diff --git a/.eslintignore b/.eslintignore index 55d0391..237b634 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,8 +1,9 @@ # don't ever lint node_modules node_modules # don't lint build output -build +dist # don't lint nyc coverage output coverage tools +tests/integrations/**/*.stories.tsx diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d59c400..82d6a07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,19 +7,27 @@ jobs: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'ci skip') && !contains(github.event.head_commit.message, 'skip ci')" steps: - - uses: actions/checkout@v2 + - name: Checkout codes + uses: actions/checkout@v4 - name: Prepare repository run: git fetch --unshallow --tags + - name: Enable corepack + run: corepack enable + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'pnpm' + - uses: pnpm/action-setup@v4 with: - version: 9 run_install: true - name: Create Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - pnpm run release + run: pnpm run release diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8f0675d..f78eb30 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,14 +6,24 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout codes + uses: actions/checkout@v4 + - name: Enable corepack + run: corepack enable + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'pnpm' - uses: pnpm/action-setup@v4 with: - version: 9 run_install: true + - name: Build + run: pnpm run build + - name: Run tests - run: | - pnpm run test:ci + run: pnpm run test:ci diff --git a/.gitignore b/.gitignore index 2e43380..bd06758 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies -/node_modules +node_modules /.pnp .pnp.js +tests/integrations/**/pnpm-lock.yaml + # testing /coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index e187b21..02a11ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -190,9 +190,9 @@ The `story-exports` rule now detects whether you are using `includeStories/exclu export default { title: 'Button', includeStories: ['myStory'], // <-- notice the lowercase m, which won't match with the story name -}; +} -export const MyStory = {}; +export const MyStory = {} ``` --- @@ -569,7 +569,7 @@ export const MyStory = {}; - no-title-property-in-meta: fix dangling comma and highlighting [#32](https://github.com/storybookjs/eslint-plugin-storybook/pull/32) ([@yannbf](https://github.com/yannbf)) - Update docs [#35](https://github.com/storybookjs/eslint-plugin-storybook/pull/35) ([@kylegach](https://github.com/kylegach) [@yannbf](https://github.com/yannbf)) -- prefer-pascal-case: ignore __namedExportsOrder [#34](https://github.com/storybookjs/eslint-plugin-storybook/pull/34) ([@yannbf](https://github.com/yannbf)) +- prefer-pascal-case: ignore \_\_namedExportsOrder [#34](https://github.com/storybookjs/eslint-plugin-storybook/pull/34) ([@yannbf](https://github.com/yannbf)) - hierarchy-separator: fix node highlight [#33](https://github.com/storybookjs/eslint-plugin-storybook/pull/33) ([@yannbf](https://github.com/yannbf)) - no-redundant-story-name: add CSF2 support [#31](https://github.com/storybookjs/eslint-plugin-storybook/pull/31) ([@yannbf](https://github.com/yannbf)) - prefer-pascal-case: add non-story exports check [#30](https://github.com/storybookjs/eslint-plugin-storybook/pull/30) ([@yannbf](https://github.com/yannbf)) diff --git a/README.md b/README.md index 626cb28..490840e 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,23 @@ This allows for this plugin to also lint your configuration files inside the .st > For more info on why this line is required in the .eslintignore file, check this [ESLint documentation](https://eslint.org/docs/latest/user-guide/configuring/ignoring-code#:~:text=In%20addition%20to,contents%2C%20are%20ignored). +If you are using [flat config style](https://eslint.org/docs/latest/use/configure/configuration-files-new), add this to your configuration file: + +```js +export default [ + // ... + { + // Inside your .eslintignore file + ignores: ['!.storybook'], + }, +] +``` + ## Usage -Use `.eslintrc.*` file to configure rules. See also: https://eslint.org/docs/user-guide/configuring +### Configuration (`.eslintrc`) + +Use `.eslintrc.*` file to configure rules in ESLint < v9. See also: https://eslint.org/docs/latest/use/configure/. Add `plugin:storybook/recommended` to the extends section of your `.eslintrc` configuration file. Note that we can omit the `eslint-plugin-` prefix: @@ -74,7 +88,7 @@ Add `plugin:storybook/recommended` to the extends section of your `.eslintrc` co This plugin will only be applied to files following the `*.stories.*` (we recommend this) or `*.story.*` pattern. This is an automatic configuration, so you don't have to do anything. -### Overriding/disabling rules +#### Overriding/disabling rules Optionally, you can override, add or disable rules settings. You likely don't want these settings to be applied in every file, so make sure that you add a `overrides` section in your `.eslintrc.*` file that applies the overrides only to your stories files. @@ -83,7 +97,7 @@ Optionally, you can override, add or disable rules settings. You likely don't wa "overrides": [ { // or whatever matches stories specified in .storybook/main.js - "files": ['*.stories.@(ts|tsx|js|jsx|mjs|cjs)'], + "files": ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)'], "rules": { // example of overriding a rule 'storybook/hierarchy-separator': 'error', @@ -95,6 +109,47 @@ Optionally, you can override, add or disable rules settings. You likely don't wa } ``` +### Configuration (`eslint.config.[c|m]?js`) + +Use `eslint.config.[c|m]?js` file to configure rules. This is the default in ESLint v9, but can be used starting from ESLint v8.57.0. See also: https://eslint.org/docs/latest/use/configure/configuration-files-new. + +```js +import storybook from 'eslint-plugin-storybook' + +export default [ + // add more generic rulesets here, such as: + // js.configs.recommended, + ...storybook.configs['flat/recommended'], + + // something ... +] +``` + +#### Overriding/disabling rules + +Optionally, you can override, add or disable rules settings. You likely don't want these settings to be applied in every file, so make sure that you add a flat config section in your `eslint.config.[m|c]?js` file that applies the overrides only to your stories files. + +```js +import storybook from 'eslint-plugin-storybook' + +export default [ + // ... + + ...storybook.configs['flat/recommended'], + { + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)'], + rules: { + // example of overriding a rule + 'storybook/hierarchy-separator': 'error', + // example of disabling a rule + 'storybook/default-exports': 'off', + }, + }, + + // something ... +] +``` + ### MDX Support This plugin does not support MDX files. @@ -107,21 +162,21 @@ This plugin does not support MDX files. **Configurations**: csf, csf-strict, addon-interactions, recommended -| Name | Description | 🔧 | Included in configurations | -| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | --- | -------------------------------------------------------- | -| [`storybook/await-interactions`](./docs/rules/await-interactions.md) | Interactions should be awaited | 🔧 | | -| [`storybook/context-in-play-function`](./docs/rules/context-in-play-function.md) | Pass a context when invoking play function of another story | | | -| [`storybook/csf-component`](./docs/rules/csf-component.md) | The component property should be set | | | -| [`storybook/default-exports`](./docs/rules/default-exports.md) | Story files should have a default export | 🔧 | | -| [`storybook/hierarchy-separator`](./docs/rules/hierarchy-separator.md) | Deprecated hierarchy separator in title property | 🔧 | | -| [`storybook/no-redundant-story-name`](./docs/rules/no-redundant-story-name.md) | A story should not have a redundant name property | 🔧 | | -| [`storybook/no-stories-of`](./docs/rules/no-stories-of.md) | storiesOf is deprecated and should not be used | | | -| [`storybook/no-title-property-in-meta`](./docs/rules/no-title-property-in-meta.md) | Do not define a title in meta | 🔧 | | -| [`storybook/no-uninstalled-addons`](./docs/rules/no-uninstalled-addons.md) | This rule identifies storybook addons that are invalid because they are either not installed or contain a typo in their name. | | | -| [`storybook/prefer-pascal-case`](./docs/rules/prefer-pascal-case.md) | Stories should use PascalCase | 🔧 | | -| [`storybook/story-exports`](./docs/rules/story-exports.md) | A story file must contain at least one story export | | | -| [`storybook/use-storybook-expect`](./docs/rules/use-storybook-expect.md) | Use expect from `@storybook/jest` | 🔧 | | -| [`storybook/use-storybook-testing-library`](./docs/rules/use-storybook-testing-library.md) | Do not use testing-library directly on stories | 🔧 | | +| Name | Description | 🔧 | Included in configurations | +| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | --- | ----------------------------------------------------------------------------------------------------------------- | +| [`storybook/await-interactions`](./docs/rules/await-interactions.md) | Interactions should be awaited | 🔧 | | +| [`storybook/context-in-play-function`](./docs/rules/context-in-play-function.md) | Pass a context when invoking play function of another story | | | +| [`storybook/csf-component`](./docs/rules/csf-component.md) | The component property should be set | | | +| [`storybook/default-exports`](./docs/rules/default-exports.md) | Story files should have a default export | 🔧 | | +| [`storybook/hierarchy-separator`](./docs/rules/hierarchy-separator.md) | Deprecated hierarchy separator in title property | 🔧 | | +| [`storybook/no-redundant-story-name`](./docs/rules/no-redundant-story-name.md) | A story should not have a redundant name property | 🔧 | | +| [`storybook/no-stories-of`](./docs/rules/no-stories-of.md) | storiesOf is deprecated and should not be used | | | +| [`storybook/no-title-property-in-meta`](./docs/rules/no-title-property-in-meta.md) | Do not define a title in meta | 🔧 | | +| [`storybook/no-uninstalled-addons`](./docs/rules/no-uninstalled-addons.md) | This rule identifies storybook addons that are invalid because they are either not installed or contain a typo in their name. | | | +| [`storybook/prefer-pascal-case`](./docs/rules/prefer-pascal-case.md) | Stories should use PascalCase | 🔧 | | +| [`storybook/story-exports`](./docs/rules/story-exports.md) | A story file must contain at least one story export | | | +| [`storybook/use-storybook-expect`](./docs/rules/use-storybook-expect.md) | Use expect from `@storybook/jest` | 🔧 | | +| [`storybook/use-storybook-testing-library`](./docs/rules/use-storybook-testing-library.md) | Do not use testing-library directly on stories | 🔧 | | diff --git a/docs/rules/await-interactions.md b/docs/rules/await-interactions.md index 8932f4a..b89cea0 100644 --- a/docs/rules/await-interactions.md +++ b/docs/rules/await-interactions.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/context-in-play-function.md b/docs/rules/context-in-play-function.md index 89b0e6d..35ee55d 100644 --- a/docs/rules/context-in-play-function.md +++ b/docs/rules/context-in-play-function.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/csf-component.md b/docs/rules/csf-component.md index f2ca677..5cbfb1f 100644 --- a/docs/rules/csf-component.md +++ b/docs/rules/csf-component.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/default-exports.md b/docs/rules/default-exports.md index 74f74db..557af7b 100644 --- a/docs/rules/default-exports.md +++ b/docs/rules/default-exports.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/hierarchy-separator.md b/docs/rules/hierarchy-separator.md index f132bf7..4d42160 100644 --- a/docs/rules/hierarchy-separator.md +++ b/docs/rules/hierarchy-separator.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: @@ -35,5 +35,5 @@ For more details about this change: https://github.com/storybookjs/storybook/blo To automatically migrate all of your codebase and fix this issue, run this codemod in the root folder of your project: ```sh -npx sb@next migrate upgrade-hierarchy-separators --glob="*/**/*.stories.@(tsx|jsx|ts|js)" +npx storybook@latest migrate upgrade-hierarchy-separators --glob="*/**/*.stories.@(tsx|jsx|ts|js)" ``` diff --git a/docs/rules/no-redundant-story-name.md b/docs/rules/no-redundant-story-name.md index 0e30469..85e01ca 100644 --- a/docs/rules/no-redundant-story-name.md +++ b/docs/rules/no-redundant-story-name.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/no-stories-of.md b/docs/rules/no-stories-of.md index 43330a4..ec61c1a 100644 --- a/docs/rules/no-stories-of.md +++ b/docs/rules/no-stories-of.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: @@ -52,5 +52,5 @@ For more information about the change from `storiesOf` to `CSF`, read here: http To automatically migrate all of your codebase, run this codemod in the root folder of your project: ```sh -npx sb@next migrate storiesof-to-csf --glob="*/**/*.stories.@(tsx|jsx|ts|js)" +npx storybook@latest migrate storiesof-to-csf --glob="*/**/*.stories.@(tsx|jsx|ts|js)" ``` diff --git a/docs/rules/no-title-property-in-meta.md b/docs/rules/no-title-property-in-meta.md index 906a269..429f15b 100644 --- a/docs/rules/no-title-property-in-meta.md +++ b/docs/rules/no-title-property-in-meta.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/no-uninstalled-addons.md b/docs/rules/no-uninstalled-addons.md index b4b22ef..df0d2aa 100644 --- a/docs/rules/no-uninstalled-addons.md +++ b/docs/rules/no-uninstalled-addons.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/prefer-pascal-case.md b/docs/rules/prefer-pascal-case.md index 2f44ce5..be0423f 100644 --- a/docs/rules/prefer-pascal-case.md +++ b/docs/rules/prefer-pascal-case.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/story-exports.md b/docs/rules/story-exports.md index 2187045..df63c9d 100644 --- a/docs/rules/story-exports.md +++ b/docs/rules/story-exports.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/use-storybook-expect.md b/docs/rules/use-storybook-expect.md index b3e70a4..eb772fd 100644 --- a/docs/rules/use-storybook-expect.md +++ b/docs/rules/use-storybook-expect.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/docs/rules/use-storybook-testing-library.md b/docs/rules/use-storybook-testing-library.md index 05151a6..1ba500a 100644 --- a/docs/rules/use-storybook-testing-library.md +++ b/docs/rules/use-storybook-testing-library.md @@ -2,7 +2,7 @@ -**Included in these configurations**: +**Included in these configurations**: diff --git a/jest.integration.config.js b/jest.integration.config.js new file mode 100644 index 0000000..aed6a90 --- /dev/null +++ b/jest.integration.config.js @@ -0,0 +1,6 @@ +module.exports = { + testMatch: ['**/tests/**/*.spec.ts'], + transform: { + '^.+\\.ts?$': 'ts-jest', + }, +} diff --git a/lib/configs/addon-interactions.ts b/lib/configs/addon-interactions.ts index 55be399..5d2710a 100644 --- a/lib/configs/addon-interactions.ts +++ b/lib/configs/addon-interactions.ts @@ -1,13 +1,13 @@ /* * IMPORTANT! * This file has been automatically generated, - * in order to update it's content execute "pnpm run update-all" + * in order to update its content, execute "pnpm run update-all" */ export = { plugins: ['storybook'], overrides: [ { - files: ['*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], rules: { 'react-hooks/rules-of-hooks': 'off', 'import/no-anonymous-default-export': 'off', diff --git a/lib/configs/csf-strict.ts b/lib/configs/csf-strict.ts index 1a8d2c1..bd7a639 100644 --- a/lib/configs/csf-strict.ts +++ b/lib/configs/csf-strict.ts @@ -1,7 +1,7 @@ /* * IMPORTANT! * This file has been automatically generated, - * in order to update it's content execute "pnpm run update-all" + * in order to update its content, execute "pnpm run update-all" */ export = { extends: require.resolve('./csf'), diff --git a/lib/configs/csf.ts b/lib/configs/csf.ts index 6d65950..5781e25 100644 --- a/lib/configs/csf.ts +++ b/lib/configs/csf.ts @@ -1,13 +1,13 @@ /* * IMPORTANT! * This file has been automatically generated, - * in order to update it's content execute "pnpm run update-all" + * in order to update its content, execute "pnpm run update-all" */ export = { plugins: ['storybook'], overrides: [ { - files: ['*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], rules: { 'react-hooks/rules-of-hooks': 'off', 'import/no-anonymous-default-export': 'off', diff --git a/lib/configs/flat/addon-interactions.ts b/lib/configs/flat/addon-interactions.ts new file mode 100644 index 0000000..82d6aab --- /dev/null +++ b/lib/configs/flat/addon-interactions.ts @@ -0,0 +1,34 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ +export = [ + { + name: 'storybook:addon-interactions:setup', + plugins: { + get storybook() { + return require('../../index') + }, + }, + }, + { + name: 'storybook:addon-interactions:stories-rules', + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + rules: { + 'react-hooks/rules-of-hooks': 'off', + 'import/no-anonymous-default-export': 'off', + 'storybook/await-interactions': 'error', + 'storybook/context-in-play-function': 'error', + 'storybook/use-storybook-expect': 'error', + 'storybook/use-storybook-testing-library': 'error', + }, + }, + { + name: 'storybook:addon-interactions:main-rules', + files: ['.storybook/main.@(js|cjs|mjs|ts)'], + rules: { + 'storybook/no-uninstalled-addons': 'error', + }, + }, +] diff --git a/lib/configs/flat/csf-strict.ts b/lib/configs/flat/csf-strict.ts new file mode 100644 index 0000000..6f37c37 --- /dev/null +++ b/lib/configs/flat/csf-strict.ts @@ -0,0 +1,19 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ +import config from './csf' + +export = [ + ...config, + { + name: 'storybook:csf-strict:rules', + rules: { + 'react-hooks/rules-of-hooks': 'off', + 'import/no-anonymous-default-export': 'off', + 'storybook/no-stories-of': 'error', + 'storybook/no-title-property-in-meta': 'error', + }, + }, +] diff --git a/lib/configs/flat/csf.ts b/lib/configs/flat/csf.ts new file mode 100644 index 0000000..23384d1 --- /dev/null +++ b/lib/configs/flat/csf.ts @@ -0,0 +1,35 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ +export = [ + { + name: 'storybook:csf:setup', + plugins: { + get storybook() { + return require('../../index') + }, + }, + }, + { + name: 'storybook:csf:stories-rules', + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + rules: { + 'react-hooks/rules-of-hooks': 'off', + 'import/no-anonymous-default-export': 'off', + 'storybook/csf-component': 'warn', + 'storybook/default-exports': 'error', + 'storybook/hierarchy-separator': 'warn', + 'storybook/no-redundant-story-name': 'warn', + 'storybook/story-exports': 'error', + }, + }, + { + name: 'storybook:csf:main-rules', + files: ['.storybook/main.@(js|cjs|mjs|ts)'], + rules: { + 'storybook/no-uninstalled-addons': 'error', + }, + }, +] diff --git a/lib/configs/flat/recommended.ts b/lib/configs/flat/recommended.ts new file mode 100644 index 0000000..4dd59fe --- /dev/null +++ b/lib/configs/flat/recommended.ts @@ -0,0 +1,39 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ +export = [ + { + name: 'storybook:recommended:setup', + plugins: { + get storybook() { + return require('../../index') + }, + }, + }, + { + name: 'storybook:recommended:stories-rules', + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + rules: { + 'react-hooks/rules-of-hooks': 'off', + 'import/no-anonymous-default-export': 'off', + 'storybook/await-interactions': 'error', + 'storybook/context-in-play-function': 'error', + 'storybook/default-exports': 'error', + 'storybook/hierarchy-separator': 'warn', + 'storybook/no-redundant-story-name': 'warn', + 'storybook/prefer-pascal-case': 'warn', + 'storybook/story-exports': 'error', + 'storybook/use-storybook-expect': 'error', + 'storybook/use-storybook-testing-library': 'error', + }, + }, + { + name: 'storybook:recommended:main-rules', + files: ['.storybook/main.@(js|cjs|mjs|ts)'], + rules: { + 'storybook/no-uninstalled-addons': 'error', + }, + }, +] diff --git a/lib/configs/recommended.ts b/lib/configs/recommended.ts index 68f218d..11d50f2 100644 --- a/lib/configs/recommended.ts +++ b/lib/configs/recommended.ts @@ -1,13 +1,13 @@ /* * IMPORTANT! * This file has been automatically generated, - * in order to update it's content execute "pnpm run update-all" + * in order to update its content, execute "pnpm run update-all" */ export = { plugins: ['storybook'], overrides: [ { - files: ['*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], rules: { 'react-hooks/rules-of-hooks': 'off', 'import/no-anonymous-default-export': 'off', diff --git a/lib/index.ts b/lib/index.ts index eade7bd..be3f92e 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,18 +1,61 @@ -/** - * @fileoverview Best practice rules for Storybook - * @author Yann Braga +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "pnpm run update" */ +// configs +import csf from './configs/csf' +import csfStrict from './configs/csf-strict' +import addonInteractions from './configs/addon-interactions' +import recommended from './configs/recommended' +import flatCsf from './configs/flat/csf' +import flatCsfStrict from './configs/flat/csf-strict' +import flatAddonInteractions from './configs/flat/addon-interactions' +import flatRecommended from './configs/flat/recommended' -//------------------------------------------------------------------------------ -// Requirements -//------------------------------------------------------------------------------ +// rules +import awaitInteractions from './rules/await-interactions' +import contextInPlayFunction from './rules/context-in-play-function' +import csfComponent from './rules/csf-component' +import defaultExports from './rules/default-exports' +import hierarchySeparator from './rules/hierarchy-separator' +import noRedundantStoryName from './rules/no-redundant-story-name' +import noStoriesOf from './rules/no-stories-of' +import noTitlePropertyInMeta from './rules/no-title-property-in-meta' +import noUninstalledAddons from './rules/no-uninstalled-addons' +import preferPascalCase from './rules/prefer-pascal-case' +import storyExports from './rules/story-exports' +import useStorybookExpect from './rules/use-storybook-expect' +import useStorybookTestingLibrary from './rules/use-storybook-testing-library' -import requireIndex from 'requireindex' +// export plugin +export = { + configs: { + // eslintrc configs + csf: csf, + 'csf-strict': csfStrict, + 'addon-interactions': addonInteractions, + recommended: recommended, -//------------------------------------------------------------------------------ -// Plugin Definition -//------------------------------------------------------------------------------ - -// import all rules in lib/rules -export const rules = requireIndex(__dirname + '/rules') -export const configs = requireIndex(__dirname + '/configs') + // flat configs + 'flat/csf': flatCsf, + 'flat/csf-strict': flatCsfStrict, + 'flat/addon-interactions': flatAddonInteractions, + 'flat/recommended': flatRecommended, + }, + rules: { + 'await-interactions': awaitInteractions, + 'context-in-play-function': contextInPlayFunction, + 'csf-component': csfComponent, + 'default-exports': defaultExports, + 'hierarchy-separator': hierarchySeparator, + 'no-redundant-story-name': noRedundantStoryName, + 'no-stories-of': noStoriesOf, + 'no-title-property-in-meta': noTitlePropertyInMeta, + 'no-uninstalled-addons': noUninstalledAddons, + 'prefer-pascal-case': preferPascalCase, + 'story-exports': storyExports, + 'use-storybook-expect': useStorybookExpect, + 'use-storybook-testing-library': useStorybookTestingLibrary, + }, +} diff --git a/lib/rules/await-interactions.ts b/lib/rules/await-interactions.ts index d546250..13bc314 100644 --- a/lib/rules/await-interactions.ts +++ b/lib/rules/await-interactions.ts @@ -32,7 +32,7 @@ export = createStorybookRule({ docs: { description: 'Interactions should be awaited', categories: [CategoryId.ADDON_INTERACTIONS, CategoryId.RECOMMENDED], - recommended: 'error', // or 'warn' + recommended: 'strict', }, messages: { interactionShouldBeAwaited: 'Interaction should be awaited: {{method}}', @@ -132,7 +132,8 @@ export = createStorybookRule({ const isUserEventFromStorybookImported = (node: TSESTree.ImportDeclaration) => { return ( - node.source.value === '@storybook/testing-library' && + (node.source.value === '@storybook/testing-library' || + node.source.value === '@storybook/test') && node.specifiers.find( (spec) => isImportSpecifier(spec) && @@ -144,7 +145,7 @@ export = createStorybookRule({ const isExpectFromStorybookImported = (node: TSESTree.ImportDeclaration) => { return ( - node.source.value === '@storybook/jest' && + (node.source.value === '@storybook/jest' || node.source.value === '@storybook/test') && node.specifiers.find( (spec) => isImportSpecifier(spec) && spec.imported.name === 'expect' ) !== undefined diff --git a/lib/rules/context-in-play-function.ts b/lib/rules/context-in-play-function.ts index eae65b2..c4c5da7 100644 --- a/lib/rules/context-in-play-function.ts +++ b/lib/rules/context-in-play-function.ts @@ -30,7 +30,7 @@ export = createStorybookRule({ docs: { description: 'Pass a context when invoking play function of another story', categories: [CategoryId.RECOMMENDED, CategoryId.ADDON_INTERACTIONS], - recommended: 'error', + recommended: 'strict', }, messages: { passContextToPlayFunction: 'Pass a context when invoking play function of another story', @@ -96,7 +96,6 @@ export = createStorybookRule({ } } return undefined - } // Expression passing an argument called context OR spreading a variable called context diff --git a/lib/rules/csf-component.ts b/lib/rules/csf-component.ts index b2f2e3a..eb25b63 100644 --- a/lib/rules/csf-component.ts +++ b/lib/rules/csf-component.ts @@ -21,7 +21,7 @@ export = createStorybookRule({ docs: { description: 'The component property should be set', categories: [CategoryId.CSF], - recommended: 'warn', + recommended: 'recommended', }, messages: { missingComponentProperty: 'Missing component property.', diff --git a/lib/rules/default-exports.ts b/lib/rules/default-exports.ts index 4776177..f728223 100644 --- a/lib/rules/default-exports.ts +++ b/lib/rules/default-exports.ts @@ -22,7 +22,7 @@ export = createStorybookRule({ docs: { description: 'Story files should have a default export', categories: [CategoryId.CSF, CategoryId.RECOMMENDED], - recommended: 'error', + recommended: 'strict', }, messages: { shouldHaveDefaultExport: 'The file should have a default export.', diff --git a/lib/rules/hierarchy-separator.ts b/lib/rules/hierarchy-separator.ts index ab32bc0..0c35105 100644 --- a/lib/rules/hierarchy-separator.ts +++ b/lib/rules/hierarchy-separator.ts @@ -23,7 +23,7 @@ export = createStorybookRule({ docs: { description: 'Deprecated hierarchy separator in title property', categories: [CategoryId.CSF, CategoryId.RECOMMENDED], - recommended: 'warn', + recommended: 'recommended', }, messages: { useCorrectSeparators: 'Use correct separators', diff --git a/lib/rules/meta-inline-properties.ts b/lib/rules/meta-inline-properties.ts index 3df3f71..05c700d 100644 --- a/lib/rules/meta-inline-properties.ts +++ b/lib/rules/meta-inline-properties.ts @@ -25,7 +25,7 @@ export = createStorybookRule({ description: 'Meta should only have inline properties', categories: [CategoryId.CSF, CategoryId.RECOMMENDED], excludeFromConfig: true, - recommended: 'error', + recommended: 'strict', }, messages: { metaShouldHaveInlineProperties: 'Meta should only have inline properties: {{property}}', diff --git a/lib/rules/no-redundant-story-name.ts b/lib/rules/no-redundant-story-name.ts index d652a12..aab64a3 100644 --- a/lib/rules/no-redundant-story-name.ts +++ b/lib/rules/no-redundant-story-name.ts @@ -32,7 +32,7 @@ export = createStorybookRule({ docs: { description: 'A story should not have a redundant name property', categories: [CategoryId.CSF, CategoryId.RECOMMENDED], - recommended: 'warn', + recommended: 'recommended', }, messages: { removeRedundantName: 'Remove redundant name', diff --git a/lib/rules/no-stories-of.ts b/lib/rules/no-stories-of.ts index da1f031..419716a 100644 --- a/lib/rules/no-stories-of.ts +++ b/lib/rules/no-stories-of.ts @@ -18,7 +18,7 @@ export = createStorybookRule({ docs: { description: 'storiesOf is deprecated and should not be used', categories: [CategoryId.CSF_STRICT], - recommended: 'error', + recommended: 'strict', }, messages: { doNotUseStoriesOf: 'storiesOf is deprecated and should not be used', diff --git a/lib/rules/no-title-property-in-meta.ts b/lib/rules/no-title-property-in-meta.ts index 76909fd..3a22e32 100644 --- a/lib/rules/no-title-property-in-meta.ts +++ b/lib/rules/no-title-property-in-meta.ts @@ -23,7 +23,7 @@ export = createStorybookRule({ docs: { description: 'Do not define a title in meta', categories: [CategoryId.CSF_STRICT], - recommended: 'error', + recommended: 'strict', }, messages: { removeTitleInMeta: 'Remove title property from meta', diff --git a/lib/rules/no-uninstalled-addons.ts b/lib/rules/no-uninstalled-addons.ts index bfb1cdc..990c5a4 100644 --- a/lib/rules/no-uninstalled-addons.ts +++ b/lib/rules/no-uninstalled-addons.ts @@ -39,7 +39,7 @@ export = createStorybookRule({ description: 'This rule identifies storybook addons that are invalid because they are either not installed or contain a typo in their name.', categories: [CategoryId.RECOMMENDED], - recommended: 'error', // or 'error' + recommended: 'strict', }, messages: { addonIsNotInstalled: `The {{ addonName }} is not installed in {{packageJsonPath}}. Did you forget to install it or is your package.json in a different location?`, diff --git a/lib/rules/prefer-pascal-case.ts b/lib/rules/prefer-pascal-case.ts index 882bbbb..fe06439 100644 --- a/lib/rules/prefer-pascal-case.ts +++ b/lib/rules/prefer-pascal-case.ts @@ -3,7 +3,7 @@ * @author Yann Braga */ -import { ASTUtils, TSESTree } from '@typescript-eslint/utils' +import { ASTUtils, TSESTree, TSESLint } from '@typescript-eslint/utils' import { IncludeExcludeOptions, isExportStory } from '@storybook/csf' import { getDescriptor, getMetaObjectExpression } from '../utils' @@ -25,7 +25,7 @@ export = createStorybookRule({ docs: { description: 'Stories should use PascalCase', categories: [CategoryId.RECOMMENDED], - recommended: 'warn', + recommended: 'stylistic', }, messages: { convertToPascalCase: 'Use pascal case', @@ -53,6 +53,24 @@ export = createStorybookRule({ .replace(new RegExp(/\s/, 'g'), '') .replace(new RegExp(/\w/), (s) => s.toUpperCase()) } + const getModuleScope = (): TSESLint.Scope.Scope | undefined => { + const { sourceCode } = context + + // Compatibility implementation for eslint v8.x and v9.x or later + // see https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#context.getscope() + // @ts-expect-error keep it for compatibility with eslint v8.x + if (sourceCode.getScope) { + // for eslint v9.x or later + return sourceCode.scopeManager?.scopes?.find( + (scope: TSESLint.Scope.Scope) => scope.type === 'module' + ) + } else { + // for eslint v8.x + return context + .getScope() + .childScopes.find((scope) => scope.type === 'module') as unknown as TSESLint.Scope.Scope + } + } const checkAndReportError = (id: TSESTree.Identifier, nonStoryExportsConfig = {}) => { const { name } = id @@ -77,7 +95,7 @@ export = createStorybookRule({ const pascal = toPascalCase(name) yield fixer.replaceTextRange(id.range, pascal + suffix) - const scope = context.getScope().childScopes[0] + const scope = getModuleScope() if (scope) { const variable = ASTUtils.findVariable(scope, name) const referenceCount = variable?.references?.length || 0 diff --git a/lib/rules/story-exports.ts b/lib/rules/story-exports.ts index 35e59fc..fea74f7 100644 --- a/lib/rules/story-exports.ts +++ b/lib/rules/story-exports.ts @@ -27,7 +27,7 @@ export = createStorybookRule({ docs: { description: 'A story file must contain at least one story export', categories: [CategoryId.RECOMMENDED, CategoryId.CSF], - recommended: 'error', + recommended: 'strict', }, messages: { shouldHaveStoryExport: 'The file should have at least one story export', diff --git a/lib/rules/use-storybook-expect.ts b/lib/rules/use-storybook-expect.ts index 5ea7417..f2c3f9e 100644 --- a/lib/rules/use-storybook-expect.ts +++ b/lib/rules/use-storybook-expect.ts @@ -28,7 +28,7 @@ export = createStorybookRule({ docs: { description: 'Use expect from `@storybook/test` or `@storybook/jest`', categories: [CategoryId.ADDON_INTERACTIONS, CategoryId.RECOMMENDED], - recommended: 'error', + recommended: 'strict', }, messages: { updateImports: 'Update imports', diff --git a/lib/rules/use-storybook-testing-library.ts b/lib/rules/use-storybook-testing-library.ts index 107ac8a..b4430c2 100644 --- a/lib/rules/use-storybook-testing-library.ts +++ b/lib/rules/use-storybook-testing-library.ts @@ -21,7 +21,7 @@ export = createStorybookRule({ docs: { description: 'Do not use testing-library directly on stories', categories: [CategoryId.ADDON_INTERACTIONS, CategoryId.RECOMMENDED], - recommended: 'error', + recommended: 'strict', }, schema: [], messages: { diff --git a/lib/types/index.ts b/lib/types/index.ts index 538df07..9f772fd 100644 --- a/lib/types/index.ts +++ b/lib/types/index.ts @@ -1,5 +1,9 @@ import { TSESLint } from '@typescript-eslint/utils' import { CategoryId } from '../utils/constants' +import { + RuleRecommendation, + RuleRecommendationAcrossConfigs, +} from '@typescript-eslint/utils/ts-eslint' export type RuleModule = TSESLint.RuleModule<'', []> & { meta: { hasSuggestions?: boolean; docs: { recommendedConfig?: 'error' | 'warn' } } @@ -7,7 +11,7 @@ export type RuleModule = TSESLint.RuleModule<'', []> & { // These 2 types are copied from @typescript-eslint/experimental-utils' CreateRuleMeta // and modified to our needs -export type StorybookRuleMetaDocs = Omit & { +export type StorybookRuleMetaDocs = TSESLint.RuleMetaDataDocs & { /** * Whether or not this rule should be excluded from linter config */ @@ -16,19 +20,23 @@ export type StorybookRuleMetaDocs = Omit & { * Which configs the rule should be part of */ categories?: CategoryId[] -} -export type StorybookRuleMeta = Omit< - TSESLint.RuleMetaData, - 'docs' -> & { - docs: StorybookRuleMetaDocs + /** + * If a string config name, which starting config this rule is enabled in. + * If an object, which settings it has enabled in each of those configs. + */ + recommended?: RuleRecommendation | RuleRecommendationAcrossConfigs } +export type StorybookRuleMeta = TSESLint.RuleMetaData< + TMessageIds, + StorybookRuleMetaDocs +> + // Comment out for testing purposes: // const docs: StorybookRuleMetaDocs = { // description: 'bla', -// recommended: 'error', +// recommended: 'strict', // } // const meta: StorybookRuleMeta<'someId'> = { diff --git a/lib/utils/create-storybook-rule.ts b/lib/utils/create-storybook-rule.ts index 3c20e84..5e57f0a 100644 --- a/lib/utils/create-storybook-rule.ts +++ b/lib/utils/create-storybook-rule.ts @@ -1,12 +1,12 @@ import { ESLintUtils, TSESLint } from '@typescript-eslint/utils' -import { docsUrl } from '../utils' -import { StorybookRuleMeta } from '../types' +import { docsUrl } from './index' +import { StorybookRuleMeta, StorybookRuleMetaDocs } from '../types' export function createStorybookRule< TOptions extends readonly unknown[], TMessageIds extends string, - TRuleListener extends TSESLint.RuleListener = TSESLint.RuleListener + TRuleListener extends TSESLint.RuleListener = TSESLint.RuleListener, >({ create, meta, @@ -20,13 +20,13 @@ export function createStorybookRule< optionsWithDefault: Readonly ) => TRuleListener }>) { - return ESLintUtils.RuleCreator(docsUrl)({ + return ESLintUtils.RuleCreator(docsUrl)({ ...remainingConfig, create, meta: { ...meta, docs: { - ...meta.docs, + ...meta.docs!, }, }, }) diff --git a/lib/utils/index.ts b/lib/utils/index.ts index 80288c3..0e9a542 100644 --- a/lib/utils/index.ts +++ b/lib/utils/index.ts @@ -22,8 +22,12 @@ export const getMetaObjectExpression = ( context: Readonly> ) => { let meta: TSESTree.ExportDefaultDeclaration['declaration'] | null = node.declaration + const { sourceCode } = context if (isIdentifier(meta)) { - const variable = ASTUtils.findVariable(context.getScope(), meta.name) + // Compatibility implementation for eslint v8.x and v9.x or later + // see https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#context.getscope() + const scope = sourceCode.getScope ? sourceCode.getScope(node) : context.getScope() + const variable = ASTUtils.findVariable(scope, meta.name) const decl = variable && variable.defs.find((def) => isVariableDeclarator(def.node)) if (decl && isVariableDeclarator(decl.node)) { meta = decl.node.init diff --git a/package.json b/package.json index 6a02898..42efc52 100644 --- a/package.json +++ b/package.json @@ -31,16 +31,18 @@ ], "scripts": { "prebuild": "rimraf dist", - "build": "tsc", + "build": "tsc -p tsconfig.build.json", "generate-rule": "ts-node ./tools/generate-rule", "lint": "eslint --fix .", "migrate": "ts-migrate-full", - "prepare": "husky install", + "prepare": "husky", "prettier": "prettier --write .", - "release": "pnpm run build && auto shipit --name storybookbot --email storybookbot@gmail.com", + "release": "git status && pnpm run build && git status && auto shipit --name storybookbot --email storybookbot@gmail.com", "start": "tsc --watch", - "test": "jest", - "test:ci": "tsc --noEmit && jest --ci", + "test": "pnpm run test:unit && pnpm run test:integration", + "test:unit": "jest", + "test:integration": "jest --config jest.integration.config.js --testTimeout 60000", + "test:ci": "tsc --noEmit && pnpm run test:unit --ci && pnpm run test:integration --ci", "update-all": "pnpm run update-configs && pnpm run update-docs", "update-configs": "ts-node ./tools/update-configs", "update-docs": "ts-node ./tools/update-rules-list" @@ -51,8 +53,7 @@ }, "dependencies": { "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.62.0", - "requireindex": "^1.2.0", + "@typescript-eslint/utils": "^8.8.1", "ts-dedent": "^2.2.0" }, "devDependencies": { @@ -61,12 +62,14 @@ "@types/jest": "^29.5.12", "@types/node": "^18.19.17", "@types/requireindex": "^1.2.4", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@types/semver": "^7.5.8", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "@typescript-eslint/rule-tester": "^8.8.1", "auto": "^11.2.1", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-eslint-plugin": "^5.3.0", + "eslint-plugin-eslint-plugin": "^6.2.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.1.3", "husky": "^9.0.11", @@ -75,10 +78,11 @@ "prettier": "^3.2.5", "prompts": "^2.4.2", "rimraf": "^3.0.2", + "semver": "^7.6.0", "ts-jest": "^29.1.2", "ts-migrate": "^0.1.35", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.5" }, "peerDependencies": { "eslint": ">=6" @@ -94,5 +98,6 @@ "npm", "released" ] - } + }, + "packageManager": "pnpm@9.1.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ae7509..7c664f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,18 +12,15 @@ importers: specifier: ^0.0.1 version: 0.0.1 '@typescript-eslint/utils': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.56.0)(typescript@5.3.3) - requireindex: - specifier: ^1.2.0 - version: 1.2.0 + specifier: ^8.8.1 + version: 8.8.1(eslint@8.56.0)(typescript@5.4.5) ts-dedent: specifier: ^2.2.0 version: 2.2.0 devDependencies: '@auto-it/released': specifier: ^11.2.1 - version: 11.2.1(@types/node@18.19.17)(typescript@5.3.3) + version: 11.2.1(@types/node@18.19.17)(typescript@5.4.5) '@types/eslint': specifier: ^8.56.2 version: 8.56.2 @@ -36,15 +33,21 @@ importers: '@types/requireindex': specifier: ^1.2.4 version: 1.2.4 + '@types/semver': + specifier: ^7.5.8 + version: 7.5.8 '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3) + specifier: ^8.8.1 + version: 8.8.1(@typescript-eslint/parser@8.8.1(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^8.8.1 + version: 8.8.1(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/rule-tester': + specifier: ^8.8.1 + version: 8.8.1(eslint@8.56.0)(typescript@5.4.5) auto: specifier: ^11.2.1 - version: 11.2.1(@types/node@18.19.17)(typescript@5.3.3) + version: 11.2.1(@types/node@18.19.17)(typescript@5.4.5) eslint: specifier: ^8.56.0 version: 8.56.0 @@ -52,8 +55,8 @@ importers: specifier: ^9.1.0 version: 9.1.0(eslint@8.56.0) eslint-plugin-eslint-plugin: - specifier: ^5.3.0 - version: 5.3.0(eslint@8.56.0) + specifier: ^6.2.0 + version: 6.2.0(eslint@8.56.0) eslint-plugin-node: specifier: ^11.1.0 version: 11.1.0(eslint@8.56.0) @@ -65,7 +68,7 @@ importers: version: 9.0.11 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + version: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) lint-staged: specifier: ^15.2.2 version: 15.2.2 @@ -78,18 +81,21 @@ importers: rimraf: specifier: ^3.0.2 version: 3.0.2 + semver: + specifier: ^7.6.0 + version: 7.6.0 ts-jest: specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)))(typescript@5.3.3) + version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)))(typescript@5.4.5) ts-migrate: specifier: ^0.1.35 - version: 0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.3.3) + version: 0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.4.5) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.17)(typescript@5.3.3) + version: 10.9.2(@types/node@18.19.17)(typescript@5.4.5) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.5 + version: 5.4.5 packages: @@ -102,11 +108,11 @@ packages: engines: {node: '>=6.0.0'} '@auto-it/bot-list@11.2.1': - resolution: {integrity: sha512-hZpdV0Bzd6mxSVlYZtw0k/Qog3tT4NOQSYViQ/wsabZXNa2GoRr0t6aid7TuJItpMvLG9+g2TMZwjF+Q4JdGPA==, tarball: https://registry.npmjs.org/@auto-it/bot-list/-/bot-list-11.2.1.tgz} + resolution: {integrity: sha512-hZpdV0Bzd6mxSVlYZtw0k/Qog3tT4NOQSYViQ/wsabZXNa2GoRr0t6aid7TuJItpMvLG9+g2TMZwjF+Q4JdGPA==} engines: {node: '>=10.x'} '@auto-it/core@11.2.1': - resolution: {integrity: sha512-lF8rHKNiFI9XTYxh1S+kw3xZfN239y54/GBzJ3tqdkNSMsE+SbpFYctG/HTTx8NLYXYTBpiQCftBL+WcXYS9UA==, tarball: https://registry.npmjs.org/@auto-it/core/-/core-11.2.1.tgz} + resolution: {integrity: sha512-lF8rHKNiFI9XTYxh1S+kw3xZfN239y54/GBzJ3tqdkNSMsE+SbpFYctG/HTTx8NLYXYTBpiQCftBL+WcXYS9UA==} peerDependencies: '@types/node': '*' typescript: '>=2.7' @@ -115,17 +121,17 @@ packages: optional: true '@auto-it/npm@11.2.1': - resolution: {integrity: sha512-rJXfodzQ9BxeM0xbLfoVgp8m07YXoTcrr8fPLPhlBlYK7lDZazE7AS7r8KpolNMEi0jUBXg7c6UKOVBpMzFUPA==, tarball: https://registry.npmjs.org/@auto-it/npm/-/npm-11.2.1.tgz} + resolution: {integrity: sha512-rJXfodzQ9BxeM0xbLfoVgp8m07YXoTcrr8fPLPhlBlYK7lDZazE7AS7r8KpolNMEi0jUBXg7c6UKOVBpMzFUPA==} '@auto-it/package-json-utils@11.2.1': - resolution: {integrity: sha512-iyjTymHIXuhCwMIHeoMa2+NwkEMFY4iD3pBNFL19CXOrsdma2QAj1HGUOo9cl4lGIOYoA7OMPlPaijUcfJatYA==, tarball: https://registry.npmjs.org/@auto-it/package-json-utils/-/package-json-utils-11.2.1.tgz} + resolution: {integrity: sha512-iyjTymHIXuhCwMIHeoMa2+NwkEMFY4iD3pBNFL19CXOrsdma2QAj1HGUOo9cl4lGIOYoA7OMPlPaijUcfJatYA==} engines: {node: '>=10.x'} '@auto-it/released@11.2.1': - resolution: {integrity: sha512-5Z5++Ov5H1+1+74ogkGldO9FIRCwJsDC06oAfwAhqg3S2VTv1uO29iUR/zTMk8uw/UuC9XZ9fBraY7CBT6myEw==, tarball: https://registry.npmjs.org/@auto-it/released/-/released-11.2.1.tgz} + resolution: {integrity: sha512-5Z5++Ov5H1+1+74ogkGldO9FIRCwJsDC06oAfwAhqg3S2VTv1uO29iUR/zTMk8uw/UuC9XZ9fBraY7CBT6myEw==} '@auto-it/version-file@11.2.1': - resolution: {integrity: sha512-9KuDAw+6b5qxm3rZlGt6QBjlWD7+kgBzO7qeDkLBpecZp9WgAB7gmPCEp5YtMKAPKanG0iZSItNh/sP4d40CGA==, tarball: https://registry.npmjs.org/@auto-it/version-file/-/version-file-11.2.1.tgz} + resolution: {integrity: sha512-9KuDAw+6b5qxm3rZlGt6QBjlWD7+kgBzO7qeDkLBpecZp9WgAB7gmPCEp5YtMKAPKanG0iZSItNh/sP4d40CGA==} '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -789,7 +795,7 @@ packages: engines: {node: '>=12'} '@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2': - resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==, tarball: https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz} + resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} engines: {node: '>=10.0.0'} peerDependencies: cosmiconfig: '>=6' @@ -942,57 +948,57 @@ packages: engines: {node: '>= 8'} '@octokit/auth-token@2.5.0': - resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==, tarball: https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz} + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} '@octokit/core@3.6.0': - resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==, tarball: https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz} + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} '@octokit/endpoint@6.0.12': - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==, tarball: https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz} + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} '@octokit/graphql@4.8.0': - resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==, tarball: https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz} + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} '@octokit/openapi-types@12.11.0': - resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==, tarball: https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz} + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} '@octokit/plugin-enterprise-compatibility@1.3.0': - resolution: {integrity: sha512-h34sMGdEOER/OKrZJ55v26ntdHb9OPfR1fwOx6Q4qYyyhWA104o11h9tFxnS/l41gED6WEI41Vu2G2zHDVC5lQ==, tarball: https://registry.npmjs.org/@octokit/plugin-enterprise-compatibility/-/plugin-enterprise-compatibility-1.3.0.tgz} + resolution: {integrity: sha512-h34sMGdEOER/OKrZJ55v26ntdHb9OPfR1fwOx6Q4qYyyhWA104o11h9tFxnS/l41gED6WEI41Vu2G2zHDVC5lQ==} '@octokit/plugin-paginate-rest@2.21.3': - resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==, tarball: https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz} + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} peerDependencies: '@octokit/core': '>=2' '@octokit/plugin-request-log@1.0.4': - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, tarball: https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz} + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: '@octokit/core': '>=3' '@octokit/plugin-rest-endpoint-methods@5.16.2': - resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==, tarball: https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz} + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} peerDependencies: '@octokit/core': '>=3' '@octokit/plugin-retry@3.0.9': - resolution: {integrity: sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==, tarball: https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz} + resolution: {integrity: sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==} '@octokit/plugin-throttling@3.7.0': - resolution: {integrity: sha512-qrKT1Yl/KuwGSC6/oHpLBot3ooC9rq0/ryDYBCpkRtoj+R8T47xTMDT6Tk2CxWopFota/8Pi/2SqArqwC0JPow==, tarball: https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.7.0.tgz} + resolution: {integrity: sha512-qrKT1Yl/KuwGSC6/oHpLBot3ooC9rq0/ryDYBCpkRtoj+R8T47xTMDT6Tk2CxWopFota/8Pi/2SqArqwC0JPow==} peerDependencies: '@octokit/core': ^3.5.0 '@octokit/request-error@2.1.0': - resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==, tarball: https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz} + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} '@octokit/request@5.6.3': - resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==, tarball: https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz} + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} '@octokit/rest@18.12.0': - resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==, tarball: https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz} + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} '@octokit/types@6.41.0': - resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, tarball: https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz} + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} @@ -1041,10 +1047,10 @@ packages: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} '@types/command-line-args@5.2.3': - resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==, tarball: https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz} + resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} '@types/command-line-usage@5.0.4': - resolution: {integrity: sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==, tarball: https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz} + resolution: {integrity: sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==} '@types/eslint@8.56.2': resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} @@ -1074,13 +1080,13 @@ packages: resolution: {integrity: sha512-SzyGKgwPzuWp2SHhlpXKzCX0pIOfcI4V2eF37nNBJOhwlegQ83omtVQ1XxZpDE06V/d6AQvfQdPfnw0tRC//Ng==} '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, tarball: https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz} + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} '@types/requireindex@1.2.4': resolution: {integrity: sha512-9NwqEWtA606+W8sSNMAzmyTzgHOKBIDKtsHl16ctbtoJdkyps/zIGefBJmfHYkKLgAH8Ptfy0TJIlXVn+JM2Lw==} - '@types/semver@7.5.7': - resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1091,63 +1097,68 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/eslint-plugin@8.8.1': + resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@8.8.1': + resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/rule-tester@8.8.1': + resolution: {integrity: sha512-79TdrU55nz5zroDIumNOpMC5I3fJkmzxAEkstz3nZ8P/xhcvwD35PUuk50l/cfvkdkYS4d4xZwf8iIamfoOzlg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.8.1': + resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.8.1': + resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '*' typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@8.8.1': + resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/typescript-estree@8.8.1': + resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/utils@8.8.1': + resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@8.8.1': + resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -1172,7 +1183,7 @@ packages: hasBin: true agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, tarball: https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz} + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} ajv@6.12.6: @@ -1251,23 +1262,19 @@ packages: engines: {node: '>=0.10.0'} array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==, tarball: https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz} + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==, tarball: https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz} + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==, tarball: https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz} + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==, tarball: https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz} + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} array-unique@0.3.2: @@ -1296,16 +1303,16 @@ packages: hasBin: true author-regex@1.0.0: - resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==, tarball: https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz} + resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==} engines: {node: '>=0.8'} auto@11.2.1: - resolution: {integrity: sha512-h2zMFeJAvyta+T183NdL/BFNzgMPsFb5qttmJIrSFaWdR14+SuONPMdqW/2pePZKfzKGK41NT31IzXvWRkB9UQ==, tarball: https://registry.npmjs.org/auto/-/auto-11.2.1.tgz} + resolution: {integrity: sha512-h2zMFeJAvyta+T183NdL/BFNzgMPsFb5qttmJIrSFaWdR14+SuONPMdqW/2pePZKfzKGK41NT31IzXvWRkB9UQ==} engines: {node: '>=10.x'} hasBin: true await-to-js@3.0.0: - resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==, tarball: https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz} + resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} babel-core@7.0.0-bridge.0: @@ -1361,10 +1368,10 @@ packages: engines: {node: '>=0.10.0'} before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, tarball: https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz} + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} bottleneck@2.19.5: - resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, tarball: https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz} + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1496,14 +1503,14 @@ packages: engines: {node: '>=0.1.90'} command-line-application@0.10.1: - resolution: {integrity: sha512-PWZ4nRkz09MbBRocqEe/Fil3RjTaMNqw0didl1n/i3flDcw/vecVfvsw3r+ZHhGs4BOuW7sk3cEYSdfM3Wv5/Q==, tarball: https://registry.npmjs.org/command-line-application/-/command-line-application-0.10.1.tgz} + resolution: {integrity: sha512-PWZ4nRkz09MbBRocqEe/Fil3RjTaMNqw0didl1n/i3flDcw/vecVfvsw3r+ZHhGs4BOuW7sk3cEYSdfM3Wv5/Q==} command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==, tarball: https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz} + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==, tarball: https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz} + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} engines: {node: '>=8.0.0'} commander@11.1.0: @@ -1530,7 +1537,7 @@ packages: resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} cosmiconfig@7.0.0: - resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==, tarball: https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz} + resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==} engines: {node: '>=10'} create-jest-runner@0.5.3: @@ -1575,7 +1582,7 @@ packages: engines: {node: '>=0.10'} dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, tarball: https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz} + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} @@ -1586,14 +1593,14 @@ packages: optional: true deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, tarball: https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz} + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, tarball: https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz} + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} define-property@0.2.5: @@ -1609,7 +1616,7 @@ packages: engines: {node: '>=0.10.0'} deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, tarball: https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz} + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} @@ -1624,19 +1631,15 @@ packages: engines: {node: '>=0.3.1'} dir-glob@2.2.2: - resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==, tarball: https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz} + resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} engines: {node: '>=4'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==, tarball: https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz} + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} electron-to-chromium@1.4.672: @@ -1656,14 +1659,14 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} endent@2.1.0: - resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==, tarball: https://registry.npmjs.org/endent/-/endent-2.1.0.tgz} + resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} env-ci@5.5.0: - resolution: {integrity: sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==, tarball: https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz} + resolution: {integrity: sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==} engines: {node: '>=10.17'} error-ex@1.3.2: @@ -1697,11 +1700,11 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-eslint-plugin@5.3.0: - resolution: {integrity: sha512-mRMH3WwewpZjbdOFbE0Vr0EJ4Q6oIXLRGkFQyRM+HWhpNIhYWy/3solQ+blVS8noSkD2/jq7iW3Ke3N0viUJ/w==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + eslint-plugin-eslint-plugin@6.2.0: + resolution: {integrity: sha512-+SSHlThUMBb6MhXl/CqNhKvnUY3111s/1vEcu+paOwTJzniTanRZCfl0kQXNfK57XsWJ5aRsiwMlPg/FgnYsag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=7.0.0' + eslint: '>=8.23.0' eslint-plugin-node@11.1.0: resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} @@ -1735,12 +1738,6 @@ packages: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} - eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -1842,7 +1839,7 @@ packages: engines: {node: '>=8.6.0'} fast-json-parse@1.0.3: - resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==, tarball: https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz} + resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1857,7 +1854,7 @@ packages: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} figures@2.0.0: - resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, tarball: https://registry.npmjs.org/figures/-/figures-2.0.0.tgz} + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} figures@3.2.0: @@ -1881,11 +1878,11 @@ packages: engines: {node: '>=6'} find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==, tarball: https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz} + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, tarball: https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz} + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} find-up@3.0.0: @@ -1916,20 +1913,20 @@ packages: engines: {node: '>=0.10.0'} fp-ts@2.16.2: - resolution: {integrity: sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==, tarball: https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.2.tgz} + resolution: {integrity: sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==} fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==, tarball: https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz} + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1952,7 +1949,7 @@ packages: engines: {node: '>=18'} get-monorepo-packages@1.2.0: - resolution: {integrity: sha512-aDP6tH+eM3EuVSp3YyCutOcFS4Y9AhRRH9FAd+cjtR/g63Hx+DCXdKoP1ViRPUJz5wm+BOEXB4FhoffGHxJ7jQ==, tarball: https://registry.npmjs.org/get-monorepo-packages/-/get-monorepo-packages-1.2.0.tgz} + resolution: {integrity: sha512-aDP6tH+eM3EuVSp3YyCutOcFS4Y9AhRRH9FAd+cjtR/g63Hx+DCXdKoP1ViRPUJz5wm+BOEXB4FhoffGHxJ7jQ==} get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -1971,7 +1968,7 @@ packages: engines: {node: '>=0.10.0'} gitlog@4.0.8: - resolution: {integrity: sha512-FcTLP7Rc0H1vWXD+J/aj5JS1uiCEBblcYXlcacRAT73N26OMYFFzrBXYmDozmWlV2K7zwK5PrH16/nuRNhqSlQ==, tarball: https://registry.npmjs.org/gitlog/-/gitlog-4.0.8.tgz} + resolution: {integrity: sha512-FcTLP7Rc0H1vWXD+J/aj5JS1uiCEBblcYXlcacRAT73N26OMYFFzrBXYmDozmWlV2K7zwK5PrH16/nuRNhqSlQ==} engines: {node: '>= 10.x'} glob-parent@5.1.2: @@ -1993,12 +1990,8 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globby@7.1.1: - resolution: {integrity: sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==, tarball: https://registry.npmjs.org/globby/-/globby-7.1.1.tgz} + resolution: {integrity: sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==} engines: {node: '>=4'} graceful-fs@4.2.11: @@ -2039,7 +2032,7 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, tarball: https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} human-signals@2.1.0: @@ -2056,7 +2049,7 @@ packages: hasBin: true ignore@3.3.10: - resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==, tarball: https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz} + resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -2067,7 +2060,7 @@ packages: engines: {node: '>= 4'} import-cwd@3.0.0: - resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==, tarball: https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz} + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} engines: {node: '>=8'} import-fresh@3.3.0: @@ -2075,7 +2068,7 @@ packages: engines: {node: '>=6'} import-from@3.0.0: - resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==, tarball: https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz} + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} engines: {node: '>=8'} import-local@3.1.0: @@ -2094,10 +2087,10 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, tarball: https://registry.npmjs.org/ini/-/ini-1.3.8.tgz} + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} io-ts@2.2.21: - resolution: {integrity: sha512-zz2Z69v9ZIC3mMLYWIeoUcwWD6f+O7yP92FMVVaXEOSZH1jnVBmET/urd/uoarD1WGBY4rCj8TAyMPzsGNzMFQ==, tarball: https://registry.npmjs.org/io-ts/-/io-ts-2.2.21.tgz} + resolution: {integrity: sha512-zz2Z69v9ZIC3mMLYWIeoUcwWD6f+O7yP92FMVVaXEOSZH1jnVBmET/urd/uoarD1WGBY4rCj8TAyMPzsGNzMFQ==} peerDependencies: fp-ts: ^2.5.0 @@ -2179,7 +2172,7 @@ packages: engines: {node: '>=0.10.0'} is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, tarball: https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz} + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} is-stream@2.0.1: @@ -2191,7 +2184,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, tarball: https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} is-windows@1.0.2: @@ -2237,7 +2230,7 @@ packages: engines: {node: '>=8'} java-properties@1.0.2: - resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==, tarball: https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz} + resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} jest-changed-files@29.7.0: @@ -2407,7 +2400,7 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, tarball: https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz} + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -2476,11 +2469,11 @@ packages: engines: {node: '>=18.0.0'} load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, tarball: https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz} + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, tarball: https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz} + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} locate-path@3.0.0: @@ -2496,16 +2489,16 @@ packages: engines: {node: '>=10'} lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, tarball: https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz} + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} lodash.chunk@4.2.0: - resolution: {integrity: sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==, tarball: https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz} + resolution: {integrity: sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==} lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, tarball: https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz} + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -2520,7 +2513,7 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, tarball: https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz} + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} log-update@3.4.0: @@ -2561,7 +2554,7 @@ packages: engines: {node: '>=0.10.0'} meant@1.0.3: - resolution: {integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==, tarball: https://registry.npmjs.org/meant/-/meant-1.0.3.tgz} + resolution: {integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2597,8 +2590,12 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz} + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} @@ -2610,7 +2607,7 @@ packages: hasBin: true module-alias@2.2.3: - resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==, tarball: https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz} + resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -2622,9 +2619,6 @@ packages: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2632,14 +2626,14 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} nested-error-stacks@2.0.1: - resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==, tarball: https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz} + resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, tarball: https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz} + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -2678,7 +2672,7 @@ packages: engines: {node: '>=0.10.0'} objectorarray@1.0.5: - resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==, tarball: https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz} + resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2700,11 +2694,11 @@ packages: engines: {node: '>= 0.8.0'} os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==, tarball: https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz} + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz} + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} p-limit@2.3.0: @@ -2716,7 +2710,7 @@ packages: engines: {node: '>=10'} p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz} + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} p-locate@3.0.0: @@ -2732,7 +2726,7 @@ packages: engines: {node: '>=10'} p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, tarball: https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz} + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} p-try@2.2.0: @@ -2744,16 +2738,16 @@ packages: engines: {node: '>=6'} parse-author@2.0.0: - resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==, tarball: https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz} + resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==} engines: {node: '>=0.10.0'} parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==, tarball: https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz} + resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} engines: {node: '>=0.10.0'} hasBin: true parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, tarball: https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz} + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} parse-json@5.2.0: @@ -2795,7 +2789,7 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, tarball: https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz} + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} path-type@4.0.0: @@ -2815,7 +2809,7 @@ packages: hasBin: true pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, tarball: https://registry.npmjs.org/pify/-/pify-3.0.0.tgz} + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} pify@4.0.1: @@ -2827,7 +2821,7 @@ packages: engines: {node: '>= 6'} pkg-conf@2.1.0: - resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==, tarball: https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz} + resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} pkg-dir@3.0.0: @@ -2886,7 +2880,7 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, tarball: https://registry.npmjs.org/rc/-/rc-1.2.8.tgz} + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true react-is@18.2.0: @@ -2901,7 +2895,7 @@ packages: engines: {node: '>= 4'} reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==, tarball: https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz} + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} regenerate-unicode-properties@10.1.1: @@ -2930,7 +2924,7 @@ packages: engines: {node: '>=4'} registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==, tarball: https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz} + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} engines: {node: '>=8'} regjsparser@0.9.1: @@ -2938,7 +2932,7 @@ packages: hasBin: true remove-markdown@0.3.0: - resolution: {integrity: sha512-5392eIuy1mhjM74739VunOlsOYKjsH82rQcTBlJ1bkICVC3dQ3ksQzTHh4jGHQFnM+1xzLzcFOMH+BofqXhroQ==, tarball: https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz} + resolution: {integrity: sha512-5392eIuy1mhjM74739VunOlsOYKjsH82rQcTBlJ1bkICVC3dQ3ksQzTHh4jGHQFnM+1xzLzcFOMH+BofqXhroQ==} repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} @@ -2960,13 +2954,9 @@ packages: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} requireg@0.2.2: - resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==, tarball: https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz} + resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} engines: {node: '>= 4.0.0'} - requireindex@1.2.0: - resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} - engines: {node: '>=0.10.5'} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -2992,7 +2982,7 @@ packages: hasBin: true resolve@1.7.1: - resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==, tarball: https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz} + resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} @@ -3067,14 +3057,14 @@ packages: engines: {node: '>=14'} signale@1.4.0: - resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==, tarball: https://registry.npmjs.org/signale/-/signale-1.4.0.tgz} + resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} engines: {node: '>=6'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} slash@1.0.0: - resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==, tarball: https://registry.npmjs.org/slash/-/slash-1.0.0.tgz} + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} engines: {node: '>=0.10.0'} slash@3.0.0: @@ -3175,7 +3165,7 @@ packages: engines: {node: '>=12'} strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, tarball: https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz} + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} strip-bom@4.0.0: @@ -3191,7 +3181,7 @@ packages: engines: {node: '>=12'} strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, tarball: https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz} + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} strip-json-comments@3.1.1: @@ -3215,7 +3205,7 @@ packages: engines: {node: '>=10'} supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, tarball: https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz} + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: @@ -3227,7 +3217,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==, tarball: https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz} + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} engines: {node: '>=8.0.0'} table@6.8.1: @@ -3235,7 +3225,7 @@ packages: engines: {node: '>=10.0.0'} tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, tarball: https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz} + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} temp@0.8.4: @@ -3243,7 +3233,7 @@ packages: engines: {node: '>=6.0.0'} terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, tarball: https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz} + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} test-exclude@6.0.0: @@ -3257,7 +3247,7 @@ packages: resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==, tarball: https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz} + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -3283,7 +3273,13 @@ packages: engines: {node: '>=0.10.0'} tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, tarball: https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz} + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -3341,30 +3337,21 @@ packages: optional: true ts-node@9.1.1: - resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, tarball: https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz} + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} engines: {node: '>=10.0.0'} hasBin: true peerDependencies: typescript: '>=2.7' tslib@1.10.0: - resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==, tarball: https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} tslib@2.1.0: - resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==, tarball: https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz} + resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3386,19 +3373,19 @@ packages: engines: {node: '>=14.16'} typescript-memoize@1.1.1: - resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==, tarball: https://registry.npmjs.org/typescript-memoize/-/typescript-memoize-1.1.1.tgz} + resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==} - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==, tarball: https://registry.npmjs.org/typical/-/typical-4.0.0.tgz} + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==, tarball: https://registry.npmjs.org/typical/-/typical-5.2.0.tgz} + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} undici-types@5.26.5: @@ -3425,7 +3412,7 @@ packages: engines: {node: '>=0.10.0'} universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, tarball: https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz} + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} @@ -3448,14 +3435,14 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, tarball: https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz} + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} user-home@2.0.0: - resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==, tarball: https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz} + resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} engines: {node: '>=0.10.0'} v8-compile-cache-lib@3.0.1: @@ -3472,10 +3459,10 @@ packages: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, tarball: https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, tarball: https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz} + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -3486,7 +3473,7 @@ packages: hasBin: true wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==, tarball: https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz} + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} wrap-ansi@5.1.0: @@ -3529,7 +3516,7 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, tarball: https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz} + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} yaml@2.3.4: @@ -3571,10 +3558,10 @@ snapshots: '@auto-it/bot-list@11.2.1': {} - '@auto-it/core@11.2.1(@types/node@18.19.17)(typescript@5.3.3)': + '@auto-it/core@11.2.1(@types/node@18.19.17)(typescript@5.4.5)': dependencies: '@auto-it/bot-list': 11.2.1 - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.0.0)(typescript@5.3.3) + '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.0.0)(typescript@5.4.5) '@octokit/core': 3.6.0 '@octokit/plugin-enterprise-compatibility': 1.3.0 '@octokit/plugin-retry': 3.0.9 @@ -3608,10 +3595,10 @@ snapshots: tapable: 2.2.1 terminal-link: 2.1.1 tinycolor2: 1.6.0 - ts-node: 10.9.2(@types/node@18.19.17)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.19.17)(typescript@5.4.5) tslib: 2.1.0 type-fest: 0.21.3 - typescript: 5.3.3 + typescript: 5.4.5 typescript-memoize: 1.1.1 url-join: 4.0.1 optionalDependencies: @@ -3622,9 +3609,9 @@ snapshots: - encoding - supports-color - '@auto-it/npm@11.2.1(@types/node@18.19.17)(typescript@5.3.3)': + '@auto-it/npm@11.2.1(@types/node@18.19.17)(typescript@5.4.5)': dependencies: - '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) + '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) '@auto-it/package-json-utils': 11.2.1 await-to-js: 3.0.0 endent: 2.1.0 @@ -3651,10 +3638,10 @@ snapshots: parse-author: 2.0.0 parse-github-url: 1.0.2 - '@auto-it/released@11.2.1(@types/node@18.19.17)(typescript@5.3.3)': + '@auto-it/released@11.2.1(@types/node@18.19.17)(typescript@5.4.5)': dependencies: '@auto-it/bot-list': 11.2.1 - '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) + '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) deepmerge: 4.3.1 fp-ts: 2.16.2 io-ts: 2.2.21(fp-ts@2.16.2) @@ -3667,9 +3654,9 @@ snapshots: - supports-color - typescript - '@auto-it/version-file@11.2.1(@types/node@18.19.17)(typescript@5.3.3)': + '@auto-it/version-file@11.2.1(@types/node@18.19.17)(typescript@5.4.5)': dependencies: - '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) + '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) fp-ts: 2.16.2 io-ts: 2.2.21(fp-ts@2.16.2) semver: 7.6.0 @@ -4481,12 +4468,12 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.0)(typescript@5.3.3)': + '@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.0)(typescript@5.4.5)': dependencies: cosmiconfig: 7.0.0 lodash.get: 4.4.2 make-error: 1.3.6 - ts-node: 9.1.1(typescript@5.3.3) + ts-node: 9.1.1(typescript@5.4.5) tslib: 2.6.2 transitivePeerDependencies: - typescript @@ -4569,7 +4556,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -4583,7 +4570,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4945,7 +4932,7 @@ snapshots: '@types/requireindex@1.2.4': {} - '@types/semver@7.5.7': {} + '@types/semver@7.5.8': {} '@types/stack-utils@2.0.3': {} @@ -4955,88 +4942,98 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4 + '@typescript-eslint/parser': 8.8.1(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/type-utils': 8.8.1(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/utils': 8.8.1(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 8.8.1 eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.3.3) + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/parser@8.8.1(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.4 eslint: 8.56.0 optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/rule-tester@8.8.1(eslint@8.56.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.4.5) + '@typescript-eslint/utils': 8.8.1(eslint@8.56.0)(typescript@5.4.5) + ajv: 6.12.6 + eslint: 8.56.0 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.6.0 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/scope-manager@5.62.0': + '@typescript-eslint/scope-manager@8.8.1': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 - '@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/type-utils@8.8.1(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.4.5) + '@typescript-eslint/utils': 8.8.1(eslint@8.56.0)(typescript@5.4.5) debug: 4.3.4 - eslint: 8.56.0 - tsutils: 3.21.0(typescript@5.3.3) + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/types@8.8.1': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@8.8.1(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.4 - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 + minimatch: 9.0.5 semver: 7.6.0 - tsutils: 3.21.0(typescript@5.3.3) + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/utils@8.8.1(eslint@8.56.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.7 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.4.5) eslint: 8.56.0 - eslint-scope: 5.1.1 - semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@5.62.0': + '@typescript-eslint/visitor-keys@8.8.1': dependencies: - '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/types': 8.8.1 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -5132,8 +5129,6 @@ snapshots: dependencies: array-uniq: 1.0.3 - array-union@2.1.0: {} - array-uniq@1.0.3: {} array-unique@0.3.2: {} @@ -5152,12 +5147,12 @@ snapshots: author-regex@1.0.0: {} - auto@11.2.1(@types/node@18.19.17)(typescript@5.3.3): + auto@11.2.1(@types/node@18.19.17)(typescript@5.4.5): dependencies: - '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) - '@auto-it/npm': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) - '@auto-it/released': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) - '@auto-it/version-file': 11.2.1(@types/node@18.19.17)(typescript@5.3.3) + '@auto-it/core': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) + '@auto-it/npm': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) + '@auto-it/released': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) + '@auto-it/version-file': 11.2.1(@types/node@18.19.17)(typescript@5.4.5) await-to-js: 3.0.0 chalk: 4.1.2 command-line-application: 0.10.1 @@ -5474,13 +5469,13 @@ snapshots: jest-worker: 24.9.0 throat: 4.1.0 - create-jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)): + create-jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5544,10 +5539,6 @@ snapshots: dependencies: path-type: 3.0.0 - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -5603,10 +5594,10 @@ snapshots: eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-eslint-plugin@5.3.0(eslint@8.56.0): + eslint-plugin-eslint-plugin@6.2.0(eslint@8.56.0): dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) eslint: 8.56.0 - eslint-utils: 3.0.0(eslint@8.56.0) estraverse: 5.3.0 eslint-plugin-node@11.1.0(eslint@8.56.0): @@ -5643,11 +5634,6 @@ snapshots: dependencies: eslint-visitor-keys: 1.3.0 - eslint-utils@3.0.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 2.1.0 - eslint-visitor-keys@1.3.0: {} eslint-visitor-keys@2.1.0: {} @@ -5995,15 +5981,6 @@ snapshots: dependencies: type-fest: 0.20.2 - 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 - globby@7.1.1: dependencies: array-union: 1.0.2 @@ -6255,16 +6232,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)): + jest-cli@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + create-jest: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6274,7 +6251,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)): + jest-config@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -6300,7 +6277,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.17 - ts-node: 10.9.2(@types/node@18.19.17)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.19.17)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6525,12 +6502,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)): + jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + jest-cli: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6805,6 +6782,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minimist@1.2.8: {} mixin-deep@1.3.2: @@ -6836,8 +6817,6 @@ snapshots: transitivePeerDependencies: - supports-color - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -7126,8 +7105,6 @@ snapshots: rc: 1.2.8 resolve: 1.7.1 - requireindex@1.2.0: {} - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -7444,58 +7421,62 @@ snapshots: tr46@0.0.3: {} + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + ts-dedent@2.2.0: {} - ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)))(typescript@5.3.3): + ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3)) + jest: 29.7.0(@types/node@18.19.17)(ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.0 - typescript: 5.3.3 + typescript: 5.4.5 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.23.9 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.23.9) - ts-migrate-plugins@0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.3.3): + ts-migrate-plugins@0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.4.5): dependencies: eslint: 7.32.0 jscodeshift: 0.13.1(@babel/preset-env@7.23.9(@babel/core@7.23.9)) json-schema: 0.4.0 - ts-migrate-server: 0.1.33(typescript@5.3.3) - typescript: 5.3.3 + ts-migrate-server: 0.1.33(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - '@babel/preset-env' - supports-color - ts-migrate-server@0.1.33(typescript@5.3.3): + ts-migrate-server@0.1.33(typescript@5.4.5): dependencies: '@ts-morph/bootstrap': 0.16.0 pretty-ms: 7.0.1 - typescript: 5.3.3 + typescript: 5.4.5 updatable-log: 0.2.0 - ts-migrate@0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.3.3): + ts-migrate@0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.4.5): dependencies: create-jest-runner: 0.5.3 json5: 2.2.3 json5-writer: 0.1.8 - ts-migrate-plugins: 0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.3.3) - ts-migrate-server: 0.1.33(typescript@5.3.3) - typescript: 5.3.3 + ts-migrate-plugins: 0.1.35(@babel/preset-env@7.23.9(@babel/core@7.23.9))(typescript@5.4.5) + ts-migrate-server: 0.1.33(typescript@5.4.5) + typescript: 5.4.5 updatable-log: 0.2.0 yargs: 15.4.1 transitivePeerDependencies: - '@babel/preset-env' - supports-color - ts-node@10.9.2(@types/node@18.19.17)(typescript@5.3.3): + ts-node@10.9.2(@types/node@18.19.17)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -7509,33 +7490,26 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@9.1.1(typescript@5.3.3): + ts-node@9.1.1(typescript@5.4.5): dependencies: arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 source-map-support: 0.5.21 - typescript: 5.3.3 + typescript: 5.4.5 yn: 3.1.1 tslib@1.10.0: {} - tslib@1.14.1: {} - tslib@2.1.0: {} tslib@2.6.2: {} - tsutils@3.21.0(typescript@5.3.3): - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -7550,7 +7524,7 @@ snapshots: typescript-memoize@1.1.1: {} - typescript@5.3.3: {} + typescript@5.4.5: {} typical@4.0.0: {} diff --git a/tests/integrations/flat-config.spec.ts b/tests/integrations/flat-config.spec.ts new file mode 100644 index 0000000..27099da --- /dev/null +++ b/tests/integrations/flat-config.spec.ts @@ -0,0 +1,38 @@ +import cp from 'child_process' +import path from 'path' +import semver from 'semver' +import { readPackageJson } from './helper' + +const ESLINT = `.${path.sep}node_modules${path.sep}.bin${path.sep}eslint` + +describe('Integration with flat config', () => { + let originalCwd: null | string = null + + beforeEach(() => { + originalCwd = process.cwd() + process.chdir(path.join(__dirname, 'flat-config')) + cp.execSync('pnpm i -f', { stdio: 'inherit' }) + }) + afterEach(() => { + originalCwd && process.chdir(originalCwd) + }) + + it('should work with config', () => { + if ( + !semver.satisfies( + process.version, + readPackageJson(path.resolve(__dirname, 'flat-config/node_modules/eslint')).engines.node + ) + ) { + return + } + + const result = JSON.parse( + cp.execSync(`${ESLINT} a.stories.tsx --max-warnings 1 --format=json`, { + encoding: 'utf-8', + }) + ) + expect(result.length).toBe(1) + expect(result[0].messages[0].messageId).toBe('shouldHaveStoryExport') + }) +}) diff --git a/tests/integrations/flat-config/.npmrc b/tests/integrations/flat-config/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/tests/integrations/flat-config/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/tests/integrations/flat-config/a.stories.tsx b/tests/integrations/flat-config/a.stories.tsx new file mode 100644 index 0000000..0d5133e --- /dev/null +++ b/tests/integrations/flat-config/a.stories.tsx @@ -0,0 +1,6 @@ +const Input = () => 'This is an input component' + +export default { + title: 'Input', + component: Input, +} diff --git a/tests/integrations/flat-config/eslint.config.js b/tests/integrations/flat-config/eslint.config.js new file mode 100644 index 0000000..02feb2c --- /dev/null +++ b/tests/integrations/flat-config/eslint.config.js @@ -0,0 +1,11 @@ +import plugin from 'eslint-plugin-storybook' + +export default [ + ...plugin.configs['flat/recommended'], + { + files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '**/*.story.@(ts|tsx|js|jsx|mjs|cjs)'], + rules: { + 'storybook/story-exports': 'warn', + }, + }, +] diff --git a/tests/integrations/flat-config/package.json b/tests/integrations/flat-config/package.json new file mode 100644 index 0000000..9bc5ec1 --- /dev/null +++ b/tests/integrations/flat-config/package.json @@ -0,0 +1,14 @@ +{ + "private": true, + "name": "integration-test-for-flat-config", + "type": "module", + "version": "1.0.0", + "description": "Integration test for flat config", + "scripts": { + "lint": "eslint ." + }, + "dependencies": { + "eslint": "^9.0.0", + "eslint-plugin-storybook": "file:../../.." + } +} diff --git a/tests/integrations/helper.ts b/tests/integrations/helper.ts new file mode 100644 index 0000000..8ae3e74 --- /dev/null +++ b/tests/integrations/helper.ts @@ -0,0 +1,6 @@ +import fs from 'fs' +import path from 'path' + +export function readPackageJson(base: string) { + return JSON.parse(fs.readFileSync(path.resolve(base, 'package.json'), 'utf-8')) +} diff --git a/tests/integrations/legacy-config.spec.ts b/tests/integrations/legacy-config.spec.ts new file mode 100644 index 0000000..1c1fc32 --- /dev/null +++ b/tests/integrations/legacy-config.spec.ts @@ -0,0 +1,38 @@ +import cp from 'child_process' +import path from 'path' +import semver from 'semver' +import { readPackageJson } from './helper' + +const ESLINT = `.${path.sep}node_modules${path.sep}.bin${path.sep}eslint` + +describe('Integration with legacy config', () => { + let originalCwd: null | string = null + + beforeEach(() => { + originalCwd = process.cwd() + process.chdir(path.join(__dirname, 'legacy-config')) + cp.execSync('pnpm i -f', { stdio: 'inherit' }) + }) + afterEach(() => { + originalCwd && process.chdir(originalCwd) + }) + + it('should work with config', () => { + if ( + !semver.satisfies( + process.version, + readPackageJson(path.resolve(__dirname, 'legacy-config/node_modules/eslint')).engines.node + ) + ) { + return + } + + const result = JSON.parse( + cp.execSync(`${ESLINT} a.stories.tsx --max-warnings 1 --format=json`, { + encoding: 'utf-8', + }) + ) + expect(result.length).toBe(1) + expect(result[0].messages[0].messageId).toBe('shouldHaveStoryExport') + }) +}) diff --git a/tests/integrations/legacy-config/.eslintrc.json b/tests/integrations/legacy-config/.eslintrc.json new file mode 100644 index 0000000..171b300 --- /dev/null +++ b/tests/integrations/legacy-config/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "root": true, + "extends": ["plugin:storybook/recommended"], + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2019 + }, + "overrides": [ + { + "files": ["*.stories.@(ts|tsx|js|jsx|mjs|cjs)"], + "rules": { + "storybook/story-exports": "warn" + } + } + ] +} diff --git a/tests/integrations/legacy-config/.npmrc b/tests/integrations/legacy-config/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/tests/integrations/legacy-config/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/tests/integrations/legacy-config/a.stories.tsx b/tests/integrations/legacy-config/a.stories.tsx new file mode 100644 index 0000000..0d5133e --- /dev/null +++ b/tests/integrations/legacy-config/a.stories.tsx @@ -0,0 +1,6 @@ +const Input = () => 'This is an input component' + +export default { + title: 'Input', + component: Input, +} diff --git a/tests/integrations/legacy-config/package.json b/tests/integrations/legacy-config/package.json new file mode 100644 index 0000000..3f5ca1e --- /dev/null +++ b/tests/integrations/legacy-config/package.json @@ -0,0 +1,14 @@ +{ + "private": true, + "name": "integration-test-for-legacy-config", + "type": "module", + "version": "1.0.0", + "description": "Integration test for legacy config", + "scripts": { + "lint": "eslint ." + }, + "dependencies": { + "eslint": "^8.57.0-0", + "eslint-plugin-storybook": "file:../../.." + } +} diff --git a/tests/lib/rules/await-interactions.test.ts b/tests/lib/rules/await-interactions.test.ts index 3e21255..0e025f0 100644 --- a/tests/lib/rules/await-interactions.test.ts +++ b/tests/lib/rules/await-interactions.test.ts @@ -131,6 +131,73 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'toHaveBeenCalled' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + import { expect } from '@storybook/jest' + WithModalOpen.play = async ({ args }) => { + // should complain + await expect(args.onClick).toHaveBeenCalled() + } + `, + }, + ], + }, + ], + }, + { + code: dedent` + import { expect, findByText } from '@storybook/test' + WithModalOpen.play = async ({ args }) => { + // should complain + expect(args.onClick).toHaveBeenCalled() + const element = findByText(canvasElement, 'asdf') + } + `, + output: dedent` + import { expect, findByText } from '@storybook/test' + WithModalOpen.play = async ({ args }) => { + // should complain + await expect(args.onClick).toHaveBeenCalled() + const element = await findByText(canvasElement, 'asdf') + } + `, + only: true, + errors: [ + { + messageId: 'interactionShouldBeAwaited', + data: { method: 'toHaveBeenCalled' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + import { expect, findByText } from '@storybook/test' + WithModalOpen.play = async ({ args }) => { + // should complain + await expect(args.onClick).toHaveBeenCalled() + const element = findByText(canvasElement, 'asdf') + } + `, + }, + ], + }, + { + messageId: 'interactionShouldBeAwaited', + data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + import { expect, findByText } from '@storybook/test' + WithModalOpen.play = async ({ args }) => { + // should complain + expect(args.onClick).toHaveBeenCalled() + const element = await findByText(canvasElement, 'asdf') + } + `, + }, + ], }, ], }, @@ -153,6 +220,18 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const canvas = within(canvasElement) + + const foodItem = await canvas.findByText(/Cheeseburger/i) + } + `, + }, + ], }, ], }, @@ -160,10 +239,8 @@ ruleTester.run('await-interactions', rule, { code: dedent` WithModalOpen.play = async ({ canvasElement }) => { const canvas = within(canvasElement) - const foodItem = canvas.findByText(/Cheeseburger/i) userEvent.click(foodItem) - const modalButton = canvas.findByLabelText('increase quantity by one') userEvent.click(modalButton) } @@ -171,10 +248,8 @@ ruleTester.run('await-interactions', rule, { output: dedent` WithModalOpen.play = async ({ canvasElement }) => { const canvas = within(canvasElement) - const foodItem = await canvas.findByText(/Cheeseburger/i) await userEvent.click(foodItem) - const modalButton = await canvas.findByLabelText('increase quantity by one') await userEvent.click(modalButton) } @@ -183,18 +258,74 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const canvas = within(canvasElement) + const foodItem = await canvas.findByText(/Cheeseburger/i) + userEvent.click(foodItem) + const modalButton = canvas.findByLabelText('increase quantity by one') + userEvent.click(modalButton) + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const canvas = within(canvasElement) + const foodItem = canvas.findByText(/Cheeseburger/i) + await userEvent.click(foodItem) + const modalButton = canvas.findByLabelText('increase quantity by one') + userEvent.click(modalButton) + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'findByLabelText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const canvas = within(canvasElement) + const foodItem = canvas.findByText(/Cheeseburger/i) + userEvent.click(foodItem) + const modalButton = await canvas.findByLabelText('increase quantity by one') + userEvent.click(modalButton) + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const canvas = within(canvasElement) + const foodItem = canvas.findByText(/Cheeseburger/i) + userEvent.click(foodItem) + const modalButton = canvas.findByLabelText('increase quantity by one') + await userEvent.click(modalButton) + } + `, + }, + ], }, ], }, @@ -221,18 +352,74 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const element: HTMLButtonElement = await within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + await userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + await userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + WithModalOpen.play = async ({ canvasElement }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(await within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + } + `, + }, + ], }, ], }, @@ -265,22 +452,107 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const WithModalOpen = { + play: async ({ canvasElement, args }) => { + const element: HTMLButtonElement = await within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + expect(args.onSubmit).toHaveBeenCalled() + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const WithModalOpen = { + play: async ({ canvasElement, args }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + await userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + expect(args.onSubmit).toHaveBeenCalled() + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const WithModalOpen = { + play: async ({ canvasElement, args }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + await userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + expect(args.onSubmit).toHaveBeenCalled() + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const WithModalOpen = { + play: async ({ canvasElement, args }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(await within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + expect(args.onSubmit).toHaveBeenCalled() + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'toHaveBeenCalled' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const WithModalOpen = { + play: async ({ canvasElement, args }) => { + const element: HTMLButtonElement = within(canvasElement).findByText(/Hello/i) + userEvent.click(element, undefined, { clickCount: 2 }) + userEvent.click(within(canvasElement).findByText(/Hello/i), undefined, { + clickCount: 2, + }) + await expect(args.onSubmit).toHaveBeenCalled() + } + } + `, + }, + ], }, ], }, @@ -319,26 +591,146 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'waitForElementToBeRemoved' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const AfterLoadingState = { + play: async ({ canvasElement, args }) => { + const canvas = within(canvasElement) + await waitForElementToBeRemoved(async () => { + canvas.findByText('Loading...') + }, { timeout: 2000 }) + const button = canvas.findByText('Loaded!') + userEvent.click(button) + waitFor(async () => { + expect(args.onSubmit).toHaveBeenCalled() + }) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const AfterLoadingState = { + play: async ({ canvasElement, args }) => { + const canvas = within(canvasElement) + waitForElementToBeRemoved(async () => { + await canvas.findByText('Loading...') + }, { timeout: 2000 }) + const button = canvas.findByText('Loaded!') + userEvent.click(button) + waitFor(async () => { + expect(args.onSubmit).toHaveBeenCalled() + }) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'findByText' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const AfterLoadingState = { + play: async ({ canvasElement, args }) => { + const canvas = within(canvasElement) + waitForElementToBeRemoved(async () => { + canvas.findByText('Loading...') + }, { timeout: 2000 }) + const button = await canvas.findByText('Loaded!') + userEvent.click(button) + waitFor(async () => { + expect(args.onSubmit).toHaveBeenCalled() + }) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'userEvent' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const AfterLoadingState = { + play: async ({ canvasElement, args }) => { + const canvas = within(canvasElement) + waitForElementToBeRemoved(async () => { + canvas.findByText('Loading...') + }, { timeout: 2000 }) + const button = canvas.findByText('Loaded!') + await userEvent.click(button) + waitFor(async () => { + expect(args.onSubmit).toHaveBeenCalled() + }) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'waitFor' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const AfterLoadingState = { + play: async ({ canvasElement, args }) => { + const canvas = within(canvasElement) + waitForElementToBeRemoved(async () => { + canvas.findByText('Loading...') + }, { timeout: 2000 }) + const button = canvas.findByText('Loaded!') + userEvent.click(button) + await waitFor(async () => { + expect(args.onSubmit).toHaveBeenCalled() + }) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'toHaveBeenCalled' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const AfterLoadingState = { + play: async ({ canvasElement, args }) => { + const canvas = within(canvasElement) + waitForElementToBeRemoved(async () => { + canvas.findByText('Loading...') + }, { timeout: 2000 }) + const button = canvas.findByText('Loaded!') + userEvent.click(button) + waitFor(async () => { + await expect(args.onSubmit).toHaveBeenCalled() + }) + } + } + `, + }, + ], }, ], }, @@ -365,14 +757,56 @@ ruleTester.run('await-interactions', rule, { { messageId: 'interactionShouldBeAwaited', data: { method: 'play' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const FourthStory = { + play: async (context) => { + await FirstStory.play(context) + SecondStory.play!(context) + ThirdStory.play?.(context) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'play' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const FourthStory = { + play: async (context) => { + FirstStory.play(context) + await SecondStory.play!(context) + ThirdStory.play?.(context) + } + } + `, + }, + ], }, { messageId: 'interactionShouldBeAwaited', data: { method: 'play' }, + suggestions: [ + { + messageId: 'fixSuggestion', + output: dedent` + export const FourthStory = { + play: async (context) => { + FirstStory.play(context) + SecondStory.play!(context) + await ThirdStory.play?.(context) + } + } + `, + }, + ], }, ], }, diff --git a/tests/lib/rules/context-in-play-function.test.ts b/tests/lib/rules/context-in-play-function.test.ts index e648dbf..67e4c8c 100644 --- a/tests/lib/rules/context-in-play-function.test.ts +++ b/tests/lib/rules/context-in-play-function.test.ts @@ -51,12 +51,6 @@ ruleTester.run('context-in-play-function', rule, { await FirstStory.play({ canvasElement, ...ctx }) } `, - dedent` - export const SecondStory = Template.bind({}) - SecondStory.play = async (ctx) => { - await FirstStory.play(ctx) - } - `, dedent` export const SecondStory = { play: async (ctx) => { diff --git a/tests/lib/rules/default-exports.test.ts b/tests/lib/rules/default-exports.test.ts index 073bbf1..c1d1c2b 100644 --- a/tests/lib/rules/default-exports.test.ts +++ b/tests/lib/rules/default-exports.test.ts @@ -45,6 +45,12 @@ ruleTester.run('default-exports', rule, { errors: [ { messageId: 'shouldHaveDefaultExport', + suggestions: [ + { + messageId: 'fixSuggestion', + output: 'export default {}\nexport const Primary = () => ', + }, + ], }, ], }, @@ -61,6 +67,13 @@ ruleTester.run('default-exports', rule, { errors: [ { messageId: 'shouldHaveDefaultExport', + suggestions: [ + { + messageId: 'fixSuggestion', + output: + "import { MyComponent, Foo } from './MyComponent'\nexport default { component: MyComponent }\nexport const Primary = () => ", + }, + ], }, ], }, @@ -77,6 +90,13 @@ ruleTester.run('default-exports', rule, { errors: [ { messageId: 'shouldHaveDefaultExport', + suggestions: [ + { + messageId: 'fixSuggestion', + output: + "import MyComponent from './MyComponent'\nexport default { component: MyComponent }\nexport const Primary = () => ", + }, + ], }, ], }, @@ -93,6 +113,13 @@ ruleTester.run('default-exports', rule, { errors: [ { messageId: 'shouldHaveDefaultExport', + suggestions: [ + { + messageId: 'fixSuggestion', + output: + "import { MyComponentProps } from './MyComponent'\nexport default {}\nexport const Primary = () => ", + }, + ], }, ], }, diff --git a/tests/lib/rules/hierarchy-separator.test.ts b/tests/lib/rules/hierarchy-separator.test.ts index 5b1197d..53f21f2 100644 --- a/tests/lib/rules/hierarchy-separator.test.ts +++ b/tests/lib/rules/hierarchy-separator.test.ts @@ -28,22 +28,6 @@ ruleTester.run('hierarchy-separator', rule, { ], invalid: [ - { - code: "export default { title: 'Examples|Components/Button' }", - output: "export default { title: 'Examples/Components/Button' }", - errors: [ - { - type: AST_NODE_TYPES.Property, - messageId: 'deprecatedHierarchySeparator', - suggestions: [ - { - messageId: 'useCorrectSeparators', - output: "export default { title: 'Examples/Components/Button' }", - }, - ], - }, - ], - }, { code: "export default { title: 'Examples|Components/Button' }", output: "export default { title: 'Examples/Components/Button' }", diff --git a/tests/utils/rule-tester.ts b/tests/utils/rule-tester.ts index 2c843d7..777b2ff 100644 --- a/tests/utils/rule-tester.ts +++ b/tests/utils/rule-tester.ts @@ -1,11 +1,11 @@ -import { resolve } from 'path' import { TSESLint } from '@typescript-eslint/utils' +import { RuleTester } from '@typescript-eslint/rule-tester' const DEFAULT_TEST_CASE_CONFIG = { filename: 'MyComponent.stories.js', } -class StorybookRuleTester extends TSESLint.RuleTester { +class StorybookRuleTester extends RuleTester { run>( ruleName: string, rule: TSESLint.RuleModule, @@ -32,20 +32,8 @@ class StorybookRuleTester extends TSESLint.RuleTester { } } -export const createRuleTester = ( - parserOptions: Partial = {} -): TSESLint.RuleTester => { - return new StorybookRuleTester({ - parser: resolve('./node_modules/@typescript-eslint/parser'), - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module', - ecmaFeatures: { - jsx: true, - }, - ...parserOptions, - }, - }) +export const createRuleTester = (): RuleTester => { + return new StorybookRuleTester() } export default createRuleTester() diff --git a/tools/generate-rule.ts b/tools/generate-rule.ts index 796e083..92b91f5 100644 --- a/tools/generate-rule.ts +++ b/tools/generate-rule.ts @@ -84,7 +84,7 @@ const generateRule = async () => { description: '${ruleDescription}', // Add the categories that suit this rule. categories: [CategoryId.RECOMMENDED], - recommended: 'warn', // \`warn\` or \`error\` + recommended: 'recommended', }, messages: { anyMessageIdHere: 'Fill me in', @@ -243,7 +243,7 @@ const generateRule = async () => { logger.log(`❤️ Thanks for helping this plugin get better, ${authorName.split(' ')[0]}!`) } -generateRule().catch((error) => { +generateRule().catch((error) => { logger.error('An error occurred while generating the rule:', error) process.exit(1) }) diff --git a/tools/update-configs.ts b/tools/update-configs.ts index 33ed8bd..25666fd 100644 --- a/tools/update-configs.ts +++ b/tools/update-configs.ts @@ -1,109 +1,27 @@ /* -This script updates `lib/configs/*.js` files from rule's meta data. +This script updates `lib/*.js` files from rule's meta data. */ import fs from 'fs/promises' import path from 'path' -import { format, Options } from 'prettier' -import prettierConfig from '../.prettierrc' -import { categories, TCategory } from './utils/categories' +import { update as updateLegacyConfigs } from './update-lib-configs' +import { update as updateFlatConfigs } from './update-lib-flat-configs' +import { update as updateIndex } from './update-lib-index' -const extendsCategories = { - csf: null, - recommended: null, - 'csf-strict': 'csf', -} - -const externalRuleOverrides = { - 'react-hooks/rules-of-hooks': 'off', - 'import/no-anonymous-default-export': 'off', -} - -function formatRules(rules: TCategory['rules'], exclude?: string[]) { - const obj = rules.reduce( - (setting, rule) => { - if (!exclude?.includes(rule.ruleId)) { - setting[rule.ruleId] = rule.meta.docs.recommended || 'error' - } - return setting - }, - { ...externalRuleOverrides } - ) - - return JSON.stringify(obj, null, 2) -} - -function formatSingleRule(rules: TCategory['rules'], ruleId: string) { - const ruleOpt = rules.find((rule) => rule.ruleId === ruleId)?.meta.docs.recommended || 'error' +const ROOT_CONFIG_DIR = path.resolve(__dirname, '../lib/configs/') - return JSON.stringify({ [ruleId]: ruleOpt }, null, 2) -} - -const SUPPORTED_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs'] -const STORIES_GLOBS = [ - `'*.stories.@(${SUPPORTED_EXTENSIONS.join('|')})'`, - `'*.story.@(${SUPPORTED_EXTENSIONS.join('|')})'`, -] - -// Other files that will be linted -const MAIN_JS_FILE = [`'.storybook/main.@(js|cjs|mjs|ts)'`] +async function run() { + // cleanup + await fs.rm(ROOT_CONFIG_DIR, { recursive: true }) -function formatCategory(category: TCategory) { - const extendsCategoryId = extendsCategories[category.categoryId] - if (extendsCategoryId == null) { - return `/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update it's content execute "pnpm run update-all" - */ - export = { - plugins: [ - 'storybook' - ], - overrides: [{ - files: [${STORIES_GLOBS.join(', ')}], - rules: ${formatRules(category.rules, ['storybook/no-uninstalled-addons'])} - }, { - files: [${MAIN_JS_FILE.join(', ')}], - rules: ${formatSingleRule(category.rules, 'storybook/no-uninstalled-addons')} - }] - } - ` - } - return `/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update it's content execute "pnpm run update-all" - */ - export = { - extends: require.resolve('./${extendsCategoryId}'), - rules: ${formatRules(category.rules)} - } - ` + // updates + await updateLegacyConfigs() + await updateFlatConfigs() + await updateIndex() } -const ROOT = path.resolve(__dirname, '../lib/configs/') - -async function run() { - - // cleanup folder - await fs.rmdir(ROOT, { recursive: true }) - await fs.mkdir(ROOT) - - // Update/add rule files - await Promise.all(categories.map(async (category) => { - const filePath = path.join(ROOT, `${category.categoryId}.ts`) - const content = await format(formatCategory(category), { - parser: 'typescript', - ...(prettierConfig as Options), - }) - - await fs.writeFile(filePath, content) - })) -} - run().catch((error) => { console.error(error) process.exit(1) -}) \ No newline at end of file +}) diff --git a/tools/update-lib-configs.ts b/tools/update-lib-configs.ts new file mode 100644 index 0000000..30e45a4 --- /dev/null +++ b/tools/update-lib-configs.ts @@ -0,0 +1,70 @@ +/* +This script updates `lib/configs/*.js` files from rule's meta data. +*/ + +import fs from 'fs/promises' +import path from 'path' +import { format, Options } from 'prettier' +import prettierConfig from '../.prettierrc' +import { categories, TCategory } from './utils/categories' +import { + extendsCategories, + STORIES_GLOBS, + MAIN_JS_FILE, + formatRules, + formatSingleRule, +} from './utils/updates' + +function formatCategory(category: TCategory) { + const extendsCategoryId = extendsCategories[category.categoryId] + if (extendsCategoryId == null) { + return `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ + export = { + plugins: [ + 'storybook' + ], + overrides: [{ + files: [${STORIES_GLOBS.join(', ')}], + rules: ${formatRules(category.rules, ['storybook/no-uninstalled-addons'])} + }, { + files: [${MAIN_JS_FILE.join(', ')}], + rules: ${formatSingleRule(category.rules, 'storybook/no-uninstalled-addons')} + }] + } + ` + } + return `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ + export = { + extends: require.resolve('./${extendsCategoryId}'), + rules: ${formatRules(category.rules)} + } + ` +} + +const CONFIG_DIR = path.resolve(__dirname, '../lib/configs/') + +export async function update() { + // setup config directory + await fs.mkdir(CONFIG_DIR) + + // Update/add rule files + await Promise.all( + categories.map(async (category) => { + const filePath = path.join(CONFIG_DIR, `${category.categoryId}.ts`) + const content = await format(formatCategory(category), { + parser: 'typescript', + ...(prettierConfig as Options), + }) + + await fs.writeFile(filePath, content) + }) + ) +} diff --git a/tools/update-lib-flat-configs.ts b/tools/update-lib-flat-configs.ts new file mode 100644 index 0000000..eb99ad8 --- /dev/null +++ b/tools/update-lib-flat-configs.ts @@ -0,0 +1,83 @@ +/* +This script updates `lib/configs/flat/*.js` files from rule's meta data. +*/ + +import fs from 'fs/promises' +import path from 'path' +import { format, Options } from 'prettier' +import prettierConfig from '../.prettierrc' +import { categories, TCategory } from './utils/categories' +import { + extendsCategories, + STORIES_GLOBS, + MAIN_JS_FILE, + formatRules, + formatSingleRule, +} from './utils/updates' + +function formatCategory(category: TCategory) { + const extendsCategoryId = extendsCategories[category.categoryId] + if (extendsCategoryId == null) { + return `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ + export = [ + { + name: 'storybook:${category.categoryId}:setup', + plugins: { + get storybook() { + return require('../../index') + } + } + }, + { + name: 'storybook:${category.categoryId}:stories-rules', + files: [${STORIES_GLOBS.join(', ')}], + rules: ${formatRules(category.rules, ['storybook/no-uninstalled-addons'])} + }, + { + name: 'storybook:${category.categoryId}:main-rules', + files: [${MAIN_JS_FILE.join(', ')}], + rules: ${formatSingleRule(category.rules, 'storybook/no-uninstalled-addons')} + } + ] + ` + } + return `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content, execute "pnpm run update-all" + */ + import config from './${extendsCategoryId}' + + export = [ + ...config, + { + name: 'storybook:${category.categoryId}:rules', + rules: ${formatRules(category.rules)} + } + ] + ` +} + +const FLAT_CONFIG_DIR = path.resolve(__dirname, '../lib/configs/flat') + +export async function update() { + // setup config directory + await fs.mkdir(FLAT_CONFIG_DIR) + + // Update/add rule files + await Promise.all( + categories.map(async (category) => { + const filePath = path.join(FLAT_CONFIG_DIR, `${category.categoryId}.ts`) + const content = await format(formatCategory(category), { + parser: 'typescript', + ...(prettierConfig as Options), + }) + + await fs.writeFile(filePath, content) + }) + ) +} diff --git a/tools/update-lib-index.ts b/tools/update-lib-index.ts new file mode 100644 index 0000000..af1099f --- /dev/null +++ b/tools/update-lib-index.ts @@ -0,0 +1,59 @@ +'use strict' + +/* +This script updates `lib/index.js` file from rule's meta data. +*/ + +import fs from 'fs/promises' +import path from 'path' +import { format, Options } from 'prettier' +import prettierConfig from '../.prettierrc' +import rules from './utils/rules' +import { categoryIds } from './utils/categories' + +function camelize(text: string) { + const a = text.toLowerCase().replace(/[-_\s.]+(.)?/g, (_, c) => (c ? c.toUpperCase() : '')) + return a.substring(0, 1).toLowerCase() + a.substring(1) +} + +export async function update() { + const rawContent = `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "pnpm run update" + */ +// configs +${categoryIds + .map((categoryId) => `import ${camelize(categoryId)} from './configs/${categoryId}'`) + .join('\n')} +${categoryIds + .map( + (categoryId) => `import ${camelize(`flat-${categoryId}`)} from './configs/flat/${categoryId}'` + ) + .join('\n')} + +// rules +${rules.map((rule) => `import ${camelize(rule.name)} from './rules/${rule.name}'`).join('\n')} + +// export plugin +export = { + configs: { + // eslintrc configs + ${categoryIds.map((categoryId) => `'${categoryId}': ${camelize(categoryId)}`).join(',\n')}, + + // flat configs + ${categoryIds + .map((categoryId) => `'flat/${categoryId}': ${camelize(`flat-${categoryId}`)}`) + .join(',\n')}, + }, + rules: { + ${rules.map((rule) => `'${rule.name}': ${camelize(rule.name)}`).join(',\n')} + } +} +` + const content = await format(rawContent, { + parser: 'typescript', + ...(prettierConfig as Options), + }) + await fs.writeFile(path.resolve(__dirname, '../lib/index.ts'), content) +} diff --git a/tools/update-rules-list.ts b/tools/update-rules-list.ts index db29a0c..c6eb54d 100644 --- a/tools/update-rules-list.ts +++ b/tools/update-rules-list.ts @@ -11,7 +11,7 @@ export type TRulesList = readonly [ ruleLink: string, docsDescription: string, fixable: string, - categories: string + categories: string, ] export type TRuleListWithoutName = TRulesList extends readonly [string, ...infer TRulesWithoutName] ? TRulesWithoutName @@ -31,12 +31,12 @@ const rulesList: TRulesList[] = Object.entries(rules) rule.meta.docs.description, rule.meta.fixable ? emojiKey.fixable : '', rule.meta.docs.categories - ? `
    ${rule.meta.docs.categories.map((c) => `
  • ${c}
  • `).join('')}
` + ? `
    ${rule.meta.docs.categories.map((c) => `
  • ${c}
  • flat/${c}
  • `).join('')}
` : '', ] - }); + }) -async function run () { +async function run() { await writeRulesListInReadme(rulesList) await updateRulesDocs(rulesList) @@ -45,4 +45,4 @@ async function run () { run().catch((error) => { console.error(error) process.exit(1) -}); \ No newline at end of file +}) diff --git a/tools/utils/docs.ts b/tools/utils/docs.ts index 664ba73..a4f6e66 100644 --- a/tools/utils/docs.ts +++ b/tools/utils/docs.ts @@ -91,23 +91,25 @@ export const writeRulesListInReadme = async (rulesList: TRulesList[]) => { const rulesListWithoutName = rulesList.map((rule) => rule.slice(1)) as TRuleListWithoutName[] const newReadme = await format(overWriteRulesList(rulesListWithoutName, readme), { parser: 'markdown', - ...await prettierConfig, + ...(await prettierConfig), }) await writeFile(readmePath, newReadme) } export const updateRulesDocs = async (rulesList: TRulesList[]) => { - await Promise.all(rulesList.map(async (rule) => { - const ruleName = rule[0] - const ruleDocFilePath = resolve(ruleDocsPath, `${ruleName}.md`) - const ruleDocFile = await readFile(ruleDocFilePath, 'utf8') - - const updatedDocFile = await format(overWriteRuleDocs(rule, ruleDocFile), { - parser: 'markdown', - ...prettierConfig, + await Promise.all( + rulesList.map(async (rule) => { + const ruleName = rule[0] + const ruleDocFilePath = resolve(ruleDocsPath, `${ruleName}.md`) + const ruleDocFile = await readFile(ruleDocFilePath, 'utf8') + + const updatedDocFile = await format(overWriteRuleDocs(rule, ruleDocFile), { + parser: 'markdown', + ...prettierConfig, + }) + + await writeFile(ruleDocFilePath, updatedDocFile) }) - - await writeFile(ruleDocFilePath, updatedDocFile) - })) + ) } diff --git a/tools/utils/updates.ts b/tools/utils/updates.ts new file mode 100644 index 0000000..8d389e0 --- /dev/null +++ b/tools/utils/updates.ts @@ -0,0 +1,41 @@ +import { categories, TCategory } from './categories' + +export const extendsCategories = { + csf: null, + recommended: null, + 'csf-strict': 'csf', +} + +const externalRuleOverrides = { + 'react-hooks/rules-of-hooks': 'off', + 'import/no-anonymous-default-export': 'off', +} + +export function formatRules(rules: TCategory['rules'], exclude?: string[]) { + const obj = rules.reduce( + (setting, rule) => { + if (!exclude?.includes(rule.ruleId)) { + setting[rule.ruleId] = rule.meta.docs.recommended || 'error' + } + return setting + }, + { ...externalRuleOverrides } + ) + + return JSON.stringify(obj, null, 2) +} + +export function formatSingleRule(rules: TCategory['rules'], ruleId: string) { + const ruleOpt = rules.find((rule) => rule.ruleId === ruleId)?.meta.docs.recommended || 'error' + + return JSON.stringify({ [ruleId]: ruleOpt }, null, 2) +} + +export const SUPPORTED_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs'] +export const STORIES_GLOBS = [ + `'**/*.stories.@(${SUPPORTED_EXTENSIONS.join('|')})'`, + `'**/*.story.@(${SUPPORTED_EXTENSIONS.join('|')})'`, +] + +// Other files that will be linted +export const MAIN_JS_FILE = [`'.storybook/main.@(js|cjs|mjs|ts)'`] diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..eed0f62 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "target": "es6", + "module": "Node16", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "noUncheckedIndexedAccess": true + }, + "ts-node": { + "transpileOnly": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { "jsx": true }, + "ecmaVersion": 8, + "sourceType": "module" + }, + "include": ["lib/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/tsconfig.json b/tsconfig.json index 4cc254a..503dc7b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,23 +1,4 @@ { - "compilerOptions": { - "outDir": "./dist/", - "target": "es6", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "noUncheckedIndexedAccess": true, - }, - "ts-node": { - "transpileOnly": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { "jsx": true }, - "ecmaVersion": 8, - "sourceType": "module" - }, - "include": ["lib/**/*.ts"], - "exclude": ["node_modules"] + "extends": "./tsconfig.build.json", + "include": ["lib/**/*.ts", "tests/**/*.ts"] }