diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5253f2c6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: aleclarson diff --git a/.github/contributing.md b/.github/contributing.md index e226b88a..5eac2389 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -1,38 +1,37 @@ -# Contributing to Radash +# Contributing to Radashi -Thank you for investing your time in contributing to radash! - -> The [documentation site](https://radash-docs.vercel.app) has a [separate project](https://github.com/rayepps/radash-docs). This repo and guide is specifically for the radash library source code. +Thank you for investing your time in contributing to Radashi! ## You have a question? -If you have a general question about radash, how to use it, the roadmap, or an idea to chat about you can ask it on the [discussions](https://github.com/rayepps/radash/discussions) page. Before you do, search to see if it's been asked before. If a related topic doesn't exist, you can start a new one. +If you have a general question about Radashi, how to use it, the roadmap, or an idea to chat about you can ask it on the [discussions](https://github.com/aleclarson/radashi/discussions) page. Before you do, search to see if it's been asked before. If a related topic doesn't exist, you can start a new one. ## You have a problem? -If you have an issue with radash, you want to report a bug, or you need an improvement you can create an issue on the [issues](https://github.com/rayepps/radash/issues) page. Before you do, search to see if it's already been brought up. If a similar issue doesn't exist, you can create a new one. +If you have an issue with Radashi, you want to report a bug, or you need an improvement you can create an issue on the [issues](https://github.com/aleclarson/radashi/issues) page. Before you do, search to see if it's already been brought up. If a similar issue doesn't exist, you can create a new one. ## You want to contribute? -Scan through the [existing issues](https://github.com/rayepps/radash/issues) to find one that interests you. As a general rule, I don’t assign issues to anyone. If you find an issue to work on, you are welcome to open a PR with a fix. Feel free to ask questions about the implementation or design in a comment on the issue before diving in. +Scan through the [existing issues](https://github.com/aleclarson/radashi/issues) to find one that interests you. As a general rule, I don’t assign issues to anyone. If you find an issue to work on, you are welcome to open a PR with a fix. Feel free to ask questions about the implementation or design in a comment on the issue before diving in. ## You want to write code? - To get started, run `yarn` in the project's root directory to install the dependencies. - You can run the unit tests with `yarn test`. They require Node v16+. You can run `nvm use` in the root directory to change to the correct Node version. The tests should pass (duh) and maintain 100% code coverage. - To get familiar with the existing code I would recommend looking through the docs and the codebase in parallel. For each function in the docs, find the implementation in the source and skim over the code. -- When coding, try not to create internal APIs (any function or module that is not exported to be used by the client). -- Also, try not to use functions from other radash modules. This is a softer rule but we want to make it easy for readers to understand a function without having to navigate the codebase. As a utility library users should ideally be able to copy/paste a function from radash into their project. Most radash functions should be easy to write in isolation. +- When coding, try not to create internal APIs (any function or module that is not exported to be used by the client). +- Also, try not to use functions from other Radashi modules. This is a softer rule but we want to make it easy for readers to understand a function without having to navigate the codebase. As a utility library users should ideally be able to copy/paste a function from Radashi into their project. Most Radashi functions should be easy to write in isolation. - If an implementation needs more than ~20 lines of code it might be better suited for another package or library. This is another softer rule. ## You're ready to push a change? -Once you've made your changes on a fork of the radash repo, create a pull request to the `master` branch of the [radash](https://github.com/rayepps/radash) repository. +Once you've made your changes on a fork of the Radashi repo, create a pull request to the `master` branch of the [radashi](https://github.com/aleclarson/radashi) repository. + - Be sure to fill in a description that lets readers and reviewers understand both the implementation and intent of your changes. - Don't forget to [link the PR to an issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one. - Enable the checkbox to [allow maintainer edits](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so the branch can be updated for a merge. -Once you submit your PR, I (@rayepps) will review it. I might ask questions or request additional information. +Once you submit your PR, one of Radashi's maintainers will review it. They might ask questions or request additional information. ## Your PR gets merged! diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index f597142a..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "npm" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "monthly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index bd888d23..f16ec79d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,15 +1,13 @@ ## Description -Please provide a detailed description of the changes and the intent behind them :) + ## Checklist - [ ] Changes are covered by tests if behavior has been changed or added - [ ] Tests have 100% coverage -- [ ] If code changes were made, the version in `package.json` has been bumped (matching semver) -- [ ] If code changes were made, the `yarn build` command has been run and to update the `cdn` directory - [ ] If code changes were made, the documentation (in the `/docs` directory) has been updated ## Resolves -If the PR resolves an open issue tag it here. For example, `Resolves #34` + diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..542471bf --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode", "vitest.explorer"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..d1b4edb2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index ea3a1a7e..b230db94 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,6 @@ MIT License +Copyright (c) 2024 Alec Larson Copyright (c) 2022 radash Permission is hereby granted, free of charge, to any person obtaining a copy @@ -18,4 +19,4 @@ 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. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index e8b8024b..2a63489a 100644 --- a/README.md +++ b/README.md @@ -1,91 +1,50 @@ -# Radash +# radashi -:loud_sound: `/raw-dash/` +:loud_sound: `/raw-dash-ee/`

- radash + Radashi

-
-

- Functional utility library - modern, simple, typed, powerful -

-
+- **What is this?** + A fork of the renowned [`radash`](https://github.com/sodiray/radash) library by Ray Epps [@sodiray](https://github.com/sodiray). -

- - bundle size - - - npm downloads - - - npm version - - - MIT license - -

+- **Why does this exist?** + This fork aims to be a more consistently maintained version of the library, with bug fixes and improvements. Pull requests are encouraged, but please keep them small and focused. Sweeping changes are discouraged and won't be merged. -
- - Full Documentation - -
+- **Can I help you maintain this?** + Yes! I'll add you as a contributor to the repository. You can review pull requests and even merge them. You can help with closing issues, too. Committing directly to the main branch is a privilege you can earn, as is publishing versions to NPM. [Apply here.](https://github.com/orgs/radashi-org/discussions/4) + +- **Is backwards compatibility a goal?** + Yes! We want the transition from `radash` to this library to be smooth. We'll make sure to avoid breaking changes. If any are made, they will be clearly documented at the bottom of this page. + +- **Is there official documentation?** + Currently, there is no documentation beyond this page. I will get to it eventually, but for now, you can refer to the original `radash` documentation [here](https://radash-docs.vercel.app). ## Install +```sh +pnpm add radashi ``` -yarn add radash + +```sh +yarn add radashi ``` -## Usage - -A very brief kitchen sink. See the full documentation [here](https://radash-docs.vercel.app). - -```ts -import * as _ from 'radash' - -const gods = [{ - name: 'Ra', - power: 'sun', - rank: 100, - culture: 'egypt' -}, { - name: 'Loki', - power: 'tricks', - rank: 72, - culture: 'norse' -}, { - name: 'Zeus', - power: 'lightning', - rank: 96, - culture: 'greek' -}] - -_.max(gods, g => g.rank) // => ra -_.sum(gods, g => g.rank) // => 268 -_.fork(gods, g => g.culture === 'norse') // => [[loki], [ra, zeus]] -_.sort(gods, g => g.rank) // => [ra, zeus, loki] -_.boil(gods, (a, b) => a.rank > b.rank ? a : b) // => ra - -_.objectify( - gods, - g => g.name.toLowerCase(), - g => _.pick(g, ['power', 'rank', 'culture']) -) // => { ra, zeus, loki } - -const godName = _.get(gods, g => g[0].name) - -const [err, god] = await _.try(api.gods.findByName)(godName) - -const allGods = await _.map(gods, async ({ name }) => { - return api.gods.findByName(name) -}) +```sh +npm install radashi ``` ## Contributing Contributions are welcome and appreciated! Check out the [contributing guide](./.github/contributing.md) before you dive in. + +## Changelog + +This section documents the changes between the original `radash` library and this fork. + +### 12.1.0 + +- Initial release. No differences. diff --git a/banner.png b/banner.png deleted file mode 100644 index 6fdba4fd..00000000 Binary files a/banner.png and /dev/null differ diff --git a/cdn/radash.esm.js b/cdn/radash.esm.js deleted file mode 100644 index a0a63559..00000000 --- a/cdn/radash.esm.js +++ /dev/null @@ -1,940 +0,0 @@ -const isSymbol = (value) => { - return !!value && value.constructor === Symbol; -}; -const isArray = Array.isArray; -const isObject = (value) => { - return !!value && value.constructor === Object; -}; -const isPrimitive = (value) => { - return value === void 0 || value === null || typeof value !== "object" && typeof value !== "function"; -}; -const isFunction = (value) => { - return !!(value && value.constructor && value.call && value.apply); -}; -const isString = (value) => { - return typeof value === "string" || value instanceof String; -}; -const isInt = (value) => { - return isNumber(value) && value % 1 === 0; -}; -const isFloat = (value) => { - return isNumber(value) && value % 1 !== 0; -}; -const isNumber = (value) => { - try { - return Number(value) === value; - } catch { - return false; - } -}; -const isDate = (value) => { - return Object.prototype.toString.call(value) === "[object Date]"; -}; -const isPromise = (value) => { - if (!value) - return false; - if (!value.then) - return false; - if (!isFunction(value.then)) - return false; - return true; -}; -const isEmpty = (value) => { - if (value === true || value === false) - return true; - if (value === null || value === void 0) - return true; - if (isNumber(value)) - return value === 0; - if (isDate(value)) - return isNaN(value.getTime()); - if (isFunction(value)) - return false; - if (isSymbol(value)) - return false; - const length = value.length; - if (isNumber(length)) - return length === 0; - const size = value.size; - if (isNumber(size)) - return size === 0; - const keys = Object.keys(value).length; - return keys === 0; -}; -const isEqual = (x, y) => { - if (Object.is(x, y)) - return true; - if (x instanceof Date && y instanceof Date) { - return x.getTime() === y.getTime(); - } - if (x instanceof RegExp && y instanceof RegExp) { - return x.toString() === y.toString(); - } - if (typeof x !== "object" || x === null || typeof y !== "object" || y === null) { - return false; - } - const keysX = Reflect.ownKeys(x); - const keysY = Reflect.ownKeys(y); - if (keysX.length !== keysY.length) - return false; - for (let i = 0; i < keysX.length; i++) { - if (!Reflect.has(y, keysX[i])) - return false; - if (!isEqual(x[keysX[i]], y[keysX[i]])) - return false; - } - return true; -}; - -const group = (array, getGroupId) => { - return array.reduce((acc, item) => { - const groupId = getGroupId(item); - if (!acc[groupId]) - acc[groupId] = []; - acc[groupId].push(item); - return acc; - }, {}); -}; -function zip(...arrays) { - if (!arrays || !arrays.length) - return []; - return new Array(Math.max(...arrays.map(({ length }) => length))).fill([]).map((_, idx) => arrays.map((array) => array[idx])); -} -function zipToObject(keys, values) { - if (!keys || !keys.length) { - return {}; - } - const getValue = isFunction(values) ? values : isArray(values) ? (_k, i) => values[i] : (_k, _i) => values; - return keys.reduce((acc, key, idx) => { - acc[key] = getValue(key, idx); - return acc; - }, {}); -} -const boil = (array, compareFunc) => { - if (!array || (array.length ?? 0) === 0) - return null; - return array.reduce(compareFunc); -}; -function sum(array, fn) { - return (array || []).reduce((acc, item) => acc + (fn ? fn(item) : item), 0); -} -const first = (array, defaultValue = void 0) => { - return array?.length > 0 ? array[0] : defaultValue; -}; -const last = (array, defaultValue = void 0) => { - return array?.length > 0 ? array[array.length - 1] : defaultValue; -}; -const sort = (array, getter, desc = false) => { - if (!array) - return []; - const asc = (a, b) => getter(a) - getter(b); - const dsc = (a, b) => getter(b) - getter(a); - return array.slice().sort(desc === true ? dsc : asc); -}; -const alphabetical = (array, getter, dir = "asc") => { - if (!array) - return []; - const asc = (a, b) => `${getter(a)}`.localeCompare(getter(b)); - const dsc = (a, b) => `${getter(b)}`.localeCompare(getter(a)); - return array.slice().sort(dir === "desc" ? dsc : asc); -}; -const counting = (list2, identity) => { - if (!list2) - return {}; - return list2.reduce((acc, item) => { - const id = identity(item); - acc[id] = (acc[id] ?? 0) + 1; - return acc; - }, {}); -}; -const replace = (list2, newItem, match) => { - if (!list2) - return []; - if (newItem === void 0) - return [...list2]; - for (let idx = 0; idx < list2.length; idx++) { - const item = list2[idx]; - if (match(item, idx)) { - return [ - ...list2.slice(0, idx), - newItem, - ...list2.slice(idx + 1, list2.length) - ]; - } - } - return [...list2]; -}; -const objectify = (array, getKey, getValue = (item) => item) => { - return array.reduce((acc, item) => { - acc[getKey(item)] = getValue(item); - return acc; - }, {}); -}; -const select = (array, mapper, condition) => { - if (!array) - return []; - return array.reduce((acc, item, index) => { - if (!condition(item, index)) - return acc; - acc.push(mapper(item, index)); - return acc; - }, []); -}; -function max(array, getter) { - const get = getter ?? ((v) => v); - return boil(array, (a, b) => get(a) > get(b) ? a : b); -} -function min(array, getter) { - const get = getter ?? ((v) => v); - return boil(array, (a, b) => get(a) < get(b) ? a : b); -} -const cluster = (list2, size = 2) => { - const clusterCount = Math.ceil(list2.length / size); - return new Array(clusterCount).fill(null).map((_c, i) => { - return list2.slice(i * size, i * size + size); - }); -}; -const unique = (array, toKey) => { - const valueMap = array.reduce((acc, item) => { - const key = toKey ? toKey(item) : item; - if (acc[key]) - return acc; - acc[key] = item; - return acc; - }, {}); - return Object.values(valueMap); -}; -function* range(startOrLength, end, valueOrMapper = (i) => i, step = 1) { - const mapper = isFunction(valueOrMapper) ? valueOrMapper : () => valueOrMapper; - const start = end ? startOrLength : 0; - const final = end ?? startOrLength; - for (let i = start; i <= final; i += step) { - yield mapper(i); - if (i + step > final) - break; - } -} -const list = (startOrLength, end, valueOrMapper, step) => { - return Array.from(range(startOrLength, end, valueOrMapper, step)); -}; -const flat = (lists) => { - return lists.reduce((acc, list2) => { - acc.push(...list2); - return acc; - }, []); -}; -const intersects = (listA, listB, identity) => { - if (!listA || !listB) - return false; - const ident = identity ?? ((x) => x); - const dictB = listB.reduce((acc, item) => { - acc[ident(item)] = true; - return acc; - }, {}); - return listA.some((value) => dictB[ident(value)]); -}; -const fork = (list2, condition) => { - if (!list2) - return [[], []]; - return list2.reduce( - (acc, item) => { - const [a, b] = acc; - if (condition(item)) { - return [[...a, item], b]; - } else { - return [a, [...b, item]]; - } - }, - [[], []] - ); -}; -const merge = (root, others, matcher) => { - if (!others && !root) - return []; - if (!others) - return root; - if (!root) - return []; - if (!matcher) - return root; - return root.reduce((acc, r) => { - const matched = others.find((o) => matcher(r) === matcher(o)); - if (matched) - acc.push(matched); - else - acc.push(r); - return acc; - }, []); -}; -const replaceOrAppend = (list2, newItem, match) => { - if (!list2 && !newItem) - return []; - if (!newItem) - return [...list2]; - if (!list2) - return [newItem]; - for (let idx = 0; idx < list2.length; idx++) { - const item = list2[idx]; - if (match(item, idx)) { - return [ - ...list2.slice(0, idx), - newItem, - ...list2.slice(idx + 1, list2.length) - ]; - } - } - return [...list2, newItem]; -}; -const toggle = (list2, item, toKey, options) => { - if (!list2 && !item) - return []; - if (!list2) - return [item]; - if (!item) - return [...list2]; - const matcher = toKey ? (x, idx) => toKey(x, idx) === toKey(item, idx) : (x) => x === item; - const existing = list2.find(matcher); - if (existing) - return list2.filter((x, idx) => !matcher(x, idx)); - const strategy = options?.strategy ?? "append"; - if (strategy === "append") - return [...list2, item]; - return [item, ...list2]; -}; -const sift = (list2) => { - return list2?.filter((x) => !!x) ?? []; -}; -const iterate = (count, func, initValue) => { - let value = initValue; - for (let i = 1; i <= count; i++) { - value = func(value, i); - } - return value; -}; -const diff = (root, other, identity = (t) => t) => { - if (!root?.length && !other?.length) - return []; - if (root?.length === void 0) - return [...other]; - if (!other?.length) - return [...root]; - const bKeys = other.reduce((acc, item) => { - acc[identity(item)] = true; - return acc; - }, {}); - return root.filter((a) => !bKeys[identity(a)]); -}; -function shift(arr, n) { - if (arr.length === 0) - return arr; - const shiftNumber = n % arr.length; - if (shiftNumber === 0) - return arr; - return [...arr.slice(-shiftNumber, arr.length), ...arr.slice(0, -shiftNumber)]; -} - -const reduce = async (array, asyncReducer, initValue) => { - const initProvided = initValue !== void 0; - if (!initProvided && array?.length < 1) { - throw new Error("Cannot reduce empty array with no init value"); - } - const iter = initProvided ? array : array.slice(1); - let value = initProvided ? initValue : array[0]; - for (const [i, item] of iter.entries()) { - value = await asyncReducer(value, item, i); - } - return value; -}; -const map = async (array, asyncMapFunc) => { - if (!array) - return []; - let result = []; - let index = 0; - for (const value of array) { - const newValue = await asyncMapFunc(value, index++); - result.push(newValue); - } - return result; -}; -const defer = async (func) => { - const callbacks = []; - const register = (fn, options) => callbacks.push({ - fn, - rethrow: options?.rethrow ?? false - }); - const [err, response] = await tryit(func)(register); - for (const { fn, rethrow } of callbacks) { - const [rethrown] = await tryit(fn)(err); - if (rethrown && rethrow) - throw rethrown; - } - if (err) - throw err; - return response; -}; -class AggregateError extends Error { - constructor(errors = []) { - super(); - const name = errors.find((e) => e.name)?.name ?? ""; - this.name = `AggregateError(${name}...)`; - this.message = `AggregateError with ${errors.length} errors`; - this.stack = errors.find((e) => e.stack)?.stack ?? this.stack; - this.errors = errors; - } -} -const parallel = async (limit, array, func) => { - const work = array.map((item, index) => ({ - index, - item - })); - const processor = async (res) => { - const results2 = []; - while (true) { - const next = work.pop(); - if (!next) - return res(results2); - const [error, result] = await tryit(func)(next.item); - results2.push({ - error, - result, - index: next.index - }); - } - }; - const queues = list(1, limit).map(() => new Promise(processor)); - const itemResults = await Promise.all(queues); - const [errors, results] = fork( - sort(itemResults.flat(), (r) => r.index), - (x) => !!x.error - ); - if (errors.length > 0) { - throw new AggregateError(errors.map((error) => error.error)); - } - return results.map((r) => r.result); -}; -async function all(promises) { - const entries = isArray(promises) ? promises.map((p) => [null, p]) : Object.entries(promises); - const results = await Promise.all( - entries.map( - ([key, value]) => value.then((result) => ({ result, exc: null, key })).catch((exc) => ({ result: null, exc, key })) - ) - ); - const exceptions = results.filter((r) => r.exc); - if (exceptions.length > 0) { - throw new AggregateError(exceptions.map((e) => e.exc)); - } - if (isArray(promises)) { - return results.map((r) => r.result); - } - return results.reduce( - (acc, item) => ({ - ...acc, - [item.key]: item.result - }), - {} - ); -} -const retry = async (options, func) => { - const times = options?.times ?? 3; - const delay = options?.delay; - const backoff = options?.backoff ?? null; - for (const i of range(1, times)) { - const [err, result] = await tryit(func)((err2) => { - throw { _exited: err2 }; - }); - if (!err) - return result; - if (err._exited) - throw err._exited; - if (i === times) - throw err; - if (delay) - await sleep(delay); - if (backoff) - await sleep(backoff(i)); - } - return void 0; -}; -const sleep = (milliseconds) => { - return new Promise((res) => setTimeout(res, milliseconds)); -}; -const tryit = (func) => { - return (...args) => { - try { - const result = func(...args); - if (isPromise(result)) { - return result.then((value) => [void 0, value]).catch((err) => [err, void 0]); - } - return [void 0, result]; - } catch (err) { - return [err, void 0]; - } - }; -}; -const guard = (func, shouldGuard) => { - const _guard = (err) => { - if (shouldGuard && !shouldGuard(err)) - throw err; - return void 0; - }; - const isPromise2 = (result) => result instanceof Promise; - try { - const result = func(); - return isPromise2(result) ? result.catch(_guard) : result; - } catch (err) { - return _guard(err); - } -}; - -function chain(...funcs) { - return (...args) => { - return funcs.slice(1).reduce((acc, fn) => fn(acc), funcs[0](...args)); - }; -} -function compose(...funcs) { - return funcs.reverse().reduce((acc, fn) => fn(acc)); -} -const partial = (fn, ...args) => { - return (...rest) => fn(...[...args, ...rest]); -}; -const partob = (fn, argobj) => { - return (restobj) => fn({ - ...argobj, - ...restobj - }); -}; -const proxied = (handler) => { - return new Proxy( - {}, - { - get: (target, propertyName) => handler(propertyName) - } - ); -}; -const memoize = (cache, func, keyFunc, ttl) => { - return function callWithMemo(...args) { - const key = keyFunc ? keyFunc(...args) : JSON.stringify({ args }); - const existing = cache[key]; - if (existing !== void 0) { - if (!existing.exp) - return existing.value; - if (existing.exp > new Date().getTime()) { - return existing.value; - } - } - const result = func(...args); - cache[key] = { - exp: ttl ? new Date().getTime() + ttl : null, - value: result - }; - return result; - }; -}; -const memo = (func, options = {}) => { - return memoize({}, func, options.key ?? null, options.ttl ?? null); -}; -const debounce = ({ delay }, func) => { - let timer = void 0; - let active = true; - const debounced = (...args) => { - if (active) { - clearTimeout(timer); - timer = setTimeout(() => { - active && func(...args); - timer = void 0; - }, delay); - } else { - func(...args); - } - }; - debounced.isPending = () => { - return timer !== void 0; - }; - debounced.cancel = () => { - active = false; - }; - debounced.flush = (...args) => func(...args); - return debounced; -}; -const throttle = ({ interval }, func) => { - let ready = true; - let timer = void 0; - const throttled = (...args) => { - if (!ready) - return; - func(...args); - ready = false; - timer = setTimeout(() => { - ready = true; - timer = void 0; - }, interval); - }; - throttled.isThrottled = () => { - return timer !== void 0; - }; - return throttled; -}; -const callable = (obj, fn) => { - const FUNC = () => { - }; - return new Proxy(Object.assign(FUNC, obj), { - get: (target, key) => target[key], - set: (target, key, value) => { - target[key] = value; - return true; - }, - apply: (target, self, args) => fn(Object.assign({}, target))(...args) - }); -}; - -function inRange(number, start, end) { - const isTypeSafe = typeof number === "number" && typeof start === "number" && (typeof end === "undefined" || typeof end === "number"); - if (!isTypeSafe) { - return false; - } - if (typeof end === "undefined") { - end = start; - start = 0; - } - return number >= Math.min(start, end) && number < Math.max(start, end); -} -const toFloat = (value, defaultValue) => { - const def = defaultValue === void 0 ? 0 : defaultValue; - if (value === null || value === void 0) { - return def; - } - const result = parseFloat(value); - return isNaN(result) ? def : result; -}; -const toInt = (value, defaultValue) => { - const def = defaultValue === void 0 ? 0 : defaultValue; - if (value === null || value === void 0) { - return def; - } - const result = parseInt(value); - return isNaN(result) ? def : result; -}; - -const shake = (obj, filter = (x) => x === void 0) => { - if (!obj) - return {}; - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - if (filter(obj[key])) { - return acc; - } else { - acc[key] = obj[key]; - return acc; - } - }, {}); -}; -const mapKeys = (obj, mapFunc) => { - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - acc[mapFunc(key, obj[key])] = obj[key]; - return acc; - }, {}); -}; -const mapValues = (obj, mapFunc) => { - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - acc[key] = mapFunc(obj[key], key); - return acc; - }, {}); -}; -const mapEntries = (obj, toEntry) => { - if (!obj) - return {}; - return Object.entries(obj).reduce((acc, [key, value]) => { - const [newKey, newValue] = toEntry(key, value); - acc[newKey] = newValue; - return acc; - }, {}); -}; -const invert = (obj) => { - if (!obj) - return {}; - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - acc[obj[key]] = key; - return acc; - }, {}); -}; -const lowerize = (obj) => mapKeys(obj, (k) => k.toLowerCase()); -const upperize = (obj) => mapKeys(obj, (k) => k.toUpperCase()); -const clone = (obj) => { - if (isPrimitive(obj)) { - return obj; - } - if (typeof obj === "function") { - return obj.bind({}); - } - const newObj = new obj.constructor(); - Object.getOwnPropertyNames(obj).forEach((prop) => { - newObj[prop] = obj[prop]; - }); - return newObj; -}; -const listify = (obj, toItem) => { - if (!obj) - return []; - const entries = Object.entries(obj); - if (entries.length === 0) - return []; - return entries.reduce((acc, entry) => { - acc.push(toItem(entry[0], entry[1])); - return acc; - }, []); -}; -const pick = (obj, keys2) => { - if (!obj) - return {}; - return keys2.reduce((acc, key) => { - if (Object.prototype.hasOwnProperty.call(obj, key)) - acc[key] = obj[key]; - return acc; - }, {}); -}; -const omit = (obj, keys2) => { - if (!obj) - return {}; - if (!keys2 || keys2.length === 0) - return obj; - return keys2.reduce( - (acc, key) => { - delete acc[key]; - return acc; - }, - { ...obj } - ); -}; -const get = (value, path, defaultValue) => { - const segments = path.split(/[\.\[\]]/g); - let current = value; - for (const key of segments) { - if (current === null) - return defaultValue; - if (current === void 0) - return defaultValue; - const dequoted = key.replace(/['"]/g, ""); - if (dequoted.trim() === "") - continue; - current = current[dequoted]; - } - if (current === void 0) - return defaultValue; - return current; -}; -const set = (initial, path, value) => { - if (!initial) - return {}; - if (!path || value === void 0) - return initial; - const segments = path.split(/[\.\[\]]/g).filter((x) => !!x.trim()); - const _set = (node) => { - if (segments.length > 1) { - const key = segments.shift(); - const nextIsNum = toInt(segments[0], null) === null ? false : true; - node[key] = node[key] === void 0 ? nextIsNum ? [] : {} : node[key]; - _set(node[key]); - } else { - node[segments[0]] = value; - } - }; - const cloned = clone(initial); - _set(cloned); - return cloned; -}; -const assign = (initial, override) => { - if (!initial || !override) - return initial ?? override ?? {}; - return Object.entries({ ...initial, ...override }).reduce( - (acc, [key, value]) => { - return { - ...acc, - [key]: (() => { - if (isObject(initial[key])) - return assign(initial[key], value); - return value; - })() - }; - }, - {} - ); -}; -const keys = (value) => { - if (!value) - return []; - const getKeys = (nested, paths) => { - if (isObject(nested)) { - return Object.entries(nested).flatMap( - ([k, v]) => getKeys(v, [...paths, k]) - ); - } - if (isArray(nested)) { - return nested.flatMap((item, i) => getKeys(item, [...paths, `${i}`])); - } - return [paths.join(".")]; - }; - return getKeys(value, []); -}; -const crush = (value) => { - if (!value) - return {}; - return objectify( - keys(value), - (k) => k, - (k) => get(value, k) - ); -}; -const construct = (obj) => { - if (!obj) - return {}; - return Object.keys(obj).reduce((acc, path) => { - return set(acc, path, obj[path]); - }, {}); -}; - -const random = (min, max) => { - return Math.floor(Math.random() * (max - min + 1) + min); -}; -const draw = (array) => { - const max = array.length; - if (max === 0) { - return null; - } - const index = random(0, max - 1); - return array[index]; -}; -const shuffle = (array) => { - return array.map((a) => ({ rand: Math.random(), value: a })).sort((a, b) => a.rand - b.rand).map((a) => a.value); -}; -const uid = (length, specials = "") => { - const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + specials; - return iterate( - length, - (acc) => { - return acc + characters.charAt(random(0, characters.length - 1)); - }, - "" - ); -}; - -const series = (items, toKey = (item) => `${item}`) => { - const { indexesByKey, itemsByIndex } = items.reduce( - (acc, item, idx) => ({ - indexesByKey: { - ...acc.indexesByKey, - [toKey(item)]: idx - }, - itemsByIndex: { - ...acc.itemsByIndex, - [idx]: item - } - }), - { - indexesByKey: {}, - itemsByIndex: {} - } - ); - const min = (a, b) => { - return indexesByKey[toKey(a)] < indexesByKey[toKey(b)] ? a : b; - }; - const max = (a, b) => { - return indexesByKey[toKey(a)] > indexesByKey[toKey(b)] ? a : b; - }; - const first = () => { - return itemsByIndex[0]; - }; - const last = () => { - return itemsByIndex[items.length - 1]; - }; - const next = (current, defaultValue) => { - return itemsByIndex[indexesByKey[toKey(current)] + 1] ?? defaultValue ?? first(); - }; - const previous = (current, defaultValue) => { - return itemsByIndex[indexesByKey[toKey(current)] - 1] ?? defaultValue ?? last(); - }; - const spin = (current, num) => { - if (num === 0) - return current; - const abs = Math.abs(num); - const rel = abs > items.length ? abs % items.length : abs; - return list(0, rel - 1).reduce( - (acc) => num > 0 ? next(acc) : previous(acc), - current - ); - }; - return { - min, - max, - first, - last, - next, - previous, - spin - }; -}; - -const capitalize = (str) => { - if (!str || str.length === 0) - return ""; - const lower = str.toLowerCase(); - return lower.substring(0, 1).toUpperCase() + lower.substring(1, lower.length); -}; -const camel = (str) => { - const parts = str?.replace(/([A-Z])+/g, capitalize)?.split(/(?=[A-Z])|[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - if (parts.length === 1) - return parts[0]; - return parts.reduce((acc, part) => { - return `${acc}${part.charAt(0).toUpperCase()}${part.slice(1)}`; - }); -}; -const snake = (str, options) => { - const parts = str?.replace(/([A-Z])+/g, capitalize).split(/(?=[A-Z])|[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - if (parts.length === 1) - return parts[0]; - const result = parts.reduce((acc, part) => { - return `${acc}_${part.toLowerCase()}`; - }); - return options?.splitOnNumber === false ? result : result.replace(/([A-Za-z]{1}[0-9]{1})/, (val) => `${val[0]}_${val[1]}`); -}; -const dash = (str) => { - const parts = str?.replace(/([A-Z])+/g, capitalize)?.split(/(?=[A-Z])|[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - if (parts.length === 1) - return parts[0]; - return parts.reduce((acc, part) => { - return `${acc}-${part.toLowerCase()}`; - }); -}; -const pascal = (str) => { - const parts = str?.split(/[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - return parts.map((str2) => str2.charAt(0).toUpperCase() + str2.slice(1)).join(""); -}; -const title = (str) => { - if (!str) - return ""; - return str.split(/(?=[A-Z])|[\.\-\s_]/).map((s) => s.trim()).filter((s) => !!s).map((s) => capitalize(s.toLowerCase())).join(" "); -}; -const template = (str, data, regex = /\{\{(.+?)\}\}/g) => { - return Array.from(str.matchAll(regex)).reduce((acc, match) => { - return acc.replace(match[0], data[match[1]]); - }, str); -}; -const trim = (str, charsToTrim = " ") => { - if (!str) - return ""; - const toTrim = charsToTrim.replace(/[\W]{1}/g, "\\$&"); - const regex = new RegExp(`^[${toTrim}]+|[${toTrim}]+$`, "g"); - return str.replace(regex, ""); -}; - -export { all, alphabetical, assign, boil, callable, camel, capitalize, chain, clone, cluster, compose, construct, counting, crush, dash, debounce, defer, diff, draw, first, flat, fork, get, group, guard, inRange, intersects, invert, isArray, isDate, isEmpty, isEqual, isFloat, isFunction, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, iterate, keys, last, list, listify, lowerize, map, mapEntries, mapKeys, mapValues, max, memo, merge, min, objectify, omit, parallel, partial, partob, pascal, pick, proxied, random, range, reduce, replace, replaceOrAppend, retry, select, series, set, shake, shift, shuffle, sift, sleep, snake, sort, sum, template, throttle, title, toFloat, toInt, toggle, trim, tryit as try, tryit, uid, unique, upperize, zip, zipToObject }; diff --git a/cdn/radash.js b/cdn/radash.js deleted file mode 100644 index ca7ebea6..00000000 --- a/cdn/radash.js +++ /dev/null @@ -1,1040 +0,0 @@ -var radash = (function (exports) { - 'use strict'; - - const isSymbol = (value) => { - return !!value && value.constructor === Symbol; - }; - const isArray = Array.isArray; - const isObject = (value) => { - return !!value && value.constructor === Object; - }; - const isPrimitive = (value) => { - return value === void 0 || value === null || typeof value !== "object" && typeof value !== "function"; - }; - const isFunction = (value) => { - return !!(value && value.constructor && value.call && value.apply); - }; - const isString = (value) => { - return typeof value === "string" || value instanceof String; - }; - const isInt = (value) => { - return isNumber(value) && value % 1 === 0; - }; - const isFloat = (value) => { - return isNumber(value) && value % 1 !== 0; - }; - const isNumber = (value) => { - try { - return Number(value) === value; - } catch { - return false; - } - }; - const isDate = (value) => { - return Object.prototype.toString.call(value) === "[object Date]"; - }; - const isPromise = (value) => { - if (!value) - return false; - if (!value.then) - return false; - if (!isFunction(value.then)) - return false; - return true; - }; - const isEmpty = (value) => { - if (value === true || value === false) - return true; - if (value === null || value === void 0) - return true; - if (isNumber(value)) - return value === 0; - if (isDate(value)) - return isNaN(value.getTime()); - if (isFunction(value)) - return false; - if (isSymbol(value)) - return false; - const length = value.length; - if (isNumber(length)) - return length === 0; - const size = value.size; - if (isNumber(size)) - return size === 0; - const keys = Object.keys(value).length; - return keys === 0; - }; - const isEqual = (x, y) => { - if (Object.is(x, y)) - return true; - if (x instanceof Date && y instanceof Date) { - return x.getTime() === y.getTime(); - } - if (x instanceof RegExp && y instanceof RegExp) { - return x.toString() === y.toString(); - } - if (typeof x !== "object" || x === null || typeof y !== "object" || y === null) { - return false; - } - const keysX = Reflect.ownKeys(x); - const keysY = Reflect.ownKeys(y); - if (keysX.length !== keysY.length) - return false; - for (let i = 0; i < keysX.length; i++) { - if (!Reflect.has(y, keysX[i])) - return false; - if (!isEqual(x[keysX[i]], y[keysX[i]])) - return false; - } - return true; - }; - - const group = (array, getGroupId) => { - return array.reduce((acc, item) => { - const groupId = getGroupId(item); - if (!acc[groupId]) - acc[groupId] = []; - acc[groupId].push(item); - return acc; - }, {}); - }; - function zip(...arrays) { - if (!arrays || !arrays.length) - return []; - return new Array(Math.max(...arrays.map(({ length }) => length))).fill([]).map((_, idx) => arrays.map((array) => array[idx])); - } - function zipToObject(keys, values) { - if (!keys || !keys.length) { - return {}; - } - const getValue = isFunction(values) ? values : isArray(values) ? (_k, i) => values[i] : (_k, _i) => values; - return keys.reduce((acc, key, idx) => { - acc[key] = getValue(key, idx); - return acc; - }, {}); - } - const boil = (array, compareFunc) => { - if (!array || (array.length ?? 0) === 0) - return null; - return array.reduce(compareFunc); - }; - function sum(array, fn) { - return (array || []).reduce((acc, item) => acc + (fn ? fn(item) : item), 0); - } - const first = (array, defaultValue = void 0) => { - return array?.length > 0 ? array[0] : defaultValue; - }; - const last = (array, defaultValue = void 0) => { - return array?.length > 0 ? array[array.length - 1] : defaultValue; - }; - const sort = (array, getter, desc = false) => { - if (!array) - return []; - const asc = (a, b) => getter(a) - getter(b); - const dsc = (a, b) => getter(b) - getter(a); - return array.slice().sort(desc === true ? dsc : asc); - }; - const alphabetical = (array, getter, dir = "asc") => { - if (!array) - return []; - const asc = (a, b) => `${getter(a)}`.localeCompare(getter(b)); - const dsc = (a, b) => `${getter(b)}`.localeCompare(getter(a)); - return array.slice().sort(dir === "desc" ? dsc : asc); - }; - const counting = (list2, identity) => { - if (!list2) - return {}; - return list2.reduce((acc, item) => { - const id = identity(item); - acc[id] = (acc[id] ?? 0) + 1; - return acc; - }, {}); - }; - const replace = (list2, newItem, match) => { - if (!list2) - return []; - if (newItem === void 0) - return [...list2]; - for (let idx = 0; idx < list2.length; idx++) { - const item = list2[idx]; - if (match(item, idx)) { - return [ - ...list2.slice(0, idx), - newItem, - ...list2.slice(idx + 1, list2.length) - ]; - } - } - return [...list2]; - }; - const objectify = (array, getKey, getValue = (item) => item) => { - return array.reduce((acc, item) => { - acc[getKey(item)] = getValue(item); - return acc; - }, {}); - }; - const select = (array, mapper, condition) => { - if (!array) - return []; - return array.reduce((acc, item, index) => { - if (!condition(item, index)) - return acc; - acc.push(mapper(item, index)); - return acc; - }, []); - }; - function max(array, getter) { - const get = getter ?? ((v) => v); - return boil(array, (a, b) => get(a) > get(b) ? a : b); - } - function min(array, getter) { - const get = getter ?? ((v) => v); - return boil(array, (a, b) => get(a) < get(b) ? a : b); - } - const cluster = (list2, size = 2) => { - const clusterCount = Math.ceil(list2.length / size); - return new Array(clusterCount).fill(null).map((_c, i) => { - return list2.slice(i * size, i * size + size); - }); - }; - const unique = (array, toKey) => { - const valueMap = array.reduce((acc, item) => { - const key = toKey ? toKey(item) : item; - if (acc[key]) - return acc; - acc[key] = item; - return acc; - }, {}); - return Object.values(valueMap); - }; - function* range(startOrLength, end, valueOrMapper = (i) => i, step = 1) { - const mapper = isFunction(valueOrMapper) ? valueOrMapper : () => valueOrMapper; - const start = end ? startOrLength : 0; - const final = end ?? startOrLength; - for (let i = start; i <= final; i += step) { - yield mapper(i); - if (i + step > final) - break; - } - } - const list = (startOrLength, end, valueOrMapper, step) => { - return Array.from(range(startOrLength, end, valueOrMapper, step)); - }; - const flat = (lists) => { - return lists.reduce((acc, list2) => { - acc.push(...list2); - return acc; - }, []); - }; - const intersects = (listA, listB, identity) => { - if (!listA || !listB) - return false; - const ident = identity ?? ((x) => x); - const dictB = listB.reduce((acc, item) => { - acc[ident(item)] = true; - return acc; - }, {}); - return listA.some((value) => dictB[ident(value)]); - }; - const fork = (list2, condition) => { - if (!list2) - return [[], []]; - return list2.reduce( - (acc, item) => { - const [a, b] = acc; - if (condition(item)) { - return [[...a, item], b]; - } else { - return [a, [...b, item]]; - } - }, - [[], []] - ); - }; - const merge = (root, others, matcher) => { - if (!others && !root) - return []; - if (!others) - return root; - if (!root) - return []; - if (!matcher) - return root; - return root.reduce((acc, r) => { - const matched = others.find((o) => matcher(r) === matcher(o)); - if (matched) - acc.push(matched); - else - acc.push(r); - return acc; - }, []); - }; - const replaceOrAppend = (list2, newItem, match) => { - if (!list2 && !newItem) - return []; - if (!newItem) - return [...list2]; - if (!list2) - return [newItem]; - for (let idx = 0; idx < list2.length; idx++) { - const item = list2[idx]; - if (match(item, idx)) { - return [ - ...list2.slice(0, idx), - newItem, - ...list2.slice(idx + 1, list2.length) - ]; - } - } - return [...list2, newItem]; - }; - const toggle = (list2, item, toKey, options) => { - if (!list2 && !item) - return []; - if (!list2) - return [item]; - if (!item) - return [...list2]; - const matcher = toKey ? (x, idx) => toKey(x, idx) === toKey(item, idx) : (x) => x === item; - const existing = list2.find(matcher); - if (existing) - return list2.filter((x, idx) => !matcher(x, idx)); - const strategy = options?.strategy ?? "append"; - if (strategy === "append") - return [...list2, item]; - return [item, ...list2]; - }; - const sift = (list2) => { - return list2?.filter((x) => !!x) ?? []; - }; - const iterate = (count, func, initValue) => { - let value = initValue; - for (let i = 1; i <= count; i++) { - value = func(value, i); - } - return value; - }; - const diff = (root, other, identity = (t) => t) => { - if (!root?.length && !other?.length) - return []; - if (root?.length === void 0) - return [...other]; - if (!other?.length) - return [...root]; - const bKeys = other.reduce((acc, item) => { - acc[identity(item)] = true; - return acc; - }, {}); - return root.filter((a) => !bKeys[identity(a)]); - }; - function shift(arr, n) { - if (arr.length === 0) - return arr; - const shiftNumber = n % arr.length; - if (shiftNumber === 0) - return arr; - return [...arr.slice(-shiftNumber, arr.length), ...arr.slice(0, -shiftNumber)]; - } - - const reduce = async (array, asyncReducer, initValue) => { - const initProvided = initValue !== void 0; - if (!initProvided && array?.length < 1) { - throw new Error("Cannot reduce empty array with no init value"); - } - const iter = initProvided ? array : array.slice(1); - let value = initProvided ? initValue : array[0]; - for (const [i, item] of iter.entries()) { - value = await asyncReducer(value, item, i); - } - return value; - }; - const map = async (array, asyncMapFunc) => { - if (!array) - return []; - let result = []; - let index = 0; - for (const value of array) { - const newValue = await asyncMapFunc(value, index++); - result.push(newValue); - } - return result; - }; - const defer = async (func) => { - const callbacks = []; - const register = (fn, options) => callbacks.push({ - fn, - rethrow: options?.rethrow ?? false - }); - const [err, response] = await tryit(func)(register); - for (const { fn, rethrow } of callbacks) { - const [rethrown] = await tryit(fn)(err); - if (rethrown && rethrow) - throw rethrown; - } - if (err) - throw err; - return response; - }; - class AggregateError extends Error { - constructor(errors = []) { - super(); - const name = errors.find((e) => e.name)?.name ?? ""; - this.name = `AggregateError(${name}...)`; - this.message = `AggregateError with ${errors.length} errors`; - this.stack = errors.find((e) => e.stack)?.stack ?? this.stack; - this.errors = errors; - } - } - const parallel = async (limit, array, func) => { - const work = array.map((item, index) => ({ - index, - item - })); - const processor = async (res) => { - const results2 = []; - while (true) { - const next = work.pop(); - if (!next) - return res(results2); - const [error, result] = await tryit(func)(next.item); - results2.push({ - error, - result, - index: next.index - }); - } - }; - const queues = list(1, limit).map(() => new Promise(processor)); - const itemResults = await Promise.all(queues); - const [errors, results] = fork( - sort(itemResults.flat(), (r) => r.index), - (x) => !!x.error - ); - if (errors.length > 0) { - throw new AggregateError(errors.map((error) => error.error)); - } - return results.map((r) => r.result); - }; - async function all(promises) { - const entries = isArray(promises) ? promises.map((p) => [null, p]) : Object.entries(promises); - const results = await Promise.all( - entries.map( - ([key, value]) => value.then((result) => ({ result, exc: null, key })).catch((exc) => ({ result: null, exc, key })) - ) - ); - const exceptions = results.filter((r) => r.exc); - if (exceptions.length > 0) { - throw new AggregateError(exceptions.map((e) => e.exc)); - } - if (isArray(promises)) { - return results.map((r) => r.result); - } - return results.reduce( - (acc, item) => ({ - ...acc, - [item.key]: item.result - }), - {} - ); - } - const retry = async (options, func) => { - const times = options?.times ?? 3; - const delay = options?.delay; - const backoff = options?.backoff ?? null; - for (const i of range(1, times)) { - const [err, result] = await tryit(func)((err2) => { - throw { _exited: err2 }; - }); - if (!err) - return result; - if (err._exited) - throw err._exited; - if (i === times) - throw err; - if (delay) - await sleep(delay); - if (backoff) - await sleep(backoff(i)); - } - return void 0; - }; - const sleep = (milliseconds) => { - return new Promise((res) => setTimeout(res, milliseconds)); - }; - const tryit = (func) => { - return (...args) => { - try { - const result = func(...args); - if (isPromise(result)) { - return result.then((value) => [void 0, value]).catch((err) => [err, void 0]); - } - return [void 0, result]; - } catch (err) { - return [err, void 0]; - } - }; - }; - const guard = (func, shouldGuard) => { - const _guard = (err) => { - if (shouldGuard && !shouldGuard(err)) - throw err; - return void 0; - }; - const isPromise2 = (result) => result instanceof Promise; - try { - const result = func(); - return isPromise2(result) ? result.catch(_guard) : result; - } catch (err) { - return _guard(err); - } - }; - - function chain(...funcs) { - return (...args) => { - return funcs.slice(1).reduce((acc, fn) => fn(acc), funcs[0](...args)); - }; - } - function compose(...funcs) { - return funcs.reverse().reduce((acc, fn) => fn(acc)); - } - const partial = (fn, ...args) => { - return (...rest) => fn(...[...args, ...rest]); - }; - const partob = (fn, argobj) => { - return (restobj) => fn({ - ...argobj, - ...restobj - }); - }; - const proxied = (handler) => { - return new Proxy( - {}, - { - get: (target, propertyName) => handler(propertyName) - } - ); - }; - const memoize = (cache, func, keyFunc, ttl) => { - return function callWithMemo(...args) { - const key = keyFunc ? keyFunc(...args) : JSON.stringify({ args }); - const existing = cache[key]; - if (existing !== void 0) { - if (!existing.exp) - return existing.value; - if (existing.exp > new Date().getTime()) { - return existing.value; - } - } - const result = func(...args); - cache[key] = { - exp: ttl ? new Date().getTime() + ttl : null, - value: result - }; - return result; - }; - }; - const memo = (func, options = {}) => { - return memoize({}, func, options.key ?? null, options.ttl ?? null); - }; - const debounce = ({ delay }, func) => { - let timer = void 0; - let active = true; - const debounced = (...args) => { - if (active) { - clearTimeout(timer); - timer = setTimeout(() => { - active && func(...args); - timer = void 0; - }, delay); - } else { - func(...args); - } - }; - debounced.isPending = () => { - return timer !== void 0; - }; - debounced.cancel = () => { - active = false; - }; - debounced.flush = (...args) => func(...args); - return debounced; - }; - const throttle = ({ interval }, func) => { - let ready = true; - let timer = void 0; - const throttled = (...args) => { - if (!ready) - return; - func(...args); - ready = false; - timer = setTimeout(() => { - ready = true; - timer = void 0; - }, interval); - }; - throttled.isThrottled = () => { - return timer !== void 0; - }; - return throttled; - }; - const callable = (obj, fn) => { - const FUNC = () => { - }; - return new Proxy(Object.assign(FUNC, obj), { - get: (target, key) => target[key], - set: (target, key, value) => { - target[key] = value; - return true; - }, - apply: (target, self, args) => fn(Object.assign({}, target))(...args) - }); - }; - - function inRange(number, start, end) { - const isTypeSafe = typeof number === "number" && typeof start === "number" && (typeof end === "undefined" || typeof end === "number"); - if (!isTypeSafe) { - return false; - } - if (typeof end === "undefined") { - end = start; - start = 0; - } - return number >= Math.min(start, end) && number < Math.max(start, end); - } - const toFloat = (value, defaultValue) => { - const def = defaultValue === void 0 ? 0 : defaultValue; - if (value === null || value === void 0) { - return def; - } - const result = parseFloat(value); - return isNaN(result) ? def : result; - }; - const toInt = (value, defaultValue) => { - const def = defaultValue === void 0 ? 0 : defaultValue; - if (value === null || value === void 0) { - return def; - } - const result = parseInt(value); - return isNaN(result) ? def : result; - }; - - const shake = (obj, filter = (x) => x === void 0) => { - if (!obj) - return {}; - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - if (filter(obj[key])) { - return acc; - } else { - acc[key] = obj[key]; - return acc; - } - }, {}); - }; - const mapKeys = (obj, mapFunc) => { - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - acc[mapFunc(key, obj[key])] = obj[key]; - return acc; - }, {}); - }; - const mapValues = (obj, mapFunc) => { - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - acc[key] = mapFunc(obj[key], key); - return acc; - }, {}); - }; - const mapEntries = (obj, toEntry) => { - if (!obj) - return {}; - return Object.entries(obj).reduce((acc, [key, value]) => { - const [newKey, newValue] = toEntry(key, value); - acc[newKey] = newValue; - return acc; - }, {}); - }; - const invert = (obj) => { - if (!obj) - return {}; - const keys2 = Object.keys(obj); - return keys2.reduce((acc, key) => { - acc[obj[key]] = key; - return acc; - }, {}); - }; - const lowerize = (obj) => mapKeys(obj, (k) => k.toLowerCase()); - const upperize = (obj) => mapKeys(obj, (k) => k.toUpperCase()); - const clone = (obj) => { - if (isPrimitive(obj)) { - return obj; - } - if (typeof obj === "function") { - return obj.bind({}); - } - const newObj = new obj.constructor(); - Object.getOwnPropertyNames(obj).forEach((prop) => { - newObj[prop] = obj[prop]; - }); - return newObj; - }; - const listify = (obj, toItem) => { - if (!obj) - return []; - const entries = Object.entries(obj); - if (entries.length === 0) - return []; - return entries.reduce((acc, entry) => { - acc.push(toItem(entry[0], entry[1])); - return acc; - }, []); - }; - const pick = (obj, keys2) => { - if (!obj) - return {}; - return keys2.reduce((acc, key) => { - if (Object.prototype.hasOwnProperty.call(obj, key)) - acc[key] = obj[key]; - return acc; - }, {}); - }; - const omit = (obj, keys2) => { - if (!obj) - return {}; - if (!keys2 || keys2.length === 0) - return obj; - return keys2.reduce( - (acc, key) => { - delete acc[key]; - return acc; - }, - { ...obj } - ); - }; - const get = (value, path, defaultValue) => { - const segments = path.split(/[\.\[\]]/g); - let current = value; - for (const key of segments) { - if (current === null) - return defaultValue; - if (current === void 0) - return defaultValue; - const dequoted = key.replace(/['"]/g, ""); - if (dequoted.trim() === "") - continue; - current = current[dequoted]; - } - if (current === void 0) - return defaultValue; - return current; - }; - const set = (initial, path, value) => { - if (!initial) - return {}; - if (!path || value === void 0) - return initial; - const segments = path.split(/[\.\[\]]/g).filter((x) => !!x.trim()); - const _set = (node) => { - if (segments.length > 1) { - const key = segments.shift(); - const nextIsNum = toInt(segments[0], null) === null ? false : true; - node[key] = node[key] === void 0 ? nextIsNum ? [] : {} : node[key]; - _set(node[key]); - } else { - node[segments[0]] = value; - } - }; - const cloned = clone(initial); - _set(cloned); - return cloned; - }; - const assign = (initial, override) => { - if (!initial || !override) - return initial ?? override ?? {}; - return Object.entries({ ...initial, ...override }).reduce( - (acc, [key, value]) => { - return { - ...acc, - [key]: (() => { - if (isObject(initial[key])) - return assign(initial[key], value); - return value; - })() - }; - }, - {} - ); - }; - const keys = (value) => { - if (!value) - return []; - const getKeys = (nested, paths) => { - if (isObject(nested)) { - return Object.entries(nested).flatMap( - ([k, v]) => getKeys(v, [...paths, k]) - ); - } - if (isArray(nested)) { - return nested.flatMap((item, i) => getKeys(item, [...paths, `${i}`])); - } - return [paths.join(".")]; - }; - return getKeys(value, []); - }; - const crush = (value) => { - if (!value) - return {}; - return objectify( - keys(value), - (k) => k, - (k) => get(value, k) - ); - }; - const construct = (obj) => { - if (!obj) - return {}; - return Object.keys(obj).reduce((acc, path) => { - return set(acc, path, obj[path]); - }, {}); - }; - - const random = (min, max) => { - return Math.floor(Math.random() * (max - min + 1) + min); - }; - const draw = (array) => { - const max = array.length; - if (max === 0) { - return null; - } - const index = random(0, max - 1); - return array[index]; - }; - const shuffle = (array) => { - return array.map((a) => ({ rand: Math.random(), value: a })).sort((a, b) => a.rand - b.rand).map((a) => a.value); - }; - const uid = (length, specials = "") => { - const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + specials; - return iterate( - length, - (acc) => { - return acc + characters.charAt(random(0, characters.length - 1)); - }, - "" - ); - }; - - const series = (items, toKey = (item) => `${item}`) => { - const { indexesByKey, itemsByIndex } = items.reduce( - (acc, item, idx) => ({ - indexesByKey: { - ...acc.indexesByKey, - [toKey(item)]: idx - }, - itemsByIndex: { - ...acc.itemsByIndex, - [idx]: item - } - }), - { - indexesByKey: {}, - itemsByIndex: {} - } - ); - const min = (a, b) => { - return indexesByKey[toKey(a)] < indexesByKey[toKey(b)] ? a : b; - }; - const max = (a, b) => { - return indexesByKey[toKey(a)] > indexesByKey[toKey(b)] ? a : b; - }; - const first = () => { - return itemsByIndex[0]; - }; - const last = () => { - return itemsByIndex[items.length - 1]; - }; - const next = (current, defaultValue) => { - return itemsByIndex[indexesByKey[toKey(current)] + 1] ?? defaultValue ?? first(); - }; - const previous = (current, defaultValue) => { - return itemsByIndex[indexesByKey[toKey(current)] - 1] ?? defaultValue ?? last(); - }; - const spin = (current, num) => { - if (num === 0) - return current; - const abs = Math.abs(num); - const rel = abs > items.length ? abs % items.length : abs; - return list(0, rel - 1).reduce( - (acc) => num > 0 ? next(acc) : previous(acc), - current - ); - }; - return { - min, - max, - first, - last, - next, - previous, - spin - }; - }; - - const capitalize = (str) => { - if (!str || str.length === 0) - return ""; - const lower = str.toLowerCase(); - return lower.substring(0, 1).toUpperCase() + lower.substring(1, lower.length); - }; - const camel = (str) => { - const parts = str?.replace(/([A-Z])+/g, capitalize)?.split(/(?=[A-Z])|[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - if (parts.length === 1) - return parts[0]; - return parts.reduce((acc, part) => { - return `${acc}${part.charAt(0).toUpperCase()}${part.slice(1)}`; - }); - }; - const snake = (str, options) => { - const parts = str?.replace(/([A-Z])+/g, capitalize).split(/(?=[A-Z])|[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - if (parts.length === 1) - return parts[0]; - const result = parts.reduce((acc, part) => { - return `${acc}_${part.toLowerCase()}`; - }); - return options?.splitOnNumber === false ? result : result.replace(/([A-Za-z]{1}[0-9]{1})/, (val) => `${val[0]}_${val[1]}`); - }; - const dash = (str) => { - const parts = str?.replace(/([A-Z])+/g, capitalize)?.split(/(?=[A-Z])|[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - if (parts.length === 1) - return parts[0]; - return parts.reduce((acc, part) => { - return `${acc}-${part.toLowerCase()}`; - }); - }; - const pascal = (str) => { - const parts = str?.split(/[\.\-\s_]/).map((x) => x.toLowerCase()) ?? []; - if (parts.length === 0) - return ""; - return parts.map((str2) => str2.charAt(0).toUpperCase() + str2.slice(1)).join(""); - }; - const title = (str) => { - if (!str) - return ""; - return str.split(/(?=[A-Z])|[\.\-\s_]/).map((s) => s.trim()).filter((s) => !!s).map((s) => capitalize(s.toLowerCase())).join(" "); - }; - const template = (str, data, regex = /\{\{(.+?)\}\}/g) => { - return Array.from(str.matchAll(regex)).reduce((acc, match) => { - return acc.replace(match[0], data[match[1]]); - }, str); - }; - const trim = (str, charsToTrim = " ") => { - if (!str) - return ""; - const toTrim = charsToTrim.replace(/[\W]{1}/g, "\\$&"); - const regex = new RegExp(`^[${toTrim}]+|[${toTrim}]+$`, "g"); - return str.replace(regex, ""); - }; - - exports.all = all; - exports.alphabetical = alphabetical; - exports.assign = assign; - exports.boil = boil; - exports.callable = callable; - exports.camel = camel; - exports.capitalize = capitalize; - exports.chain = chain; - exports.clone = clone; - exports.cluster = cluster; - exports.compose = compose; - exports.construct = construct; - exports.counting = counting; - exports.crush = crush; - exports.dash = dash; - exports.debounce = debounce; - exports.defer = defer; - exports.diff = diff; - exports.draw = draw; - exports.first = first; - exports.flat = flat; - exports.fork = fork; - exports.get = get; - exports.group = group; - exports.guard = guard; - exports.inRange = inRange; - exports.intersects = intersects; - exports.invert = invert; - exports.isArray = isArray; - exports.isDate = isDate; - exports.isEmpty = isEmpty; - exports.isEqual = isEqual; - exports.isFloat = isFloat; - exports.isFunction = isFunction; - exports.isInt = isInt; - exports.isNumber = isNumber; - exports.isObject = isObject; - exports.isPrimitive = isPrimitive; - exports.isPromise = isPromise; - exports.isString = isString; - exports.isSymbol = isSymbol; - exports.iterate = iterate; - exports.keys = keys; - exports.last = last; - exports.list = list; - exports.listify = listify; - exports.lowerize = lowerize; - exports.map = map; - exports.mapEntries = mapEntries; - exports.mapKeys = mapKeys; - exports.mapValues = mapValues; - exports.max = max; - exports.memo = memo; - exports.merge = merge; - exports.min = min; - exports.objectify = objectify; - exports.omit = omit; - exports.parallel = parallel; - exports.partial = partial; - exports.partob = partob; - exports.pascal = pascal; - exports.pick = pick; - exports.proxied = proxied; - exports.random = random; - exports.range = range; - exports.reduce = reduce; - exports.replace = replace; - exports.replaceOrAppend = replaceOrAppend; - exports.retry = retry; - exports.select = select; - exports.series = series; - exports.set = set; - exports.shake = shake; - exports.shift = shift; - exports.shuffle = shuffle; - exports.sift = sift; - exports.sleep = sleep; - exports.snake = snake; - exports.sort = sort; - exports.sum = sum; - exports.template = template; - exports.throttle = throttle; - exports.title = title; - exports.toFloat = toFloat; - exports.toInt = toInt; - exports.toggle = toggle; - exports.trim = trim; - exports.try = tryit; - exports.tryit = tryit; - exports.uid = uid; - exports.unique = unique; - exports.upperize = upperize; - exports.zip = zip; - exports.zipToObject = zipToObject; - - return exports; - -})({}); diff --git a/cdn/radash.min.js b/cdn/radash.min.js deleted file mode 100644 index f9363f50..00000000 --- a/cdn/radash.min.js +++ /dev/null @@ -1 +0,0 @@ -var radash=function(i){"use strict";const E=e=>!!e&&e.constructor===Symbol,w=Array.isArray,k=e=>!!e&&e.constructor===Object,N=e=>e==null||typeof e!="object"&&typeof e!="function",y=e=>!!(e&&e.constructor&&e.call&&e.apply),K=e=>typeof e=="string"||e instanceof String,W=e=>h(e)&&e%1===0,J=e=>h(e)&&e%1!==0,h=e=>{try{return Number(e)===e}catch{return!1}},T=e=>Object.prototype.toString.call(e)==="[object Date]",S=e=>!(!e||!e.then||!y(e.then)),X=e=>{if(e===!0||e===!1||e==null)return!0;if(h(e))return e===0;if(T(e))return isNaN(e.getTime());if(y(e)||E(e))return!1;const t=e.length;if(h(t))return t===0;const n=e.size;return h(n)?n===0:Object.keys(e).length===0},j=(e,t)=>{if(Object.is(e,t))return!0;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof RegExp&&t instanceof RegExp)return e.toString()===t.toString();if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const n=Reflect.ownKeys(e),r=Reflect.ownKeys(t);if(n.length!==r.length)return!1;for(let s=0;se.reduce((n,r)=>{const s=t(r);return n[s]||(n[s]=[]),n[s].push(r),n},{});function H(...e){return!e||!e.length?[]:new Array(Math.max(...e.map(({length:t})=>t))).fill([]).map((t,n)=>e.map(r=>r[n]))}function Q(e,t){if(!e||!e.length)return{};const n=y(t)?t:w(t)?(r,s)=>t[s]:(r,s)=>t;return e.reduce((r,s,u)=>(r[s]=n(s,u),r),{})}const O=(e,t)=>!e||(e.length??0)===0?null:e.reduce(t);function V(e,t){return(e||[]).reduce((n,r)=>n+(t?t(r):r),0)}const G=(e,t=void 0)=>e?.length>0?e[0]:t,x=(e,t=void 0)=>e?.length>0?e[e.length-1]:t,z=(e,t,n=!1)=>{if(!e)return[];const r=(u,c)=>t(u)-t(c),s=(u,c)=>t(c)-t(u);return e.slice().sort(n===!0?s:r)},ee=(e,t,n="asc")=>{if(!e)return[];const r=(u,c)=>`${t(u)}`.localeCompare(t(c)),s=(u,c)=>`${t(c)}`.localeCompare(t(u));return e.slice().sort(n==="desc"?s:r)},te=(e,t)=>e?e.reduce((n,r)=>{const s=t(r);return n[s]=(n[s]??0)+1,n},{}):{},ne=(e,t,n)=>{if(!e)return[];if(t===void 0)return[...e];for(let r=0;rr)=>e.reduce((r,s)=>(r[t(s)]=n(s),r),{}),re=(e,t,n)=>e?e.reduce((r,s,u)=>(n(s,u)&&r.push(t(s,u)),r),[]):[];function se(e,t){const n=t??(r=>r);return O(e,(r,s)=>n(r)>n(s)?r:s)}function ie(e,t){const n=t??(r=>r);return O(e,(r,s)=>n(r){const n=Math.ceil(e.length/t);return new Array(n).fill(null).map((r,s)=>e.slice(s*t,s*t+t))},ce=(e,t)=>{const n=e.reduce((r,s)=>{const u=t?t(s):s;return r[u]||(r[u]=s),r},{});return Object.values(n)};function*A(e,t,n=s=>s,r=1){const s=y(n)?n:()=>n,u=t?e:0,c=t??e;for(let o=u;o<=c&&(yield s(o),!(o+r>c));o+=r);}const C=(e,t,n,r)=>Array.from(A(e,t,n,r)),oe=e=>e.reduce((t,n)=>(t.push(...n),t),[]),fe=(e,t,n)=>{if(!e||!t)return!1;const r=n??(u=>u),s=t.reduce((u,c)=>(u[r(c)]=!0,u),{});return e.some(u=>s[r(u)])},R=(e,t)=>e?e.reduce((n,r)=>{const[s,u]=n;return t(r)?[[...s,r],u]:[s,[...u,r]]},[[],[]]):[[],[]],le=(e,t,n)=>!t&&!e?[]:t?e?n?e.reduce((r,s)=>{const u=t.find(c=>n(s)===n(c));return u?r.push(u):r.push(s),r},[]):e:[]:e,ae=(e,t,n)=>{if(!e&&!t)return[];if(!t)return[...e];if(!e)return[t];for(let r=0;r{if(!e&&!t)return[];if(!e)return[t];if(!t)return[...e];const s=n?(o,a)=>n(o,a)===n(t,a):o=>o===t;return e.find(s)?e.filter((o,a)=>!s(o,a)):(r?.strategy??"append")==="append"?[...e,t]:[t,...e]},ge=e=>e?.filter(t=>!!t)??[],B=(e,t,n)=>{let r=n;for(let s=1;s<=e;s++)r=t(r,s);return r},he=(e,t,n=r=>r)=>{if(!e?.length&&!t?.length)return[];if(e?.length===void 0)return[...t];if(!t?.length)return[...e];const r=t.reduce((s,u)=>(s[n(u)]=!0,s),{});return e.filter(s=>!r[n(s)])};function me(e,t){if(e.length===0)return e;const n=t%e.length;return n===0?e:[...e.slice(-n,e.length),...e.slice(0,-n)]}const we=async(e,t,n)=>{const r=n!==void 0;if(!r&&e?.length<1)throw new Error("Cannot reduce empty array with no init value");const s=r?e:e.slice(1);let u=r?n:e[0];for(const[c,o]of s.entries())u=await t(u,o,c);return u},ye=async(e,t)=>{if(!e)return[];let n=[],r=0;for(const s of e){const u=await t(s,r++);n.push(u)}return n},pe=async e=>{const t=[],n=(u,c)=>t.push({fn:u,rethrow:c?.rethrow??!1}),[r,s]=await m(e)(n);for(const{fn:u,rethrow:c}of t){const[o]=await m(u)(r);if(o&&c)throw o}if(r)throw r;return s};class L extends Error{constructor(t=[]){super();const n=t.find(r=>r.name)?.name??"";this.name=`AggregateError(${n}...)`,this.message=`AggregateError with ${t.length} errors`,this.stack=t.find(r=>r.stack)?.stack??this.stack,this.errors=t}}const be=async(e,t,n)=>{const r=t.map((d,b)=>({index:b,item:d})),s=async d=>{const b=[];for(;;){const f=r.pop();if(!f)return d(b);const[l,g]=await m(n)(f.item);b.push({error:l,result:g,index:f.index})}},u=C(1,e).map(()=>new Promise(s)),c=await Promise.all(u),[o,a]=R(z(c.flat(),d=>d.index),d=>!!d.error);if(o.length>0)throw new L(o.map(d=>d.error));return a.map(d=>d.result)};async function ke(e){const t=w(e)?e.map(s=>[null,s]):Object.entries(e),n=await Promise.all(t.map(([s,u])=>u.then(c=>({result:c,exc:null,key:s})).catch(c=>({result:null,exc:c,key:s})))),r=n.filter(s=>s.exc);if(r.length>0)throw new L(r.map(s=>s.exc));return w(e)?n.map(s=>s.result):n.reduce((s,u)=>({...s,[u.key]:u.result}),{})}const Oe=async(e,t)=>{const n=e?.times??3,r=e?.delay,s=e?.backoff??null;for(const u of A(1,n)){const[c,o]=await m(t)(a=>{throw{_exited:a}});if(!c)return o;if(c._exited)throw c._exited;if(u===n)throw c;r&&await $(r),s&&await $(s(u))}},$=e=>new Promise(t=>setTimeout(t,e)),m=e=>(...t)=>{try{const n=e(...t);return S(n)?n.then(r=>[void 0,r]).catch(r=>[r,void 0]):[void 0,n]}catch(n){return[n,void 0]}},Ae=(e,t)=>{const n=s=>{if(t&&!t(s))throw s},r=s=>s instanceof Promise;try{const s=e();return r(s)?s.catch(n):s}catch(s){return n(s)}};function Ce(...e){return(...t)=>e.slice(1).reduce((n,r)=>r(n),e[0](...t))}function $e(...e){return e.reverse().reduce((t,n)=>n(t))}const Pe=(e,...t)=>(...n)=>e(...t,...n),_e=(e,t)=>n=>e({...t,...n}),Ee=e=>new Proxy({},{get:(t,n)=>e(n)}),Ne=(e,t,n,r)=>function(...u){const c=n?n(...u):JSON.stringify({args:u}),o=e[c];if(o!==void 0&&(!o.exp||o.exp>new Date().getTime()))return o.value;const a=t(...u);return e[c]={exp:r?new Date().getTime()+r:null,value:a},a},Te=(e,t={})=>Ne({},e,t.key??null,t.ttl??null),Se=({delay:e},t)=>{let n,r=!0;const s=(...u)=>{r?(clearTimeout(n),n=setTimeout(()=>{r&&t(...u),n=void 0},e)):t(...u)};return s.isPending=()=>n!==void 0,s.cancel=()=>{r=!1},s.flush=(...u)=>t(...u),s},je=({interval:e},t)=>{let n=!0,r;const s=(...u)=>{n&&(t(...u),n=!1,r=setTimeout(()=>{n=!0,r=void 0},e))};return s.isThrottled=()=>r!==void 0,s},ze=(e,t)=>{const n=()=>{};return new Proxy(Object.assign(n,e),{get:(r,s)=>r[s],set:(r,s,u)=>(r[s]=u,!0),apply:(r,s,u)=>t(Object.assign({},r))(...u)})};function Me(e,t,n){return typeof e=="number"&&typeof t=="number"&&(typeof n>"u"||typeof n=="number")?(typeof n>"u"&&(n=t,t=0),e>=Math.min(t,n)&&e{const n=t===void 0?0:t;if(e==null)return n;const r=parseFloat(e);return isNaN(r)?n:r},Z=(e,t)=>{const n=t===void 0?0:t;if(e==null)return n;const r=parseInt(e);return isNaN(r)?n:r},Be=(e,t=n=>n===void 0)=>e?Object.keys(e).reduce((r,s)=>(t(e[s])||(r[s]=e[s]),r),{}):{},P=(e,t)=>Object.keys(e).reduce((r,s)=>(r[t(s,e[s])]=e[s],r),{}),Le=(e,t)=>Object.keys(e).reduce((r,s)=>(r[s]=t(e[s],s),r),{}),Ze=(e,t)=>e?Object.entries(e).reduce((n,[r,s])=>{const[u,c]=t(r,s);return n[u]=c,n},{}):{},De=e=>e?Object.keys(e).reduce((n,r)=>(n[e[r]]=r,n),{}):{},Fe=e=>P(e,t=>t.toLowerCase()),qe=e=>P(e,t=>t.toUpperCase()),D=e=>{if(N(e))return e;if(typeof e=="function")return e.bind({});const t=new e.constructor;return Object.getOwnPropertyNames(e).forEach(n=>{t[n]=e[n]}),t},Ie=(e,t)=>{if(!e)return[];const n=Object.entries(e);return n.length===0?[]:n.reduce((r,s)=>(r.push(t(s[0],s[1])),r),[])},ve=(e,t)=>e?t.reduce((n,r)=>(Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]),n),{}):{},Ue=(e,t)=>e?!t||t.length===0?e:t.reduce((n,r)=>(delete n[r],n),{...e}):{},F=(e,t,n)=>{const r=t.split(/[\.\[\]]/g);let s=e;for(const u of r){if(s===null||s===void 0)return n;const c=u.replace(/['"]/g,"");c.trim()!==""&&(s=s[c])}return s===void 0?n:s},q=(e,t,n)=>{if(!e)return{};if(!t||n===void 0)return e;const r=t.split(/[\.\[\]]/g).filter(c=>!!c.trim()),s=c=>{if(r.length>1){const o=r.shift(),a=Z(r[0],null)!==null;c[o]=c[o]===void 0?a?[]:{}:c[o],s(c[o])}else c[r[0]]=n},u=D(e);return s(u),u},I=(e,t)=>!e||!t?e??t??{}:Object.entries({...e,...t}).reduce((n,[r,s])=>({...n,[r]:(()=>k(e[r])?I(e[r],s):s)()}),{}),v=e=>{if(!e)return[];const t=(n,r)=>k(n)?Object.entries(n).flatMap(([s,u])=>t(u,[...r,s])):w(n)?n.flatMap((s,u)=>t(s,[...r,`${u}`])):[r.join(".")];return t(e,[])},Ke=e=>e?M(v(e),t=>t,t=>F(e,t)):{},We=e=>e?Object.keys(e).reduce((t,n)=>q(t,n,e[n]),{}):{},_=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),Je=e=>{const t=e.length;if(t===0)return null;const n=_(0,t-1);return e[n]},Xe=e=>e.map(t=>({rand:Math.random(),value:t})).sort((t,n)=>t.rand-n.rand).map(t=>t.value),Ye=(e,t="")=>{const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"+t;return B(e,r=>r+n.charAt(_(0,n.length-1)),"")},He=(e,t=n=>`${n}`)=>{const{indexesByKey:n,itemsByIndex:r}=e.reduce((f,l,g)=>({indexesByKey:{...f.indexesByKey,[t(l)]:g},itemsByIndex:{...f.itemsByIndex,[g]:l}}),{indexesByKey:{},itemsByIndex:{}}),s=(f,l)=>n[t(f)]n[t(f)]>n[t(l)]?f:l,c=()=>r[0],o=()=>r[e.length-1],a=(f,l)=>r[n[t(f)]+1]??l??c(),d=(f,l)=>r[n[t(f)]-1]??l??o();return{min:s,max:u,first:c,last:o,next:a,previous:d,spin:(f,l)=>{if(l===0)return f;const g=Math.abs(l),rt=g>e.length?g%e.length:g;return C(0,rt-1).reduce(U=>l>0?a(U):d(U),f)}}},p=e=>{if(!e||e.length===0)return"";const t=e.toLowerCase();return t.substring(0,1).toUpperCase()+t.substring(1,t.length)},Qe=e=>{const t=e?.replace(/([A-Z])+/g,p)?.split(/(?=[A-Z])|[\.\-\s_]/).map(n=>n.toLowerCase())??[];return t.length===0?"":t.length===1?t[0]:t.reduce((n,r)=>`${n}${r.charAt(0).toUpperCase()}${r.slice(1)}`)},Ve=(e,t)=>{const n=e?.replace(/([A-Z])+/g,p).split(/(?=[A-Z])|[\.\-\s_]/).map(s=>s.toLowerCase())??[];if(n.length===0)return"";if(n.length===1)return n[0];const r=n.reduce((s,u)=>`${s}_${u.toLowerCase()}`);return t?.splitOnNumber===!1?r:r.replace(/([A-Za-z]{1}[0-9]{1})/,s=>`${s[0]}_${s[1]}`)},Ge=e=>{const t=e?.replace(/([A-Z])+/g,p)?.split(/(?=[A-Z])|[\.\-\s_]/).map(n=>n.toLowerCase())??[];return t.length===0?"":t.length===1?t[0]:t.reduce((n,r)=>`${n}-${r.toLowerCase()}`)},xe=e=>{const t=e?.split(/[\.\-\s_]/).map(n=>n.toLowerCase())??[];return t.length===0?"":t.map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")},et=e=>e?e.split(/(?=[A-Z])|[\.\-\s_]/).map(t=>t.trim()).filter(t=>!!t).map(t=>p(t.toLowerCase())).join(" "):"",tt=(e,t,n=/\{\{(.+?)\}\}/g)=>Array.from(e.matchAll(n)).reduce((r,s)=>r.replace(s[0],t[s[1]]),e),nt=(e,t=" ")=>{if(!e)return"";const n=t.replace(/[\W]{1}/g,"\\$&"),r=new RegExp(`^[${n}]+|[${n}]+$`,"g");return e.replace(r,"")};return i.all=ke,i.alphabetical=ee,i.assign=I,i.boil=O,i.callable=ze,i.camel=Qe,i.capitalize=p,i.chain=Ce,i.clone=D,i.cluster=ue,i.compose=$e,i.construct=We,i.counting=te,i.crush=Ke,i.dash=Ge,i.debounce=Se,i.defer=pe,i.diff=he,i.draw=Je,i.first=G,i.flat=oe,i.fork=R,i.get=F,i.group=Y,i.guard=Ae,i.inRange=Me,i.intersects=fe,i.invert=De,i.isArray=w,i.isDate=T,i.isEmpty=X,i.isEqual=j,i.isFloat=J,i.isFunction=y,i.isInt=W,i.isNumber=h,i.isObject=k,i.isPrimitive=N,i.isPromise=S,i.isString=K,i.isSymbol=E,i.iterate=B,i.keys=v,i.last=x,i.list=C,i.listify=Ie,i.lowerize=Fe,i.map=ye,i.mapEntries=Ze,i.mapKeys=P,i.mapValues=Le,i.max=se,i.memo=Te,i.merge=le,i.min=ie,i.objectify=M,i.omit=Ue,i.parallel=be,i.partial=Pe,i.partob=_e,i.pascal=xe,i.pick=ve,i.proxied=Ee,i.random=_,i.range=A,i.reduce=we,i.replace=ne,i.replaceOrAppend=ae,i.retry=Oe,i.select=re,i.series=He,i.set=q,i.shake=Be,i.shift=me,i.shuffle=Xe,i.sift=ge,i.sleep=$,i.snake=Ve,i.sort=z,i.sum=V,i.template=tt,i.throttle=je,i.title=et,i.toFloat=Re,i.toInt=Z,i.toggle=de,i.trim=nt,i.try=m,i.tryit=m,i.uid=Ye,i.unique=ce,i.upperize=qe,i.zip=H,i.zipToObject=Q,i}({}); diff --git a/docs/typed/is-int-string.mdx b/docs/typed/is-int-string.mdx new file mode 100644 index 00000000..cbce3eb2 --- /dev/null +++ b/docs/typed/is-int-string.mdx @@ -0,0 +1,24 @@ +--- +title: isIntString +description: 'Determine if a value is an int in string form' +group: Typed +--- + +## Basic usage + +Pass in a value and get a boolean telling you if the value is an int in string form. + +```ts +import { isIntString } from 'radash' + +isIntString('12') // => true +isIntString('-12') // => true + +isIntString('12.233') // => false +isIntString('12.0') // => false +isIntString('+12') // => false + +isIntString('hello') // => false +isIntString(null) // => false +isIntString(12) // => false +``` diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index cf7d4418..00000000 --- a/jest.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - "roots": [ - "/src" - ], - "testMatch": [ - "**/__tests__/**/*.+(ts|tsx|js)", - "**/?(*.)+(spec|test).+(ts|tsx|js)" - ], - "transform": { - "^.+\\.(ts|tsx)$": "ts-jest" - }, - "coverageThreshold": { - "global": { - "branches": 100, - "functions": 100, - "lines": 100, - "statements": 100 - } - } -} \ No newline at end of file diff --git a/package.json b/package.json index 0f7a54c7..fbb90148 100644 --- a/package.json +++ b/package.json @@ -1,52 +1,110 @@ { - "name": "radash", + "name": "radashi", "version": "12.1.0", "description": "Functional utility library - modern, simple, typed, powerful", - "main": "dist/cjs/index.cjs", - "module": "dist/esm/index.mjs", + "main": "dist/index.js", + "module": "dist/index.mjs", "types": "dist/index.d.ts", "exports": { - "types": "./dist/index.d.ts", - "import": "./dist/esm/index.mjs", - "require": "./dist/cjs/index.cjs" + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./array": { + "import": { + "types": "./dist/array.d.mts", + "default": "./dist/array.mjs" + }, + "types": "./dist/array.d.ts", + "default": "./dist/array.js" + }, + "./async": { + "import": { + "types": "./dist/async.d.mts", + "default": "./dist/async.mjs" + }, + "types": "./dist/async.d.ts", + "default": "./dist/async.js" + }, + "./curry": { + "import": { + "types": "./dist/curry.d.mts", + "default": "./dist/curry.mjs" + }, + "types": "./dist/curry.d.ts", + "default": "./dist/curry.js" + }, + "./object": { + "import": { + "types": "./dist/object.d.mts", + "default": "./dist/object.mjs" + }, + "types": "./dist/object.d.ts", + "default": "./dist/object.js" + }, + "./random": { + "import": { + "types": "./dist/random.d.mts", + "default": "./dist/random.mjs" + }, + "types": "./dist/random.d.ts", + "default": "./dist/random.js" + }, + "./series": { + "import": { + "types": "./dist/series.d.mts", + "default": "./dist/series.mjs" + }, + "types": "./dist/series.d.ts", + "default": "./dist/series.js" + }, + "./string": { + "import": { + "types": "./dist/string.d.mts", + "default": "./dist/string.mjs" + }, + "types": "./dist/string.d.ts", + "default": "./dist/string.js" + }, + "./typed": { + "import": { + "types": "./dist/typed.d.mts", + "default": "./dist/typed.mjs" + }, + "types": "./dist/typed.d.ts", + "default": "./dist/typed.js" + } }, "sideEffects": false, "files": [ "dist" ], "repository": { - "url": "https://github.com/rayepps/radash" + "url": "https://github.com/aleclarson/radashi" }, - "author": "rayepps", + "author": "Alec Larson", "private": false, "license": "MIT", "scripts": { - "test": "jest --coverage", - "check": "yarn lint && yarn test && yarn build", - "build": "yarn tsc --noEmit && yarn rollup -c", - "docs:install": "yarn && yarn add --dev next@12.3.4", - "docs:build": "chiller build --ci", - "lint": "tslint -p tsconfig.json", - "format": "prettier --write \"src/**/*.ts\"", - "format:check": "prettier --check \"src/**/*.ts\" --ignore-unknown" + "dev": "tsup --clean --watch --sourcemap", + "build": "tsup --clean", + "lint": "tsc -p . --noEmit", + "test": "vitest run --coverage", + "docs:install": "pnpm add next@12.3.4 chiller@1.0.0-rc.30 -D", + "docs:build": "chiller build --ci" }, "devDependencies": { - "@rollup/plugin-typescript": "^10.0.1", - "@types/chai": "^4.3.3", - "@types/jest": "^28.1.1", - "chai": "^4.3.6", - "chiller": "^1.0.0-rc.30", - "esbuild": "^0.16.3", - "jest": "^28.1.3", + "@vitest/coverage-v8": "^1.6.0", + "fast-glob": "^3.3.2", "prettier": "^2.7.1", "prettier-plugin-organize-imports": "^3.0.3", - "rollup": "^3.2.5", - "rollup-plugin-dts": "^5.0.0", - "rollup-plugin-esbuild": "^5.0.0", - "rollup-plugin-node-externals": "^5.0.2", - "ts-jest": "^28.0.8", - "tslint": "^6.0.0", - "typescript": "^4.8.4" + "tsup": "^8.1.0", + "typescript": "^4.8.4", + "vitest": "^1.6.0" }, "engines": { "node": ">=14.18.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..1cb0ad6b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2071 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@vitest/coverage-v8': + specifier: ^1.6.0 + version: 1.6.0(vitest@1.6.0(@types/node@20.14.8)) + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + prettier: + specifier: ^2.7.1 + version: 2.8.8 + prettier-plugin-organize-imports: + specifier: ^3.0.3 + version: 3.2.4(prettier@2.8.8)(typescript@4.9.5) + tsup: + specifier: ^8.1.0 + version: 8.1.0(postcss@8.4.38)(typescript@4.9.5) + typescript: + specifier: ^4.8.4 + version: 4.9.5 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.14.8) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@20.14.8': + resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} + + '@vitest/coverage-v8@1.6.0': + resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + peerDependencies: + vitest: 1.6.0 + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bundle-require@4.2.1: + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.4: + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prettier-plugin-organize-imports@3.2.4: + resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.1.0: + resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.3.1: + resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + + '@rollup/rollup-android-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@types/estree@1.0.5': {} + + '@types/node@20.14.8': + dependencies: + undici-types: 5.26.5 + optional: true + + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.8))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.5 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.10 + magicast: 0.3.4 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + test-exclude: 6.0.0 + vitest: 1.6.0(@types/node@20.14.8) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.0 + + acorn@8.12.0: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + array-union@2.1.0: {} + + assertion-error@1.1.0: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bundle-require@4.2.1(esbuild@0.21.5): + dependencies: + esbuild: 0.21.5 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.7: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.0.8 + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-func-name@2.0.2: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.2: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.0 + minimatch: 9.0.4 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + has-flag@4.0.0: {} + + html-escaper@2.0.2: {} + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + ignore@5.3.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.4: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.5 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.0: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + js-tokens@9.0.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + local-pkg@0.5.0: + dependencies: + mlly: 1.7.1 + pkg-types: 1.1.1 + + lodash.sortby@4.7.0: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.2.2: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + source-map-js: 1.2.0 + + make-dir@4.0.0: + dependencies: + semver: 7.6.2 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mlly@1.7.1: + dependencies: + acorn: 8.12.0 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + + ms@2.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + package-json-from-dist@1.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pirates@4.0.6: {} + + pkg-types@1.1.1: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + + postcss-load-config@4.0.2(postcss@8.4.38): + dependencies: + lilconfig: 3.1.2 + yaml: 2.4.5 + optionalDependencies: + postcss: 8.4.38 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@4.9.5): + dependencies: + prettier: 2.8.8 + typescript: 4.9.5 + + prettier@2.8.8: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-is@18.3.1: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve-from@5.0.0: {} + + reusify@1.0.4: {} + + rollup@4.18.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + semver@7.6.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.0: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.2 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.8.0: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.1.0(postcss@8.4.38)(typescript@4.9.5): + dependencies: + bundle-require: 4.2.1(esbuild@0.21.5) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.5 + esbuild: 0.21.5 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2(postcss@8.4.38) + resolve-from: 5.0.0 + rollup: 4.18.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + - ts-node + + type-detect@4.0.8: {} + + typescript@4.9.5: {} + + ufo@1.5.3: {} + + undici-types@5.26.5: + optional: true + + vite-node@1.6.0(@types/node@20.14.8): + dependencies: + cac: 6.7.14 + debug: 4.3.5 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.3.1(@types/node@20.14.8) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite@5.3.1(@types/node@20.14.8): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 20.14.8 + fsevents: 2.3.3 + + vitest@1.6.0(@types/node@20.14.8): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 + chai: 4.4.1 + debug: 4.3.5 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.3.1(@types/node@20.14.8) + vite-node: 1.6.0(@types/node@20.14.8) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.14.8 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + yaml@2.4.5: {} + + yocto-queue@1.0.0: {} diff --git a/radashi.png b/radashi.png new file mode 100644 index 00000000..c2411c16 Binary files /dev/null and b/radashi.png differ diff --git a/rollup.config.mjs b/rollup.config.mjs deleted file mode 100644 index c32740f6..00000000 --- a/rollup.config.mjs +++ /dev/null @@ -1,123 +0,0 @@ -// rollup.config.mjs -import typescript from '@rollup/plugin-typescript' -import dts from 'rollup-plugin-dts' -import esbuild, { minify } from 'rollup-plugin-esbuild' -import externals from 'rollup-plugin-node-externals' - -const usePreferConst = true // Use "const" instead of "var" -const usePreserveModules = true // `true` -> keep modules structure, `false` -> combine everything into a single file -const useStrict = true // Use "strict" -const useThrowOnError = true // On error throw and exception -const useSourceMap = true // Generate source map files -const useEsbuild = true // `true` -> use esbuild, `false` use tsc - -export default [ - { - // .d.ts build - input: 'src/index.ts', - output: { - file: 'dist/index.d.ts', - format: 'es' - }, - plugins: [externals(), dts()] - }, - { - // CJS build - input: 'src/index.ts', - output: { - dir: 'dist/cjs', - format: 'cjs', - generatedCode: { - constBindings: usePreferConst - }, - preserveModules: usePreserveModules, - strict: useStrict, - entryFileNames: '[name].cjs', - sourcemap: useSourceMap - }, - plugins: [ - externals(), - useEsbuild - ? esbuild() - : typescript({ - noEmitOnError: useThrowOnError, - outDir: 'dist/cjs', - removeComments: true - }) - ] - }, - { - // ESM builds - input: 'src/index.ts', - output: { - dir: 'dist/esm', - format: 'es', - generatedCode: { - constBindings: usePreferConst - }, - preserveModules: usePreserveModules, - strict: useStrict, - entryFileNames: '[name].mjs', - sourcemap: useSourceMap - }, - plugins: [ - externals(), - useEsbuild - ? esbuild() - : typescript({ - noEmitOnError: useThrowOnError, - outDir: 'dist/esm', - removeComments: true - }) - ] - }, - { - // CDN build - input: 'src/index.ts', - output: [ - { - format: 'iife', - generatedCode: { - constBindings: usePreferConst - }, - preserveModules: false, - strict: useStrict, - file: 'cdn/radash.js', - name: 'radash', - sourcemap: false - }, - { - format: 'iife', - generatedCode: { - constBindings: usePreferConst - }, - preserveModules: false, - strict: useStrict, - file: 'cdn/radash.min.js', - name: 'radash', - sourcemap: false, - plugins: [minify()] - }, - { - format: 'es', - generatedCode: { - constBindings: usePreferConst - }, - preserveModules: false, - strict: useStrict, - file: 'cdn/radash.esm.js', - sourcemap: false - } - ], - plugins: [ - externals(), - useEsbuild - ? esbuild() - : typescript({ - noEmitOnError: useThrowOnError, - outDir: 'cdn', - removeComments: true - }) - ] - } -] \ No newline at end of file diff --git a/src/async.ts b/src/async.ts index 72864df0..867404c4 100644 --- a/src/async.ts +++ b/src/async.ts @@ -1,6 +1,8 @@ import { fork, list, range, sort } from './array' import { isArray, isPromise } from './typed' +declare const setTimeout: (fn: () => void, ms: number) => unknown + /** * An async reduce function. Works like the * built-in Array.reduce function but handles @@ -233,28 +235,24 @@ export const retry = async ( const times = options?.times ?? 3 const delay = options?.delay const backoff = options?.backoff ?? null - for (const i of range(1, times)) { + let i = 0 + while (true) { const [err, result] = (await tryit(func)((err: any) => { throw { _exited: err } })) as [any, TResponse] if (!err) return result if (err._exited) throw err._exited - if (i === times) throw err + if (++i === times) throw err if (delay) await sleep(delay) if (backoff) await sleep(backoff(i)) } - // Logically, we should never reach this - // code path. It makes the function meet - // strict mode requirements. - /* istanbul ignore next */ - return undefined as unknown as TResponse } /** * Async wait */ export const sleep = (milliseconds: number) => { - return new Promise(res => setTimeout(res, milliseconds)) + return new Promise(res => setTimeout(res, milliseconds)) } /** diff --git a/src/curry.ts b/src/curry.ts index 2725ea53..1f19000e 100644 --- a/src/curry.ts +++ b/src/curry.ts @@ -1,3 +1,6 @@ +declare const setTimeout: (fn: () => void, ms: number) => unknown +declare const clearTimeout: (timer: unknown) => void + export function chain( f1: (...arg: T1) => T2, f2: (arg: T2) => T3 @@ -515,7 +518,7 @@ export const debounce = ( { delay }: { delay: number }, func: (...args: TArgs) => any ) => { - let timer: NodeJS.Timeout | undefined = undefined + let timer: unknown = undefined let active = true const debounced: DebounceFunction = (...args: TArgs) => { @@ -550,7 +553,7 @@ export const throttle = ( func: (...args: TArgs) => any ) => { let ready = true - let timer: NodeJS.Timeout | undefined = undefined + let timer: unknown = undefined const throttled: ThrottledFunction = (...args: TArgs) => { if (!ready) return diff --git a/src/index.ts b/src/index.ts index 9dff2e21..03b14d7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,6 +93,7 @@ export { isFloat, isFunction, isInt, + isIntString, isNumber, isObject, isPrimitive, diff --git a/src/object.ts b/src/object.ts index 5561da2a..1c912f5e 100644 --- a/src/object.ts +++ b/src/object.ts @@ -15,19 +15,17 @@ type UppercasedKeys> = { * object. Optional second argument shakes out values * by custom evaluation. */ -export const shake = ( +export const shake = ( obj: T, - filter: (value: any) => boolean = x => x === undefined -): Omit => { + filter = (value: T[keyof T]): boolean => value === undefined +): T => { if (!obj) return {} as T const keys = Object.keys(obj) as (keyof T)[] return keys.reduce((acc, key) => { - if (filter(obj[key])) { - return acc - } else { + if (!filter(obj[key])) { acc[key] = obj[key] - return acc } + return acc }, {} as T) } diff --git a/src/tests/array.test.ts b/src/tests/array.test.ts index 15b1fc88..a7fc71b0 100644 --- a/src/tests/array.test.ts +++ b/src/tests/array.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' const NULL = null as unknown as unknown[] @@ -14,10 +14,10 @@ describe('array module', () => { { group: 'c', word: 'ok' } ] const groups = _.group(list, x => x.group) - assert.equal(groups.a?.length, 2) - assert.equal(groups.b?.length, 2) - assert.equal(groups.c?.length, 1) - assert.equal(groups.c?.[0].word, 'ok') + expect(groups.a?.length).toBe(2) + expect(groups.b?.length).toBe(2) + expect(groups.c?.length).toBe(1) + expect(groups.c?.[0].word).toBe('ok') }) }) @@ -31,27 +31,27 @@ describe('array module', () => { { game: 'e', score: 500 } ] const result = _.boil(list, (a, b) => (a.score > b.score ? a : b)) - assert.equal(result!.game, 'e') - assert.equal(result!.score, 500) + expect(result!.game).toBe('e') + expect(result!.score).toBe(500) }) test('does not fail when provided array is empty', () => { const result = _.boil([], () => true) - assert.isNull(result) + expect(result).toBeNull() }) test('does not fail when provided array is null', () => { const result = _.boil(null as unknown as readonly boolean[], () => true) - assert.isNull(result) + expect(result).toBeNull() }) test('does not fail when provided array is funky shaped', () => { const result = _.boil({} as any, () => true) - assert.isNull(result) + expect(result).toBeNull() }) }) describe('zip function', () => { test('zips an array correctly', () => { const result = _.zip(['a', 'b'], [1, 2], [true, false]) - assert.deepEqual(result, [ + expect(result).toEqual([ ['a', 1, true], ['b', 2, false] ]) @@ -60,30 +60,30 @@ describe('array module', () => { test('returns an empty array if nothing is passed', () => { // @ts-ignore const result = _.zip() - assert.deepEqual(result, []) + expect(result).toEqual([]) }) }) describe('zipToObject function', () => { test('zips to an object correctly', () => { const result = _.zipToObject(['a', 'b'], [1, 2]) - assert.deepEqual(result, { a: 1, b: 2 }) + expect(result).toEqual({ a: 1, b: 2 }) }) test('zips to an object with custom map function', () => { const result = _.zipToObject(['a', 'b'], (k, i) => k + i) - assert.deepEqual(result, { a: 'a0', b: 'b1' }) + expect(result).toEqual({ a: 'a0', b: 'b1' }) }) test('zips to an object with only one value', () => { const result = _.zipToObject(['a', 'b'], 1) - assert.deepEqual(result, { a: 1, b: 1 }) + expect(result).toEqual({ a: 1, b: 1 }) }) test('returns an empty object if bad parameters are passed', () => { // @ts-ignore const result = _.zipToObject() - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) }) @@ -91,16 +91,16 @@ describe('array module', () => { test('adds list of number correctly', () => { const list = [5, 5, 10, 2] const result = _.sum(list) - assert.equal(result, 22) + expect(result).toBe(22) }) test('adds list of objects correctly using getter fn', () => { const list = [{ value: 5 }, { value: 5 }, { value: 10 }, { value: 2 }] const result = _.sum(list, x => x.value) - assert.equal(result, 22) + expect(result).toBe(22) }) test('gracefully handles null input list', () => { const result = _.sum(null as unknown as readonly number[]) - assert.equal(result, 0) + expect(result).toBe(0) }) }) @@ -111,17 +111,17 @@ describe('array module', () => { { game: 'b', score: 200 } ] const result = _.first(list) - assert.equal(result!.game, 'a') - assert.equal(result!.score, 100) + expect(result!.game).toBe('a') + expect(result!.score).toBe(100) }) test('returns default value without error when list is empty', () => { const list = [] as string[] const result = _.first(list, 'yolo') - assert.equal(result, 'yolo') + expect(result).toBe('yolo') }) test('gracefully handles null input list', () => { const result = _.first(NULL) - assert.equal(result, null) + expect(result).toBeUndefined() }) }) @@ -132,17 +132,17 @@ describe('array module', () => { { game: 'b', score: 200 } ] const result = _.last(list) - assert.equal(result!.game, 'b') - assert.equal(result!.score, 200) + expect(result!.game).toBe('b') + expect(result!.score).toBe(200) }) test('returns default value without error when list is empty', () => { const list = [] as string[] const result = _.last(list, 'yolo') - assert.equal(result, 'yolo') + expect(result).toBe('yolo') }) test('gracefully handles null input list', () => { const result = _.last(NULL) - assert.equal(result, null) + expect(result).toBeUndefined() }) }) @@ -150,20 +150,20 @@ describe('array module', () => { test('uses getter', () => { const list = [{ index: 2 }, { index: 0 }, { index: 1 }] const result = _.sort(list, i => i.index) - assert.equal(result[0].index, 0) - assert.equal(result[1].index, 1) - assert.equal(result[2].index, 2) + expect(result[0].index).toBe(0) + expect(result[1].index).toBe(1) + expect(result[2].index).toBe(2) }) test('uses descending order', () => { const list = [{ index: 2 }, { index: 0 }, { index: 1 }] const result = _.sort(list, i => i.index, true) - assert.equal(result[0].index, 2) - assert.equal(result[1].index, 1) - assert.equal(result[2].index, 0) + expect(result[0].index).toBe(2) + expect(result[1].index).toBe(1) + expect(result[2].index).toBe(0) }) test('gracefully handles null input list', () => { const result = _.sort(null as any as number[], x => x) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) }) @@ -174,15 +174,15 @@ describe('array module', () => { 'x', () => false ) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns the list for an undefined new item', () => { const result = _.replace(['a'], undefined, () => true) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('returns replaced item when value is null', () => { const result = _.replace(['a'], null, i => i === 'a') - assert.deepEqual(result, [null]) + expect(result).toEqual([null]) }) test('returns replaced item by index', () => { const result = _.replace( @@ -190,7 +190,7 @@ describe('array module', () => { 'BB', (letter, idx) => idx === 1 ) - assert.equal(result[1], 'BB') + expect(result[1]).toBe('BB') }) test('returns copy of list with replaced item', () => { const list = [ @@ -202,8 +202,8 @@ describe('array module', () => { { game: 'x', score: 800 }, item => item.game === 'a' ) - assert.equal(result[0].game, 'x') - assert.equal(list[1].game, 'b') + expect(result[0].game).toBe('x') + expect(list[1].game).toBe('b') }) test('returns copy of list without changing', () => { const list = [ @@ -215,8 +215,8 @@ describe('array module', () => { { game: 'x', score: 800 }, item => item.game === 'XX' ) - assert.equal(result[0].game, 'a') - assert.equal(list[1].game, 'b') + expect(result[0].game).toBe('a') + expect(list[1].game).toBe('b') }) }) @@ -234,8 +234,8 @@ describe('array module', () => { x => x.id, x => x ) - assert.equal(result.a.word, 'hello') - assert.equal(result.b.word, 'bye') + expect(result.a.word).toBe('hello') + expect(result.b.word).toBe('bye') }) test('does not fail on empty input list', () => { const result = _.objectify( @@ -243,11 +243,11 @@ describe('array module', () => { (x: any) => x.id, x => x ) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('defaults value to array item', () => { const result = _.objectify(list.slice(0, 1), x => x.id) - assert.deepEqual(result, { + expect(result).toEqual({ a: { id: 'a', word: 'hello' } }) }) @@ -255,22 +255,20 @@ describe('array module', () => { describe('select function', () => { test('does not fail on bad input', () => { - assert.deepEqual( + expect( _.select( null as unknown as any[], x => x, x => x - ), - [] - ) - assert.deepEqual( + ) + ).toEqual([]) + expect( _.select( undefined as unknown as any[], x => x, x => x - ), - [] - ) + ) + ).toEqual([]) }) test('returns mapped and filtered values', () => { const list = [ @@ -285,7 +283,7 @@ describe('array module', () => { x => x.word, x => x.group === 'a' ) - assert.deepEqual(result, ['hello', 'oh']) + expect(result).toEqual(['hello', 'oh']) }) test('does not fail on empty input list', () => { const list: any[] = [] @@ -294,7 +292,7 @@ describe('array module', () => { (x: any) => x.word, x => x.group === 'a' ) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('works with index', () => { const letters = ['a', 'b', 'c', 'd'] @@ -303,7 +301,7 @@ describe('array module', () => { (l, idx) => `${l}${idx}`, (l, idx) => idx > 1 ) - assert.deepEqual(result, ['c2', 'd3']) + expect(result).toEqual(['c2', 'd3']) }) }) @@ -311,7 +309,7 @@ describe('array module', () => { test('returns the max value from list of number', () => { const list = [5, 5, 10, 2] const result = _.max(list) - assert.equal(result, 10) + expect(result).toBe(10) }) test('returns the max value from list of objects', () => { const list = [ @@ -322,8 +320,8 @@ describe('array module', () => { { game: 'e', score: 500 } ] const result = _.max(list, x => x.score) - assert.equal(result!.game, 'e') - assert.equal(result!.score, 500) + expect(result!.game).toBe('e') + expect(result!.score).toBe(500) }) }) @@ -331,7 +329,7 @@ describe('array module', () => { test('returns the min value from list of number', () => { const list = [5, 5, 10, 2] const result = _.min(list) - assert.equal(result, 2) + expect(result).toBe(2) }) test('returns the min value from list of objects', () => { const list = [ @@ -342,8 +340,8 @@ describe('array module', () => { { game: 'e', score: 500 } ] const result = _.min(list, x => x.score) - assert.equal(result!.game, 'a') - assert.equal(result!.score, 100) + expect(result!.game).toBe('a') + expect(result!.score).toBe(100) }) }) @@ -352,18 +350,18 @@ describe('array module', () => { const list = [1, 1, 1, 1, 1, 1, 1, 1] const result = _.cluster(list) const [a, b, c] = result - assert.deepEqual(a, [1, 1]) - assert.deepEqual(b, [1, 1]) - assert.deepEqual(c, [1, 1]) + expect(a).toEqual([1, 1]) + expect(b).toEqual([1, 1]) + expect(c).toEqual([1, 1]) }) test('returns remainder in final cluster', () => { const list = [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2] const result = _.cluster(list, 3) const [a, b, c, d] = result - assert.deepEqual(a, [1, 1, 1]) - assert.deepEqual(b, [1, 1, 1]) - assert.deepEqual(c, [1, 1, 1]) - assert.deepEqual(d, [2, 2]) + expect(a).toEqual([1, 1, 1]) + expect(b).toEqual([1, 1, 1]) + expect(c).toEqual([1, 1, 1]) + expect(d).toEqual([2, 2]) }) }) @@ -371,7 +369,7 @@ describe('array module', () => { test('correctly removed duplicate items', () => { const list = [1, 1, 2] const result = _.unique(list) - assert.deepEqual(result, [1, 2]) + expect(result).toEqual([1, 2]) }) test('uses key fn to correctly remove duplicate items', () => { const list = [ @@ -383,12 +381,12 @@ describe('array module', () => { ] const result = _.unique(list, x => x.id) const [a, b, c] = result - assert.equal(a.id, 'a') - assert.equal(a.word, 'hello') - assert.equal(b.id, 'b') - assert.equal(b.word, 'oh') - assert.equal(c.id, 'c') - assert.equal(c.word, 'yolo') + expect(a.id).toBe('a') + expect(a.word).toBe('hello') + expect(b.id).toBe('b') + expect(b.word).toBe('oh') + expect(c.id).toBe('c') + expect(c.word).toBe('yolo') }) }) @@ -401,55 +399,43 @@ describe('array module', () => { } test('yields expected values', () => { - assert.deepEqual(toList(_.range(0, 4)), [0, 1, 2, 3, 4]) - assert.deepEqual(toList(_.range(3)), [0, 1, 2, 3]) - assert.deepEqual(toList(_.range(0, 3)), [0, 1, 2, 3]) - assert.deepEqual(toList(_.range(0, 3, 'y')), ['y', 'y', 'y', 'y']) - assert.deepEqual(toList(_.range(0, 3, () => 'y')), ['y', 'y', 'y', 'y']) - assert.deepEqual(toList(_.range(0, 3, i => i)), [0, 1, 2, 3]) - assert.deepEqual(toList(_.range(0, 3, i => `y${i}`)), [ + expect(toList(_.range(0, 4))).toEqual([0, 1, 2, 3, 4]) + expect(toList(_.range(3))).toEqual([0, 1, 2, 3]) + expect(toList(_.range(0, 3))).toEqual([0, 1, 2, 3]) + expect(toList(_.range(0, 3, 'y'))).toEqual(['y', 'y', 'y', 'y']) + expect(toList(_.range(0, 3, () => 'y'))).toEqual(['y', 'y', 'y', 'y']) + expect(toList(_.range(0, 3, i => i))).toEqual([0, 1, 2, 3]) + expect(toList(_.range(0, 3, i => `y${i}`))).toEqual([ 'y0', 'y1', 'y2', 'y3' ]) - assert.deepEqual(toList(_.range(0, 3, obj)), [obj, obj, obj, obj]) - assert.deepEqual(toList(_.range(0, 6, i => i, 2)), [0, 2, 4, 6]) + expect(toList(_.range(0, 3, obj))).toEqual([obj, obj, obj, obj]) + expect(toList(_.range(0, 6, i => i, 2))).toEqual([0, 2, 4, 6]) }) }) describe('list function', () => { const obj = { name: 'radash' } test('creates correct list', () => { - assert.deepEqual(_.list(0, 4), [0, 1, 2, 3, 4]) - assert.deepEqual(_.list(3), [0, 1, 2, 3]) - assert.deepEqual(_.list(0, 3), [0, 1, 2, 3]) - assert.deepEqual(_.list(0, 3, 'y'), ['y', 'y', 'y', 'y']) - assert.deepEqual( - _.list(0, 3, () => 'y'), - ['y', 'y', 'y', 'y'] - ) - assert.deepEqual( - _.list(0, 3, i => i), - [0, 1, 2, 3] - ) - assert.deepEqual( - _.list(0, 3, i => `y${i}`), - ['y0', 'y1', 'y2', 'y3'] - ) - assert.deepEqual(_.list(0, 3, obj), [obj, obj, obj, obj]) - assert.deepEqual( - _.list(0, 6, i => i, 2), - [0, 2, 4, 6] - ) + expect(_.list(0, 4)).toEqual([0, 1, 2, 3, 4]) + expect(_.list(3)).toEqual([0, 1, 2, 3]) + expect(_.list(0, 3)).toEqual([0, 1, 2, 3]) + expect(_.list(0, 3, 'y')).toEqual(['y', 'y', 'y', 'y']) + expect(_.list(0, 3, () => 'y')).toEqual(['y', 'y', 'y', 'y']) + expect(_.list(0, 3, i => i)).toEqual([0, 1, 2, 3]) + expect(_.list(0, 3, i => `y${i}`)).toEqual(['y0', 'y1', 'y2', 'y3']) + expect(_.list(0, 3, obj)).toEqual([obj, obj, obj, obj]) + expect(_.list(0, 6, i => i, 2)).toEqual([0, 2, 4, 6]) }) test('omits end if step does not land on it', () => { const result = _.list(0, 5, i => i, 2) - assert.deepEqual(result, [0, 2, 4]) + expect(result).toEqual([0, 2, 4]) }) test('returns start only if step larger than end', () => { const result = _.list(0, 5, i => i, 20) - assert.deepEqual(result, [0]) + expect(result).toEqual([0]) }) }) @@ -457,9 +443,9 @@ describe('array module', () => { test('returns all items in all arrays', () => { const lists = [['a', 'b'], ['c', 'd'], ['e']] const result = _.flat(lists) - assert.deepEqual(result, ['a', 'b', 'c', 'd', 'e']) - assert.equal(result[0], 'a') - assert.equal(result[4], 'e') + expect(result).toEqual(['a', 'b', 'c', 'd', 'e']) + expect(result[0]).toBe('a') + expect(result[4]).toBe('e') }) }) @@ -468,36 +454,36 @@ describe('array module', () => { const listA = ['a', 'b'] const listB = [1, 2, 'b', 'x'] const result = _.intersects(listA, listB) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns false if list a & b have no items in common', () => { const listA = ['a', 'b', 'c'] const listB = ['x', 'y'] const result = _.intersects(listA, listB) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true using custom identity', () => { const listA = [{ value: 23 }, { value: 12 }] const listB = [{ value: 12 }] const result = _.intersects(listA, listB, x => x.value) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns false without failing if either list is null', () => { - assert.isFalse(_.intersects(null as unknown as never, [])) - assert.isFalse(_.intersects([], null as unknown as never)) + expect(_.intersects(null as unknown as never, [])).toBeFalsy() + expect(_.intersects([], null as unknown as never)).toBeFalsy() }) }) describe('fork function', () => { test('returns two empty arrays for null input', () => { const [a, b] = _.fork(NULL, x => !!x) - assert.deepEqual(a, []) - assert.deepEqual(b, []) + expect(a).toEqual([]) + expect(b).toEqual([]) }) test('returns two empty arrays for one empty array input', () => { const [a, b] = _.fork([], x => !!x) - assert.deepEqual(a, []) - assert.deepEqual(b, []) + expect(a).toEqual([]) + expect(b).toEqual([]) }) test('returns correctly forked list', () => { const input = [ @@ -507,33 +493,33 @@ describe('array module', () => { { name: 'mary', group: 'Y' } ] const [xs, ys] = _.fork(input, x => x.group === 'X') - assert.lengthOf(xs, 2) - assert.lengthOf(ys, 2) + expect(xs).toHaveLength(2) + expect(ys).toHaveLength(2) const [r, s] = xs - assert.equal(r.name, 'ray') - assert.equal(s.name, 'sara') + expect(r.name).toBe('ray') + expect(s.name).toBe('sara') const [b, m] = ys - assert.equal(b.name, 'bo') - assert.equal(m.name, 'mary') + expect(b.name).toBe('bo') + expect(m.name).toBe('mary') }) }) describe('merge function', () => { test('returns empty array for two null inputs', () => { const result = _.merge(NULL, NULL, x => '') - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns an empty array for two empty array inputs', () => { const result = _.merge([], [], x => '') - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns root for a null other input', () => { const result = _.merge([], NULL, x => '') - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns empty array for a null root input', () => { const result = _.merge(NULL, [], x => '') - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns root for a null matcher input', () => { const result = _.merge( @@ -541,7 +527,7 @@ describe('array module', () => { [], null as unknown as (x: string) => string ) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('returns correctly mergeped lists', () => { const inputA = [ @@ -555,10 +541,10 @@ describe('array module', () => { { name: 'mary', group: 'YYY' } ] const result = _.merge(inputA, inputB, x => x.name) - assert.equal(result[0].group, 'XXX') - assert.equal(result[1].group, 'X') - assert.equal(result[2].group, 'Y') - assert.equal(result[3].group, 'YYY') + expect(result[0].group).toBe('XXX') + expect(result[1].group).toBe('X') + expect(result[2].group).toBe('Y') + expect(result[3].group).toBe('YYY') }) }) @@ -570,15 +556,15 @@ describe('array module', () => { const lettersXX = ['a', 'b', 'c', 'd', 'e', 'XX'] test('returns empty array for two null inputs', () => { const result = _.replaceOrAppend(NULL, null, x => false) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns array with new item for null list input', () => { const result = _.replaceOrAppend(NULL, 'a', x => false) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('returns list for null new item input', () => { const result = _.replaceOrAppend(['a'], null, x => false) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('returns list with item replacing match by index', () => { const result = _.replaceOrAppend( @@ -586,23 +572,23 @@ describe('array module', () => { 'BB', (letter, idx) => idx === 1 ) - assert.equal(result[1], 'BB') + expect(result[1]).toBe('BB') }) test('returns list with item replacing match', () => { const result = _.replaceOrAppend(letters, 'XA', x => x === 'a') - assert.deepEqual(result, lettersXA) + expect(result).toEqual(lettersXA) }) test('returns list with item replacing match in middle', () => { const result = _.replaceOrAppend(letters, 'XC', x => x === 'c') - assert.deepEqual(result, lettersXC) + expect(result).toEqual(lettersXC) }) test('returns list with item replacing match at end', () => { const result = _.replaceOrAppend(letters, 'XE', x => x === 'e') - assert.deepEqual(result, lettersXE) + expect(result).toEqual(lettersXE) }) test('returns list with item appended', () => { const result = _.replaceOrAppend(letters, 'XX', x => x === 'x') - assert.deepEqual(result, lettersXX) + expect(result).toEqual(lettersXX) }) }) @@ -610,45 +596,45 @@ describe('array module', () => { const people = [null, 'hello', undefined, false, 23] test('returns empty array for null input array', () => { const result = _.sift(NULL) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('returns array with falsy values filtered out', () => { const result = _.sift(people) - assert.deepEqual(result, ['hello', 23]) + expect(result).toEqual(['hello', 23]) }) }) describe('iterate function', () => { test('iterates correct number of times', () => { const result = _.iterate(5, (acc, idx) => acc + idx, 0) - assert.equal(result, 15) + expect(result).toBe(15) }) }) describe('diff function', () => { test('handles null root', () => { const result = _.diff(NULL, ['a']) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('handles null other', () => { const result = _.diff(['a'], NULL) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('handles null inputs', () => { const result = _.diff(NULL, NULL) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('handles empty array root', () => { const result = _.diff([], ['a']) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('handles empty array other', () => { const result = _.diff(['a'], []) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('returns all items from root that dont exist in other', () => { const result = _.diff(['a', 'b', 'c'], ['c', 'd', 'e']) - assert.deepEqual(result, ['a', 'b']) + expect(result).toEqual(['a', 'b']) }) test('uses identity function', () => { const identity = ({ letter }: { letter: string }) => letter @@ -658,7 +644,7 @@ describe('array module', () => { [letter('c'), letter('d'), letter('e')], identity ) - assert.deepEqual(result, [letter('a'), letter('b')]) + expect(result).toEqual([letter('a'), letter('b')]) }) }) @@ -666,20 +652,20 @@ describe('array module', () => { test('uses getter', () => { const list = [{ name: 'Leo' }, { name: 'AJ' }, { name: 'Cynthia' }] const result = _.alphabetical(list, i => i.name) - assert.equal(result[0].name, 'AJ') - assert.equal(result[1].name, 'Cynthia') - assert.equal(result[2].name, 'Leo') + expect(result[0].name).toBe('AJ') + expect(result[1].name).toBe('Cynthia') + expect(result[2].name).toBe('Leo') }) test('uses descending order', () => { const list = [{ name: 'Leo' }, { name: 'AJ' }, { name: 'Cynthia' }] const result = _.alphabetical(list, i => i.name, 'desc') - assert.equal(result[0].name, 'Leo') - assert.equal(result[1].name, 'Cynthia') - assert.equal(result[2].name, 'AJ') + expect(result[0].name).toBe('Leo') + expect(result[1].name).toBe('Cynthia') + expect(result[2].name).toBe('AJ') }) test('gracefully handles null input list', () => { const result = _.alphabetical(null as any as string[], x => x) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) }) @@ -692,14 +678,18 @@ describe('array module', () => { ] test('returns correctly counted items object', () => { const result = _.counting(people, p => p.group) - assert.deepEqual(result, { + expect(result).toEqual({ X: 2, Y: 2 }) }) test('does not error on bad input', () => { - _.counting(null as unknown as number[], x => x) - _.counting(undefined as unknown as number[], x => x) + expect(() => + _.counting(null as unknown as number[], x => x) + ).not.toThrow() + expect(() => + _.counting(undefined as unknown as number[], x => x) + ).not.toThrow() }) }) @@ -707,58 +697,58 @@ describe('array module', () => { const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] test('should shift array right 3 positions', () => { const result = _.shift(arr, 3) - assert.deepEqual(result, [7, 8, 9, 1, 2, 3, 4, 5, 6]) + expect(result).toEqual([7, 8, 9, 1, 2, 3, 4, 5, 6]) }) test('should shift array left 3 positions', () => { const result = _.shift(arr, -3) - assert.deepEqual(result, [4, 5, 6, 7, 8, 9, 1, 2, 3]) + expect(result).toEqual([4, 5, 6, 7, 8, 9, 1, 2, 3]) }) test('should shift array right 6 positions', () => { const result = _.shift(arr, 15) - assert.deepEqual(result, [4, 5, 6, 7, 8, 9, 1, 2, 3]) + expect(result).toEqual([4, 5, 6, 7, 8, 9, 1, 2, 3]) }) test('should shift array left 6 positions', () => { const result = _.shift(arr, -15) - assert.deepEqual(result, [7, 8, 9, 1, 2, 3, 4, 5, 6]) + expect(result).toEqual([7, 8, 9, 1, 2, 3, 4, 5, 6]) }) test('should keep array as is', () => { const result = _.shift(arr, 0) - assert.deepEqual(result, [1, 2, 3, 4, 5, 6, 7, 8, 9]) + expect(result).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]) }) test('should keep array as is', () => { const result = _.shift(arr, 9) - assert.deepEqual(result, [1, 2, 3, 4, 5, 6, 7, 8, 9]) + expect(result).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]) }) test('should return empty array', () => { const results = _.shift([], 0) - assert.deepEqual(results, []) + expect(results).toEqual([]) }) test('should return empty array', () => { const results = _.shift([], 10) - assert.deepEqual(results, []) + expect(results).toEqual([]) }) }) describe('toggle function', () => { test('should handle null input list', () => { const result = _.toggle(null as unknown as any[], 'a') - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('should handle null input list and null item', () => { const result = _.toggle(null as unknown as any[], null) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('should handle null item', () => { const result = _.toggle(['a'], null) - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('should add item when it does not exist using default matcher', () => { const result = _.toggle(['a'], 'b') - assert.deepEqual(result, ['a', 'b']) + expect(result).toEqual(['a', 'b']) }) test('should remove item when it does exist using default matcher', () => { const result = _.toggle(['a', 'b'], 'b') - assert.deepEqual(result, ['a']) + expect(result).toEqual(['a']) }) test('should remove item when it does exist using custom matcher', () => { const result = _.toggle( @@ -766,15 +756,15 @@ describe('array module', () => { { value: 'b' }, v => v.value ) - assert.deepEqual(result, [{ value: 'a' }]) + expect(result).toEqual([{ value: 'a' }]) }) test('should add item when it does not exist using custom matcher', () => { const result = _.toggle([{ value: 'a' }], { value: 'b' }, v => v.value) - assert.deepEqual(result, [{ value: 'a' }, { value: 'b' }]) + expect(result).toEqual([{ value: 'a' }, { value: 'b' }]) }) test('should prepend item when strategy is set', () => { const result = _.toggle(['a'], 'b', null, { strategy: 'prepend' }) - assert.deepEqual(result, ['b', 'a']) + expect(result).toEqual(['b', 'a']) }) }) }) diff --git a/src/tests/async.test.ts b/src/tests/async.test.ts index e67aa3d0..c7f73dfc 100644 --- a/src/tests/async.test.ts +++ b/src/tests/async.test.ts @@ -1,9 +1,11 @@ -import { assert } from 'chai' +import { expect, vi } from 'vitest' import * as _ from '..' import { AggregateError } from '../async' describe('async module', () => { - beforeEach(() => jest.useFakeTimers({ advanceTimers: true })) + beforeEach(() => { + vi.useFakeTimers({ shouldAdvanceTime: true }) + }) describe('asyncReduce function', () => { test('returns result of reducer', async () => { @@ -18,7 +20,7 @@ describe('async module', () => { return new Promise(res => res(a + b)) } const result = await _.reduce(numbers, asyncSum, 0) - assert.equal(result, 10) + expect(result).toBe(10) }) test('passes correct indexes', async () => { const array = ['a', 'b', 'c', 'd', 'e'] @@ -33,7 +35,7 @@ describe('async module', () => { }) } const result = await _.reduce(array, asyncSumIndex, []) - assert.deepEqual(result, [0, 1, 2, 3, 4]) + expect(result).toEqual([0, 1, 2, 3, 4]) }) }) @@ -44,19 +46,19 @@ describe('async module', () => { return new Promise(res => res(a * a)) } const result = await _.map(numbers, asyncSquare) - assert.deepEqual(result, [1, 4, 9, 16]) + expect(result).toEqual([1, 4, 9, 16]) }) test('handles null input', async () => { const result = await _.map(null as unknown as unknown[], async () => '') - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('passes correct indexes', async () => { const array = ['a', 'b', 'c', 'd'] const mapper = async (l: string, index: number) => `${l}${index}` const result = await _.map(array, mapper) - assert.deepEqual(result, ['a0', 'b1', 'c2', 'd3']) + expect(result).toEqual(['a0', 'b1', 'c2', 'd3']) }) }) @@ -68,29 +70,29 @@ describe('async module', () => { test('calls asyncReduce', async () => { const result = await _.reduce(numbers, reducer, 0) - assert.equal(result, 10) + expect(result).toBe(10) }) test('uses first item in array when no init provided', async () => { const result = await _.reduce(numbers, reducer) - assert.equal(result, 10) + expect(result).toBe(10) }) test('throws on no init value and an empty array', async () => { try { await _.reduce([], reducer) } catch (err) { - assert.isNotNull(err) + expect(err).not.toBeNull() return } - assert.fail('Expected error to be thrown') + expect.fail('Expected error to be thrown') }) test('throws on no init value and a null array input', async () => { try { await _.reduce(null as unknown as number[], reducer) } catch (err) { - assert.isNotNull(err) + expect(err).not.toBeNull() return } - assert.fail('Expected error to be thrown') + expect.fail('Expected error to be thrown') }) }) @@ -102,7 +104,7 @@ describe('async module', () => { val = 1 }) }) - assert.equal(val, 1) + expect(val).toBe(1) }) test('returns the resulting value of the given function', async () => { let val = 0 @@ -112,8 +114,8 @@ describe('async module', () => { }) return 'x' }) - assert.equal(val, 1) - assert.equal(result, 'x') + expect(val).toBe(1) + expect(result).toBe('x') }) test('calls all registered defer functions', async () => { let one = 0 @@ -131,10 +133,10 @@ describe('async module', () => { }) return 'x' }) - assert.equal(one, 1) - assert.equal(two, 2) - assert.equal(three, 3) - assert.equal(result, 'x') + expect(one).toBe(1) + expect(two).toBe(2) + expect(three).toBe(3) + expect(result).toBe('x') }) test('calls all registered defer functions when error is thrown', async () => { let one = 0 @@ -155,9 +157,9 @@ describe('async module', () => { return 'x' }) } catch {} - assert.equal(one, 1) - assert.equal(two, 2) - assert.equal(three, 3) + expect(one).toBe(1) + expect(two).toBe(2) + expect(three).toBe(3) }) test('throws the error', async () => { let error: Error | null = null @@ -168,8 +170,8 @@ describe('async module', () => { } catch (err: any) { error = err } - assert.isNotNull(error) - assert.equal(error?.message, 'soooo broken') + expect(error).not.toBeNull() + expect(error?.message).toBe('soooo broken') }) test('rethrows the rethrown error when rethrow is true', async () => { let error: Error | null = null @@ -185,8 +187,8 @@ describe('async module', () => { } catch (err: any) { error = err } - assert.isNotNull(error) - assert.equal(error?.message, 'soooo broken') + expect(error).not.toBeNull() + expect(error?.message).toBe('soooo broken') }) test('does not rethrow the rethrown error when rethrow is false', async () => { let error: Error | null = null @@ -202,7 +204,7 @@ describe('async module', () => { } catch (err: any) { error = err } - assert.isNull(error) + expect(error).toBeNull() }) test('does not rethrow the rethrown error by default', async () => { let error: Error | null = null @@ -215,13 +217,13 @@ describe('async module', () => { } catch (err: any) { error = err } - assert.isNull(error) + expect(error).toBeNull() }) test('returns awaited async results', async () => { const result = await _.defer(() => { return new Promise(res => res('x')) }) - assert.equal(result, 'x') + expect(result).toBe('x') }) }) @@ -231,37 +233,37 @@ describe('async module', () => { throw new Error('not good enough') }) const [err, result] = await fn() - assert.isUndefined(result) - assert.isNotNull(err) - assert.equal(err!.message, 'not good enough') + expect(result).toBeUndefined() + expect(err).not.toBeNull() + expect(err!.message).toBe('not good enough') }) test('returns result when no error is thrown', async () => { const [err, result] = await _.try(async () => { return 'hello' })() - assert.isUndefined(err) - assert.isNotNull(result) - assert.equal(result, 'hello') + expect(err).toBeUndefined() + expect(result).not.toBeNull() + expect(result).toBe('hello') }) test('handles non-async function results', async () => { const [err, result] = _.try(() => { return 'hello' })() - assert.isUndefined(err) - assert.isNotNull(result) - assert.equal(result, 'hello') + expect(err).toBeUndefined() + expect(result).not.toBeNull() + expect(result).toBe('hello') }) test('handles non-async function errors', async () => { const [err, result] = _.try(() => { if (1 < 0) return '' throw new Error('unknown') })() - assert.isUndefined(result) - assert.isNotNull(err) - assert.equal(err!.message, 'unknown') + expect(result).toBeUndefined() + expect(err).not.toBeNull() + expect(err!.message).toBe('unknown') }) test('alias exists', () => { - assert.isNotNull(_.tryit) + expect(_.tryit).not.toBeNull() }) }) @@ -271,7 +273,7 @@ describe('async module', () => { const before = Date.now() await _.sleep(ONE_SECOND) const after = Date.now() - assert.isAtLeast(after, before + ONE_SECOND) + expect(after).toBeGreaterThanOrEqual(before + ONE_SECOND) }) }) @@ -298,8 +300,8 @@ describe('async module', () => { errors.push(e as Error) } const aggregate = new AggregateError(errors) - assert.include(aggregate.stack, 'at fakeMicrotask') - assert.include(aggregate.message, 'with 1') + expect(aggregate.stack).toContain('at fakeMicrotask') + expect(aggregate.message).toContain('with 1') }) test('uses stack from first error with a stack', () => { const errors: Error[] = [{} as Error] @@ -309,9 +311,9 @@ describe('async module', () => { errors.push(e as Error) } const aggregate = new AggregateError(errors) - assert.equal(aggregate.name, 'AggregateError(MicrotaskError...)') - assert.include(aggregate.stack, 'at fakeMicrotask') - assert.include(aggregate.message, 'with 2') + expect(aggregate.name).toBe('AggregateError(MicrotaskError...)') + expect(aggregate.stack).toContain('at fakeMicrotask') + expect(aggregate.message).toContain('with 2') }) test('does not fail if no errors given', () => { new AggregateError([]) @@ -327,10 +329,10 @@ describe('async module', () => { return `hi_${num}` }) })() - assert.isUndefined(errors) - assert.deepEqual(results, ['hi_1', 'hi_2', 'hi_3']) + expect(errors).toBeUndefined() + expect(results).toEqual(['hi_1', 'hi_2', 'hi_3']) }) - test('throws erros as array of all errors', async () => { + test('throws errors as array of all errors', async () => { const [error, results] = await _.try(async () => { return _.parallel(1, _.list(1, 3), async num => { await _.sleep(1000) @@ -339,9 +341,9 @@ describe('async module', () => { }) })() const err = error as AggregateError - assert.isUndefined(results) - assert.equal(err.errors.length, 1) - assert.equal(err.errors[0].message, 'number is 2') + expect(results).toBeUndefined() + expect(err.errors.length).toBe(1) + expect(err.errors[0].message).toBe('number is 2') }) test('does not run more than the limit at once', async () => { let numInProgress = 0 @@ -352,7 +354,7 @@ describe('async module', () => { await _.sleep(300) numInProgress-- }) - assert.deepEqual(Math.max(...tracking), 3) + expect(Math.max(...tracking)).toBe(3) }) }) @@ -369,13 +371,13 @@ describe('async module', () => { const result = await _.retry(NULL, async bail => { return 'hello' }) - assert.equal(result, 'hello') + expect(result).toBe('hello') }) test('simple + quick + happy path', async () => { const result = await _.retry(NULL, async () => { return 'hello' }) - assert.equal(result, 'hello') + expect(result).toBe('hello') }) test('retries on failure', async () => { let failedOnce = false @@ -386,7 +388,7 @@ describe('async module', () => { } return 'hello' }) - assert.equal(result, 'hello') + expect(result).toBe('hello') }) test('quits on bail', async () => { try { @@ -394,10 +396,10 @@ describe('async module', () => { bail('iquit') }) } catch (err) { - assert.equal(err, 'iquit') + expect(err).toBe('iquit') return } - assert.fail('error should have been thrown') + expect.fail('error should have been thrown') }) test('quits after max retries', async () => { try { @@ -405,10 +407,10 @@ describe('async module', () => { throw 'quitagain' }) } catch (err) { - assert.equal(err, 'quitagain') + expect(err).toBe('quitagain') return } - assert.fail('error should have been thrown') + expect.fail('error should have been thrown') }) test('quits after max retries without delay', async () => { try { @@ -417,10 +419,10 @@ describe('async module', () => { } await _.retry({ times: 3 }, func) } catch (err) { - assert.equal(err, 'quitagain') + expect(err).toBe('quitagain') return } - assert.fail('error should have been thrown') + expect.fail('error should have been thrown') }) test('quits after max retries with delay', async () => { try { @@ -429,10 +431,10 @@ describe('async module', () => { } await _.retry({ delay: 100 }, func) } catch (err) { - assert.equal(err, 'quitagain') + expect(err).toBe('quitagain') return } - assert.fail('error should have been thrown') + expect.fail('error should have been thrown') }) test('uses backoff between retries', async () => { let count = 0 @@ -452,7 +454,7 @@ describe('async module', () => { } ) const diff = Date.now() - start - assert.equal(count, 3) + expect(count).toBe(3) // Time taken should at least be the // total ms backed off. Using exponential // backoff (above) 3 times (passing on @@ -460,7 +462,7 @@ describe('async module', () => { // - 10**1 + 10**2 = 1025 // The performance typically comes in 1 // or 2 milliseconds after. - assert.isAtLeast(diff, backoffs) + expect(diff).toBeGreaterThanOrEqual(backoffs) }) }) @@ -469,20 +471,20 @@ describe('async module', () => { const result = await _.guard(async () => { return 'hello' }) - assert.equal(result, 'hello') + expect(result).toBe('hello') }) it('returns result of given sync function', async () => { const result = _.guard(() => { return 'hello' }) - assert.equal(result, 'hello') + expect(result).toBe('hello') }) it('returns error if given async function throws', async () => { const result = (await _.guard(async () => { throw new Error('error') })) ?? 'good-bye' - assert.equal(result, 'good-bye') + expect(result).toBe('good-bye') }) it('returns error if given sync function throws', async () => { const alwaysThrow = () => { @@ -490,7 +492,7 @@ describe('async module', () => { return undefined } const result = _.guard(alwaysThrow) ?? 'good-bye' - assert.equal(result, 'good-bye') + expect(result).toBe('good-bye') }) it('throws error if shouldGuard returns false', async () => { const makeFetchUser = (id: number) => { @@ -505,16 +507,16 @@ describe('async module', () => { (await _.guard(makeFetchUser(id), isUserNotFoundErr)) ?? 'default-user' const user1 = await fetchUser(1) - assert.equal(user1, 'user1') + expect(user1).toBe('user1') const user2 = await fetchUser(2) - assert.equal(user2, 'default-user') + expect(user2).toBe('default-user') try { await fetchUser(3) - assert.fail() + expect.fail() } catch (err: any) { - assert.equal(err.message, 'unknown error') + expect(err.message).toBe('unknown error') } }) }) @@ -530,7 +532,7 @@ describe('async module', () => { promise.resolve('hello'), promise.resolve({ name: 'ray' }) ]) - assert.deepEqual(result, [22, 'hello', { name: 'ray' }]) + expect(result).toEqual([22, 'hello', { name: 'ray' }]) }) it('returns object with values in correct keys when given object', async () => { const result = await _.all({ @@ -538,7 +540,7 @@ describe('async module', () => { str: promise.resolve('hello'), obj: promise.resolve({ name: 'ray' }) }) - assert.deepEqual(result, { + expect(result).toEqual({ num: 22, str: 'hello', obj: { name: 'ray' } @@ -553,11 +555,11 @@ describe('async module', () => { }) } catch (e: any) { const err = e as AggregateError - assert.equal(err.errors.length, 1) - assert.equal(err.errors[0].message, 'broken') + expect(err.errors.length).toBe(1) + expect(err.errors[0].message).toBe('broken') return } - assert.fail('Expected error to be thrown but it was not') + expect.fail('Expected error to be thrown but it was not') }) it('throws aggregate error when a single promise fails (in array mode)', async () => { try { @@ -568,11 +570,11 @@ describe('async module', () => { ]) } catch (e: any) { const err = e as AggregateError - assert.equal(err.errors.length, 1) - assert.equal(err.errors[0].message, 'broken') + expect(err.errors.length).toBe(1) + expect(err.errors[0].message).toBe('broken') return } - assert.fail('Expected error to be thrown but it was not') + expect.fail('Expected error to be thrown but it was not') }) }) }) diff --git a/src/tests/curry.test.ts b/src/tests/curry.test.ts index a5bbdd75..0995dd69 100644 --- a/src/tests/curry.test.ts +++ b/src/tests/curry.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' import type { DebounceFunction } from '../curry' @@ -30,8 +30,8 @@ describe('curry module', () => { const expected = decomposed() const result = composed() - assert.equal(result, expected) - assert.equal(result, 2) + expect(result).toBe(expected) + expect(result).toBe(2) }) test('composes async function', async () => { const useZero = (fn: (num: number) => Promise) => async () => @@ -62,7 +62,7 @@ describe('curry module', () => { const expected = await decomposed() const result = await composed() - assert.equal(result, expected) + expect(result).toBe(expected) }) test('composes function type overloads', () => { const useZero = (fn: (num: number) => number) => () => fn(0) @@ -76,21 +76,19 @@ describe('curry module', () => { const returnArg = (arg: 'num') => (args: { num: number }) => args[arg] const returnNum = () => (num: number) => num - assert.equal(_.compose(useZero, returnNum())(), 0) + expect(_.compose(useZero, returnNum())()).toBe(0) - assert.equal(_.compose(useZero, objectize, returnArg('num'))(), 0) + expect(_.compose(useZero, objectize, returnArg('num'))()).toBe(0) - assert.equal( - _.compose(useZero, objectize, increment, returnArg('num'))(), + expect(_.compose(useZero, objectize, increment, returnArg('num'))()).toBe( 1 ) - assert.equal( - _.compose(useZero, objectize, increment, increment, returnArg('num'))(), - 2 - ) + expect( + _.compose(useZero, objectize, increment, increment, returnArg('num'))() + ).toBe(2) - assert.equal( + expect( _.compose( useZero, objectize, @@ -98,11 +96,10 @@ describe('curry module', () => { increment, increment, returnArg('num') - )(), - 3 - ) + )() + ).toBe(3) - assert.equal( + expect( _.compose( useZero, objectize, @@ -111,11 +108,10 @@ describe('curry module', () => { increment, increment, returnArg('num') - )(), - 4 - ) + )() + ).toBe(4) - assert.equal( + expect( _.compose( useZero, objectize, @@ -125,11 +121,10 @@ describe('curry module', () => { increment, increment, returnArg('num') - )(), - 5 - ) + )() + ).toBe(5) - assert.equal( + expect( _.compose( useZero, objectize, @@ -140,11 +135,10 @@ describe('curry module', () => { increment, increment, returnArg('num') - )(), - 6 - ) + )() + ).toBe(6) - assert.equal( + expect( _.compose( useZero, objectize, @@ -156,9 +150,8 @@ describe('curry module', () => { increment, increment, returnArg('num') - )(), - 7 - ) + )() + ).toBe(7) }) }) @@ -168,13 +161,13 @@ describe('curry module', () => { const expected = 20 const partialed = _.partial(add, 10) const result = partialed(10) - assert.equal(result, expected) + expect(result).toBe(expected) }) test('passes many args', () => { const add = (...nums: number[]) => nums.reduce((a, b) => a + b, 0) const expected = 10 const result = _.partial(add, 2, 2, 2)(2, 2) - assert.equal(result, expected) + expect(result).toBe(expected) }) }) @@ -183,13 +176,13 @@ describe('curry module', () => { const add = ({ a, b }: { a: number; b: number }) => a + b const expected = 20 const result = _.partob(add, { a: 10 })({ b: 10 }) - assert.equal(result, expected) + expect(result).toBe(expected) }) test('partob overrides inital with later', () => { const add = ({ a, b }: { a: number; b: number }) => a + b const expected = 15 const result = _.partob(add, { a: 10 })({ a: 5, b: 10 } as any) - assert.equal(result, expected) + expect(result).toBe(expected) }) }) @@ -200,7 +193,7 @@ describe('curry module', () => { const twoX = (num: number) => num * 2 const func = _.chain(genesis, addFive, twoX) const result = func(0, '') - assert.equal(result, 10) + expect(result).toBe(10) }) test('calls add(1), then addFive, then twoX functions by 1', () => { @@ -209,7 +202,7 @@ describe('curry module', () => { const twoX = (num: number) => num * 2 const func = _.chain(add(1), addFive, twoX) const result = func(1) - assert.equal(result, 14) + expect(result).toBe(14) }) test('calls add(2), then addFive, then twoX, then repeatX functions by 1', () => { @@ -219,7 +212,7 @@ describe('curry module', () => { const repeatX = (num: number) => 'X'.repeat(num) const func = _.chain(add(2), addFive, twoX, repeatX) const result = func(1) - assert.equal(result, 'XXXXXXXXXXXXXXXX') + expect(result).toBe('XXXXXXXXXXXXXXXX') }) test('calls addFive, then add(2), then twoX, then repeatX functions by 1', () => { @@ -229,7 +222,7 @@ describe('curry module', () => { const repeatX = (num: number) => 'X'.repeat(num) const func = _.chain(addFive, add(2), twoX, repeatX) const result = func(1) - assert.equal(result, 'XXXXXXXXXXXXXXXX') + expect(result).toBe('XXXXXXXXXXXXXXXX') }) test('calls getName, then upperCase functions as a mapper for User[]', () => { @@ -245,7 +238,7 @@ describe('curry module', () => { const getUpperName = _.chain(getName, upperCase) const result = users.map(getUpperName) - assert.deepEqual(result, ['JOHN DOE', 'JOHN SMITH', 'JOHN WICK']) + expect(result).toEqual(['JOHN DOE', 'JOHN SMITH', 'JOHN WICK']) }) }) @@ -257,9 +250,9 @@ describe('curry module', () => { return undefined } const proxy = _.proxied(handler) as any - assert.equal(proxy.x, 2) - assert.equal(proxy.getName(), 'radash') - assert.isUndefined(proxy.nil) + expect(proxy.x).toBe(2) + expect(proxy.getName()).toBe('radash') + expect(proxy.nil).toBeUndefined() }) }) @@ -268,7 +261,7 @@ describe('curry module', () => { const func = _.memo(() => new Date().getTime()) const resultA = func() const resultB = func() - assert.equal(resultA, resultB) + expect(resultA).toBe(resultB) }) test('uses key to identify unique calls', () => { const func = _.memo( @@ -283,8 +276,8 @@ describe('curry module', () => { const resultA = func({ user: { id: 'alpha' } }) const resultB = func({ user: { id: 'beta' } }) const resultA2 = func({ user: { id: 'alpha' } }) - assert.equal(resultA, resultA2) - assert.notEqual(resultB, resultA) + expect(resultA).toBe(resultA2) + expect(resultB).not.toBe(resultA) }) test('calls function again when first value expires', async () => { const func = _.memo(() => new Date().getTime(), { @@ -293,7 +286,7 @@ describe('curry module', () => { const resultA = func() await new Promise(res => setTimeout(res, 100)) const resultB = func() - assert.notEqual(resultA, resultB) + expect(resultA).not.toBe(resultB) }) test('does not call function again when first value has not expired', async () => { const func = _.memo(() => new Date().getTime(), { @@ -302,13 +295,13 @@ describe('curry module', () => { const resultA = func() await new Promise(res => setTimeout(res, 100)) const resultB = func() - assert.equal(resultA, resultB) + expect(resultA).toBe(resultB) }) }) describe('debounce function', () => { let func: DebounceFunction - const mockFunc = jest.fn() + const mockFunc = vi.fn() const runFunc3Times = () => { func() func() @@ -320,7 +313,7 @@ describe('curry module', () => { }) afterEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) test('only executes once when called rapidly', async () => { @@ -387,12 +380,12 @@ describe('curry module', () => { func() func() func() - assert.equal(calls, 1) + expect(calls).toBe(1) await _.sleep(610) func() func() func() - assert.equal(calls, 2) + expect(calls).toBe(2) }) test('returns if the throttle is active', async () => { diff --git a/src/tests/number.test.ts b/src/tests/number.test.ts index ee83dde4..36dbc5fb 100644 --- a/src/tests/number.test.ts +++ b/src/tests/number.test.ts @@ -1,95 +1,95 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' describe('number module', () => { describe('inRange function', () => { test('handles nullish values', () => { - assert.strictEqual(_.inRange(0, 1, null as any), false) - assert.strictEqual(_.inRange(0, null as any, 1), false) - assert.strictEqual(_.inRange(null as any, 0, 1), false) - assert.strictEqual(_.inRange(0, undefined as any, 1), false) - assert.strictEqual(_.inRange(undefined as any, 0, 1), false) + expect(_.inRange(0, 1, null as any)).toBe(false) + expect(_.inRange(0, null as any, 1)).toBe(false) + expect(_.inRange(null as any, 0, 1)).toBe(false) + expect(_.inRange(0, undefined as any, 1)).toBe(false) + expect(_.inRange(undefined as any, 0, 1)).toBe(false) - assert.strictEqual(_.inRange(0, 1, undefined as any), true) + expect(_.inRange(0, 1, undefined as any)).toBe(true) }) test('handles bad input', () => { const result = _.inRange(0, 1, {} as any) - assert.strictEqual(result, false) + expect(result).toBe(false) }) test('computes correctly', () => { - assert.strictEqual(_.inRange(10, 0, 5), false) - assert.strictEqual(_.inRange(10, 0, 20), true) - assert.strictEqual(_.inRange(-10, 0, -20), true) - assert.strictEqual(_.inRange(9.99, 0, 10), true) - assert.strictEqual(_.inRange(Math.PI, 0, 3.15), true) + expect(_.inRange(10, 0, 5)).toBe(false) + expect(_.inRange(10, 0, 20)).toBe(true) + expect(_.inRange(-10, 0, -20)).toBe(true) + expect(_.inRange(9.99, 0, 10)).toBe(true) + expect(_.inRange(Math.PI, 0, 3.15)).toBe(true) }) test('handles the different syntax of number type', () => { - assert.strictEqual(_.inRange(0, -1, 1), true) - assert.strictEqual(_.inRange(Number(0), -1, 1), true) - assert.strictEqual(_.inRange(+'0', -1, 1), true) + expect(_.inRange(0, -1, 1)).toBe(true) + expect(_.inRange(Number(0), -1, 1)).toBe(true) + expect(_.inRange(+'0', -1, 1)).toBe(true) }) test('handles two params', () => { - assert.strictEqual(_.inRange(1, 2), true) - assert.strictEqual(_.inRange(1.2, 2), true) - assert.strictEqual(_.inRange(2, 1), false) - assert.strictEqual(_.inRange(2, 2), false) - assert.strictEqual(_.inRange(3.2, 2), false) - assert.strictEqual(_.inRange(-1, 1), false) - assert.strictEqual(_.inRange(-1, -10), true) + expect(_.inRange(1, 2)).toBe(true) + expect(_.inRange(1.2, 2)).toBe(true) + expect(_.inRange(2, 1)).toBe(false) + expect(_.inRange(2, 2)).toBe(false) + expect(_.inRange(3.2, 2)).toBe(false) + expect(_.inRange(-1, 1)).toBe(false) + expect(_.inRange(-1, -10)).toBe(true) }) test('handles the exclusive end of the range', () => { - assert.strictEqual(_.inRange(1, 0, 1), false) - assert.strictEqual(_.inRange(10.0, 0, 10), false) + expect(_.inRange(1, 0, 1)).toBe(false) + expect(_.inRange(10.0, 0, 10)).toBe(false) }) test('handles the inclusive start of the range', () => { - assert.strictEqual(_.inRange(0, 0, 1), true) - assert.strictEqual(_.inRange(10.0, 10, 20), true) + expect(_.inRange(0, 0, 1)).toBe(true) + expect(_.inRange(10.0, 10, 20)).toBe(true) }) }) describe('toFloat function', () => { test('handles null', () => { const result = _.toFloat(null) - assert.strictEqual(result, 0.0) + expect(result).toBe(0.0) }) test('handles undefined', () => { const result = _.toFloat(undefined) - assert.strictEqual(result, 0.0) + expect(result).toBe(0.0) }) test('uses null default', () => { const result = _.toFloat('x', null) - assert.strictEqual(result, null) + expect(result).toBeNull() }) test('handles bad input', () => { const result = _.toFloat({}) - assert.strictEqual(result, 0.0) + expect(result).toBe(0.0) }) test('converts 20.00 correctly', () => { const result = _.toFloat('20.00') - assert.strictEqual(result, 20.0) + expect(result).toBe(20.0) }) }) describe('toInt function', () => { test('handles null', () => { const result = _.toInt(null) - assert.strictEqual(result, 0) + expect(result).toBe(0) }) test('uses null default', () => { const result = _.toInt('x', null) - assert.strictEqual(result, null) + expect(result).toBeNull() }) test('handles undefined', () => { const result = _.toInt(undefined) - assert.strictEqual(result, 0) + expect(result).toBe(0) }) test('handles bad input', () => { const result = _.toInt({}) - assert.strictEqual(result, 0) + expect(result).toBe(0) }) test('converts 20 correctly', () => { const result = _.toInt('20') - assert.strictEqual(result, 20) + expect(result).toBe(20) }) }) }) diff --git a/src/tests/object.test.ts b/src/tests/object.test.ts index 42cc1e22..6570b2c2 100644 --- a/src/tests/object.test.ts +++ b/src/tests/object.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' const NULL = null as unknown as {} @@ -13,7 +13,7 @@ describe('object module', () => { o: false, r: 'x' }) - assert.deepEqual(result, { + expect(result).toEqual({ x: 2, y: null, o: false, @@ -31,13 +31,13 @@ describe('object module', () => { }, val => val !== 'x' ) - assert.deepEqual(result, { + expect(result).toEqual({ r: 'x' }) }) test('handles undefined input', () => { - const result = _.shake(undefined) - assert.deepEqual(result, {}) + const result = _.shake(undefined!) + expect(result).toEqual({}) }) }) @@ -51,7 +51,7 @@ describe('object module', () => { }, prefixWith('x') ) - assert.deepEqual(result, { + expect(result).toEqual({ xx: 22, xy: 8 }) @@ -68,7 +68,7 @@ describe('object module', () => { }, prefixWith('x') ) - assert.deepEqual(result, { + expect(result).toEqual({ x: 'xhi', y: 'xbye' }) @@ -81,7 +81,7 @@ describe('object module', () => { 'X-Api-Key': 'value', Bearer: 'value' }) - assert.deepEqual(result, { + expect(result).toEqual({ 'x-api-key': 'value', bearer: 'value' }) @@ -94,7 +94,7 @@ describe('object module', () => { 'x-api-key': 'value', bearer: 'value' }) - assert.deepEqual(result, { + expect(result).toEqual({ 'X-API-KEY': 'value', BEARER: 'value' }) @@ -114,24 +114,24 @@ describe('object module', () => { ] for (const elm of arr) { const newElm = _.clone(elm) - assert.equal(elm, newElm) + expect(elm).toBe(newElm) } }) test('copies arrays', () => { const arr = [{ a: 0 }, 1, 2, 3] const result = _.clone(arr) - assert.notEqual(arr, result) + expect(arr).not.toBe(result) for (const i in result) { - assert.equal(arr[i], result[i]) + expect(arr[i]).toBe(result[i]) } }) test('copies functions', () => { const fa = () => 0 const fb = _.clone(fa) - assert.notEqual(fa, fb) - assert.equal(fa(), fb()) + expect(fa).not.toBe(fb) + expect(fa()).toBe(fb()) }) test('copies objects (class instances) without losing the class type', () => { class Data { @@ -142,9 +142,9 @@ describe('object module', () => { obj.val = 1 const result = _.clone(obj) - assert.notEqual(obj, result) - assert.equal(obj.constructor.name, result.constructor.name) - assert.equal(obj.val, result.val) + expect(obj).not.toBe(result) + expect(obj.constructor.name).toBe(result.constructor.name) + expect(obj.val).toBe(result.val) }) test('copies all attributes from object', () => { const obj = { @@ -155,9 +155,9 @@ describe('object module', () => { } } const result = _.clone(obj) - assert.equal(result.x, obj.x) - assert.equal(result.add(2, 2), obj.add(2, 2)) - assert.equal(result.child.key, obj.child.key) + expect(result.x).toBe(obj.x) + expect(result.add(2, 2)).toBe(obj.add(2, 2)) + expect(result.child.key).toBe(obj.child.key) }) test('copies all attributes from class instance', () => { class Data { @@ -170,21 +170,21 @@ describe('object module', () => { } } const result = _.clone(new Data()) - assert.equal(result.x, 22) + expect(result.x).toBe(22) // @warning will not copy functions from class instance - // assert.equal(result.add(2, 2), 4) - assert.equal(result.child.key, 'yolo') + // expect(result.add(2, 2)).toBe(4) + expect(result.child.key).toBe('yolo') }) }) describe('listify function', () => { test('handles null input', () => { const result = _.listify(null as any as Record, () => 1) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('handles empty object', () => { const result = _.listify({} as Record, () => 1) - assert.deepEqual(result, []) + expect(result).toEqual([]) }) test('calls toItem to convert to list', () => { type Index = 'one' | 'two' @@ -196,7 +196,7 @@ describe('object module', () => { index: key, name: value.name })) - assert.deepEqual(result, [ + expect(result).toEqual([ { index: 'one', name: 'ray' }, { index: 'two', name: 'ash' } ]) @@ -206,27 +206,27 @@ describe('object module', () => { describe('pick function', () => { test('handles null input', () => { const result = _.pick(null as unknown as Record, []) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('handles empty keys', () => { const result = _.pick({ a: 2 }, []) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('handle key not in object', () => { const result = _.pick({ a: 2, b: 3 }, ['c'] as any) - assert.deepEqual(result, {} as any) + expect(result).toEqual({} as any) }) test('handle one key not in object', () => { const result = _.pick({ a: 2, b: 3 }, ['a', 'c'] as any) - assert.deepEqual(result, { a: 2 } as any) + expect(result).toEqual({ a: 2 } as any) }) test('does not ignore undefined values', () => { const result = _.pick({ a: 2, b: undefined }, ['b']) - assert.deepEqual(result, { b: undefined }) + expect(result).toEqual({ b: undefined }) }) test('returns picked properties only', () => { const result = _.pick({ a: 2, b: 4 }, ['a']) - assert.deepEqual(result, { + expect(result).toEqual({ a: 2 }) }) @@ -242,7 +242,7 @@ describe('object module', () => { c: [3] } const result = _.pick(x, ['a']) - assert.deepEqual(result, { + expect(result).toEqual({ a: 'alpha' }) }) @@ -258,7 +258,7 @@ describe('object module', () => { } const proxified = new Proxy(target, handler1) const result = _.pick(proxified, ['a']) - assert.deepEqual(result, { + expect(result).toEqual({ a: 'world' }) }) @@ -267,7 +267,7 @@ describe('object module', () => { obj.a = 2 obj.b = 4 const result = _.pick(obj, ['a']) - assert.deepEqual(result, { + expect(result).toEqual({ a: 2 }) }) @@ -276,7 +276,7 @@ describe('object module', () => { // @ts-ignore obj.hasOwnProperty = 'OVERWRITTEN' const result = _.pick(obj, ['a']) - assert.deepEqual(result, { + expect(result).toEqual({ a: 2 }) }) @@ -290,19 +290,19 @@ describe('object module', () => { } test('handles null input', () => { const result = _.omit(null, []) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('handles empty keys', () => { const result = _.omit(person, []) - assert.deepEqual(result, person) + expect(result).toEqual(person) }) test('handles null keys', () => { const result = _.omit(person, null as unknown as []) - assert.deepEqual(result, person) + expect(result).toEqual(person) }) test('returns object without omitted properties', () => { const result = _.omit(person, ['name']) - assert.deepEqual(result, { + expect(result).toEqual({ age: 20, active: true }) @@ -332,24 +332,24 @@ describe('object module', () => { ] } test('handles null and undefined input', () => { - assert.equal(_.get(null, 'name'), null) - assert.equal(_.get(undefined, 'name'), null) + expect(_.get(null, 'name')).toBeUndefined() + expect(_.get(undefined, 'name')).toBeUndefined() }) test('respects undefined as default value', () => { - assert.equal(_.get({}, 'a.b.c', undefined), undefined) + expect(_.get({}, 'a.b.c', undefined)).toBeUndefined() }) test('returns specified value or default using path', () => { - assert.equal(_.get({ age: undefined }, 'age', 22), 22) - assert.equal(_.get(jay, 'friends[0].age'), 17) - assert.equal(_.get(jay, 'friends["0"].age'), 17) - assert.equal(_.get(jay, 'friends.0.age'), 17) - assert.equal(_.get(jay, 'friends.1.age'), null) - assert.equal(_.get(jay, 'friends.0.friends[0].name'), 'sara') - assert.equal(_.get(jay, 'name'), 'jay') - assert.equal(_.get(jay, '[name]'), 'jay') - assert.equal(_.get(jay, '["name"]'), 'jay') - assert.equal(_.get(jay, 'friends[0][name]'), 'carl') - assert.equal(_.get(jay, 'friends[0].friends[0].friends[0].age', 22), 22) + expect(_.get({ age: undefined }, 'age', 22)).toBe(22) + expect(_.get(jay, 'friends[0].age')).toBe(17) + expect(_.get(jay, 'friends["0"].age')).toBe(17) + expect(_.get(jay, 'friends.0.age')).toBe(17) + expect(_.get(jay, 'friends.1.age')).toBeUndefined() + expect(_.get(jay, 'friends.0.friends[0].name')).toBe('sara') + expect(_.get(jay, 'name')).toBe('jay') + expect(_.get(jay, '[name]')).toBe('jay') + expect(_.get(jay, '["name"]')).toBe('jay') + expect(_.get(jay, 'friends[0][name]')).toBe('carl') + expect(_.get(jay, 'friends[0].friends[0].friends[0].age', 22)).toBe(22) }) }) @@ -367,16 +367,16 @@ describe('object module', () => { value: never ) => [string | number | symbol, unknown] ) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('correctly maps keys and values', () => { const result = _.mapEntries(peopleByRole, (key, value) => [ value, key.toUpperCase() ]) - assert.equal(result.jay, 'ADMIN') - assert.equal(result.fey, 'USER') - assert.equal(result.bray, 'GUEST') + expect(result.jay).toBe('ADMIN') + expect(result.fey).toBe('USER') + expect(result.bray).toBe('GUEST') }) }) @@ -388,13 +388,13 @@ describe('object module', () => { } test('handles null input', () => { const result = _.invert(NULL) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('correctly maps keys and values', () => { const result = _.invert(peopleByRole) - assert.equal(result.jay, 'admin') - assert.equal(result.fey, 'user') - assert.equal(result.bray, 'guest') + expect(result.jay).toBe('admin') + expect(result.fey).toBe('user') + expect(result.bray).toBe('guest') }) }) @@ -423,35 +423,35 @@ describe('object module', () => { } test('handles both null input', () => { const result = _.assign(NULL, NULL) - assert.deepEqual(result, {}) + expect(result).toEqual({}) }) test('handles null first input', () => { const result = _.assign({ a: 'y' }, NULL) - assert.deepEqual(result, { a: 'y' }) + expect(result).toEqual({ a: 'y' }) }) test('handles null last input', () => { const result = _.assign(NULL, { a: 'y' }) - assert.deepEqual(result, { a: 'y' }) + expect(result).toEqual({ a: 'y' }) }) test('correctly assign a with values from b', () => { const result = _.assign(initial, override) - assert.deepEqual(result, override) + expect(result).toEqual(override) }) test('handles initial have unique value', () => { const result = _.assign({ a: 'x' }, {}) - assert.deepEqual(result, { a: 'x' }) + expect(result).toEqual({ a: 'x' }) }) test('handles override have unique value', () => { const result = _.assign({}, { b: 'y' }) - assert.deepEqual(result, { b: 'y' }) + expect(result).toEqual({ b: 'y' }) }) }) describe('keys function', () => { test('handles bad input', () => { - assert.deepEqual(_.keys({}), []) - assert.deepEqual(_.keys(null as any), []) - assert.deepEqual(_.keys(undefined as any), []) + expect(_.keys({})).toEqual([]) + expect(_.keys(null as any)).toEqual([]) + expect(_.keys(undefined as any)).toEqual([]) }) test('returns correct list of keys', () => { const ra = { @@ -468,7 +468,7 @@ describe('object module', () => { } ] } - assert.deepEqual(_.keys(ra), [ + expect(_.keys(ra)).toEqual([ 'name', 'power', 'friend.name', @@ -481,28 +481,28 @@ describe('object module', () => { describe('set function', () => { test('handles bad input', () => { - assert.deepEqual(_.set({}, '', {}), {}) - assert.deepEqual(_.set({}, null as any, {}), {}) - assert.deepEqual(_.set({}, '', null as any), {}) - assert.deepEqual(_.set(null as any, '', {}), {}) - assert.deepEqual(_.set(null as any, null as any, null as any), {}) - assert.deepEqual(_.set({ foo: true }, 'foo', false), { foo: false }) - assert.deepEqual(_.set({}, 'foo', 0), { foo: 0 }) + expect(_.set({}, '', {})).toEqual({}) + expect(_.set({}, null as any, {})).toEqual({}) + expect(_.set({}, '', null as any)).toEqual({}) + expect(_.set(null as any, '', {})).toEqual({}) + expect(_.set(null as any, null as any, null as any)).toEqual({}) + expect(_.set({ foo: true }, 'foo', false)).toEqual({ foo: false }) + expect(_.set({}, 'foo', 0)).toEqual({ foo: 0 }) }) test('sets deep values correctly', () => { - assert.deepEqual(_.set({}, 'cards.value', 2), { + expect(_.set({}, 'cards.value', 2)).toEqual({ cards: { value: 2 } }) - assert.deepEqual(_.set({}, 'cards.0.value', 2), { + expect(_.set({}, 'cards.0.value', 2)).toEqual({ cards: [{ value: 2 }] }) - assert.deepEqual(_.set({}, 'cards.0.0.value', 2), { + expect(_.set({}, 'cards.0.0.value', 2)).toEqual({ cards: [[{ value: 2 }]] }) - assert.deepEqual(_.set({}, 'cards.[0].[0].value', 2), { + expect(_.set({}, 'cards.[0].[0].value', 2)).toEqual({ cards: [[{ value: 2 }]] }) - assert.deepEqual(_.set({}, 'cards.[1].[1].value', 2), { + expect(_.set({}, 'cards.[1].[1].value', 2)).toEqual({ cards: [, [, { value: 2 }]] }) }) @@ -510,9 +510,9 @@ describe('object module', () => { describe('crush function', () => { test('handles bad input', () => { - assert.deepEqual(_.crush({}), {}) - assert.deepEqual(_.crush(null as any), {}) - assert.deepEqual(_.crush(undefined as any), {}) + expect(_.crush({})).toEqual({}) + expect(_.crush(null as any)).toEqual({}) + expect(_.crush(undefined as any)).toEqual({}) }) test('returns correctly crushed object', () => { const now = new Date() @@ -531,7 +531,7 @@ describe('object module', () => { ], timestamp: now } - assert.deepEqual(_.crush(ra), { + expect(_.crush(ra)).toEqual({ name: 'ra', power: 100, 'friend.name': 'loki', @@ -545,9 +545,9 @@ describe('object module', () => { describe('construct function', () => { test('handles bad input', () => { - assert.deepEqual(_.construct({}), {}) - assert.deepEqual(_.construct(null as any), {}) - assert.deepEqual(_.construct(undefined as any), {}) + expect(_.construct({})).toEqual({}) + expect(_.construct(null as any)).toEqual({}) + expect(_.construct(undefined as any)).toEqual({}) }) test('returns correctly constructed object', () => { const now = new Date() @@ -570,7 +570,7 @@ describe('object module', () => { ], timestamp: now } - assert.deepEqual( + expect( _.construct({ name: 'ra', power: 100, @@ -581,9 +581,8 @@ describe('object module', () => { 'enemies.1.name': 'vishnu', 'enemies.1.power': 58, timestamp: now - }), - ra - ) + }) + ).toEqual(ra) }) }) }) diff --git a/src/tests/random.test.ts b/src/tests/random.test.ts index e38ca5b0..b8c17510 100644 --- a/src/tests/random.test.ts +++ b/src/tests/random.test.ts @@ -1,19 +1,19 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' describe('random module', () => { describe('random function', () => { test('returns a number', () => { const result = _.random(0, 100) - assert.isAtLeast(result, 0) - assert.isAtMost(result, 100) + expect(result).toBeGreaterThanOrEqual(0) + expect(result).toBeLessThanOrEqual(100) }) }) describe('uid function', () => { test('generates the correct length string', () => { const result = _.uid(10) - assert.equal(result.length, 10) + expect(result.length).toBe(10) }) /** * @warning This is potentially a flaky test. @@ -30,7 +30,7 @@ describe('random module', () => { 300, '________________________________________________________________' ) - assert.include(result, '_') + expect(result).toContain('_') }) }) @@ -38,20 +38,20 @@ describe('random module', () => { test('returns list with same number of items', () => { const list = [1, 2, 3, 4, 5] const result = _.shuffle(list) - assert.equal(list.length, result.length) + expect(list.length).toBe(result.length) }) test('returns list with same value', () => { const list = [1, 2, 3, 4, 5] const totalBefore = _.sum(list) const result = _.shuffle(list) const totalAfter = _.sum(result) - assert.equal(totalBefore, totalAfter) + expect(totalBefore).toBe(totalAfter) }) test('returns copy of list without mutatuing input', () => { const list = [1, 2, 3, 4, 5] const result = _.shuffle(list) - assert.notEqual(list, result) - assert.deepEqual(list, [1, 2, 3, 4, 5]) + expect(list).not.toBe(result) + expect(list).toEqual([1, 2, 3, 4, 5]) }) }) @@ -59,7 +59,7 @@ describe('random module', () => { test('returns a string from the list', () => { const letters = 'abcde' const result = _.draw(letters.split('')) - assert.include(letters, result!) + expect(letters).toContain(result!) }) test('returns a item from the list', () => { const list = [ @@ -68,12 +68,12 @@ describe('random module', () => { { id: 'c', word: 'yolo' } ] const result = _.draw(list) - assert.include('abc', result!.id) + expect('abc').toContain(result!.id) }) test('returns null given empty input', () => { const list: unknown[] = [] const result = _.draw(list) - assert.isNull(result) + expect(result).toBeNull() }) }) }) diff --git a/src/tests/series.test.ts b/src/tests/series.test.ts index 66abd08a..042b0b9f 100644 --- a/src/tests/series.test.ts +++ b/src/tests/series.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' describe('series module', () => { @@ -14,85 +14,85 @@ describe('series module', () => { describe('min function', () => { test('correctly returns min', () => { const result = sut.min('monday', 'tuesday') - assert.equal(result, 'monday') + expect(result).toBe('monday') }) test('correctly returns min when second arg', () => { const result = sut.min('tuesday', 'monday') - assert.equal(result, 'monday') + expect(result).toBe('monday') }) }) describe('max function', () => { test('correctly returns max', () => { const result = sut.max('thursday', 'tuesday') - assert.equal(result, 'thursday') + expect(result).toBe('thursday') }) test('correctly returns max when second arg', () => { const result = sut.max('tuesday', 'thursday') - assert.equal(result, 'thursday') + expect(result).toBe('thursday') }) }) describe('first function', () => { test('returns first item', () => { const result = sut.first() - assert.equal(result, 'monday') + expect(result).toBe('monday') }) }) describe('last function', () => { test('returns last item', () => { const result = sut.last() - assert.equal(result, 'friday') + expect(result).toBe('friday') }) }) describe('next function', () => { test('returns next item', () => { const result = sut.next('wednesday') - assert.equal(result, 'thursday') + expect(result).toBe('thursday') }) test('returns first given last exhausted', () => { const result = sut.next('friday') - assert.equal(result, 'monday') + expect(result).toBe('monday') }) test('returns the given default when the last is exhausted', () => { const result = sut.next('friday', 'wednesday') - assert.equal(result, 'wednesday') + expect(result).toBe('wednesday') }) }) describe('previous function', () => { test('returns previous item', () => { const result = sut.previous('wednesday') - assert.equal(result, 'tuesday') + expect(result).toBe('tuesday') }) test('returns last given first exhausted', () => { const result = sut.previous('monday') - assert.equal(result, 'friday') + expect(result).toBe('friday') }) test('returns the given default when the first is exhausted', () => { const result = sut.previous('monday', 'wednesday') - assert.equal(result, 'wednesday') + expect(result).toBe('wednesday') }) }) describe('spin function', () => { test('returns current given zero', () => { const result = sut.spin('wednesday', 0) - assert.equal(result, 'wednesday') + expect(result).toBe('wednesday') }) test('returns friday given -3 starting at wednesday', () => { const result = sut.spin('wednesday', -3) - assert.equal(result, 'friday') + expect(result).toBe('friday') }) test('returns monday given 3 starting at wednesday', () => { const result = sut.spin('wednesday', 3) - assert.equal(result, 'monday') + expect(result).toBe('monday') }) test('returns monday given 13 starting at wednesday', () => { const result = sut.spin('wednesday', 13) - assert.equal(result, 'monday') + expect(result).toBe('monday') }) }) }) diff --git a/src/tests/string.test.ts b/src/tests/string.test.ts index c9bdc9e2..e87b6e10 100644 --- a/src/tests/string.test.ts +++ b/src/tests/string.test.ts @@ -1,100 +1,100 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' describe('string module', () => { describe('camel function', () => { test('returns correctly cased string', () => { const result = _.camel('hello world') - assert.equal(result, 'helloWorld') + expect(result).toBe('helloWorld') }) test('returns single word', () => { const result = _.camel('hello') - assert.equal(result, 'hello') + expect(result).toBe('hello') }) test('returns empty string for empty input', () => { const result = _.camel(null as any) - assert.equal(result, '') + expect(result).toBe('') }) test('a word in camel case should remain in camel case', () => { const result = _.camel('helloWorld') - assert.equal(result, 'helloWorld') + expect(result).toBe('helloWorld') }) }) describe('camelCase function', () => { test('returns non alphanumerics with -space and capital', () => { const result = _.camel('Exobase Starter_flash AND-go') - assert.equal(result, 'exobaseStarterFlashAndGo') + expect(result).toBe('exobaseStarterFlashAndGo') }) }) describe('snake function', () => { test('returns correctly cased string', () => { const result = _.snake('hello world') - assert.equal(result, 'hello_world') + expect(result).toBe('hello_world') }) test('must handle strings that are camelCase', () => { const result = _.snake('helloWorld') - assert.equal(result, 'hello_world') + expect(result).toBe('hello_world') }) test('must handle strings that are dash', () => { const result = _.snake('hello-world') - assert.equal(result, 'hello_world') + expect(result).toBe('hello_world') }) test('splits numbers that are next to letters', () => { const result = _.snake('hello-world12_19-bye') - assert.equal(result, 'hello_world_12_19_bye') + expect(result).toBe('hello_world_12_19_bye') }) test('does not split numbers when flag is set to false', () => { const result = _.snake('hello-world12_19-bye', { splitOnNumber: false }) - assert.equal(result, 'hello_world12_19_bye') + expect(result).toBe('hello_world12_19_bye') }) test('returns single word', () => { const result = _.snake('hello') - assert.equal(result, 'hello') + expect(result).toBe('hello') }) test('returns empty string for empty input', () => { const result = _.snake(null as any) - assert.equal(result, '') + expect(result).toBe('') }) }) describe('snakeCase function', () => { test('returns non alphanumerics with _', () => { const result = _.snake('Exobase Starter_flash AND-go') - assert.equal(result, 'exobase_starter_flash_and_go') + expect(result).toBe('exobase_starter_flash_and_go') }) }) describe('dash function', () => { test('returns correctly cased string', () => { const result = _.dash('hello world') - assert.equal(result, 'hello-world') + expect(result).toBe('hello-world') }) test('returns single word', () => { const result = _.dash('hello') - assert.equal(result, 'hello') + expect(result).toBe('hello') }) test('returns empty string for empty input', () => { const result = _.dash(null as any) - assert.equal(result, '') + expect(result).toBe('') }) test('must handle strings that are camelCase', () => { const result = _.dash('helloWorld') - assert.equal(result, 'hello-world') + expect(result).toBe('hello-world') }) test('must handle strings that are dash', () => { const result = _.dash('hello-world') - assert.equal(result, 'hello-world') + expect(result).toBe('hello-world') }) }) describe('dashCase function', () => { test('returns non alphanumerics with -', () => { const result = _.dash('Exobase Starter_flash AND-go') - assert.equal(result, 'exobase-starter-flash-and-go') + expect(result).toBe('exobase-starter-flash-and-go') }) }) @@ -120,7 +120,7 @@ describe('string module', () => { Thank You - ${data.name} ` - assert.equal(result, expected) + expect(result).toBe(expected) }) test('replaces all occurrences given template', () => { @@ -130,74 +130,71 @@ describe('string module', () => { } const result = _.template(tmp, data, /<(.+?)>/g) - assert.equal(result, `Hello ${data.name}.`) + expect(result).toBe(`Hello ${data.name}.`) }) }) describe('capitalize function', () => { test('handles null', () => { const result = _.capitalize(null as any) - assert.equal(result, '') + expect(result).toBe('') }) test('converts hello as Hello', () => { const result = _.capitalize('hello') - assert.equal(result, 'Hello') + expect(result).toBe('Hello') }) test('converts hello Bob as Hello bob', () => { const result = _.capitalize('hello Bob') - assert.equal(result, 'Hello bob') + expect(result).toBe('Hello bob') }) }) describe('pascal function', () => { test('returns non alphanumerics in pascal', () => { const result = _.pascal('Exobase Starter_flash AND-go') - assert.equal(result, 'ExobaseStarterFlashAndGo') + expect(result).toBe('ExobaseStarterFlashAndGo') }) test('returns single word', () => { const result = _.pascal('hello') - assert.equal(result, 'Hello') + expect(result).toBe('Hello') }) test('returns empty string for empty input', () => { const result = _.pascal(null as any) - assert.equal(result, '') + expect(result).toBe('') }) }) describe('title function', () => { test('returns input formatted in title case', () => { - assert.equal(_.title('hello world'), 'Hello World') - assert.equal(_.title('va_va_boom'), 'Va Va Boom') - assert.equal(_.title('root-hook - ok!'), 'Root Hook Ok!') - assert.equal(_.title('queryItems'), 'Query Items') - assert.equal( - _.title('queryAllItems-in_Database'), - 'Query All Items In Database' - ) + expect(_.title('hello world')).toBe('Hello World') + expect(_.title('va_va_boom')).toBe('Va Va Boom') + expect(_.title('root-hook - ok!')).toBe('Root Hook Ok!') + expect(_.title('queryItems')).toBe('Query Items') + expect(_.title('queryAllItems-in_Database')).toBe('Query All Items In Database') }) test('returns empty string for bad input', () => { - assert.equal(_.title(null), '') - assert.equal(_.title(undefined), '') + expect(_.title(null)).toBe('') + expect(_.title(undefined)).toBe('') }) }) describe('trim function', () => { test('handles bad input', () => { - assert.equal(_.trim(null), '') - assert.equal(_.trim(undefined), '') + expect(_.trim(null)).toBe('') + expect(_.trim(undefined)).toBe('') }) test('returns input string correctly trimmed', () => { - assert.equal(_.trim('\n\n\t\nhello\n\t \n', '\n\t '), 'hello') - assert.equal(_.trim('hello', 'x'), 'hello') - assert.equal(_.trim(' hello '), 'hello') - assert.equal(_.trim(' __hello__ ', '_'), ' __hello__ ') - assert.equal(_.trim('__hello__', '_'), 'hello') - assert.equal(_.trim('//repos////', '/'), 'repos') - assert.equal(_.trim('/repos/:owner/:repo/', '/'), 'repos/:owner/:repo') + expect(_.trim('\n\n\t\nhello\n\t \n', '\n\t ')).toBe('hello') + expect(_.trim('hello', 'x')).toBe('hello') + expect(_.trim(' hello ')).toBe('hello') + expect(_.trim(' __hello__ ', '_')).toBe(' __hello__ ') + expect(_.trim('__hello__', '_')).toBe('hello') + expect(_.trim('//repos////', '/')).toBe('repos') + expect(_.trim('/repos/:owner/:repo/', '/')).toBe('repos/:owner/:repo') }) test('handles when char to trim is special case in regex', () => { - assert.equal(_.trim('_- hello_- ', '_- '), 'hello') + expect(_.trim('_- hello_- ', '_- ')).toBe('hello') }) }) }) diff --git a/src/tests/tsconfig.json b/src/tests/tsconfig.json new file mode 100644 index 00000000..745e30d1 --- /dev/null +++ b/src/tests/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "noEmit": true, + "target": "esnext", + "lib": ["es2020"], + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + "types": ["vitest/globals"] + } +} diff --git a/src/tests/typed.test.ts b/src/tests/typed.test.ts index 2263cc1f..12562bf4 100644 --- a/src/tests/typed.test.ts +++ b/src/tests/typed.test.ts @@ -1,80 +1,80 @@ -import { assert } from 'chai' +import { expect } from 'vitest' import * as _ from '..' describe('typed module', () => { describe('isArray function', () => { test('returns false for null', () => { const result = _.isArray(null) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for undefined', () => { const result = _.isArray(undefined) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for boolean', () => { const result = _.isArray(false) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for object', () => { const result = _.isArray({}) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for class instance', () => { class Data {} const result = _.isArray(new Data()) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for number', () => { const result = _.isArray(22) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string', () => { const result = _.isArray('abc') - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for array', () => { const result = _.isArray([1, 2, 3]) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns true for empty array', () => { const result = _.isArray([]) - assert.isTrue(result) + expect(result).toBeTruthy() }) }) describe('isObject function', () => { test('returns false for null', () => { const result = _.isObject(null) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for undefined', () => { const result = _.isObject(undefined) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for boolean', () => { const result = _.isObject(false) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for class instance', () => { class Data {} const result = _.isObject(new Data()) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for number', () => { const result = _.isObject(22) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string', () => { const result = _.isObject('abc') - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for array', () => { const result = _.isObject([1, 2, 3]) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for object', () => { const result = _.isObject({}) - assert.isTrue(result) + expect(result).toBeTruthy() }) }) @@ -91,14 +91,14 @@ describe('typed module', () => { ] for (const elm of arr) { - assert.isTrue(_.isPrimitive(elm)) + expect(_.isPrimitive(elm)).toBeTruthy() } }), test('returns false for non-primitives', () => { const arr = [new Date(), Number, {}, Object({}), () => 0, [1, 2]] for (const elm of arr) { - assert.isFalse(_.isPrimitive(elm)) + expect(_.isPrimitive(elm)).toBeFalsy() } }) }) @@ -106,189 +106,215 @@ describe('typed module', () => { describe('isFunction function', () => { test('returns false for null', () => { const result = _.isFunction(null) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for undefined', () => { const result = _.isFunction(undefined) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for boolean', () => { const result = _.isFunction(false) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for class instance', () => { class Data {} const result = _.isFunction(new Data()) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for number', () => { const result = _.isFunction(22) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string', () => { const result = _.isFunction('abc') - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for array', () => { const result = _.isFunction([1, 2, 3]) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for object', () => { const result = _.isFunction({}) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for anonymous function', () => { const result = _.isFunction(function () { return 'hello' }) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns true for arrow function', () => { const result = _.isFunction(() => { return 'hello' }) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns true for named function', () => { function sayHello() { return 'hello' } const result = _.isFunction(sayHello) - assert.isTrue(result) + expect(result).toBeTruthy() }) }) describe('isString function', () => { test('returns false for null', () => { const result = _.isString(null) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for undefined', () => { const result = _.isString(undefined) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for boolean', () => { const result = _.isString(false) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for class instance', () => { class Data {} const result = _.isString(new Data()) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for number', () => { const result = _.isString(22) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for array', () => { const result = _.isString([1, 2, 3]) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for object', () => { const result = _.isString({}) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for string', () => { const result = _.isString('abc') - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns true for string class', () => { const result = _.isString(String('abc')) - assert.isTrue(result) + expect(result).toBeTruthy() }) }) describe('isNumber function', () => { test('returns false for null', () => { const result = _.isNumber(null) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for undefined', () => { const result = _.isNumber(undefined) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for boolean', () => { const result = _.isNumber(false) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for class instance', () => { class Data {} const result = _.isNumber(new Data()) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for int', () => { const result = _.isNumber(22) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns true for float', () => { const result = _.isNumber(22.0567) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns false for NaN', () => { const result = _.isNumber(NaN) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for array', () => { const result = _.isNumber([1, 2, 3]) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for object', () => { const result = _.isNumber({}) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string', () => { const result = _.isNumber('abc') - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string class', () => { const result = _.isNumber(String('abc')) - assert.isFalse(result) + expect(result).toBeFalsy() }) }) describe('isInt function', () => { class Data {} test('returns false for non-number values', () => { - assert.isFalse(_.isInt(undefined)) - assert.isFalse(_.isInt(null)) - assert.isFalse(_.isInt(false)) - assert.isFalse(_.isInt(new Data())) - assert.isFalse(_.isInt(NaN)) - assert.isFalse(_.isInt([1, 2, 3])) - assert.isFalse(_.isInt({})) - assert.isFalse(_.isInt('abc')) - assert.isFalse(_.isInt(String('abc'))) + expect(_.isInt(undefined)).toBeFalsy() + expect(_.isInt(null)).toBeFalsy() + expect(_.isInt(false)).toBeFalsy() + expect(_.isInt(new Data())).toBeFalsy() + expect(_.isInt(NaN)).toBeFalsy() + expect(_.isInt([1, 2, 3])).toBeFalsy() + expect(_.isInt({})).toBeFalsy() + expect(_.isInt('abc')).toBeFalsy() + expect(_.isInt(String('abc'))).toBeFalsy() }) test('returns true for int', () => { const result = _.isInt(22) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns false for float', () => { const result = _.isInt(22.0567) - assert.isFalse(result) + expect(result).toBeFalsy() + }) + }) + + describe('isIntString function', () => { + test('returns true for int string', () => { + expect(_.isIntString('0')).toBeTruthy() + expect(_.isIntString('22')).toBeTruthy() + expect(_.isIntString('-22')).toBeTruthy() + expect(_.isIntString('1e+28')).toBeTruthy() + }) + test('returns false for decimal string', () => { + expect(_.isIntString('22.0567')).toBeFalsy() + expect(_.isIntString('22.0')).toBeFalsy() + }) + test('returns false for leading + symbol', () => { + expect(_.isIntString('+22')).toBeFalsy() + }) + test('returns false for non-numeric string', () => { + expect(_.isIntString('abc')).toBeFalsy() + expect(_.isIntString('')).toBeFalsy() + }) + test('returns false for non-string values', () => { + expect(_.isIntString(22)).toBeFalsy() + expect(_.isIntString(true)).toBeFalsy() + expect(_.isIntString(null)).toBeFalsy() + expect(_.isIntString(NaN)).toBeFalsy() }) }) describe('isFloat function', () => { class Data {} test('returns false for non-number values', () => { - assert.isFalse(_.isFloat(undefined)) - assert.isFalse(_.isFloat(null)) - assert.isFalse(_.isFloat(false)) - assert.isFalse(_.isFloat(new Data())) - assert.isFalse(_.isFloat(NaN)) - assert.isFalse(_.isFloat([1, 2, 3])) - assert.isFalse(_.isFloat({})) - assert.isFalse(_.isFloat('abc')) - assert.isFalse(_.isFloat(String('abc'))) + expect(_.isFloat(undefined)).toBeFalsy() + expect(_.isFloat(null)).toBeFalsy() + expect(_.isFloat(false)).toBeFalsy() + expect(_.isFloat(new Data())).toBeFalsy() + expect(_.isFloat(NaN)).toBeFalsy() + expect(_.isFloat([1, 2, 3])).toBeFalsy() + expect(_.isFloat({})).toBeFalsy() + expect(_.isFloat('abc')).toBeFalsy() + expect(_.isFloat(String('abc'))).toBeFalsy() }) test('returns false for int', () => { const result = _.isFloat(22) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for float', () => { const result = _.isFloat(22.0567) - assert.isTrue(result) + expect(result).toBeTruthy() }) }) @@ -298,74 +324,74 @@ describe('typed module', () => { name: string = 'ray' } test('returns true for empty values', () => { - assert.isTrue(_.isEmpty(null)) - assert.isTrue(_.isEmpty(undefined)) - assert.isTrue(_.isEmpty(new Data())) - assert.isTrue(_.isEmpty(0)) - assert.isTrue(_.isEmpty(true)) - assert.isTrue(_.isEmpty([])) - assert.isTrue(_.isEmpty(false)) - assert.isTrue(_.isEmpty({})) - assert.isTrue(_.isEmpty('')) - assert.isTrue(_.isEmpty(String())) - assert.isTrue(_.isEmpty(new Map())) - assert.isTrue(_.isEmpty(new Date('invalid value'))) + expect(_.isEmpty(null)).toBeTruthy() + expect(_.isEmpty(undefined)).toBeTruthy() + expect(_.isEmpty(new Data())).toBeTruthy() + expect(_.isEmpty(0)).toBeTruthy() + expect(_.isEmpty(true)).toBeTruthy() + expect(_.isEmpty([])).toBeTruthy() + expect(_.isEmpty(false)).toBeTruthy() + expect(_.isEmpty({})).toBeTruthy() + expect(_.isEmpty('')).toBeTruthy() + expect(_.isEmpty(String())).toBeTruthy() + expect(_.isEmpty(new Map())).toBeTruthy() + expect(_.isEmpty(new Date('invalid value'))).toBeTruthy() }) test('returns false for non-empty values', () => { - assert.isFalse(_.isEmpty(new Date())) - assert.isFalse(_.isEmpty(new Date('2022-09-01T02:19:55.976Z'))) - assert.isFalse(_.isEmpty(22)) - assert.isFalse(_.isEmpty(new Person())) - assert.isFalse(_.isEmpty({ name: 'x' })) - assert.isFalse(_.isEmpty('abc')) - assert.isFalse(_.isEmpty(String('abc'))) - assert.isFalse(_.isEmpty([1, 2, 3])) - assert.isFalse(_.isEmpty(function work() {})) - assert.isFalse(_.isEmpty(() => {})) - assert.isFalse(_.isEmpty(Symbol(''))) - assert.isFalse(_.isEmpty(Symbol('hello'))) + expect(_.isEmpty(new Date())).toBeFalsy() + expect(_.isEmpty(new Date('2022-09-01T02:19:55.976Z'))).toBeFalsy() + expect(_.isEmpty(22)).toBeFalsy() + expect(_.isEmpty(new Person())).toBeFalsy() + expect(_.isEmpty({ name: 'x' })).toBeFalsy() + expect(_.isEmpty('abc')).toBeFalsy() + expect(_.isEmpty(String('abc'))).toBeFalsy() + expect(_.isEmpty([1, 2, 3])).toBeFalsy() + expect(_.isEmpty(function work() {})).toBeFalsy() + expect(_.isEmpty(() => {})).toBeFalsy() + expect(_.isEmpty(Symbol(''))).toBeFalsy() + expect(_.isEmpty(Symbol('hello'))).toBeFalsy() const map = new Map() map.set('a', 1) - assert.isFalse(_.isEmpty(map)) + expect(_.isEmpty(map)).toBeFalsy() }) }) describe('isDate function', () => { test('return true for Date values', () => { - assert.isTrue(_.isDate(new Date())) - assert.isTrue(_.isDate(new Date('2022-09-01T02:19:55.976Z'))) - assert.isTrue(_.isDate(new Date('invalid value'))) + expect(_.isDate(new Date())).toBeTruthy() + expect(_.isDate(new Date('2022-09-01T02:19:55.976Z'))).toBeTruthy() + expect(_.isDate(new Date('invalid value'))).toBeTruthy() }) test('return false for non-Date values', () => { - assert.isFalse(_.isDate(22)) - assert.isFalse(_.isDate({ name: 'x' })) - assert.isFalse(_.isDate('abc')) - assert.isFalse(_.isDate(String('abc'))) - assert.isFalse(_.isDate([1, 2, 3])) - assert.isFalse(_.isDate(function work() {})) - assert.isFalse(_.isDate(() => {})) - assert.isFalse(_.isDate(Symbol(''))) - assert.isFalse(_.isDate(Symbol('hello'))) + expect(_.isDate(22)).toBeFalsy() + expect(_.isDate({ name: 'x' })).toBeFalsy() + expect(_.isDate('abc')).toBeFalsy() + expect(_.isDate(String('abc'))).toBeFalsy() + expect(_.isDate([1, 2, 3])).toBeFalsy() + expect(_.isDate(function work() {})).toBeFalsy() + expect(_.isDate(() => {})).toBeFalsy() + expect(_.isDate(Symbol(''))).toBeFalsy() + expect(_.isDate(Symbol('hello'))).toBeFalsy() }) }) describe('isPromise function', () => { test('return true for Promise values', () => { - assert.isTrue(_.isPromise(new Promise(res => res(0)))) - assert.isTrue(_.isPromise(new Promise(res => res('')))) - assert.isTrue(_.isPromise((async () => {})())) + expect(_.isPromise(new Promise(res => res(0)))).toBeTruthy() + expect(_.isPromise(new Promise(res => res('')))).toBeTruthy() + expect(_.isPromise((async () => {})())).toBeTruthy() }) test('return false for non-Date values', () => { - assert.isFalse(_.isPromise(22)) - assert.isFalse(_.isPromise({ name: 'x' })) - assert.isFalse(_.isPromise('abc')) - assert.isFalse(_.isPromise(String('abc'))) - assert.isFalse(_.isPromise([1, 2, 3])) - assert.isFalse(_.isPromise(function work() {})) - assert.isFalse(_.isPromise(() => {})) - assert.isFalse(_.isPromise(Symbol(''))) - assert.isFalse(_.isPromise(Symbol('hello'))) - assert.isFalse(_.isPromise({ then: 2 })) + expect(_.isPromise(22)).toBeFalsy() + expect(_.isPromise({ name: 'x' })).toBeFalsy() + expect(_.isPromise('abc')).toBeFalsy() + expect(_.isPromise(String('abc'))).toBeFalsy() + expect(_.isPromise([1, 2, 3])).toBeFalsy() + expect(_.isPromise(function work() {})).toBeFalsy() + expect(_.isPromise(() => {})).toBeFalsy() + expect(_.isPromise(Symbol(''))).toBeFalsy() + expect(_.isPromise(Symbol('hello'))).toBeFalsy() + expect(_.isPromise({ then: 2 })).toBeFalsy() }) }) @@ -373,18 +399,18 @@ describe('typed module', () => { test('returns false for null', () => { const input = null const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for undefined', () => { const input = undefined const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for empty class instance', () => { class Data {} const input = new Data() const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for class instance with properties', () => { class Data { @@ -392,82 +418,82 @@ describe('typed module', () => { } const input = new Data() const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for number greater than 0', () => { const input = 22 const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for number 0', () => { const input = 0 const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for array with values', () => { const input = [1, 2, 3] const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for empty array', () => { const input: unknown[] = [] const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for true', () => { const input = true const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for false', () => { const input = false const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for empty object', () => { const input = {} const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for object with values', () => { const input = { name: 'x' } const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string with chars', () => { const input = 'abc' const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for empty string', () => { const input = '' const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for empty string class', () => { const input = '' const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for string class with chars', () => { const input = 'abc' const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns false for empty Map', () => { const input = new Map() const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) test('returns true for empty Symbol', () => { const input = Symbol('') const result = _.isSymbol(input) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns true for Symbol instance', () => { const input = Symbol('hello') const result = _.isSymbol(input) - assert.isTrue(result) + expect(result).toBeTruthy() }) test('returns false for Map with values', () => { const input = new Map() @@ -475,7 +501,7 @@ describe('typed module', () => { input.set('b', 2) input.set('c', 3) const result = _.isSymbol(input) - assert.isFalse(result) + expect(result).toBeFalsy() }) }) @@ -511,34 +537,34 @@ describe('typed module', () => { } complex.loop = complex test('returns true for equal things', () => { - assert.isTrue(_.isEqual(0, 0)) - assert.isTrue(_.isEqual('a', 'a')) + expect(_.isEqual(0, 0)).toBeTruthy() + expect(_.isEqual('a', 'a')).toBeTruthy() const hello = Symbol('hello') - assert.isTrue(_.isEqual(hello, hello)) - assert.isTrue(_.isEqual({}, {})) - assert.isTrue(_.isEqual(true, true)) - assert.isTrue(_.isEqual(new RegExp(/a*s/), new RegExp(/a*s/))) + expect(_.isEqual(hello, hello)).toBeTruthy() + expect(_.isEqual({}, {})).toBeTruthy() + expect(_.isEqual(true, true)).toBeTruthy() + expect(_.isEqual(new RegExp(/a*s/), new RegExp(/a*s/))).toBeTruthy() const now = new Date() - assert.isTrue(_.isEqual(now, now)) - assert.isTrue(_.isEqual([], [])) - assert.isTrue(_.isEqual(complex, { ...complex })) - assert.isTrue( + expect(_.isEqual(now, now)).toBeTruthy() + expect(_.isEqual([], [])).toBeTruthy() + expect(_.isEqual(complex, { ...complex })).toBeTruthy() + expect( _.isEqual([complex, complex], [{ ...complex }, { ...complex }]) - ) + ).toBeTruthy() }) test('returns false for non-equal things', () => { - assert.isFalse(_.isEqual(0, 1)) - assert.isFalse(_.isEqual('a', 'b')) - assert.isFalse(_.isEqual(new RegExp(/^http:/), new RegExp(/https/))) - assert.isFalse(_.isEqual(Symbol('hello'), Symbol('goodbye'))) - assert.isFalse(_.isEqual({ z: 23 }, { a: 1 })) - assert.isFalse(_.isEqual(true, false)) - assert.isFalse( + expect(_.isEqual(0, 1)).toBeFalsy() + expect(_.isEqual('a', 'b')).toBeFalsy() + expect(_.isEqual(new RegExp(/^http:/), new RegExp(/https/))).toBeFalsy() + expect(_.isEqual(Symbol('hello'), Symbol('goodbye'))).toBeFalsy() + expect(_.isEqual({ z: 23 }, { a: 1 })).toBeFalsy() + expect(_.isEqual(true, false)).toBeFalsy() + expect( _.isEqual(new Date(), new Date('2022-09-01T03:25:12.750Z')) - ) - assert.isFalse(_.isEqual([], [1])) - assert.isFalse(_.isEqual(complex, { ...complex, num: 222 })) - assert.isFalse(_.isEqual([complex], [{ ...complex, num: 222 }])) + ).toBeFalsy() + expect(_.isEqual([], [1])).toBeFalsy() + expect(_.isEqual(complex, { ...complex, num: 222 })).toBeFalsy() + expect(_.isEqual([complex], [{ ...complex, num: 222 }])).toBeFalsy() }) }) }) diff --git a/src/typed.ts b/src/typed.ts index e6600171..5966daa2 100644 --- a/src/typed.ts +++ b/src/typed.ts @@ -36,6 +36,12 @@ export const isInt = (value: any): value is number => { return isNumber(value) && value % 1 === 0 } +export const isIntString = (value: any): value is string => { + if (!isString(value)) return false + const num = +value + return num === Math.floor(num) && `${num}` === value +} + export const isFloat = (value: any): value is number => { return isNumber(value) && value % 1 !== 0 } diff --git a/tsconfig.json b/tsconfig.json index 147a4de5..de04712f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,14 @@ { + "include": ["src/**/*.ts"], + "exclude": ["**/*.test.ts"], "compilerOptions": { - "outDir": "dist", "moduleResolution": "node", - "target": "es2020", + "noEmit": true, + "target": "esnext", "lib": ["es2020"], "esModuleInterop": true, - "strict": true - }, - "include": [ - "src/**/*.ts" - ], - "exclude": ["node_modules", "dist"] -} \ No newline at end of file + "skipLibCheck": true, + "strict": true, + "types": [] + } +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 00000000..2e36e7e9 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsup' +import glob from 'fast-glob' + +export default defineConfig({ + entry: glob.sync(['src/**/*.ts', '!**/*.test.ts']), + format: ['cjs', 'esm'], + dts: true, + esbuildOptions(options) { + options.chunkNames = 'chunks/[name]-[hash]' + } +}) diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..7fdcb64d --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + coverage: { + thresholds: { 100: true } + } + } +}) diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index e3a9ad81..00000000 --- a/yarn.lock +++ /dev/null @@ -1,2665 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.19.3": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz" - integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz" - integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helpers" "^7.19.4" - "@babel/parser" "^7.19.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.19.6", "@babel/generator@^7.7.2": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz" - integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== - dependencies: - "@babel/types" "^7.19.4" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== - dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - 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== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.19.6": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz" - integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.19.4" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== - -"@babel/helper-simple-access@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz" - integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== - dependencies: - "@babel/types" "^7.19.4" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - 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== - -"@babel/helpers@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz" - integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.4" - "@babel/types" "^7.19.4" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz" - integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== - -"@babel/plugin-syntax-async-generators@^7.8.4": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.7.2": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz" - integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.6" - "@babel/types" "^7.19.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz" - integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@esbuild/android-arm64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.10.tgz#d784d8f13dbef50492ea55456fb50651e4036fbf" - integrity sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw== - -"@esbuild/android-arm@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.10.tgz#becf6b5647c091b039121db8c17300a7dfd1ab4a" - integrity sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ== - -"@esbuild/android-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.10.tgz#648cacbb13a5047380a038e5d6d895015e31b525" - integrity sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg== - -"@esbuild/darwin-arm64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.10.tgz#3ca7fd9a456d11752df77df6c030f2d08f27bda9" - integrity sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g== - -"@esbuild/darwin-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.10.tgz#7eb71b8da4106627f01553def517d3c5e5942592" - integrity sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ== - -"@esbuild/freebsd-arm64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.10.tgz#c69c78ee1d17d35ad2cf76a1bb67788000a84b43" - integrity sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ== - -"@esbuild/freebsd-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.10.tgz#a9804ab1b9366f915812af24ad5cfc1c0db01441" - integrity sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA== - -"@esbuild/linux-arm64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.10.tgz#d9a9ddfcb28ed8cced688bc112ef66283d6fa77f" - integrity sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA== - -"@esbuild/linux-arm@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.10.tgz#f32cdac1d3319c83ae7f9f31238dd1284ee6bba2" - integrity sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA== - -"@esbuild/linux-ia32@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.10.tgz#1e023478e42f3a01cad48f4af50120d4b639af03" - integrity sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw== - -"@esbuild/linux-loong64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.10.tgz#f9098865a69d1d6e2f8bda51c7f9d4240f20b771" - integrity sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg== - -"@esbuild/linux-mips64el@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.10.tgz#574725ad2ea81b7783b7ba7d1ab3475f8fdd8d32" - integrity sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA== - -"@esbuild/linux-ppc64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.10.tgz#11da658c54514a693813af56bb28951d563a90c3" - integrity sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg== - -"@esbuild/linux-riscv64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.10.tgz#3af4600adbd6c5a4a6f1da05771f4aa6774baab2" - integrity sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw== - -"@esbuild/linux-s390x@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.10.tgz#9e3377aaf0191a9d6628e806a279085ec4391f3e" - integrity sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw== - -"@esbuild/linux-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.10.tgz#7c41d4d697ce674e0083e7baa6231468f4650d85" - integrity sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA== - -"@esbuild/netbsd-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.10.tgz#ebac59e3986834af04bbafcee7b0c1f31cd477c6" - integrity sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA== - -"@esbuild/openbsd-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.10.tgz#9eaa6cac3b80db45090c0946e62de5b5689c61d1" - integrity sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA== - -"@esbuild/sunos-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.10.tgz#31e5e4b814ef43d300e26511e486a4716a390d5f" - integrity sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg== - -"@esbuild/win32-arm64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.10.tgz#ca58472dc03ca79e6d03f8a31113979ff253d94f" - integrity sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw== - -"@esbuild/win32-ia32@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.10.tgz#c572df2c65ab118feed0a5da5a4a193846d74e43" - integrity sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg== - -"@esbuild/win32-x64@0.16.10": - version "0.16.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.10.tgz#0e9c6a5e69c10d96aff2386b7ee9646138c2a831" - integrity sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - 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" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - -"@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== - dependencies: - "@jest/console" "^28.1.3" - "@jest/reporters" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.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 "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" - micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== - dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" - -"@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== - dependencies: - jest-get-type "^28.0.2" - -"@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== - dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" - -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== - dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -"@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/types" "^28.1.3" - -"@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" - "@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 "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== - dependencies: - "@jridgewell/trace-mapping" "^0.3.13" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== - dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== - dependencies: - "@jest/test-result" "^28.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - slash "^3.0.0" - -"@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== - 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" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - 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" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": - 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== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@rollup/plugin-typescript@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz#270b515b116ea28320e6bb62451c4767d49072d6" - integrity sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A== - dependencies: - "@rollup/pluginutils" "^5.0.1" - resolve "^1.22.1" - -"@rollup/pluginutils@^5.0.1": - version "5.0.2" - resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" - integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" - -"@sinclair/typebox@^0.24.1": - version "0.24.50" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.50.tgz" - integrity sha512-k8ETQOOQDg5FtK7y9KJWpsGLik+QlPmIi8zzl/dGUgshV2QitprkFlCR/AemjWOTyKn9UwSSGRTzLVotvgCjYQ== - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@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== - dependencies: - "@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== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== - dependencies: - "@babel/types" "^7.3.0" - -"@types/chai@^4.3.3": - version "4.3.4" - resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== - -"@types/estree@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - 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== - -"@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== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^28.1.1": - version "28.1.8" - resolved "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz" - integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== - dependencies: - expect "^28.0.0" - pretty-format "^28.0.0" - -"@types/node@*": - version "18.11.5" - resolved "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz" - integrity sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ== - -"@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@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== - -"@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== - dependencies: - "@types/yargs-parser" "*" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - 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== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -babel-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== - 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" - -babel-plugin-istanbul@^6.1.1: - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^28.1.3: - 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== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== - dependencies: - babel-plugin-jest-hoist "^28.1.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001400: - version "1.0.30001425" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz" - integrity sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw== - -chai@^4.3.6: - version "4.3.7" - resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@4.1.2, chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0, chalk@^2.3.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -chiller@^1.0.0-rc.30: - version "1.0.0-rc.30" - resolved "https://registry.yarnpkg.com/chiller/-/chiller-1.0.0-rc.30.tgz#5098aff4d3216c7d85cedfbeb2c32a571d48f690" - integrity sha512-pF0QSdHWozhXGN9ywDjMkNK5XBAr4VqG2T5EFbLo4OCjiKu78ERfNCm19pSw9BkBdSL5jPpZuSJ6QBlZEC6frg== - dependencies: - chalk "4.1.2" - chokidar "^3.5.3" - cmdish "^1.1.0" - commander "^9.4.1" - fs-extra "^11.1.0" - glob "^8.0.3" - radash "^10.3.2" - zod "^3.20.2" - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - 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" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.5.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== - -cjs-module-lexer@^1.0.0: - 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== - -cliui@^8.0.1: - 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== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -cmdish@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cmdish/-/cmdish-1.1.0.tgz#55d4be573efc8aaa7e6118143065110dfa9aaa6e" - integrity sha512-f64OcMO7VMG8SLXH92TvCLcj5EERegHAaUDghzc3EQr6noPSxzZqva0/JQETA7bISvqlrkZvyhSdjLvnVilB3w== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^2.12.1: - 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== - -commander@^9.4.1: - version "9.4.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - 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== - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-eql@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz" - integrity sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w== - dependencies: - type-detect "^4.0.0" - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -electron-to-chromium@^1.4.251: - 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== - -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-module-lexer@^1.0.5: - version "1.1.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.1.0.tgz" - integrity sha512-fJg+1tiyEeS8figV+fPcPpm8WqJEflG3yPU0NOm5xMvrNkuiy7HzX/Ljng4Y0hAoiw4/3hQTCFYw+ub8+a2pRA== - -esbuild@^0.16.3: - version "0.16.10" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.10.tgz#d485c28f1626a3f9c1796c952e4cd0561f0031bb" - integrity sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw== - optionalDependencies: - "@esbuild/android-arm" "0.16.10" - "@esbuild/android-arm64" "0.16.10" - "@esbuild/android-x64" "0.16.10" - "@esbuild/darwin-arm64" "0.16.10" - "@esbuild/darwin-x64" "0.16.10" - "@esbuild/freebsd-arm64" "0.16.10" - "@esbuild/freebsd-x64" "0.16.10" - "@esbuild/linux-arm" "0.16.10" - "@esbuild/linux-arm64" "0.16.10" - "@esbuild/linux-ia32" "0.16.10" - "@esbuild/linux-loong64" "0.16.10" - "@esbuild/linux-mips64el" "0.16.10" - "@esbuild/linux-ppc64" "0.16.10" - "@esbuild/linux-riscv64" "0.16.10" - "@esbuild/linux-s390x" "0.16.10" - "@esbuild/linux-x64" "0.16.10" - "@esbuild/netbsd-x64" "0.16.10" - "@esbuild/openbsd-x64" "0.16.10" - "@esbuild/sunos-x64" "0.16.10" - "@esbuild/win32-arm64" "0.16.10" - "@esbuild/win32-ia32" "0.16.10" - "@esbuild/win32-x64" "0.16.10" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estree-walker@^2.0.2: - 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== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^28.0.0, expect@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== - dependencies: - "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - 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== - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -fs-extra@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - 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== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - 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" - -glob@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - 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== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - 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== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - 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== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - p-limit "^3.1.0" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== - dependencies: - "@jest/core" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.3" - "@jest/types" "^28.1.3" - babel-jest "^28.1.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 "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^28.1.3" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== - dependencies: - detect-newline "^3.0.0" - -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== - dependencies: - "@jest/types" "^28.1.3" - chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" - -jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-haste-map@^28.1.3: - 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== - 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" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== - dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== - dependencies: - chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^28.0.2: - 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== - -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== - dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" - -jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== - dependencies: - "@jest/console" "^28.1.3" - "@jest/environment" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.10.2" - graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/globals" "^28.1.3" - "@jest/source-map" "^28.1.2" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.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 "^28.1.3" - graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - natural-compare "^1.4.0" - pretty-format "^28.1.3" - semver "^7.3.5" - -jest-util@^28.0.0, jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - 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" - -jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== - dependencies: - "@jest/types" "^28.1.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^28.0.2" - leven "^3.1.0" - pretty-format "^28.1.3" - -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== - dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" - -jest-worker@^28.1.3: - 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== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" - integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== - dependencies: - "@jest/core" "^28.1.3" - "@jest/types" "^28.1.3" - import-local "^3.0.2" - jest-cli "^28.1.3" - -joycon@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz" - integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - 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== - -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== - dependencies: - get-func-name "^2.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.26.7: - version "0.26.7" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^3.0.0: - 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== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" - integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mkdirp@^0.5.3: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - 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" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - 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== - dependencies: - find-up "^4.0.0" - -prettier-plugin-organize-imports@^3.0.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.1.tgz#7e0e0a18457e0166e740daaff1aed1c08069fcb9" - integrity sha512-bty7C2Ecard5EOXirtzeCAqj4FU4epeuWrQt/Z+sh8UVEpBlBZ3m3KNPz2kFu7KgRTQx/C9o4/TdquPD1jOqjQ== - -prettier@^2.7.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== - -pretty-format@^28.0.0, pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -radash@^10.3.2: - version "10.3.2" - resolved "https://registry.yarnpkg.com/radash/-/radash-10.3.2.tgz#688e1db43d3d75694540dd5866358aa4be68af80" - integrity sha512-ixLKg4xJFVYDEHck4/30BonhHPw+3bQAkSoyAPTICi57xEDUPQgh4VtzRl0hNUjymBaAfYp/VjmvWujSVCe0FQ== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - 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== - -resolve-cwd@^3.0.0: - 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== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-dts@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.0.0.tgz" - integrity sha512-OO8ayCvuJCKaQSShyVTARxGurVVk4ulzbuvz+0zFd1f93vlnWFU5pBMT7HFeS6uj7MvvZLx4kUAarGATSU1+Ng== - dependencies: - magic-string "^0.26.7" - optionalDependencies: - "@babel/code-frame" "^7.18.6" - -rollup-plugin-esbuild@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-5.0.0.tgz" - integrity sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg== - dependencies: - "@rollup/pluginutils" "^5.0.1" - debug "^4.3.4" - es-module-lexer "^1.0.5" - joycon "^3.1.1" - jsonc-parser "^3.2.0" - -rollup-plugin-node-externals@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-externals/-/rollup-plugin-node-externals-5.0.3.tgz#77522654ddbae6f28f6ae15a849d54427d5a637d" - integrity sha512-2hehUFt243Lra6tf1cJyRMz5OlTf+kn8zYyl8wR4MLkUiX+X96YVhfer7qsn2X30mnuGVvpY/oyFlJ86i9DF3Q== - -rollup@^3.2.5: - version "3.7.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.7.5.tgz#db580f8eda50237b0721ddea301fb981cd992933" - integrity sha512-z0ZbqHBtS/et2EEUKMrAl2CoSdwN7ZPzL17UMiKN9RjjqHShTlv7F9J6ZJZJNREYjBh3TvBrdfjkFDIXFNeuiQ== - optionalDependencies: - fsevents "~2.3.2" - -semver@7.x, semver@^7.3.5: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^5.3.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - 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== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - 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== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - 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== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - 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== - -to-regex-range@^5.0.1: - 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== - dependencies: - is-number "^7.0.0" - -ts-jest@^28.0.8: - version "28.0.8" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz" - integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -tslib@^1.13.0, tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslint@^6.0.0: - version "6.1.3" - resolved "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: - 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== - -type-fest@^0.21.3: - 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== - -typescript@^4.8.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.1: - 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== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.0.0, yargs-parser@^21.0.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.6.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz" - integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== - 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.0.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.20.2: - version "3.20.2" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807" - integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==