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 | 🔧 |
addon-interactions recommended |
-| [`storybook/context-in-play-function`](./docs/rules/context-in-play-function.md) | Pass a context when invoking play function of another story | | recommended addon-interactions |
-| [`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` | 🔧 | addon-interactions recommended |
-| [`storybook/use-storybook-testing-library`](./docs/rules/use-storybook-testing-library.md) | Do not use testing-library directly on stories | 🔧 | addon-interactions recommended |
+| Name | Description | 🔧 | Included in configurations |
+| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | --- | ----------------------------------------------------------------------------------------------------------------- |
+| [`storybook/await-interactions`](./docs/rules/await-interactions.md) | Interactions should be awaited | 🔧 | addon-interactions flat/addon-interactions recommended flat/recommended |
+| [`storybook/context-in-play-function`](./docs/rules/context-in-play-function.md) | Pass a context when invoking play function of another story | | recommended flat/recommended addon-interactions flat/addon-interactions |
+| [`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 | 🔧 | csf flat/csf recommended flat/recommended |
+| [`storybook/hierarchy-separator`](./docs/rules/hierarchy-separator.md) | Deprecated hierarchy separator in title property | 🔧 | csf flat/csf recommended flat/recommended |
+| [`storybook/no-redundant-story-name`](./docs/rules/no-redundant-story-name.md) | A story should not have a redundant name property | 🔧 | csf flat/csf recommended flat/recommended |
+| [`storybook/no-stories-of`](./docs/rules/no-stories-of.md) | storiesOf is deprecated and should not be used | | csf-strict flat/csf-strict |
+| [`storybook/no-title-property-in-meta`](./docs/rules/no-title-property-in-meta.md) | Do not define a title in meta | 🔧 | csf-strict flat/csf-strict |
+| [`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. | | recommended flat/recommended |
+| [`storybook/prefer-pascal-case`](./docs/rules/prefer-pascal-case.md) | Stories should use PascalCase | 🔧 | recommended flat/recommended |
+| [`storybook/story-exports`](./docs/rules/story-exports.md) | A story file must contain at least one story export | | recommended flat/recommended csf flat/csf |
+| [`storybook/use-storybook-expect`](./docs/rules/use-storybook-expect.md) | Use expect from `@storybook/jest` | 🔧 | addon-interactions flat/addon-interactions recommended flat/recommended |
+| [`storybook/use-storybook-testing-library`](./docs/rules/use-storybook-testing-library.md) | Do not use testing-library directly on stories | 🔧 | addon-interactions flat/addon-interactions recommended flat/recommended |
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**: addon-interactions recommended
+**Included in these configurations**: addon-interactions flat/addon-interactions recommended flat/recommended
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**: recommended addon-interactions
+**Included in these configurations**: recommended flat/recommended addon-interactions flat/addon-interactions
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**: csf flat/csf recommended flat/recommended
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**: csf flat/csf recommended flat/recommended
@@ -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**: csf flat/csf recommended flat/recommended
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**: csf-strict flat/csf-strict
@@ -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**: csf-strict flat/csf-strict
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**: recommended flat/recommended
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**: recommended flat/recommended
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**: recommended flat/recommended csf flat/csf
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**: addon-interactions recommended
+**Included in these configurations**: addon-interactions flat/addon-interactions recommended flat/recommended
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**: addon-interactions recommended
+**Included in these configurations**: addon-interactions flat/addon-interactions recommended flat/recommended
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 = () => hello ',
+ },
+ ],
},
],
},
@@ -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 = () => hello ",
+ },
+ ],
},
],
},
@@ -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 = () => hello ",
+ },
+ ],
},
],
},
@@ -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 = () => hello ",
+ },
+ ],
},
],
},
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"]
}