diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e32b00da09..67f649be07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,7 +42,9 @@ jobs: env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: pnpm build - - run: pnpm -r publish + - run: pnpm -r publish --access public + env: + NPM_CONFIG_PROVENANCE: true actions-timeline: needs: [publish] diff --git a/.release-please-manifest.json b/.release-please-manifest.json index ed468e2518..312876a5a1 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -2,6 +2,7 @@ "packages/create-plugin": "8.2.4", "packages/customize-uploader": "8.0.13", "packages/dts-gen": "8.1.1", + "@kintone/eslint-plugin": "0.0.0", "packages/plugin-manifest-validator": "10.2.2", "packages/plugin-packer": "8.1.3", "packages/plugin-uploader": "9.1.4", diff --git a/packages/eslint-plugin/.gitignore b/packages/eslint-plugin/.gitignore new file mode 100644 index 0000000000..7c1b942670 --- /dev/null +++ b/packages/eslint-plugin/.gitignore @@ -0,0 +1,30 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules/ +.node_modules/ + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# testing +coverage/ +/test-dashboard.md + +# artifacts +lib/ +dist/ + +# editors +**/.vs +**/.vscode +!**/.vscode/tasks.json +.idea + +# secrets +.env +.envrc + +# misc +**/.DS_Store diff --git a/packages/eslint-plugin/.prettierignore b/packages/eslint-plugin/.prettierignore new file mode 100644 index 0000000000..ab974e8cc9 --- /dev/null +++ b/packages/eslint-plugin/.prettierignore @@ -0,0 +1,10 @@ +# Ignore artifacts: +lib +dist +coverage + +# Ignore all HTML files: +*.html + +# Ignore auto generated files +CHANGELOG.md diff --git a/packages/eslint-plugin/LICENSE b/packages/eslint-plugin/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/packages/eslint-plugin/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/eslint-plugin/README.md b/packages/eslint-plugin/README.md new file mode 100644 index 0000000000..05ce545752 --- /dev/null +++ b/packages/eslint-plugin/README.md @@ -0,0 +1,50 @@ +# @kintone/eslint-plugin + +[![npm version](https://badge.fury.io/js/@kintone%2Feslint-plugin.svg)](https://badge.fury.io/js/@kintone%2Feslint-plugin) +![Node.js version](https://img.shields.io/badge/dynamic/json.svg?url=https://raw.githubusercontent.com/kintone/js-sdk/main/packages/eslint-plugin/package.json&label=node&query=$.engines.node&colorB=blue) +[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-yellow.svg)](LICENSE) + +> This plugin provide rules for kintone plugin development. + +> [!WARNING] +> Experimental: This package is still under early development. + +## Usage + +```shell +npm i -D @kintone/eslint-plugin +``` + +```javascript +// eslint.config.mjs +import kintoneESLintPlugin from "@kintone/eslint-plugin"; + +export default [kintoneESLintPlugin.configs.recommended]; +``` + +By default, this plugin refers `manifest.json` of current directory. +You can update this behavior by `manifestFilePath` in [shared settings](https://eslint.org/docs/latest/use/configure/configuration-files#configuring-shared-settings). + +```javascript +// eslint.config.mjs +import kintoneESLintPlugin from "@kintone/eslint-plugin"; + +export default [ + { + settings: { + "@kintone/eslint-plugin": { manifestFilePath: "path/to/manifest.json" }, + }, + }, + kintoneESLintPlugin.configs.recommended, +]; +``` + +## Rules + +| Name | Description | +| ---------------------------------------------------------- | ------------------------------------------------------------------------ | +| [`only-allowed-js-api`](docs/rules/only-allowed-js-api.md) | Only allow the kintone JS APIs listed in permissions.js_api in manifest. | + +## License + +[Apache 2.0](LICENSE) diff --git a/packages/eslint-plugin/docs/rules/only-allowed-js-api.md b/packages/eslint-plugin/docs/rules/only-allowed-js-api.md new file mode 100644 index 0000000000..0dcb9e145f --- /dev/null +++ b/packages/eslint-plugin/docs/rules/only-allowed-js-api.md @@ -0,0 +1,35 @@ +# Only allowed kintone JS API (`only-allowed-js-api`) + +Only allow the kintone JS APIs listed in permissions.js_api in manifest. + +#### ❌Incorrect + +```json5 +// manifest.json +{ + // ... + permissions: { + js_api: ["kintone.api"], + }, +} +``` + +```typescript +kintone.app.getId(); +``` + +#### ✅Correct + +```json5 +// manifest.json +{ + // ... + permissions: { + js_api: ["kintone.api", "kintone.app.getId"], + }, +} +``` + +```typescript +kintone.app.getId(); +``` diff --git a/packages/eslint-plugin/eslint.config.mjs b/packages/eslint-plugin/eslint.config.mjs new file mode 100644 index 0000000000..1f646dba3b --- /dev/null +++ b/packages/eslint-plugin/eslint.config.mjs @@ -0,0 +1,4 @@ +import rootConfig from "../../eslint.config.mjs"; + +/** @type {import("eslint").Linter.Config[]} */ +export default [{ ignores: ["**/lib"] }, ...rootConfig]; diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json new file mode 100644 index 0000000000..efb9d5c5d8 --- /dev/null +++ b/packages/eslint-plugin/package.json @@ -0,0 +1,70 @@ +{ + "name": "@kintone/eslint-plugin", + "version": "0.0.0", + "description": "An ESLint plugin for kintone.", + "keywords": [ + "eslint", + "eslintplugin", + "eslint-plugin", + "kintone" + ], + "homepage": "https://github.com/kintone/js-sdk/tree/main/packages/eslint-plugin#readme", + "bugs": { + "url": "https://github.com/kintone/js-sdk/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/kintone/js-sdk.git", + "directory": "packages/eslint-plugin" + }, + "license": "Apache-2.0", + "author": { + "name": "Cybozu, Inc.", + "url": "https://cybozu.co.jp" + }, + "type": "module", + "files": [ + "CHANGELOG.md", + "lib" + ], + "main": "lib/index.js", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "default": "./lib/index.js" + } + }, + "scripts": { + "prebuild": "pnpm clean", + "build": "tsc --build ./tsconfig.build.json", + "start": "run-s clean 'build --watch'", + "test": "vitest run", + "test:watch": "vitest", + "test:ci": "vitest run", + "lint": "eslint ./ --max-warnings 0", + "fix": "pnpm lint --fix", + "clean": "rimraf lib" + }, + "dependencies": { + "@typescript-eslint/utils": "^8.17.0" + }, + "peerDependencies": { + "eslint": ">=9.16.0" + }, + "devDependencies": { + "@cybozu/eslint-config": "^24.0.0-beta.0", + "@cybozu/license-manager": "^1.2.1", + "@types/node": "^22.10.1", + "@typescript-eslint/rule-tester": "^8.17.0", + "eslint": "^9.16.0", + "globals": "^15.13.0", + "npm-run-all": "^4.1.5", + "prettier": "^3.4.2", + "rimraf": "^6.0.1", + "typescript": "^5.7.2", + "vitest": "^2.1.8" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts new file mode 100644 index 0000000000..ea76d6337a --- /dev/null +++ b/packages/eslint-plugin/src/index.ts @@ -0,0 +1,39 @@ +import { rules } from "./rules/index.js"; +import module from "node:module"; +import type { TSESLint } from "@typescript-eslint/utils"; +const require = module.createRequire(import.meta.url); + +const name = "@kintone/eslint-plugin"; +const { version } = + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + require("../package.json") as typeof import("../package.json"); + +const base = { + meta: { name, version }, + rules, +}; + +const configs = { + recommended: { + files: ["**/*.{js,cjs,mjs,ts,cts,mts,jsx,tsx}"], + plugins: { + [name]: base, + }, + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + [`${name}/only-allowed-js-api`]: "error", + } satisfies { + [key in `${typeof name}/${keyof typeof rules}`]: TSESLint.FlatConfig.SeverityString; + }, + }, +} satisfies TSESLint.FlatConfig.Plugin["configs"]; + +const plugin = Object.assign(base, { + configs, +}) satisfies TSESLint.FlatConfig.Plugin; +export default plugin; diff --git a/packages/eslint-plugin/src/rules/index.ts b/packages/eslint-plugin/src/rules/index.ts new file mode 100644 index 0000000000..968b64ade2 --- /dev/null +++ b/packages/eslint-plugin/src/rules/index.ts @@ -0,0 +1,5 @@ +import { rule as onlyAllowedJsApi } from "./only-allowed-js-api.js"; + +export const rules = { + "only-allowed-js-api": onlyAllowedJsApi, +}; diff --git a/packages/eslint-plugin/src/rules/only-allowed-js-api.ts b/packages/eslint-plugin/src/rules/only-allowed-js-api.ts new file mode 100644 index 0000000000..2236c96a9a --- /dev/null +++ b/packages/eslint-plugin/src/rules/only-allowed-js-api.ts @@ -0,0 +1,67 @@ +import type { TSESTree } from "@typescript-eslint/utils"; +import { createRule } from "../utils/create-rule.js"; +import { loadPluginManifest } from "../utils/manifest.js"; +import { kintoneJsApis } from "../utils/js-api.js"; + +type MessageIds = "onlyUseAllowedJsApi"; + +export const rule = createRule<[], MessageIds>({ + name: "only-allowed-js-api", + meta: { + type: "problem", + docs: { + description: + "Only allow the kintone JS APIs listed in permissions.js_api in manifest.", + recommended: true, + requiresTypeChecking: false, + }, + messages: { + onlyUseAllowedJsApi: + "Only the kintone JS APIs listed in permissions.js_api in manifest are allowed.", + }, + schema: [], + }, + defaultOptions: [], + create(context) { + const manifest = loadPluginManifest(context); + + const allowedJsApis = manifest.permissions?.js_api || []; + + const checkCallExpression = (node: TSESTree.CallExpression) => { + const calleeName = joinCalleeNames(node); + + if (kintoneJsApis.includes(calleeName)) { + if (!allowedJsApis.includes(calleeName)) { + context.report({ node, messageId: "onlyUseAllowedJsApi" }); + } + } + }; + + return { + CallExpression: checkCallExpression, + }; + }, +}); + +const joinCalleeNames = (node: TSESTree.CallExpression): string => { + const recursive = ( + expression: + | TSESTree.Expression + | TSESTree.Identifier + | TSESTree.PrivateIdentifier, + ): string[] => { + if (expression.type === "Identifier") { + return [expression.name]; + } + + if (expression.type === "MemberExpression") { + return [ + ...recursive(expression.object), + ...recursive(expression.property), + ]; + } + return []; + }; + + return recursive(node.callee).join("."); +}; diff --git a/packages/eslint-plugin/src/utils/create-rule.ts b/packages/eslint-plugin/src/utils/create-rule.ts new file mode 100644 index 0000000000..69dfc53969 --- /dev/null +++ b/packages/eslint-plugin/src/utils/create-rule.ts @@ -0,0 +1,13 @@ +import { ESLintUtils } from "@typescript-eslint/utils"; +const { RuleCreator: ruleCreator } = ESLintUtils; + +export interface PluginDocs { + description: string; + recommended: boolean; + requiresTypeChecking: boolean; +} + +export const createRule = ruleCreator( + (name) => + `https://github.com/kintone/js-sdk/tree/main/packages/eslint-plugin/docs/rules/${name}.md`, +); diff --git a/packages/eslint-plugin/src/utils/js-api.ts b/packages/eslint-plugin/src/utils/js-api.ts new file mode 100644 index 0000000000..3e332cfe08 --- /dev/null +++ b/packages/eslint-plugin/src/utils/js-api.ts @@ -0,0 +1,153 @@ +export const kintoneJsApis = [ + // イベントハンドラーを登録する + "kintone.events.on", + "kintone.events.on", + + // イベントハンドラーを削除する + "kintone.events.off", + "kintone.events.off", + + // kintone REST APIリクエストを送信する + "kintone.api", + "kintone.api", + + // APIのURLを取得する + "kintone.api.url", + "kintone.api.url", + + // クエリ文字列付きのAPIのURLを取得する + "kintone.api.urlForGet", + "kintone.api.urlForGet", + + // CSRFトークンを取得する + "kintone.getRequestToken", + "kintone.getRequestToken", + + // kintone REST API同時接続数を取得する + "kintone.api.getConcurrencyLimit", + "kintone.api.getConcurrencyLimit", + + // 外部のAPIを実行する + "kintone.proxy", + "kintone.proxy", + + // 外部にファイルをアップロードする + "kintone.proxy.upload", + "kintone.proxy.upload", + + // レコードIDを取得する + "kintone.app.record.getId", + "kintone.mobile.app.record.getId", + + // レコードの値を取得する + "kintone.app.record.get", + "kintone.mobile.app.record.get", + + // レコードに値をセットする + "kintone.app.record.set", + "kintone.mobile.app.record.set", + + // アプリのIDを取得する + "kintone.app.getId", + "kintone.mobile.app.getId", + + // アプリのアイコンのURLを取得する + "kintone.app.getIcons", + "kintone.app.getIcons", + + // ルックアップフィールドの参照先のアプリIDを取得する + "kintone.app.getLookupTargetAppId", + "kintone.mobile.app.getLookupTargetAppId", + + // 関連レコード一覧の参照先のアプリIDを取得する + "kintone.app.getRelatedRecordsTargetAppId", + "kintone.mobile.app.getRelatedRecordsTargetAppId", + + // レコード一覧のクエリ文字列を取得する + "kintone.app.getQueryCondition", + "kintone.mobile.app.getQueryCondition", + + // レコード一覧のクエリ文字列を取得する(オプション付き) + "kintone.app.getQuery", + "kintone.mobile.app.getQuery", + + // ログインユーザーの情報を取得する + "kintone.getLoginUser", + "kintone.getLoginUser", + + // デザインのバージョンを取得する + "kintone.getUiVersion", + "kintone.getUiVersion", + + // フィールドの表示/非表示を切り替える + "kintone.app.record.setFieldShown", + "kintone.mobile.app.record.setFieldShown", + + // グループフィールドを開閉する + "kintone.app.record.setGroupFieldOpen", + "kintone.mobile.app.record.setGroupFieldOpen", + + // フィールド要素を取得する + "kintone.app.record.getFieldElement", + "kintone.mobile.app.record.getFieldElement", + + // メニューの上側の要素を取得する + "kintone.app.record.getHeaderMenuSpaceElement", + undefined, + + // ヘッダーの下側の要素を取得する + undefined, + "kintone.mobile.app.getHeaderSpaceElement", + + // スペースフィールドの要素を取得する + "kintone.app.record.getSpaceElement", + "kintone.mobile.app.record.getSpaceElement", + + // フィールド要素を取得する + "kintone.app.getFieldElements", + "kintone.mobile.app.getFieldElements", + + // メニューの右側の要素を取得する + "kintone.app.getHeaderMenuSpaceElement", + undefined, + + // メニューの下側の要素を取得する + "kintone.app.getHeaderSpaceElement", + undefined, + + // ヘッダーの下側の要素を取得する + undefined, + "kintone.mobile.app.getHeaderSpaceElement", + + // ポータルの上側の要素を取得する + "kintone.portal.getContentSpaceElement", + "kintone.mobile.portal.getContentSpaceElement", + + // スペースのトップ画面の上側の要素を取得する + "kintone.space.portal.getContentSpaceElement", + "kintone.mobile.space.portal.getContentSpaceElement", + + // 設定情報を取得する + "kintone.plugin.app.getConfig", + "kintone.plugin.app.getConfig", + + // 設定情報を保存する + "kintone.plugin.app.setConfig", + undefined, + + // 外部APIの実行に必要な情報を取得する + "kintone.plugin.app.getProxyConfig", + undefined, + + // 外部APIの実行に必要な情報を保存する + "kintone.plugin.app.setProxyConfig", + undefined, + + // 外部APIを実行する + "kintone.plugin.app.proxy", + "kintone.plugin.app.proxy", + + // 外部にファイルをアップロードする + "kintone.plugin.app.proxy.upload", + "kintone.plugin.app.proxy.upload", +]; diff --git a/packages/eslint-plugin/src/utils/manifest.ts b/packages/eslint-plugin/src/utils/manifest.ts new file mode 100644 index 0000000000..1e4674da6d --- /dev/null +++ b/packages/eslint-plugin/src/utils/manifest.ts @@ -0,0 +1,60 @@ +import type { TSESLint } from "@typescript-eslint/utils"; +import { getSettings } from "./settings.js"; +import fs from "node:fs"; + +export const loadPluginManifest = < + MessageIds extends string, + Options extends readonly unknown[], +>( + context: Readonly>, +): ManifestV2JsonObject => { + const settings = getSettings(context); + if (settings.manifest) { + return settings.manifest as ManifestV2JsonObject; + } + const json = fs.readFileSync(settings.manifestFilePath, "utf-8"); + return JSON.parse(json); +}; + +// TODO: Unify with plugin/core module of cli-kintone +export type ManifestV2JsonObject = { + $schema?: string; + manifest_version: 2; + version: number | string; + type?: "APP"; + name: { + ja?: string; + en: string; + zh?: string; + }; + description?: { + ja?: string; + en: string; + zh?: string; + }; + icon: string; + homepage_url?: { + ja: string; + en: string; + zh: string; + }; + components?: [ + { + type: "APP_INDEX_HEADER_SPACE" | "APP_INDEX_HEADLESS"; + js?: string[]; + css?: string[]; + html?: string; + }, + ]; + config?: { + html?: string; + js?: string[]; + css?: string[]; + required_params?: string[]; + }; + allowed_hosts?: string[]; + permissions?: { + js_api?: string[]; + rest_api?: string[]; + }; +}; diff --git a/packages/eslint-plugin/src/utils/settings.ts b/packages/eslint-plugin/src/utils/settings.ts new file mode 100644 index 0000000000..1cb384718d --- /dev/null +++ b/packages/eslint-plugin/src/utils/settings.ts @@ -0,0 +1,51 @@ +import type { TSESLint } from "@typescript-eslint/utils"; +type Settings = { + manifest?: object; + // TODO: Reading a manifest file from manifestFilePath may degrade rule performance + manifestFilePath: string; +}; +const defaultSettings: Settings = { + manifestFilePath: "manifest.json", +}; + +export const getSettings = < + MessageIds extends string, + Options extends readonly unknown[], +>( + context: Readonly>, +): Settings => { + let settings = defaultSettings; + + const sharedSettings = context.settings["@kintone/eslint-plugin"]; + if (!sharedSettings) { + return settings; + } + if (typeof sharedSettings !== "object") { + throw new Error("settings must be an object"); + } + + if ("manifest" in sharedSettings) { + if ( + typeof sharedSettings.manifest !== "object" || + sharedSettings.manifest == null + ) { + throw new Error("manifestFilePath must be an object"); + } + settings = { + ...settings, + manifest: sharedSettings.manifest, + }; + } + + if ("manifestFilePath" in sharedSettings) { + if (typeof sharedSettings.manifestFilePath !== "string") { + throw new Error("manifestFilePath must be a string"); + } + settings = { + ...settings, + manifestFilePath: sharedSettings.manifestFilePath, + }; + } + + return settings; +}; diff --git a/packages/eslint-plugin/tests/index.test.ts b/packages/eslint-plugin/tests/index.test.ts new file mode 100644 index 0000000000..3d7b37c40f --- /dev/null +++ b/packages/eslint-plugin/tests/index.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, test } from "vitest"; +import module from "node:module"; +const require = module.createRequire(import.meta.url); +import plugin from "../src/index.js"; + +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +const pkgJson = require("../package.json") as typeof import("../package.json"); + +describe("metadata", () => { + test("should match to the package.json", () => { + expect(plugin.meta.name).toBe(pkgJson.name); + expect(plugin.meta.version).toBe(pkgJson.version); + }); +}); diff --git a/packages/eslint-plugin/tests/rules/only-allowed-js-api.test.ts b/packages/eslint-plugin/tests/rules/only-allowed-js-api.test.ts new file mode 100644 index 0000000000..30de95f227 --- /dev/null +++ b/packages/eslint-plugin/tests/rules/only-allowed-js-api.test.ts @@ -0,0 +1,61 @@ +import { RuleTester } from "@typescript-eslint/rule-tester"; +import { rule } from "../../src/rules/only-allowed-js-api.js"; +import type { ManifestV2JsonObject } from "../../src/utils/manifest.js"; + +const manifest: ManifestV2JsonObject = { + manifest_version: 2, + version: "1", + name: { + en: "my-plugin", + }, + description: { + en: "Just another plugin", + }, + icon: "./icon.svg", + permissions: { + js_api: ["kintone.api"], + }, +}; + +const ruleTester = new RuleTester({ + settings: { + "@kintone/eslint-plugin": { + manifest: manifest, + }, + }, +}); + +ruleTester.run("permissions", rule, { + valid: [ + // not function call + "const x = 1;", + "const fn = ()=> {};", + "function fn (){}", + + // not function call (kintone api) + "kintone.api", + "kintone.app.getId", + + // function call but not kintone js api + "fn(123)", + "fetch(123)", + "obj.child.fn(123)", + + "kintone(123)", + "kintone.foo.bar(123)", + + // allowed kintone js api + "kintone.api(123)", + ], + invalid: [ + // kintone js api not listed in permissions.js_api in manifest + { + code: "kintone.app.getId(123)", + errors: [ + { + messageId: "onlyUseAllowedJsApi", + }, + ], + }, + ], +}); diff --git a/packages/eslint-plugin/tests/setup.ts b/packages/eslint-plugin/tests/setup.ts new file mode 100644 index 0000000000..d808073a99 --- /dev/null +++ b/packages/eslint-plugin/tests/setup.ts @@ -0,0 +1,11 @@ +// https://typescript-eslint.io/packages/rule-tester/#vitest + +import * as vitest from "vitest"; +import { RuleTester } from "@typescript-eslint/rule-tester"; + +RuleTester.afterAll = vitest.afterAll; + +// If you are not using vitest with globals: true (https://vitest.dev/config/#globals): +RuleTester.it = vitest.it; +RuleTester.itOnly = vitest.it.only; +RuleTester.describe = vitest.describe; diff --git a/packages/eslint-plugin/tsconfig.build.json b/packages/eslint-plugin/tsconfig.build.json new file mode 100644 index 0000000000..8d99974fbf --- /dev/null +++ b/packages/eslint-plugin/tsconfig.build.json @@ -0,0 +1,35 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Modules */ + "rootDir": "./src" /* Specify the root folder within your source files. */, + + /* Projects */ + "composite": true /* Enable constraints that allow a TypeScript project to be used with project references. */, + "tsBuildInfoFile": "./node_modules/.build.tsbuildinfo" /* Specify the path to .tsbuildinfo incremental compilation file. */, + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + // "declarationMap": true /* Create sourcemaps for d.ts files. */, + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + "noEmit": false /* Disable emitting files from a compilation. */, + "outDir": "./lib" /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + }, + "include": ["src"] +} diff --git a/packages/eslint-plugin/tsconfig.json b/packages/eslint-plugin/tsconfig.json new file mode 100644 index 0000000000..3878d74958 --- /dev/null +++ b/packages/eslint-plugin/tsconfig.json @@ -0,0 +1,60 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Language and Environment */ + "target": "ES2023" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + + /* Modules */ + "module": "Node16" /* Specify what module code is generated. */, + // "rootDir": "./src" /* Specify the root folder within your source files. */, + "moduleResolution": "Node16" /* Specify how TypeScript looks up a file from a given module specifier. */, + "noUncheckedSideEffectImports": true /* Check side effect imports. */, + "resolveJsonModule": true /* Enable importing .json files. */, + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "noEmit": true /* Disable emitting files from a compilation. */, + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noUnusedLocals": true /* Enable error reporting when local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read. */, + "exactOptionalPropertyTypes": true /* Interpret optional property types as written, rather than adding 'undefined'. */, + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, + "noUncheckedIndexedAccess": true /* Add 'undefined' to a type when accessed using an index. */, + "noImplicitOverride": true /* Ensure overriding members in derived classes are marked with an override modifier. */, + "noPropertyAccessFromIndexSignature": true /* Enforces using indexed accessors for keys declared using an indexed type. */, + "allowUnusedLabels": false /* Disable error reporting for unused labels. */, + "allowUnreachableCode": false /* Disable error reporting for unreachable code. */, + + /* Completeness */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "files": [], + "references": [ + { + "path": "tsconfig.build.json" + }, + { + "path": "tsconfig.typecheck.json" + } + ] +} diff --git a/packages/eslint-plugin/tsconfig.typecheck.json b/packages/eslint-plugin/tsconfig.typecheck.json new file mode 100644 index 0000000000..8e325a7e03 --- /dev/null +++ b/packages/eslint-plugin/tsconfig.typecheck.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + "composite": true /* Enable constraints that allow a TypeScript project to be used with project references. */, + "tsBuildInfoFile": "./node_modules/.cache/.typecheck.tsbuildinfo" /* Specify the path to .tsbuildinfo incremental compilation file. */ + }, + "include": ["src", "tests", "vitest.config.ts"] +} diff --git a/packages/eslint-plugin/vitest.config.ts b/packages/eslint-plugin/vitest.config.ts new file mode 100644 index 0000000000..af35cce30d --- /dev/null +++ b/packages/eslint-plugin/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + setupFiles: "tests/setup.ts", + }, +}); diff --git a/packages/tsconfig.json b/packages/tsconfig.json index 2aff0bf637..3b3a4e0b68 100644 --- a/packages/tsconfig.json +++ b/packages/tsconfig.json @@ -5,6 +5,7 @@ { "path": "./create-plugin"}, { "path": "./customize-uploader"}, { "path": "./dts-gen"}, + { "path": "./eslint-plugin"}, { "path": "./plugin-packer"}, { "path": "./plugin-manifest-validator"}, { "path": "./plugin-uploader"}, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0473488fe..8dfac9e913 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -203,6 +203,46 @@ importers: specifier: ^5.1.4 version: 5.1.4(webpack@5.97.1) + packages/eslint-plugin: + dependencies: + '@typescript-eslint/utils': + specifier: ^8.17.0 + version: 8.18.2(eslint@9.17.0)(typescript@5.7.2) + devDependencies: + '@cybozu/eslint-config': + specifier: ^24.0.0-beta.0 + version: 24.0.0-beta.0(eslint@9.17.0)(prettier@3.4.2)(typescript@5.7.2) + '@cybozu/license-manager': + specifier: ^1.2.1 + version: 1.2.1 + '@types/node': + specifier: ^22.10.1 + version: 22.10.2 + '@typescript-eslint/rule-tester': + specifier: ^8.17.0 + version: 8.18.2(eslint@9.17.0)(typescript@5.7.2) + eslint: + specifier: ^9.16.0 + version: 9.17.0 + globals: + specifier: ^15.13.0 + version: 15.14.0 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + typescript: + specifier: ^5.7.2 + version: 5.7.2 + vitest: + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2) + packages/plugin-manifest-validator: dependencies: ajv: @@ -580,7 +620,7 @@ packages: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -1965,6 +2005,33 @@ packages: - supports-color dev: true + /@cybozu/eslint-config@24.0.0-beta.0(eslint@9.17.0)(prettier@3.4.2)(typescript@5.7.2): + resolution: {integrity: sha512-ie4ux28m0ZI6lLrpBkL/HDIkx42lWMORffYxgAUd5PeXsez+CwUumG8eHK+4UkxCnTcmPFWpM/cJ6omfn9xPCw==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^8.56.0 || ^9.0.0-0 + typescript: '>=4.7.5 || ^5.0.0' + dependencies: + '@stylistic/eslint-plugin-ts': 2.9.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0)(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + eslint: 9.17.0 + eslint-config-prettier: 9.1.0(eslint@9.17.0) + eslint-plugin-import-x: 3.1.0(eslint@9.17.0)(typescript@5.7.2) + eslint-plugin-jsx-a11y: 6.10.1(eslint@9.17.0) + eslint-plugin-n: 17.11.1(eslint@9.17.0) + eslint-plugin-prettier: 5.2.1(eslint-config-prettier@9.1.0)(eslint@9.17.0)(prettier@3.4.2) + eslint-plugin-react: 7.37.1(eslint@9.17.0) + eslint-plugin-react-hooks: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.17.0) + globals: 15.11.0 + typescript: 5.7.2 + typescript-eslint: 8.11.0(eslint@9.17.0)(typescript@5.7.2) + transitivePeerDependencies: + - '@types/eslint' + - prettier + - supports-color + dev: true + /@cybozu/license-manager@1.2.1: resolution: {integrity: sha512-my0f4N/e6XVNZ5q9vJlkA/MBiY7scy7neBRhf2dXpdaYGR5Ti1Xjig4dkKlgy/u0+h4hnkE/8sd5MlhjPNqwuw==} engines: {node: '>=18.14.0', npm: '>=9.3.1', pnpm: '>=8.10.0'} @@ -2196,10 +2263,23 @@ packages: eslint: 9.13.0 eslint-visitor-keys: 3.4.3 + /@eslint-community/eslint-utils@4.4.0(eslint@9.17.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.17.0 + eslint-visitor-keys: 3.4.3 + /@eslint-community/regexpp@4.11.1: resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@eslint/config-array@0.18.0: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2210,10 +2290,26 @@ packages: transitivePeerDependencies: - supports-color + /@eslint/config-array@0.19.1: + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + /@eslint/core@0.7.0: resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@eslint/core@0.9.1: + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@types/json-schema': 7.0.15 + /@eslint/eslintrc@3.1.0: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2222,7 +2318,23 @@ packages: debug: 4.4.0 espree: 10.2.0 globals: 14.0.0 - ignore: 5.2.4 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/eslintrc@3.2.0: + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2234,20 +2346,38 @@ packages: resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@eslint/js@9.17.0: + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@eslint/object-schema@2.1.4: resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@eslint/object-schema@2.1.5: + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@eslint/plugin-kit@0.2.1: resolution: {integrity: sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: levn: 0.4.1 + /@eslint/plugin-kit@0.2.4: + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + levn: 0.4.1 + /@humanfs/core@0.19.0: resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} engines: {node: '>=18.18.0'} + /@humanfs/core@0.19.1: + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + /@humanfs/node@0.16.5: resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} engines: {node: '>=18.18.0'} @@ -2255,6 +2385,13 @@ packages: '@humanfs/core': 0.19.0 '@humanwhocodes/retry': 0.3.1 + /@humanfs/node@0.16.6: + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -2263,6 +2400,10 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} + /@humanwhocodes/retry@0.4.1: + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + /@inquirer/checkbox@2.4.7: resolution: {integrity: sha512-5YwCySyV1UEgqzz34gNsC38eKxRBtlRDpJLlKcRtTjlYA/yDKuc1rfw+hjw+2WJxbAZtaDPsRl5Zk7J14SBoBw==} engines: {node: '>=18'} @@ -2289,7 +2430,7 @@ packages: '@inquirer/figures': 1.0.5 '@inquirer/type': 1.5.2 '@types/mute-stream': 0.0.4 - '@types/node': 22.1.0 + '@types/node': 22.10.2 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-spinners: 2.9.2 @@ -2673,6 +2814,10 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: @@ -3166,7 +3311,7 @@ packages: peerDependencies: eslint: '>=8.40.0' dependencies: - '@typescript-eslint/utils': 8.11.0(eslint@9.13.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@9.13.0)(typescript@5.7.2) eslint: 9.13.0 eslint-visitor-keys: 4.1.0 espree: 10.2.0 @@ -3174,6 +3319,21 @@ packages: - supports-color - typescript + /@stylistic/eslint-plugin-ts@2.9.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-CxB73paAKlmaIDtOfKoIHlhNJVlyRMVobuBqdOc4wbVSqfhbgpCWuJYpBkV3ydGDKRfVWNJ9yg5b99lzZtrjhg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.40.0' + dependencies: + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) + eslint: 9.17.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -3207,7 +3367,7 @@ packages: /@types/adm-zip@0.5.7: resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} dependencies: - '@types/node': 18.19.67 + '@types/node': 18.19.68 dev: true /@types/babel__core@7.20.1: @@ -3417,7 +3577,7 @@ packages: /@types/mute-stream@0.0.4: resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: - '@types/node': 18.19.68 + '@types/node': 22.10.2 dev: false /@types/node-forge@1.3.11: @@ -3436,11 +3596,6 @@ packages: resolution: {integrity: sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==} dependencies: undici-types: 5.26.5 - - /@types/node@18.19.67: - resolution: {integrity: sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==} - dependencies: - undici-types: 5.26.5 dev: true /@types/node@18.19.68: @@ -3448,11 +3603,10 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@22.1.0: - resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} + /@types/node@22.10.2: + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} dependencies: - undici-types: 6.13.0 - dev: false + undici-types: 6.20.0 /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3515,7 +3669,7 @@ packages: /@types/stream-buffers@3.0.7: resolution: {integrity: sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==} dependencies: - '@types/node': 18.19.34 + '@types/node': 18.19.68 dev: true /@types/through@0.0.30: @@ -3551,12 +3705,12 @@ packages: /@types/yauzl@2.10.3: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} dependencies: - '@types/node': 18.19.34 + '@types/node': 18.19.68 /@types/yazl@2.4.5: resolution: {integrity: sha512-qpmPfx32HS7vlGJf7EsoM9qJnLZhXJBf1KH0hzfdc+D794rljQWh4H0I/UrZy+6Nhqn0l2jdBZXBGZtR1vnHqw==} dependencies: - '@types/node': 18.19.34 + '@types/node': 18.19.68 dev: true /@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0)(eslint@9.13.0)(typescript@5.7.2): @@ -3585,6 +3739,33 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0)(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.11.0 + '@typescript-eslint/type-utils': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.11.0 + eslint: 9.17.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@8.11.0(eslint@9.13.0)(typescript@5.7.2): resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3605,6 +3786,45 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/parser@8.11.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 8.11.0 + '@typescript-eslint/types': 8.11.0 + '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.11.0 + debug: 4.4.0 + eslint: 9.17.0 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/rule-tester@8.18.2(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-1tTHu/rNuF8zB3tkRz+S/1a9N/GVnP90ca9DEeVI4RNhOZUKtAPLq7oEjSU804tYxrF055MVnYS5CulEQsM88g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + dependencies: + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) + ajv: 6.12.6 + eslint: 9.17.0 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/scope-manager@7.4.0: resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3619,6 +3839,13 @@ packages: '@typescript-eslint/types': 8.11.0 '@typescript-eslint/visitor-keys': 8.11.0 + /@typescript-eslint/scope-manager@8.18.2: + resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + /@typescript-eslint/type-utils@8.11.0(eslint@9.13.0)(typescript@5.7.2): resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3637,6 +3864,25 @@ packages: - eslint - supports-color + /@typescript-eslint/type-utils@8.11.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + debug: 4.4.0 + ts-api-utils: 1.3.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - eslint + - supports-color + dev: true + /@typescript-eslint/types@7.4.0: resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3645,6 +3891,10 @@ packages: resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@typescript-eslint/types@8.18.2: + resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@typescript-eslint/typescript-estree@7.4.0(typescript@5.7.2): resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3661,7 +3911,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.3 - ts-api-utils: 1.0.3(typescript@5.7.2) + ts-api-utils: 1.3.0(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -3680,7 +3930,25 @@ packages: debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2): + resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.7.2) typescript: 5.7.2 @@ -3705,6 +3973,25 @@ packages: - supports-color - typescript + /@typescript-eslint/utils@7.4.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.7.2) + eslint: 9.17.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/utils@8.11.0(eslint@9.13.0)(typescript@5.7.2): resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3720,6 +4007,54 @@ packages: - supports-color - typescript + /@typescript-eslint/utils@8.11.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) + '@typescript-eslint/scope-manager': 8.11.0 + '@typescript-eslint/types': 8.11.0 + '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.7.2) + eslint: 9.17.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@8.18.2(eslint@9.13.0)(typescript@5.7.2): + resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + eslint: 9.13.0 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/utils@8.18.2(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + eslint: 9.17.0 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + /@typescript-eslint/visitor-keys@7.4.0: resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3734,6 +4069,74 @@ packages: '@typescript-eslint/types': 8.11.0 eslint-visitor-keys: 3.4.3 + /@typescript-eslint/visitor-keys@8.18.2: + resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.18.2 + eslint-visitor-keys: 4.2.0 + + /@vitest/expect@2.1.8: + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/mocker@2.1.8(vite@5.4.11): + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 5.4.11(@types/node@22.10.2) + dev: true + + /@vitest/pretty-format@2.1.8: + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/runner@2.1.8: + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + dependencies: + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@2.1.8: + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 + pathe: 1.1.2 + dev: true + + /@vitest/spy@2.1.8: + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + dependencies: + tinyspy: 3.0.2 + dev: true + + /@vitest/utils@2.1.8: + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + dev: true + /@webassemblyjs/ast@1.14.1: resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} dependencies: @@ -4105,7 +4508,7 @@ packages: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.7 - is-array-buffer: 3.0.2 + is-array-buffer: 3.0.4 dev: true /array-buffer-byte-length@1.0.1: @@ -4198,12 +4601,12 @@ packages: resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 + array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 get-intrinsic: 1.2.4 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 dev: true /arraybuffer.prototype.slice@1.0.3: @@ -4257,6 +4660,11 @@ packages: util: 0.12.5 dev: true + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -4676,6 +5084,11 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -4742,6 +5155,17 @@ packages: resolution: {integrity: sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==} dev: true + /chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4766,6 +5190,11 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -5359,6 +5788,11 @@ packages: resolution: {integrity: sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==} dev: true + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + /deep-equal@1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: @@ -5367,7 +5801,7 @@ packages: is-regex: 1.1.4 object-is: 1.1.5 object-keys: 1.1.1 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.2 dev: true /deep-is@0.1.4: @@ -5743,7 +6177,7 @@ packages: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -5808,6 +6242,10 @@ packages: resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} dev: true + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + dev: true + /es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -5820,7 +6258,7 @@ packages: dependencies: get-intrinsic: 1.2.4 has: 1.0.3 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /es-set-tostringtag@2.0.3: @@ -6004,6 +6442,16 @@ packages: eslint: 9.13.0 semver: 7.6.3 + /eslint-compat-utils@0.5.1(eslint@9.17.0): + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 9.17.0 + semver: 7.6.3 + dev: true + /eslint-config-prettier@9.1.0(eslint@9.13.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -6012,6 +6460,15 @@ packages: dependencies: eslint: 9.13.0 + /eslint-config-prettier@9.1.0(eslint@9.17.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 9.17.0 + dev: true + /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: @@ -6032,6 +6489,18 @@ packages: eslint: 9.13.0 eslint-compat-utils: 0.5.1(eslint@9.13.0) + /eslint-plugin-es-x@7.8.0(eslint@9.17.0): + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) + '@eslint-community/regexpp': 4.11.1 + eslint: 9.17.0 + eslint-compat-utils: 0.5.1(eslint@9.17.0) + dev: true + /eslint-plugin-import-x@3.1.0(eslint@9.13.0)(typescript@5.7.2): resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==} engines: {node: '>=16'} @@ -6045,13 +6514,35 @@ packages: eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.8.1 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 + semver: 7.6.3 + stable-hash: 0.0.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + /eslint-plugin-import-x@3.1.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==} + engines: {node: '>=16'} + peerDependencies: + eslint: ^8.56.0 || ^9.0.0-0 + dependencies: + '@typescript-eslint/utils': 7.4.0(eslint@9.17.0)(typescript@5.7.2) + debug: 4.4.0 + doctrine: 3.0.0 + eslint: 9.17.0 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.8.1 + is-glob: 4.0.3 + minimatch: 9.0.5 semver: 7.6.3 stable-hash: 0.0.4 tslib: 2.6.2 transitivePeerDependencies: - supports-color - typescript + dev: true /eslint-plugin-jsx-a11y@6.10.1(eslint@9.13.0): resolution: {integrity: sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g==} @@ -6077,6 +6568,31 @@ packages: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 + /eslint-plugin-jsx-a11y@6.10.1(eslint@9.17.0): + resolution: {integrity: sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.1 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.1.0 + eslint: 9.17.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.1 + dev: true + /eslint-plugin-n@17.11.1(eslint@9.13.0): resolution: {integrity: sha512-93IUD82N6tIEgjztVI/l3ElHtC2wTa9boJHrD8iN+NyDxjxz/daZUZKfkedjBZNdg6EqDk4irybUsiPwDqXAEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6089,10 +6605,27 @@ packages: eslint-plugin-es-x: 7.8.0(eslint@9.13.0) get-tsconfig: 4.8.1 globals: 15.14.0 - ignore: 5.2.4 + ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 + /eslint-plugin-n@17.11.1(eslint@9.17.0): + resolution: {integrity: sha512-93IUD82N6tIEgjztVI/l3ElHtC2wTa9boJHrD8iN+NyDxjxz/daZUZKfkedjBZNdg6EqDk4irybUsiPwDqXAEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) + enhanced-resolve: 5.17.1 + eslint: 9.17.0 + eslint-plugin-es-x: 7.8.0(eslint@9.17.0) + get-tsconfig: 4.8.1 + globals: 15.14.0 + ignore: 5.3.2 + minimatch: 9.0.5 + semver: 7.6.3 + dev: true + /eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0)(eslint@9.13.0)(prettier@3.3.3): resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6114,6 +6647,27 @@ packages: prettier-linter-helpers: 1.0.0 synckit: 0.9.2 + /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@9.17.0)(prettier@3.4.2): + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 9.17.0 + eslint-config-prettier: 9.1.0(eslint@9.17.0) + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + dev: true + /eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614(eslint@9.13.0): resolution: {integrity: sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==} engines: {node: '>=10'} @@ -6122,7 +6676,42 @@ packages: dependencies: eslint: 9.13.0 - /eslint-plugin-react@7.37.1(eslint@9.13.0): + /eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614(eslint@9.17.0): + resolution: {integrity: sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + dependencies: + eslint: 9.17.0 + dev: true + + /eslint-plugin-react@7.37.1(eslint@9.13.0): + resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.1.0 + eslint: 9.13.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 + + /eslint-plugin-react@7.37.1(eslint@9.17.0): resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==} engines: {node: '>=4'} peerDependencies: @@ -6134,7 +6723,7 @@ packages: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.1.0 - eslint: 9.13.0 + eslint: 9.17.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -6147,6 +6736,7 @@ packages: semver: 6.3.1 string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 + dev: true /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -6163,6 +6753,13 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 + /eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6171,6 +6768,10 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /eslint@9.13.0: resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6219,6 +6820,53 @@ packages: transitivePeerDependencies: - supports-color + /eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + transitivePeerDependencies: + - supports-color + /esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} @@ -6288,6 +6936,14 @@ packages: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.1.0 + /espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + /esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} @@ -6338,6 +6994,12 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.6 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -6405,6 +7067,11 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + dev: true + /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6718,7 +7385,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.1 + es-abstract: 1.23.3 functions-have-names: 1.2.3 dev: true @@ -6839,6 +7506,19 @@ packages: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 + /glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -6874,7 +7554,6 @@ packages: /globals@15.11.0: resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} engines: {node: '>=18'} - dev: false /globals@15.14.0: resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} @@ -6885,6 +7564,7 @@ packages: engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 + dev: true /globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -6902,7 +7582,7 @@ packages: dir-glob: 3.0.1 fast-glob: 3.3.2 glob: 7.2.3 - ignore: 5.2.4 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 dev: false @@ -6914,7 +7594,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.2.4 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -6924,7 +7604,7 @@ packages: dependencies: '@sindresorhus/merge-streams': 1.0.0 fast-glob: 3.3.2 - ignore: 5.2.4 + ignore: 5.3.2 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -7314,7 +7994,7 @@ packages: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /is-array-buffer@3.0.4: @@ -7349,7 +8029,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -7370,7 +8050,7 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} @@ -7449,7 +8129,7 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -7492,7 +8172,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} @@ -7517,7 +8197,7 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} @@ -7655,6 +8335,13 @@ packages: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + /jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + dependencies: + '@isaacs/cliui': 8.0.2 + dev: true + /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7803,7 +8490,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 18.19.34 + '@types/node': 18.19.68 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -8191,7 +8878,7 @@ packages: js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.3.3 + prettier: 3.4.2 tinyglobby: 0.2.10 dev: true @@ -8356,10 +9043,19 @@ packages: dependencies: js-tokens: 4.0.0 + /loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + dev: true + /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + /lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -8383,6 +9079,12 @@ packages: vlq: 0.2.3 dev: true + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + /magic-string@0.30.3: resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} engines: {node: '>=12'} @@ -8560,6 +9262,13 @@ packages: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} dev: true + /minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -9080,6 +9789,14 @@ packages: lru-cache: 10.2.0 minipass: 7.1.2 + /path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + dev: true + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true @@ -9100,6 +9817,15 @@ packages: engines: {node: '>=12'} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true + /pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -9635,6 +10361,12 @@ packages: engines: {node: '>=14'} hasBin: true + /prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10091,6 +10823,15 @@ packages: dependencies: glob: 10.4.5 + /rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.0 + dev: true + /ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: @@ -10427,6 +11168,10 @@ packages: get-intrinsic: 1.2.4 object-inspect: 1.13.1 + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -10633,6 +11378,10 @@ packages: escape-string-regexp: 2.0.0 dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -10643,6 +11392,10 @@ packages: engines: {node: '>= 0.8'} dev: true + /std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + dev: true + /stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} dependencies: @@ -10744,7 +11497,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.1 + es-abstract: 1.23.3 dev: true /string.prototype.trim@1.2.9: @@ -10761,7 +11514,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.1 + es-abstract: 1.23.3 dev: true /string.prototype.trimend@1.0.8: @@ -10776,7 +11529,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.1 + es-abstract: 1.23.3 dev: true /string.prototype.trimstart@1.0.8: @@ -11003,6 +11756,14 @@ packages: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: true + + /tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + dev: true + /tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} @@ -11011,6 +11772,21 @@ packages: picomatch: 4.0.2 dev: true + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -11068,14 +11844,6 @@ packages: engines: {node: '>=8'} dev: false - /ts-api-utils@1.0.3(typescript@5.7.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.7.2 - /ts-api-utils@1.3.0(typescript@5.7.2): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -11201,7 +11969,7 @@ packages: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-buffer@1.0.2: @@ -11219,7 +11987,7 @@ packages: call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.3 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-byte-length@1.0.1: @@ -11236,11 +12004,11 @@ packages: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.3 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-byte-offset@1.0.2: @@ -11259,7 +12027,7 @@ packages: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 dev: true /typed-array-length@1.0.6: @@ -11294,6 +12062,24 @@ packages: - eslint - supports-color + /typescript-eslint@8.11.0(eslint@9.17.0)(typescript@5.7.2): + resolution: {integrity: sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0)(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.11.0(eslint@9.17.0)(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - eslint + - supports-color + dev: true + /typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -11317,9 +12103,8 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici-types@6.13.0: - resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} - dev: false + /undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} @@ -11456,6 +12241,28 @@ packages: engines: {node: '>= 0.8'} dev: true + /vite-node@2.1.8(@types/node@22.10.2): + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.5.4 + pathe: 1.1.2 + vite: 5.4.11(@types/node@22.10.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite@5.4.11(@types/node@18.19.68): resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -11495,6 +12302,103 @@ packages: fsevents: 2.3.3 dev: true + /vite@5.4.11(@types/node@22.10.2): + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 22.10.2 + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.29.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@2.1.8(@types/node@22.10.2): + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 22.10.2 + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@22.10.2) + vite-node: 2.1.8(@types/node@22.10.2) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: true + /vlq@0.2.3: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} dev: true @@ -11823,6 +12727,15 @@ packages: dependencies: isexe: 2.0.0 + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} dev: true diff --git a/release-please-config.json b/release-please-config.json index 9d7d57f03a..ee88ffda9e 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -5,6 +5,7 @@ "prerelease": false, "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": false, + "initial-version": "0.0.1", "changelog-path": "CHANGELOG.md", "versioning": "default", "include-v-in-tag": false, @@ -24,6 +25,10 @@ "package-name": "@kintone/dts-gen", "component": "@kintone/dts-gen" }, + "packages/eslint-plugin": { + "package-name": "@kintone/eslint-plugin", + "component": "@kintone/eslint-plugin" + }, "packages/plugin-manifest-validator": { "package-name": "@kintone/plugin-manifest-validator", "component": "@kintone/plugin-manifest-validator"