diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..09fb8561 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.{ts,js,tsx,jsx}] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true + +[*.{yaml,yml}] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true diff --git a/.env.example b/.env.example index ce660f9b..df9acd29 100644 --- a/.env.example +++ b/.env.example @@ -1,16 +1,6 @@ -# ------------------ -# AUTH CONFIGURATION -# ------------------ - -# You can generate a new secret on the command line with: `openssl rand -base64 32` -# https://next-auth.js.org/configuration/options#secret -NEXTAUTH_SECRET="secret" - -# Domain where your app will be hosted (set to http://localhost:3000 for running locally) -# (if this is not configured correctly, signing the wallet message to sign in will not work) -NEXTAUTH_URL="https://.vercel.app" -# NEXTAUTH_URL="http://localhost:3000" - +# Storage for metadata +# Create a Blob database and get token here: https://vercel.com/dashboard/stores?type=blob +BLOB_READ_WRITE_TOKEN= # --------------------- # NETWORK CONFIGURATION diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..3be82f2d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,11 @@ +node_modules +dist +.next +coverage +build +typechain-types +.eslintrc.js +commitlint.config.js +subgraph/generated +public/mockServiceWorker.js + diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d4b2cb8a..1616f1ab 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,37 +1,176 @@ -/** @type {import("eslint").Linter.Config} */ -const config = { - parser: "@typescript-eslint/parser", - parserOptions: { - project: true, - }, - plugins: ["@typescript-eslint"], +const fs = require("fs"); +const path = require("path"); + +const prettierConfig = fs.readFileSync(path.resolve(__dirname, "./.prettierrc"), "utf8"); +const prettierOptions = JSON.parse(prettierConfig); +const isProduction = process.env.NODE_ENV === "production"; + +module.exports = { + root: true, extends: [ - "plugin:@next/next/recommended", + "airbnb", + "prettier", + "next/core-web-vitals", + "plugin:import/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-type-checked", + "plugin:@typescript-eslint/strict", + "plugin:@typescript-eslint/strict-type-checked", + "plugin:@typescript-eslint/stylistic", "plugin:@typescript-eslint/stylistic-type-checked", + "plugin:import/typescript", + "plugin:react/recommended", ], + plugins: ["json", "prettier", "unused-imports", "import", "@typescript-eslint", "react-hooks"], + parser: "@typescript-eslint/parser", + env: { + browser: true, + node: true, + jest: true, + es2022: true, + }, + settings: { + react: { + version: "18", + }, + "import/resolver": { + typescript: {}, + node: { + extensions: [".ts", ".js", ".tsx", ".jsx"], + moduleDirectory: ["node_modules", "src"], + }, + }, + }, + parserOptions: { + project: path.resolve(__dirname, "./tsconfig.json"), + sourceType: "module", + typescript: true, + ecmaVersion: 2022, + experimentalDecorators: true, + requireConfigFile: false, + ecmaFeatures: { + classes: true, + impliedStrict: true, + }, + warnOnUnsupportedTypeScriptVersion: true, + }, + reportUnusedDisableDirectives: isProduction, rules: { - // These opinionated rules are enabled in stylistic-type-checked above. - // Feel free to reconfigure them to your own preference. - "@typescript-eslint/array-type": "off", - "@typescript-eslint/consistent-type-definitions": "off", + "import/no-cycle": ["error"], + "unused-imports/no-unused-imports": "error", + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: ["**/*.test.ts", "./src/test-msw.ts", "./src/test-setup.ts", "./src/lib/eas/*.ts"], + }, + ], + "no-debugger": isProduction ? "error" : "off", + "no-console": "error", + "no-underscore-dangle": "error", + "no-redeclare": ["error", { builtinGlobals: true }], + "import/order": [ + "error", + { + groups: ["external", "builtin", "internal", "type", "parent", "sibling", "index", "object"], + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + warnOnUnassignedImports: true, + "newlines-between": "always", + }, + ], + "prettier/prettier": ["error", prettierOptions], + "import/prefer-default-export": "off", + "import/extensions": ["error", { json: "always" }], + "class-methods-use-this": "off", + "prefer-promise-reject-errors": "off", + "max-classes-per-file": "off", + "no-use-before-define": ["off"], + "no-shadow": "off", + curly: ["error", "all"], - "@typescript-eslint/consistent-type-imports": [ - "warn", + "@typescript-eslint/explicit-member-accessibility": ["error", { accessibility: "no-public" }], + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/prefer-nullish-coalescing": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/use-unknown-in-catch-callback-variable": "off", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/explicit-module-boundary-types": "error", + "@typescript-eslint/no-use-before-define": ["error", { functions: false, classes: false }], + "@typescript-eslint/no-misused-promises": ["error", { checksVoidReturn: false }], + "@typescript-eslint/no-shadow": [ + "error", { - prefer: "type-imports", - fixStyle: "inline-type-imports", + builtinGlobals: true, + allow: [ + "alert", + "location", + "event", + "history", + "name", + "status", + "Option", + "Image", + "Lock", + "test", + "expect", + "describe", + "beforeAll", + "afterAll", + ], }, ], - "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }], - "@typescript-eslint/require-await": "off", - "@typescript-eslint/no-misused-promises": [ + "@typescript-eslint/restrict-template-expressions": ["error", { allowNumber: true }], + + "react/jsx-filename-extension": [ "error", { - checksVoidReturn: { attributes: false }, + extensions: [".tsx", ".jsx", ".js"], }, ], + "react/no-unknown-property": ["error", { ignore: ["tw", "global", "jsx"] }], + "react/jsx-sort-props": [ + "error", + { + callbacksLast: true, + shorthandFirst: true, + ignoreCase: true, + reservedFirst: true, + }, + ], + "react/sort-prop-types": [ + "error", + { + callbacksLast: true, + }, + ], + "react/react-in-jsx-scope": "off", + "react/jsx-boolean-value": "error", + "react/jsx-handler-names": "error", + "react/prop-types": "error", + "react/jsx-no-bind": "error", + "react-hooks/rules-of-hooks": "error", + "react/no-array-index-key": "warn", + "jsx-a11y/no-static-element-interactions": "warn", + "jsx-a11y/click-events-have-key-events": "warn", + "jsx-a11y/anchor-is-valid": "warn", + "react/jsx-props-no-spreading": "off", + "react/forbid-prop-types": "off", + "react/state-in-constructor": "off", + "react/jsx-fragments": "off", + "react/static-property-placement": ["off"], + "react/jsx-newline": ["error", { prevent: false }], + "jsx-a11y/label-has-associated-control": "off", + "jsx-a11y/label-has-for": "off", + "react/require-default-props": [ + "error", + { + functions: "defaultArguments", + }, + ], + "react/no-unused-prop-types": "error", + "react/function-component-definition": ["error", { namedComponents: ["arrow-function"] }], }, }; - -module.exports = config; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..a9d558df --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,16 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# More details are here: https://help.github.com/articles/about-codeowners/ + +# The '*' pattern is global owners. + +# Order is important. The last matching pattern has the most precedence. +# The folders are ordered as follows: + +# In each subsection folders are ordered first by depth, then alphabetically. +# This should make it easy to add new rules without breaking existing ones. + +# Global: + +* @ctrlc03 @kittybest @0xmad @crisgarner diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml new file mode 100644 index 00000000..8e3634bf --- /dev/null +++ b/.github/workflows/checks.yml @@ -0,0 +1,49 @@ +name: Checks + +on: + push: + branches: [main] + pull_request: + +env: + NEXT_PUBLIC_CHAIN_NAME: ${{ vars.NEXT_PUBLIC_CHAIN_NAME }} + NEXT_PUBLIC_ADMIN_ADDRESS: ${{ vars.NEXT_PUBLIC_ADMIN_ADDRESS }} + NEXT_PUBLIC_APPROVAL_SCHEMA: ${{ vars.NEXT_PUBLIC_APPROVAL_SCHEMA }} + NEXT_PUBLIC_METADATA_SCHEMA: ${{ vars.NEXT_PUBLIC_METADATA_SCHEMA }} + NEXT_PUBLIC_ROUND_ID: ${{ vars.NEXT_PUBLIC_ROUND_ID }} + NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK: false + NEXT_PUBLIC_MACI_ADDRESS: ${{ vars.NEXT_PUBLIC_MACI_ADDRESS }} + NEXT_PUBLIC_TALLY_URL: ${{ vars.NEXT_PUBLIC_TALLY_URL }} + NEXT_PUBLIC_WALLETCONNECT_ID: ${{ secrets.NEXT_PUBLIC_WALLETCONNECT_ID }} + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + check: + strategy: + fail-fast: false + matrix: + command: ["prettier", "types", "lint", "test"] + + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 8 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install + run: | + pnpm install + + - name: ${{ matrix.command }} + run: pnpm run ${{ matrix.command }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..8743f4f9 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,46 @@ +name: "CodeQL" + +on: + push: + branches: [main] + pull_request: + branches: [main] + schedule: + - cron: "0 0 * * *" + +jobs: + analyze: + name: analyze + runs-on: ubuntu-22.04 + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["javascript-typescript"] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 00000000..fe2541d3 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,32 @@ +name: Commitlint + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + commitlint: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v4 + with: + version: 8 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install + run: | + pnpm install --frozen-lockfile --prefer-offline + + - run: pnpm exec commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/config/typos.toml b/.github/workflows/config/typos.toml new file mode 100644 index 00000000..844da57b --- /dev/null +++ b/.github/workflows/config/typos.toml @@ -0,0 +1,9 @@ +[default.extend-words] +ba = "ba" +serie = "serie" +groth = "groth" +Allo = "Allo" +Buidl = "Buidl" + +[files] +extend-exclude = ["/**/CHANGELOG.md", "/**/*.svg", "/**/*.excalidraw"] diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml new file mode 100644 index 00000000..70963f83 --- /dev/null +++ b/.github/workflows/typos.yml @@ -0,0 +1,21 @@ +name: Typo Check + +on: + push: + branches: [dev] + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + typos: + name: Spell Check with Typos + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - name: Use typos with config file + uses: crate-ci/typos@v1.22.7 + with: + config: .github/workflows/config/typos.toml diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 00000000..6a2e4c84 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +pnpm exec commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..035932cf --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged && pnpm run types diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 00000000..334ad492 --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,4 @@ +{ + "**/*.{ts,js,tsx,jsx}": ["prettier --ignore-unknown --write", "eslint --fix"], + "*": ["prettier --ignore-unknown --write"] +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..286356fc --- /dev/null +++ b/.prettierignore @@ -0,0 +1,10 @@ +build/ +dist/ +.next/ +node_modules/ +coverage/ +pnpm-lock.yaml +CHANGELOG.md +CODEOWNERS +.eslintignore + diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..c7d002c5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "plugins": ["prettier-plugin-tailwindcss"], + "arrowParens": "always", + "bracketSpacing": true, + "endOfLine": "lf", + "printWidth": 120, + "singleQuote": false, + "semi": true, + "tabWidth": 2, + "useTabs": false, + "trailingComma": "all" +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 10fef2c7..00000000 Binary files a/bun.lockb and /dev/null differ diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 00000000..e6ec2f43 --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1,4 @@ +module.exports = { + extends: ["@commitlint/config-conventional"], + ignores: [(message) => /Signed-off-by: dependabot\[bot]/m.test(message)], +}; diff --git a/docs/01_setup.md b/docs/01_setup.md index d1f0bcca..048eb5d0 100644 --- a/docs/01_setup.md +++ b/docs/01_setup.md @@ -172,7 +172,7 @@ pnpm run prove:[network] --poll [poll-id] \ > [!IMPORTANT] > We suggest including the --start-block flag, proving requires fetching all events from the smart contracts and by default starts from block zero, this would take a lot of time and is error-prone due to RPC provider limitations. -Once you have the tally.json file you can rename it (tally-{pollId}.json), upload it and add it as an enviroment variable `NEXT_PUBLIC_TALLY_URL` to show the results. +Once you have the tally.json file you can rename it (tally-{pollId}.json), upload it and add it as an environment variable `NEXT_PUBLIC_TALLY_URL` to show the results. ## Additional configuration diff --git a/package.json b/package.json index 63c7b4e3..aa5fd868 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "easy-retro-pgf", + "name": "maci-rpgf", "version": "0.1.0", "private": true, "type": "module", @@ -7,9 +7,14 @@ "build": "next build", "dev": "next dev", "lint": "next lint", + "lint:fix": "next lint --fix", "start": "next start", - "test": "vitest", - "eas:registerSchemas": "npx tsx src/lib/eas/registerSchemas" + "test": "vitest run", + "prettier": "prettier -c .", + "prettier:fix": "prettier -w .", + "types": "tsc -p tsconfig.json --noEmit", + "eas:registerSchemas": "npx tsx src/lib/eas/registerSchemas", + "prepare": "is-ci || husky" }, "dependencies": { "@ethereum-attestation-service/eas-sdk": "^1.5.0", @@ -65,9 +70,11 @@ "zod": "3.22.4" }, "devDependencies": { - "@next/eslint-plugin-next": "^14.1.0", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "@next/eslint-plugin-next": "^14.2.3", "@tailwindcss/typography": "^0.5.10", - "@testing-library/jest-dom": "^6.3.0", + "@testing-library/jest-dom": "^6.4.5", "@types/eslint": "^8.56.2", "@types/formidable": "^3.4.5", "@types/lowdb": "^1.0.15", @@ -81,17 +88,31 @@ "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.17", "dotenv": "^16.4.1", - "eslint": "^8.56.0", + "eslint": "^8.57.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-next": "14.2.4", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-json": "^4.0.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-unused-imports": "^4.0.0", "happy-dom": "^13.3.2", "hardhat": "^2.22.3", + "husky": "^9.0.11", + "is-ci": "^3.0.1", "jsdom": "^24.0.0", "ky": "^1.2.0", + "lint-staged": "^15.2.7", "msw": "^2.1.5", "msw-trpc": "2.0.0-beta.0", "mws": "^2.0.11", "next-router-mock": "^0.9.11", "postcss": "^8.4.33", - "prettier": "^3.2.4", + "prettier": "^3.3.2", "prettier-plugin-tailwindcss": "^0.5.11", "tailwindcss": "^3.4.1", "typescript": "^5.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0258b1f..bdd4cd8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,14 +160,20 @@ dependencies: version: 3.22.4 devDependencies: + '@commitlint/cli': + specifier: ^19.3.0 + version: 19.3.0(@types/node@20.12.11)(typescript@5.4.5) + '@commitlint/config-conventional': + specifier: ^19.2.2 + version: 19.2.2 '@next/eslint-plugin-next': - specifier: ^14.1.0 + specifier: ^14.2.3 version: 14.2.3 '@tailwindcss/typography': specifier: ^0.5.10 version: 0.5.13(tailwindcss@3.4.3) '@testing-library/jest-dom': - specifier: ^6.3.0 + specifier: ^6.4.5 version: 6.4.5(vitest@1.6.0) '@types/eslint': specifier: ^8.56.2 @@ -209,20 +215,62 @@ devDependencies: specifier: ^16.4.1 version: 16.4.5 eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 + eslint-config-airbnb: + specifier: ^19.0.4 + version: 19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.0) + eslint-config-next: + specifier: 14.2.4 + version: 14.2.4(eslint@8.57.0)(typescript@5.4.5) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-import-resolver-typescript: + specifier: ^3.6.1 + version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-json: + specifier: ^4.0.0 + version: 4.0.0 + eslint-plugin-jsx-a11y: + specifier: ^6.8.0 + version: 6.8.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2) + eslint-plugin-react: + specifier: ^7.34.3 + version: 7.34.3(eslint@8.57.0) + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.0) + eslint-plugin-unused-imports: + specifier: ^4.0.0 + version: 4.0.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0) happy-dom: specifier: ^13.3.2 version: 13.10.1 hardhat: specifier: ^2.22.3 version: 2.22.3(ts-node@10.9.2)(typescript@5.4.5) + husky: + specifier: ^9.0.11 + version: 9.0.11 + is-ci: + specifier: ^3.0.1 + version: 3.0.1 jsdom: specifier: ^24.0.0 version: 24.0.0 ky: specifier: ^1.2.0 version: 1.2.4 + lint-staged: + specifier: ^15.2.7 + version: 15.2.7 msw: specifier: ^2.1.5 version: 2.3.0(typescript@5.4.5) @@ -239,11 +287,11 @@ devDependencies: specifier: ^8.4.33 version: 8.4.38 prettier: - specifier: ^3.2.4 - version: 3.2.5 + specifier: ^3.3.2 + version: 3.3.2 prettier-plugin-tailwindcss: specifier: ^0.5.11 - version: 0.5.14(prettier@3.2.5) + version: 0.5.14(prettier@3.3.2) tailwindcss: specifier: ^3.4.1 version: 3.4.3(ts-node@10.9.2) @@ -301,7 +349,6 @@ packages: dependencies: '@babel/highlight': 7.24.6 picocolors: 1.0.0 - dev: false /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} @@ -596,7 +643,6 @@ packages: /@babel/helper-validator-identifier@7.24.6: resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} - dev: false /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -643,7 +689,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: false /@babel/parser@7.24.5: resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} @@ -1905,6 +1950,169 @@ packages: commander: 12.0.0 dev: false + /@commitlint/cli@19.3.0(@types/node@20.12.11)(typescript@5.4.5): + resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} + engines: {node: '>=v18'} + hasBin: true + dependencies: + '@commitlint/format': 19.3.0 + '@commitlint/lint': 19.2.2 + '@commitlint/load': 19.2.0(@types/node@20.12.11)(typescript@5.4.5) + '@commitlint/read': 19.2.1 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/config-conventional@19.2.2: + resolution: {integrity: sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-conventionalcommits: 7.0.2 + dev: true + + /@commitlint/config-validator@19.0.3: + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + ajv: 8.13.0 + dev: true + + /@commitlint/ensure@19.0.3: + resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@19.0.0: + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/format@19.3.0: + resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + dev: true + + /@commitlint/is-ignored@19.2.2: + resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + semver: 7.6.2 + dev: true + + /@commitlint/lint@19.2.2: + resolution: {integrity: sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/is-ignored': 19.2.2 + '@commitlint/parse': 19.0.3 + '@commitlint/rules': 19.0.3 + '@commitlint/types': 19.0.3 + dev: true + + /@commitlint/load@19.2.0(@types/node@20.12.11)(typescript@5.4.5): + resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/execute-rule': 19.0.0 + '@commitlint/resolve-extends': 19.1.0 + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.4.5) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.11)(cosmiconfig@9.0.0)(typescript@5.4.5) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/message@19.0.0: + resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/parse@19.0.3: + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + dev: true + + /@commitlint/read@19.2.1: + resolution: {integrity: sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/top-level': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@19.1.0: + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/types': 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + dev: true + + /@commitlint/rules@19.0.3: + resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/ensure': 19.0.3 + '@commitlint/message': 19.0.0 + '@commitlint/to-lines': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + dev: true + + /@commitlint/to-lines@19.0.0: + resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/top-level@19.0.0: + resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + engines: {node: '>=v18'} + dependencies: + find-up: 7.0.0 + dev: true + + /@commitlint/types@19.0.3: + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + dev: true + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2591,6 +2799,7 @@ packages: /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4(supports-color@8.1.1) @@ -2606,6 +2815,7 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead dev: true /@iden3/bigarray@0.0.2: @@ -3096,6 +3306,12 @@ packages: glob: 10.3.10 dev: true + /@next/eslint-plugin-next@14.2.4: + resolution: {integrity: sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==} + dependencies: + glob: 10.3.10 + dev: true + /@next/swc-darwin-arm64@14.2.3: resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} engines: {node: '>= 10'} @@ -3959,6 +4175,11 @@ packages: requiresBuild: true optional: true + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: @@ -5294,6 +5515,10 @@ packages: dev: true optional: true + /@rushstack/eslint-patch@1.10.3: + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} + dev: true + /@safe-global/safe-apps-provider@0.18.1(typescript@5.4.5)(zod@3.22.4): resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: @@ -5888,6 +6113,12 @@ packages: '@types/node': 20.12.11 dev: false + /@types/conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + dependencies: + '@types/node': 20.12.11 + dev: true + /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} dev: true @@ -6019,6 +6250,10 @@ packages: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} dev: true + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + /@types/lodash@4.17.1: resolution: {integrity: sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==} dev: true @@ -6912,6 +7147,14 @@ packages: buffer: 6.0.3 dev: false + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + /abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: false @@ -6961,12 +7204,12 @@ packages: negotiator: 0.6.3 dev: false - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.12.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.12.0 dev: true /acorn-walk@8.3.2: @@ -6978,6 +7221,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + /adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} @@ -7030,7 +7278,6 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false /amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} @@ -7062,6 +7309,11 @@ packages: dependencies: type-fest: 0.21.3 + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + dev: true + /ansi-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} dependencies: @@ -7180,7 +7432,22 @@ packages: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: false + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -7201,7 +7468,58 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: false + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true /arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} @@ -7215,7 +7533,6 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: false /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -7224,6 +7541,10 @@ packages: /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + /ast-types@0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} @@ -7309,7 +7630,11 @@ packages: engines: {node: '>= 0.4'} dependencies: possible-typed-array-names: 1.0.0 - dev: false + + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: true /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} @@ -7338,6 +7663,12 @@ packages: - debug dev: false + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: false @@ -7512,6 +7843,12 @@ packages: dependencies: fill-range: 7.0.1 + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} @@ -7631,7 +7968,6 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: false /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} @@ -7739,6 +8075,11 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} dev: false @@ -7824,7 +8165,6 @@ packages: /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - dev: false /cids@0.7.5: resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} @@ -7935,6 +8275,13 @@ packages: restore-cursor: 3.1.0 dev: false + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + /cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -7949,6 +8296,14 @@ packages: colors: 1.4.0 dev: false + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: true + /cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -8052,6 +8407,10 @@ packages: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: false + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + /colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} @@ -8100,6 +8459,11 @@ packages: engines: {node: '>=18'} dev: false + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false @@ -8120,6 +8484,13 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: false + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -8158,6 +8529,10 @@ packages: /confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + /connect@3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} @@ -8175,6 +8550,31 @@ packages: engines: {node: ^14.18.0 || >=16.10.0} dev: false + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -8213,6 +8613,20 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.11)(cosmiconfig@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 20.12.11 + cosmiconfig: 9.0.0(typescript@5.4.5) + jiti: 1.21.0 + typescript: 5.4.5 + dev: true + /cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -8223,6 +8637,22 @@ packages: parse-json: 4.0.0 dev: false + /cosmiconfig@9.0.0(typescript@5.4.5): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.4.5 + dev: true + /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -8424,6 +8854,15 @@ packages: d3-array: 2.12.1 dev: false + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + dev: true + /data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -8439,7 +8878,6 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: false /data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} @@ -8448,7 +8886,6 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: false /data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} @@ -8457,7 +8894,6 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: false /date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} @@ -8489,6 +8925,17 @@ packages: ms: 2.0.0 dev: false + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -8585,7 +9032,6 @@ packages: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: false /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} @@ -8599,7 +9045,6 @@ packages: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: false /defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -8696,6 +9141,13 @@ packages: /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -8711,6 +9163,13 @@ packages: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} dev: true + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -8772,6 +9231,10 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -8812,6 +9275,14 @@ packages: engines: {node: '>=10.0.0'} dev: false + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -8838,7 +9309,6 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: false /error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -8904,19 +9374,16 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: false /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 - dev: false /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dev: false /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} @@ -8932,12 +9399,31 @@ packages: stop-iteration-iterator: 1.0.0 dev: false + /es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + dev: true + /es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - dev: false /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} @@ -8946,13 +9432,11 @@ packages: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: false /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: hasown: 2.0.2 - dev: false /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -8961,7 +9445,6 @@ packages: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: false /esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} @@ -9041,6 +9524,284 @@ packages: source-map: 0.2.0 dev: false + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + object.assign: 4.1.5 + object.entries: 1.1.8 + semver: 6.3.1 + dev: true + + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.0): + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + dependencies: + eslint: 8.57.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.3(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + object.assign: 4.1.5 + object.entries: 1.1.8 + dev: true + + /eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.2.4 + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.3(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + typescript: 5.4.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4(supports-color@8.1.1) + enhanced-resolve: 5.17.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.5 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-json@4.0.0: + resolution: {integrity: sha512-l/P3WTzl2HI8PbwsbDIrZ+6jvwQI4TGuz20ReJkG3Y+gZS5ZurTgx+gBmuLpOgiqMyDJWyJ7+GCjevWtNYQcUg==} + engines: {node: '>=18.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.24.5 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + dev: true + + /eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + 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: + '@types/eslint': 8.56.10 + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.3.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-react@7.34.3(eslint@8.57.0): + resolution: {integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + 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 + dev: true + + /eslint-plugin-unused-imports@4.0.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0): + resolution: {integrity: sha512-mzM+y2B7XYpQryVa1usT+Y/BdNAtAZiXzwpSyDCboFoJN/LZRN67TNvQxKtuTK/Aplya3sLNQforiubzPPaIcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': '8' + eslint: '9' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9105,8 +9866,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 dev: true @@ -9378,7 +10139,6 @@ packages: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 - bundledDependencies: false /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -9391,7 +10151,6 @@ packages: /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -9453,6 +10212,10 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -9563,6 +10326,12 @@ packages: dependencies: to-regex-range: 5.0.1 + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + /filter-obj@1.1.0: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} @@ -9627,6 +10396,15 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + dev: true + /flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9672,7 +10450,6 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - dev: false /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} @@ -9802,11 +10579,9 @@ packages: define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: false /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false /futoin-hkdf@1.5.3: resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} @@ -9821,6 +10596,11 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -9833,7 +10613,6 @@ packages: has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: false /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -9865,7 +10644,12 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: false + + /get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true /ghost-testrpc@0.0.2: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} @@ -9875,6 +10659,16 @@ packages: node-emoji: 1.11.0 dev: false + /git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -9945,6 +10739,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -9963,6 +10758,13 @@ packages: minimatch: 5.0.1 once: 1.4.0 + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + dependencies: + ini: 4.1.1 + dev: true + /global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} @@ -9996,7 +10798,6 @@ packages: dependencies: define-properties: 1.2.1 gopd: 1.0.1 - dev: false /globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} @@ -10032,7 +10833,6 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 - dev: false /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -10241,7 +11041,6 @@ packages: /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false /has-flag@1.0.0: resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} @@ -10260,24 +11059,20 @@ packages: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 - dev: false /has-proto@1.0.3: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - dev: false /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: false /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: false /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} @@ -10477,6 +11272,12 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + dev: true + /hyphenate-style-name@1.0.4: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} dev: false @@ -10549,6 +11350,10 @@ packages: resolve-from: 4.0.0 dev: true + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + dev: true + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -10574,6 +11379,11 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /inline-style-parser@0.2.3: resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} dev: false @@ -10592,7 +11402,6 @@ packages: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: false /internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -10648,17 +11457,21 @@ packages: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: false /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: false /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -10672,12 +11485,17 @@ packages: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: false + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: true /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -10689,14 +11507,12 @@ packages: engines: {node: '>= 0.4'} dependencies: is-typed-array: 1.1.13 - dev: false /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: false /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -10723,6 +11539,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.7 + dev: true + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -10732,12 +11554,23 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: true + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: false /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -10787,12 +11620,10 @@ packages: /is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - dev: false /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - dev: false /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -10803,12 +11634,16 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: false /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -10844,19 +11679,16 @@ packages: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false /is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - dev: false /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - dev: false /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} @@ -10872,21 +11704,25 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: false /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: false + + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true /is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.15 - dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -10895,13 +11731,11 @@ packages: /is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - dev: false /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 - dev: false /is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} @@ -10909,7 +11743,6 @@ packages: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: false /is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} @@ -10948,7 +11781,6 @@ packages: /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -10979,6 +11811,16 @@ packages: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: false + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + dev: true + /jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -11024,7 +11866,7 @@ packages: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -11151,7 +11993,7 @@ packages: chalk: 4.1.2 flow-parser: 0.237.1 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 neo-async: 2.6.2 node-dir: 0.1.17 recast: 0.21.5 @@ -11215,6 +12057,10 @@ packages: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: false + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + /json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} @@ -11233,7 +12079,6 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -11243,11 +12088,22 @@ packages: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: false + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: @@ -11266,6 +12122,11 @@ packages: graceful-fs: 4.2.11 dev: false + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + /jsonpath@1.1.1: resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} dependencies: @@ -11278,6 +12139,16 @@ packages: resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} dev: false + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + dev: true + /keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -11317,6 +12188,17 @@ packages: engines: {node: '>=18'} dev: true + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.23 + dev: true + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -11358,6 +12240,25 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /lint-staged@15.2.7: + resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 8.0.1 + lilconfig: 3.1.1 + listr2: 8.2.1 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.4.2 + transitivePeerDependencies: + - supports-color + dev: true + /listhen@1.7.2: resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} hasBin: true @@ -11384,6 +12285,18 @@ packages: - uWebSockets.js dev: false + /listr2@8.2.1: + resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + dev: true + /lit-element@3.3.3: resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} dependencies: @@ -11442,13 +12355,19 @@ packages: dependencies: p-locate: 5.0.0 + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /locko@1.1.0: resolution: {integrity: sha512-pYB2dzRY93fJkg2RIl41AMNgTQftEjyTK9vlPrGOJvuGQsOjb267VJBw15BjiN3RBd1oBoKkOu9E2dRdFKIfAA==} dev: false /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false /lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -11470,10 +12389,26 @@ packages: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + /lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} dev: false @@ -11482,6 +12417,14 @@ packages: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: false + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -11492,6 +12435,17 @@ packages: chalk: 4.1.2 is-unicode-supported: 0.1.0 + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + /logkitty@0.7.1: resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} hasBin: true @@ -11859,6 +12813,11 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -11926,7 +12885,7 @@ packages: graceful-fs: 4.2.11 invariant: 2.2.4 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 node-abort-controller: 3.1.1 nullthrows: 1.1.1 walker: 1.0.8 @@ -12263,6 +13222,13 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -12294,7 +13260,6 @@ packages: /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - dev: false /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} @@ -12349,7 +13314,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false /minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} @@ -12953,7 +13917,6 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false /object-is@1.1.6: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} @@ -12966,7 +13929,6 @@ packages: /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - dev: false /object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} @@ -12976,7 +13938,52 @@ packages: define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: false + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true /obliterator@2.0.4: resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} @@ -13031,7 +14038,6 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - dev: false /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} @@ -13146,6 +14152,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-limit@5.0.0: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} @@ -13178,6 +14191,13 @@ packages: dependencies: p-limit: 3.1.0 + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -13233,6 +14253,16 @@ packages: json-parse-better-errors: 1.0.2 dev: false + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -13252,6 +14282,11 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -13312,6 +14347,12 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -13390,7 +14431,6 @@ packages: /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - dev: false /postcss-import@15.1.0(postcss@8.4.38): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} @@ -13495,7 +14535,14 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-tailwindcss@0.5.14(prettier@3.2.5): + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier-plugin-tailwindcss@0.5.14(prettier@3.3.2): resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} engines: {node: '>=14.21.3'} peerDependencies: @@ -13547,7 +14594,7 @@ packages: prettier-plugin-svelte: optional: true dependencies: - prettier: 3.2.5 + prettier: 3.3.2 dev: true /prettier@2.8.8: @@ -13556,8 +14603,8 @@ packages: hasBin: true dev: false - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} hasBin: true dev: true @@ -13637,7 +14684,6 @@ packages: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: false /property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -13838,7 +14884,6 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -14183,6 +15228,19 @@ packages: engines: {node: '>=6'} dev: false + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.3 + dev: true + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -14215,7 +15273,6 @@ packages: define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: false /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} @@ -14301,6 +15358,15 @@ packages: engines: {node: '>=4'} dev: true + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.1.7: resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} dev: false @@ -14318,6 +15384,15 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -14326,6 +15401,14 @@ packages: signal-exit: 3.0.7 dev: false + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -14340,6 +15423,10 @@ packages: engines: {node: '>= 0.4.0'} dev: false + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + dev: true + /rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -14356,6 +15443,7 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -14437,7 +15525,6 @@ packages: get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: false /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -14453,7 +15540,6 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: false /safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} @@ -14606,7 +15692,6 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: false /set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} @@ -14616,7 +15701,6 @@ packages: es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: false /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} @@ -14682,7 +15766,6 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: false /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -14690,7 +15773,6 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -14734,6 +15816,22 @@ packages: is-fullwidth-code-point: 3.0.0 dev: false + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + /snarkjs@0.5.0: resolution: {integrity: sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA==} hasBin: true @@ -14918,7 +16016,6 @@ packages: /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -15025,6 +16122,11 @@ packages: engines: {node: '>=4'} dev: false + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + /string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} dev: false @@ -15053,6 +16155,33 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + /string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -15061,7 +16190,6 @@ packages: define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: false /string.prototype.trimend@1.0.8: resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} @@ -15069,7 +16197,6 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: false /string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -15078,7 +16205,6 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: false /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -15124,6 +16250,11 @@ packages: dependencies: ansi-regex: 6.0.1 + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -15263,6 +16394,14 @@ packages: get-port: 3.2.0 dev: false + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + dev: true + /system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -15339,6 +16478,11 @@ packages: transitivePeerDependencies: - ts-node + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -15369,11 +16513,16 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.0 commander: 2.20.3 source-map-support: 0.5.21 dev: false + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -15434,6 +16583,10 @@ packages: readable-stream: 3.6.2 dev: false + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + /tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} dev: true @@ -15589,7 +16742,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.12.11 - acorn: 8.11.3 + acorn: 8.12.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 @@ -15612,6 +16765,15 @@ packages: typescript: 5.4.5 dev: true + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -15694,7 +16856,6 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: false /typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} @@ -15705,7 +16866,6 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: false /typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} @@ -15717,7 +16877,6 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: false /typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} @@ -15729,7 +16888,6 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: false /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -15778,7 +16936,6 @@ packages: has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: false /uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -15841,6 +16998,11 @@ packages: engines: {node: '>=4'} dev: false + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + /unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: @@ -16350,6 +17512,32 @@ packages: engines: {node: '>=0.10.0'} dev: false + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + /w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -16511,7 +17699,24 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: false + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + dev: true /which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} @@ -16521,7 +17726,6 @@ packages: is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: false /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -16536,7 +17740,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: false /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -16622,6 +17825,15 @@ packages: string-width: 5.1.2 strip-ansi: 7.1.0 + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index b2d59b46..00000000 --- a/prettier.config.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */ -const config = { - plugins: ["prettier-plugin-tailwindcss"], -}; - -export default config; diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js index 56ea6074..9aae6221 100644 --- a/public/mockServiceWorker.js +++ b/public/mockServiceWorker.js @@ -1,6 +1,3 @@ -/* eslint-disable */ -/* tslint:disable */ - /** * Mock Service Worker. * @see https://github.com/mswjs/msw @@ -257,10 +254,7 @@ function sendToClient(client, message, transferrables = []) { resolve(event.data); }; - client.postMessage( - message, - [channel.port2].concat(transferrables.filter(Boolean)), - ); + client.postMessage(message, [channel.port2].concat(transferrables.filter(Boolean))); }); } diff --git a/src/components/ConnectButton.tsx b/src/components/ConnectButton.tsx index f435cde5..e905397d 100644 --- a/src/components/ConnectButton.tsx +++ b/src/components/ConnectButton.tsx @@ -1,92 +1,61 @@ +import { ConnectButton as RainbowConnectButton } from "@rainbow-me/rainbowkit"; import Image from "next/image"; import Link from "next/link"; import { type ComponentPropsWithRef, useCallback } from "react"; -import { useEnsAvatar, useEnsName } from "wagmi"; import { FaListCheck } from "react-icons/fa6"; - -import { ConnectButton as RainbowConnectButton } from "@rainbow-me/rainbowkit"; import { createBreakpoint } from "react-use"; import { toast } from "sonner"; +import { useEnsAvatar, useEnsName } from "wagmi"; -import { Button } from "./ui/Button"; -import { Chip } from "./ui/Chip"; -import { useLayoutOptions } from "~/layouts/BaseLayout"; -import { useMaci } from "~/contexts/Maci"; +import { config } from "~/config"; import { useBallot } from "~/contexts/Ballot"; +import { useMaci } from "~/contexts/Maci"; +import { useLayoutOptions } from "~/layouts/BaseLayout"; + import type { Address } from "viem"; -import { config } from "~/config"; + +import { Button } from "./ui/Button"; +import { Chip } from "./ui/Chip"; const useBreakpoint = createBreakpoint({ XL: 1280, L: 768, S: 350 }); -export const ConnectButton = () => { - const breakpoint = useBreakpoint(); - const isMobile = breakpoint === "S"; +const UserInfo = ({ address, children, ...props }: { address: Address } & ComponentPropsWithRef) => { + const ens = useEnsName({ + address, + chainId: 1, + query: { enabled: Boolean(address) }, + }); + const name = ens.data ?? undefined; + const avatar = useEnsAvatar({ + name, + chainId: 1, + query: { enabled: Boolean(name) }, + }); return ( - - {({ - account, - chain, - openAccountModal, - openChainModal, - openConnectModal, - mounted, - authenticationStatus, - }) => { - const ready = mounted && authenticationStatus !== "loading"; - const connected = - ready && - account && - chain && - (!authenticationStatus || authenticationStatus === "authenticated"); - - return ( -
- {(() => { - if (!connected) { - return ( - - ); - } - - if ( - chain.unsupported ?? - ![Number(config.network.id)].includes(chain.id) - ) { - return Wrong network; - } + +
+ {avatar.data ? ( + {name!} + ) : ( +
+ )} +
- return ( - - ); - })()} -
- ); - }} - + {children} +
); }; +const SignupButton = ({ + loading, + ...props +}: ComponentPropsWithRef & { loading: boolean }): JSX.Element => ( + + {loading ? "Loading..." : "Sign up"} + +); + const ConnectedDetails = ({ openAccountModal, account, @@ -103,10 +72,7 @@ const ConnectedDetails = ({ const { showBallot } = useLayoutOptions(); const onError = useCallback(() => toast.error("Signup error"), []); - const handleSignup = useCallback( - () => onSignup(onError), - [onSignup, onError], - ); + const handleSignup = useCallback(() => onSignup(onError), [onSignup, onError]); return (
@@ -114,26 +80,22 @@ const ConnectedDetails = ({ {!isEligibleToVote && You are not allowed to vote} {isEligibleToVote && !isRegistered && ( - - )} - {isRegistered && showBallot && ballot?.published && ( - Already submitted + )} + + {isRegistered && showBallot && ballot?.published && Already submitted} + {isRegistered && showBallot && !ballot?.published && ( - + {isMobile ? : `View Ballot`} +
{ballotSize}
)} - + + {isMobile ? null : account.displayName}
@@ -141,44 +103,51 @@ const ConnectedDetails = ({ ); }; -const UserInfo = ({ - address, - children, - ...props -}: { address: Address } & ComponentPropsWithRef) => { - const ens = useEnsName({ - address, - chainId: 1, - query: { enabled: Boolean(address) }, - }); - const name = ens.data ?? undefined; - const avatar = useEnsAvatar({ - name, - chainId: 1, - query: { enabled: Boolean(name) }, - }); +export const ConnectButton = (): JSX.Element => { + const breakpoint = useBreakpoint(); + const isMobile = breakpoint === "S"; return ( - -
- {avatar.data ? ( - {name!} - ) : ( -
- )} -
- {children} - - ); -}; + + {({ account, chain, openAccountModal, openChainModal, openConnectModal, mounted, authenticationStatus }) => { + const ready = mounted && authenticationStatus !== "loading"; + const connected = + ready && account && chain && (!authenticationStatus || authenticationStatus === "authenticated"); -const SignupButton = ({ - loading, - ...props -}: ComponentPropsWithRef & { loading: boolean }): JSX.Element => { - return ( - - {loading ? "Loading..." : "Sign up"} - + return ( +
+ {(() => { + if (!connected) { + return ( + + ); + } + + if (chain.unsupported ?? ![Number(config.network.id)].includes(chain.id)) { + return Wrong network; + } + + return ; + })()} +
+ ); + }} +
); }; diff --git a/src/components/ENS.tsx b/src/components/ENS.tsx index 49dbd4de..6714c2e1 100644 --- a/src/components/ENS.tsx +++ b/src/components/ENS.tsx @@ -1,9 +1,11 @@ -import { Avatar } from "~/components/ui/Avatar"; import { useEnsAvatar, useEnsName } from "wagmi"; + +import { Avatar } from "~/components/ui/Avatar"; import { truncate } from "~/utils/truncate"; + import type { Address } from "viem"; -export function AvatarENS({ address }: { address: Address }) { +export const AvatarENS = ({ address }: { address: Address }): JSX.Element => { const { data: name } = useEnsName({ address, chainId: 1, @@ -18,13 +20,14 @@ export function AvatarENS({ address }: { address: Address }) { }); return (
- + +
{name ?? truncate(address)}
); -} +}; -export function NameENS({ address }: { address?: string }) { +export const NameENS = ({ address = "" }: { address?: string }): JSX.Element => { const { data: name } = useEnsName({ address: address as Address, chainId: 1, @@ -34,4 +37,4 @@ export function NameENS({ address }: { address?: string }) { }); return
{name ?? truncate(address)}
; -} +}; diff --git a/src/components/EligibilityDialog.tsx b/src/components/EligibilityDialog.tsx index 3363a84f..774427bf 100644 --- a/src/components/EligibilityDialog.tsx +++ b/src/components/EligibilityDialog.tsx @@ -1,35 +1,34 @@ -import Link from "next/link"; import { useAccount, useDisconnect } from "wagmi"; import { metadata } from "~/config"; -import { Dialog } from "./ui/Dialog"; import { useApprovedVoter } from "~/features/voters/hooks/useApprovedVoter"; -export const EligibilityDialog = () => { +import { Dialog } from "./ui/Dialog"; + +export const EligibilityDialog = (): JSX.Element | null => { const { address } = useAccount(); const { disconnect } = useDisconnect(); const { data, isLoading, error } = useApprovedVoter(address!); - if (isLoading || !address || error) return null; + if (isLoading || !address || error) { + return null; + } return ( disconnect()} + size="sm" title={ <> You are not eligible to vote 😔 } + onOpenChange={() => { + disconnect(); + }} >
- Only badgeholders are able to vote in {metadata.title}. You can find out - more about how badgeholders are selected{" "} - - here - - . +

Only badgeholders are able to vote in {metadata.title}

); diff --git a/src/components/EmptyState.tsx b/src/components/EmptyState.tsx index 1460db16..427f009d 100644 --- a/src/components/EmptyState.tsx +++ b/src/components/EmptyState.tsx @@ -1,16 +1,13 @@ import { type PropsWithChildren } from "react"; + import { Heading } from "./ui/Heading"; -export function EmptyState({ - title, - children, -}: PropsWithChildren<{ title: string }>) { - return ( -
- - {title} - -
{children}
-
- ); -} +export const EmptyState = ({ title, children = null }: PropsWithChildren<{ title: string }>): JSX.Element => ( +
+ + {title} + + +
{children}
+
+); diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 6d88d47f..b46b8fb5 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,26 +1,29 @@ import { GithubIcon } from "lucide-react"; -export function Footer() { - return ( - - ); -} +export const Footer = (): JSX.Element => ( + +); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index d9014f86..bea1e7f1 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,14 +1,15 @@ +import clsx from "clsx"; +import { Menu, X } from "lucide-react"; +import dynamic from "next/dynamic"; +import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/router"; import { type ComponentPropsWithRef, useState } from "react"; -import clsx from "clsx"; + +import { config, metadata } from "~/config"; import { ConnectButton } from "./ConnectButton"; import { IconButton } from "./ui/Button"; -import { config, metadata } from "~/config"; -import { Menu, X } from "lucide-react"; -import dynamic from "next/dynamic"; -import Image from "next/image"; const Logo = () => (
@@ -22,23 +23,39 @@ const Logo = () => (
); -const NavLink = ({ - isActive, - ...props -}: { isActive: boolean } & ComponentPropsWithRef) => ( +const NavLink = ({ isActive, ...props }: { isActive: boolean } & ComponentPropsWithRef) => ( ); -type NavLink = { href: string; children: string }; -export const Header = ({ navLinks }: { navLinks: NavLink[] }) => { +const MobileMenu = ({ isOpen = false, navLinks }: { isOpen?: boolean; navLinks: INavLink[] }) => ( +
+ {navLinks.map((link) => ( + + ))} +
+); + +interface INavLink { + href: string; + children: string; +} + +const Header = ({ navLinks }: { navLinks: INavLink[] }) => { const { asPath } = useRouter(); const [isOpen, setOpen] = useState(false); @@ -47,59 +64,37 @@ export const Header = ({ navLinks }: { navLinks: NavLink[] }) => {
setOpen(!isOpen)} + onClick={() => { + setOpen(!isOpen); + }} /> - + +
+
- {navLinks?.map((link) => ( - + {navLinks.map((link) => ( + {link.children} ))}
-
+ +
+
+
); }; -const MobileMenu = ({ - isOpen, - navLinks, -}: { - isOpen?: boolean; - navLinks: NavLink[]; -}) => ( -
- {navLinks.map((link) => ( - - ))} -
-); - -export default dynamic(async () => Header, { ssr: false }); +export default dynamic(async () => Promise.resolve(Header), { ssr: false }); diff --git a/src/components/ImageUpload.tsx b/src/components/ImageUpload.tsx index cf014b24..d632cc91 100644 --- a/src/components/ImageUpload.tsx +++ b/src/components/ImageUpload.tsx @@ -4,92 +4,88 @@ import { ImageIcon } from "lucide-react"; import { type ComponentProps, useRef } from "react"; import { Controller, useFormContext } from "react-hook-form"; import { toast } from "sonner"; + import { IconButton } from "~/components/ui/Button"; import { Spinner } from "~/components/ui/Spinner"; import { useUploadMetadata } from "~/hooks/useMetadata"; -type Props = { name?: string; maxSize?: number } & ComponentProps<"img">; +export interface IImageUploadProps extends ComponentProps<"img"> { + name?: string; + maxSize?: number; +} -export function ImageUpload({ - name, +export const ImageUpload = ({ + name = "", maxSize = 1024 * 1024, // 1 MB className, -}: Props) { +}: IImageUploadProps): JSX.Element => { const ref = useRef(null); const { control } = useFormContext(); const upload = useUploadMetadata(); const select = useMutation({ mutationFn: async (file: File) => { - if (file?.size >= maxSize) { + if (file.size >= maxSize) { toast.error("Image too large", { - description: `The image to selected is: ${(file.size / 1024).toFixed( - 2, - )} / ${(maxSize / 1024).toFixed(2)} kb`, + description: `The image to selected is: ${(file.size / 1024).toFixed(2)} / ${(maxSize / 1024).toFixed(2)} kb`, }); throw new Error("IMAGE_TOO_LARGE"); } - return URL.createObjectURL(file); + return Promise.resolve(URL.createObjectURL(file)); }, }); return ( { - return ( + name={name} + render={({ field: { value, onChange, ...field } }) => ( + // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events +
ref.current?.click()} + > + +
ref.current?.click()} - className={clsx( - "relative cursor-pointer overflow-hidden", - className, - )} - > - + className={clsx("h-full rounded-xl bg-gray-200 bg-cover bg-center bg-no-repeat dark:bg-gray-800", { + "animate-pulse opacity-50": upload.isPending, + })} + style={{ + backgroundImage: `url("${select.data ?? value}")`, + }} + /> -
- { - const [file] = event.target.files ?? []; - if (file) { - select.mutate(file, { - onSuccess: () => { - upload.mutate(file, { - onSuccess: (data) => { - onChange(data.url); - }, - }); - }, - }); - } - }} - type="file" - /> -
- ); - }} + { + const [file] = event.target.files ?? []; + if (file) { + select.mutate(file, { + onSuccess: () => { + upload.mutate(file, { + onSuccess: (data) => { + onChange(data.url); + }, + }); + }, + }); + } + }} + /> +
+ )} + rules={{ required: "Recipe picture is required" }} /> ); -} +}; diff --git a/src/components/InfiniteLoading.tsx b/src/components/InfiniteLoading.tsx index f5129aeb..a214a277 100644 --- a/src/components/InfiniteLoading.tsx +++ b/src/components/InfiniteLoading.tsx @@ -1,10 +1,11 @@ -import { useMemo, type ReactNode, useRef, useEffect } from "react"; import { type UseTRPCInfiniteQueryResult } from "@trpc/react-query/shared"; +import { useMemo, type ReactNode, useRef, useEffect } from "react"; +import { useIntersection } from "react-use"; import { config } from "~/config"; -import { useIntersection } from "react-use"; -import { Spinner } from "./ui/Spinner"; + import { EmptyState } from "./EmptyState"; +import { Spinner } from "./ui/Spinner"; const columnMap = { 2: "grid-cols-1 md:grid-cols-2", @@ -16,14 +17,44 @@ type Props = UseTRPCInfiniteQueryResult & { columns?: keyof typeof columnMap; }; -export function InfiniteLoading({ +const FetchInView = ({ + hasMore = false, + isFetchingNextPage, + fetchNextPage, +}: { + hasMore?: boolean; + isFetchingNextPage: boolean; + fetchNextPage: () => Promise; +}) => { + const ref = useRef(null); + const intersection = useIntersection(ref, { + root: null, + rootMargin: "0px", + threshold: 0.5, + }); + + useEffect(() => { + if (intersection?.isIntersecting && !isFetchingNextPage && hasMore) { + // eslint-disable-next-line no-console + fetchNextPage().catch(console.error); + } + }, [intersection?.isIntersecting, isFetchingNextPage, hasMore, fetchNextPage]); + + return ( +
+ {isFetchingNextPage && } +
+ ); +}; + +export const InfiniteLoading = ({ data, columns = 3, isFetchingNextPage, isLoading, renderItem, fetchNextPage, -}: Props) { +}: Props): JSX.Element => { const loadingItems = useMemo( () => Array.from({ length: config.pageSize }).map((_, id) => ({ @@ -31,62 +62,27 @@ export function InfiniteLoading({ })) as T[], [], ); - const pages = data?.pages ?? []; - const items = useMemo( - () => pages.reduce((acc, x) => acc.concat(x), []) ?? [], - [pages], - ); + const pages = useMemo(() => data?.pages ?? [], [data?.pages]); + const items = useMemo(() => pages.reduce((acc, x) => acc.concat(x), []), [pages]); const hasMore = useMemo(() => { - if (!pages.length) return false; + if (!pages.length) { + return false; + } return (pages[pages.length - 1]?.length ?? 0) === config.pageSize; }, [pages]); return (
- {!isLoading && !items?.length ? ( - - ) : null} + {!isLoading && !items.length ? : null} +
{items.map((item) => renderItem(item, { isLoading }))} - {(isLoading || isFetchingNextPage) && - loadingItems.map((item) => renderItem(item, { isLoading }))} -
- - -
- ); -} -function FetchInView({ - hasMore, - isFetchingNextPage, - fetchNextPage, -}: { - hasMore?: boolean; - isFetchingNextPage: boolean; - fetchNextPage: () => Promise; -}) { - const ref = useRef(null); - const intersection = useIntersection(ref, { - root: null, - rootMargin: "0px", - threshold: 0.5, - }); - - useEffect(() => { - if (intersection?.isIntersecting) { - !isFetchingNextPage && hasMore && fetchNextPage().catch(console.log); - } - }, [intersection?.isIntersecting]); + {(isLoading || isFetchingNextPage) && loadingItems.map((item) => renderItem(item, { isLoading }))} +
- return ( -
- {isFetchingNextPage && } +
); -} +}; diff --git a/src/components/SortByDropdown.tsx b/src/components/SortByDropdown.tsx index a0cef16e..ee5a7e5c 100644 --- a/src/components/SortByDropdown.tsx +++ b/src/components/SortByDropdown.tsx @@ -1,51 +1,22 @@ import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; -import { IconButton } from "./ui/Button"; import { ArrowUpDown, Check } from "lucide-react"; + import { type SortType, sortLabels } from "~/features/filter/hooks/useFilter"; -type Props = { +import { IconButton } from "./ui/Button"; + +interface ISortByDropdownProps { value: SortType; onChange: (value: string) => void; options: SortType[]; -}; - -export const SortByDropdown = ({ value, onChange, options = [] }: Props) => { - return ( - - - - Sort by: {value && sortLabels[value]} - - - - - - - Sort By - - onChange(v)} - > - {options.map((value) => ( - - ))} - - - - - ); -}; - -const RadioItem = ({ value = "", label = "" }) => ( +} + +interface IRadioItemProps { + label?: string; + value?: string; +} + +const RadioItem = ({ value = "", label = "" }: IRadioItemProps): JSX.Element => ( ( + {label} ); + +export const SortByDropdown = ({ value, onChange, options = [] }: ISortByDropdownProps): JSX.Element => ( + + + + Sort by: {sortLabels[value]} + + + + + + + Sort By + + + { + onChange(v); + }} + > + {options.map((option) => ( + + ))} + + + + +); diff --git a/src/components/SortFilter.tsx b/src/components/SortFilter.tsx index 3e802228..46cf4919 100644 --- a/src/components/SortFilter.tsx +++ b/src/components/SortFilter.tsx @@ -1,31 +1,42 @@ +import { ChangeEvent, useCallback, useState } from "react"; +import { useDebounce } from "react-use"; + +import { useFilter } from "~/features/filter/hooks/useFilter"; + import type { OrderBy, SortOrder } from "~/features/filter/types"; + import { SortByDropdown } from "./SortByDropdown"; -import { useFilter } from "~/features/filter/hooks/useFilter"; import { SearchInput } from "./ui/Form"; -import { useDebounce } from "react-use"; -import { useState } from "react"; -export const SortFilter = () => { +export const SortFilter = (): JSX.Element => { const { orderBy, sortOrder, setFilter } = useFilter(); const [search, setSearch] = useState(""); useDebounce(() => setFilter({ search }), 500, [search]); + const onChange = useCallback( + (e: ChangeEvent) => { + setSearch(e.target.value); + }, + [setSearch], + ); + return (
setSearch(e.target.value)} + onChange={onChange} /> + { - const [orderBy, sortOrder] = sort.split("_") as [OrderBy, SortOrder]; + const [order, sorting] = sort.split("_") as [OrderBy, SortOrder]; - await setFilter({ orderBy, sortOrder }).catch(); + await setFilter({ orderBy: order, sortOrder: sorting }).catch(); }} />
diff --git a/src/components/Toaster.tsx b/src/components/Toaster.tsx index 23894302..918a87cc 100644 --- a/src/components/Toaster.tsx +++ b/src/components/Toaster.tsx @@ -1,17 +1,16 @@ import { useTheme } from "next-themes"; import { Toaster as Sonner } from "sonner"; -export function Toaster() { +export const Toaster = (): JSX.Element => { const { theme } = useTheme(); return ( ); -} +}; diff --git a/src/components/ui/Alert.tsx b/src/components/ui/Alert.tsx index db581deb..18e1c4d9 100644 --- a/src/components/ui/Alert.tsx +++ b/src/components/ui/Alert.tsx @@ -1,7 +1,8 @@ +import { type LucideIcon } from "lucide-react"; +import { type ComponentProps, createElement } from "react"; import { tv } from "tailwind-variants"; + import { createComponent } from "."; -import { type ComponentProps, createElement } from "react"; -import { type LucideIcon } from "lucide-react"; const alert = tv({ base: "rounded-xl p-4", @@ -16,19 +17,18 @@ const alert = tv({ export const AlertComponent = createComponent("div", alert); -export const Alert = ({ - icon, - title, - children, - ...props -}: { icon?: LucideIcon } & ComponentProps) => { - return ( - -
- {icon ? createElement(icon, { className: "w-4 h-4" }) : null} -
{title}
-
- {children} -
- ); -}; +export interface IAlertProps extends ComponentProps { + icon?: LucideIcon; +} + +export const Alert = ({ icon = undefined, title, children, ...props }: IAlertProps): JSX.Element => ( + +
+ {icon ? createElement(icon, { className: "w-4 h-4" }) : null} + +
{title}
+
+ + {children} +
+); diff --git a/src/components/ui/Avatar.tsx b/src/components/ui/Avatar.tsx index e2de4afe..b6a42f90 100644 --- a/src/components/ui/Avatar.tsx +++ b/src/components/ui/Avatar.tsx @@ -1,7 +1,9 @@ import { tv } from "tailwind-variants"; -import { createComponent } from "."; + import { BackgroundImage } from "./BackgroundImage"; +import { createComponent } from "."; + export const Avatar = createComponent( BackgroundImage, tv({ diff --git a/src/components/ui/BackgroundImage.tsx b/src/components/ui/BackgroundImage.tsx index 9e4ed677..9dfc37fa 100644 --- a/src/components/ui/BackgroundImage.tsx +++ b/src/components/ui/BackgroundImage.tsx @@ -1,23 +1,26 @@ import clsx from "clsx"; + import type { ComponentPropsWithRef } from "react"; -export const BackgroundImage = ({ - src, - fallbackSrc, - isLoading, - className, - ...props -}: { +export interface IBackgroundImageProps extends ComponentPropsWithRef<"div"> { src?: string; fallbackSrc?: string; isLoading?: boolean; -} & ComponentPropsWithRef<"div">) => ( +} + +export const BackgroundImage = ({ + src = "", + fallbackSrc = "", + isLoading = false, + className, + ...props +}: IBackgroundImageProps): JSX.Element => (
); diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx index e5f75696..eb09e883 100644 --- a/src/components/ui/Badge.tsx +++ b/src/components/ui/Badge.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; export const Badge = createComponent( diff --git a/src/components/ui/Banner.tsx b/src/components/ui/Banner.tsx index 1e9860f0..20f7bd83 100644 --- a/src/components/ui/Banner.tsx +++ b/src/components/ui/Banner.tsx @@ -1,5 +1,7 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "~/components/ui"; + import { BackgroundImage } from "./BackgroundImage"; export const Banner = createComponent( diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx index 2f938166..cd17c494 100644 --- a/src/components/ui/Button.tsx +++ b/src/components/ui/Button.tsx @@ -1,6 +1,8 @@ +import { LucideIcon } from "lucide-react"; +import { type ComponentPropsWithRef, createElement, forwardRef, ReactNode } from "react"; import { tv } from "tailwind-variants"; + import { createComponent } from "."; -import { type ComponentPropsWithRef, createElement, forwardRef } from "react"; const button = tv({ base: "inline-flex items-center justify-center font-semibold text-center transition-colors rounded-full duration-150 whitespace-nowrap transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 dark:ring-offset-gray-800", @@ -9,15 +11,14 @@ const button = tv({ primary: "bg-primary-600 hover:bg-primary-700 dark:bg-white dark:hover:bg-primary-500 dark:text-gray-900 text-white dark:disabled:bg-gray-500", ghost: "hover:bg-gray-100 dark:hover:bg-gray-800", - default: - "bg-gray-100 dark:bg-gray-900 hover:bg-gray-200 dark:hover:bg-gray-700", + default: "bg-gray-100 dark:bg-gray-900 hover:bg-gray-200 dark:hover:bg-gray-700", inverted: "bg-white text-black hover:bg-white/90", link: "bg-none hover:underline", outline: "border-2 hover:bg-white/5", }, size: { sm: "px-3 py-2 h-10 min-w-[40px]", - deafult: "px-4 py-2 h-12", + default: "px-4 py-2 h-12", icon: "h-12 w-12", }, disabled: { @@ -26,30 +27,30 @@ const button = tv({ }, defaultVariants: { variant: "default", - size: "deafult", + size: "default", }, }); export const Button = createComponent("button", button); -export const IconButton = forwardRef(function IconButton( - { - children, - icon, - size, - ...props - }: // eslint-disable-next-line - { icon: any; size?: string } & ComponentPropsWithRef, - ref, -) { - return ( - - ); -}); + ), +); + +IconButton.displayName = "IconButton"; diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx index e0fdd90f..2bc300d2 100644 --- a/src/components/ui/Card.tsx +++ b/src/components/ui/Card.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; export const Card = createComponent( diff --git a/src/components/ui/Chip.tsx b/src/components/ui/Chip.tsx index e701e651..5e83c2e3 100644 --- a/src/components/ui/Chip.tsx +++ b/src/components/ui/Chip.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; const chip = tv({ diff --git a/src/components/ui/Dialog.tsx b/src/components/ui/Dialog.tsx index d857fb07..0b14943f 100644 --- a/src/components/ui/Dialog.tsx +++ b/src/components/ui/Dialog.tsx @@ -1,49 +1,22 @@ import * as RadixDialog from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; +import { tv } from "tailwind-variants"; + +import { theme } from "~/config"; + import type { ReactNode, PropsWithChildren, ComponentProps } from "react"; + import { IconButton } from "./Button"; + import { createComponent } from "."; -import { tv } from "tailwind-variants"; -import { X } from "lucide-react"; -import { theme } from "~/config"; -export const Dialog = ({ - title, - size, - isOpen, - children, - onOpenChange, -}: { +export interface IDialogProps extends PropsWithChildren { title?: string | ReactNode; isOpen?: boolean; size?: "sm" | "md"; onOpenChange?: ComponentProps["onOpenChange"]; -} & PropsWithChildren) => { - return ( - - - - {/* Because of Portal we need to set the theme here */} -
- - - {title} - - {children} - {onOpenChange ? ( - - - - ) : null} - -
-
-
- ); -}; +} + const Content = createComponent( RadixDialog.Content, tv({ @@ -59,3 +32,32 @@ const Content = createComponent( }, }), ); + +export const Dialog = ({ + title = 0, + size = undefined, + isOpen = false, + children, + onOpenChange = undefined, +}: IDialogProps): JSX.Element => ( + + + + + {/* Because of Portal we need to set the theme here */} +
+ + {title} + + {children} + + {onOpenChange ? ( + + + + ) : null} + +
+
+
+); diff --git a/src/components/ui/Divider.tsx b/src/components/ui/Divider.tsx deleted file mode 100644 index 60124468..00000000 --- a/src/components/ui/Divider.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { tv } from "tailwind-variants"; -import { createComponent } from "."; -import { createElement, type ComponentPropsWithoutRef } from "react"; - -export const Divider = createComponent( - "div", - tv({ - base: "bg-gray-200", - variants: { - orientation: { - vertical: "h-full w-[1px]", - horizontal: "w-full h-[1px]", - }, - }, - defaultVariants: { - orientation: "horizontal", - }, - }), -); - -export const DividerIcon = ({ - icon, - ...props -}: // eslint-disable-next-line -{ icon?: any } & ComponentPropsWithoutRef) => ( -
- - {icon ? ( -
- {createElement(icon)} -
- ) : null} -
-); diff --git a/src/components/ui/Form.tsx b/src/components/ui/Form.tsx index be94d541..4969aa07 100644 --- a/src/components/ui/Form.tsx +++ b/src/components/ui/Form.tsx @@ -1,5 +1,5 @@ -import { type z } from "zod"; -import { tv } from "tailwind-variants"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { PlusIcon, Search, Trash } from "lucide-react"; import { type ComponentPropsWithRef, type PropsWithChildren, @@ -18,12 +18,14 @@ import { type UseFormProps, useFieldArray, } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; +import { tv } from "tailwind-variants"; +import { type z } from "zod"; -import { createComponent } from "."; import { cn } from "~/utils/classNames"; + import { IconButton } from "./Button"; -import { PlusIcon, Search, Trash } from "lucide-react"; + +import { createComponent } from "."; const inputBase = [ "dark:bg-gray-900", @@ -33,6 +35,7 @@ const inputBase = [ "disabled:opacity-30", "checked:bg-gray-800", ]; + export const Input = createComponent( "input", tv({ @@ -44,6 +47,7 @@ export const Input = createComponent( }, }), ); + export const InputWrapper = createComponent( "div", tv({ @@ -51,6 +55,7 @@ export const InputWrapper = createComponent( variants: {}, }), ); + export const InputAddon = createComponent( "div", tv({ @@ -85,10 +90,7 @@ export const Select = createComponent( export const Checkbox = createComponent( "input", tv({ - base: [ - ...inputBase, - "checked:focus:dark:bg-gray-700 checked:hover:dark:bg-gray-700", - ], + base: [...inputBase, "checked:focus:dark:bg-gray-700 checked:hover:dark:bg-gray-700"], }), ); @@ -99,89 +101,77 @@ export const Label = createComponent( variants: { required: { true: "after:content-['*']" } }, }), ); -export const Textarea = createComponent( - "textarea", - tv({ base: [...inputBase, "w-full"] }), -); -export const SearchInput = forwardRef(function SearchInput( - { ...props }: ComponentPropsWithRef, - ref, -) { - return ( - - - - - - - ); -}); +export const ErrorMessage = createComponent("div", tv({ base: "pt-1 text-xs text-red-500" })); -export const FormControl = ({ - name, - label, - hint, - required, - children, - valueAsNumber, - className, -}: { +export const Textarea = createComponent("textarea", tv({ base: [...inputBase, "w-full"] })); + +export const SearchInput = forwardRef(({ ...props }: ComponentPropsWithRef, ref) => ( + + + + + + + +)); + +SearchInput.displayName = "SearchInput"; + +export interface IFormControlProps extends ComponentPropsWithoutRef<"fieldset"> { name: string; label?: string; required?: boolean; valueAsNumber?: boolean; hint?: string; -} & ComponentPropsWithoutRef<"fieldset">) => { +} + +export const FormControl = ({ + name, + label = "", + hint = "", + required = false, + children = null, + valueAsNumber = false, + className = "", +}: IFormControlProps): JSX.Element => { const { register, formState: { errors }, } = useFormContext(); // Get error for name - handles field arrays (field.index.prop) - const error = name.split(".").reduce( - /* eslint-disable-next-line */ - (err, key) => (err as any)?.[key], - errors, - ) as unknown as { message: string }; + const [index] = name.split("."); + const error = index && errors[index]; return (
{label && ( -
); }; -export const ErrorMessage = createComponent( - "div", - tv({ base: "pt-1 text-xs text-red-500" }), -); - -export function FieldArray({ +export const FieldArray = ({ name, renderField, }: { name: string; renderField: (field: z.infer, index: number) => ReactNode; -}) { +}): JSX.Element => { const form = useFormContext(); const { fields, append, remove } = useFieldArray({ control: form.control, @@ -192,55 +182,55 @@ export function FieldArray({ return (
- {error && ( -
- {String(error)} -
- )} + {error &&
{String(error)}
} + {fields.map((field, i) => (
{renderField(field, i)}
remove(i)} + onClick={() => { + remove(i); + }} />
))} +
append({})} + size="sm" + type="button" + onClick={() => { + append({}); + }} > Add row
); -} +}; -export function FormSection({ +export const FormSection = ({ title, description, children, -}: { title: string; description: string } & ComponentProps<"section">) { - return ( -
-

{title}

-

- {description} -

- {children} -
- ); -} +}: { title: string; description: string } & ComponentProps<"section">): JSX.Element => ( +
+

{title}

+ +

{description}

+ + {children} +
+); export interface FormProps extends PropsWithChildren { defaultValues?: UseFormProps>["defaultValues"]; @@ -249,13 +239,13 @@ export interface FormProps extends PropsWithChildren { onSubmit: (values: z.infer, form: UseFormReturn>) => void; } -export function Form({ +export const Form = ({ schema, children, - values, - defaultValues, + values = undefined, + defaultValues = undefined, onSubmit, -}: FormProps) { +}: FormProps): JSX.Element => { // Initialize the form with defaultValues and schema for validation const form = useForm({ defaultValues, @@ -267,9 +257,13 @@ export function Form({ // Pass the form methods to a FormProvider. This lets us access the form from components with useFormContext return ( -
onSubmit(values, form))}> + { + onSubmit(data, form); + })} + > {children}
); -} +}; diff --git a/src/components/ui/Heading.tsx b/src/components/ui/Heading.tsx index adfb2508..97f77d93 100644 --- a/src/components/ui/Heading.tsx +++ b/src/components/ui/Heading.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; export const Heading = createComponent( diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx index f5bcb651..aef90b5b 100644 --- a/src/components/ui/Link.tsx +++ b/src/components/ui/Link.tsx @@ -1,10 +1,10 @@ +import clsx from "clsx"; +import { ExternalLinkIcon } from "lucide-react"; import NextLink from "next/link"; import { type ComponentProps } from "react"; import { tv } from "tailwind-variants"; import { createComponent } from "."; -import clsx from "clsx"; -import { ExternalLinkIcon } from "lucide-react"; export const Link = createComponent( NextLink, @@ -13,14 +13,10 @@ export const Link = createComponent( }), ); -export const ExternalLink = ({ - children, - ...props -}: ComponentProps) => ( - - {children} +export const ExternalLink = ({ children, ...props }: ComponentProps): JSX.Element => ( + + {children} + + ); diff --git a/src/components/ui/Markdown.tsx b/src/components/ui/Markdown.tsx index 567ff10e..278e2cc8 100644 --- a/src/components/ui/Markdown.tsx +++ b/src/components/ui/Markdown.tsx @@ -2,18 +2,16 @@ import clsx from "clsx"; import { type ComponentProps } from "react"; import ReactMarkdown from "react-markdown"; -export function Markdown({ - isLoading, - ...props -}: { isLoading?: boolean } & ComponentProps) { - return ( -
- -
- ); +export interface IMarkdownProps extends ComponentProps { + isLoading?: boolean; } + +export const Markdown = ({ isLoading = false, ...props }: IMarkdownProps): JSX.Element => ( +
+ +
+); diff --git a/src/components/ui/Progress.tsx b/src/components/ui/Progress.tsx index e130249d..0cb75f9c 100644 --- a/src/components/ui/Progress.tsx +++ b/src/components/ui/Progress.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; const ProgressWrapper = createComponent( @@ -8,7 +9,12 @@ const ProgressWrapper = createComponent( }), ); -export const Progress = ({ value = 0, max = 100 }) => ( +export interface IProgressProps { + value?: number; + max?: number; +} + +export const Progress = ({ value = 0, max = 100 }: IProgressProps): JSX.Element => (
& { isLoading?: boolean }) => +}: ComponentProps<"span"> & { isLoading?: boolean }): JSX.Element => isLoading ? ( ) : ( - <>{children} +
{children}
); diff --git a/src/components/ui/Spinner.tsx b/src/components/ui/Spinner.tsx index a2a12544..128ddc8e 100644 --- a/src/components/ui/Spinner.tsx +++ b/src/components/ui/Spinner.tsx @@ -1,24 +1,26 @@ import clsx from "clsx"; import { type ComponentProps } from "react"; -export const Spinner = (props: ComponentProps<"div">) => ( +export const Spinner = (props: ComponentProps<"div">): JSX.Element => (
+ Loading...
); diff --git a/src/components/ui/Table.tsx b/src/components/ui/Table.tsx index 3e7bf096..ad263ccb 100644 --- a/src/components/ui/Table.tsx +++ b/src/components/ui/Table.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; export const Table = createComponent( diff --git a/src/components/ui/Tag.tsx b/src/components/ui/Tag.tsx index 52ab96d5..ead931dd 100644 --- a/src/components/ui/Tag.tsx +++ b/src/components/ui/Tag.tsx @@ -1,4 +1,5 @@ import { tv } from "tailwind-variants"; + import { createComponent } from "."; export const Tag = createComponent( diff --git a/src/components/ui/index.tsx b/src/components/ui/index.tsx index e92b2dab..da9b7ec6 100644 --- a/src/components/ui/index.tsx +++ b/src/components/ui/index.tsx @@ -1,30 +1,33 @@ -import type { ComponentPropsWithRef, ReactNode, ElementType } from "react"; import { forwardRef } from "react"; +import { tv } from "tailwind-variants"; -export type PolymorphicRef = - React.ComponentPropsWithRef["ref"]; +import type { ComponentPropsWithRef, ReactNode, ElementType, ForwardRefExoticComponent, RefAttributes } from "react"; + +export type PolymorphicRef = React.ComponentPropsWithRef["ref"]; export type ComponentProps = { as?: C; children?: ReactNode; } & ComponentPropsWithRef; -export function createComponent( +export function createComponent( tag: T, - variant: TV, -) { - return forwardRef(function UIComponent( - props: ComponentPropsWithRef, - ref?: PolymorphicRef, - ) { - const { as: Component = tag, className, ...rest } = props; - return ( + variant: V, +): ForwardRefExoticComponent, "ref"> & RefAttributes> { + const ComponentElement = forwardRef( + ( + { as: Component = tag, className, ...rest }: ComponentPropsWithRef, + ref?: PolymorphicRef, + ) => ( )({ class: className as string | undefined, ...rest })} {...rest} /> - ); - }); + ), + ); + + ComponentElement.displayName = tag.toString(); + + return ComponentElement; } diff --git a/src/config.ts b/src/config.ts index f1a9284d..53a02528 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,14 +17,11 @@ export const config = { registrationEndsAt: new Date(process.env.NEXT_PUBLIC_REGISTRATION_END_DATE!), reviewEndsAt: new Date(process.env.NEXT_PUBLIC_REVIEW_END_DATE!), resultsAt: new Date(process.env.NEXT_PUBLIC_RESULTS_DATE!), - skipApprovedVoterCheck: ["true", "1"].includes( - process.env.NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK!, - ), + skipApprovedVoterCheck: ["true", "1"].includes(process.env.NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK!), tokenName: process.env.NEXT_PUBLIC_TOKEN_NAME!, roundId: process.env.NEXT_PUBLIC_ROUND_ID!, admin: (process.env.NEXT_PUBLIC_ADMIN_ADDRESS ?? "") as `0x${string}`, - network: - wagmiChains[process.env.NEXT_PUBLIC_CHAIN_NAME as keyof typeof wagmiChains], + network: wagmiChains[process.env.NEXT_PUBLIC_CHAIN_NAME as keyof typeof wagmiChains], maciAddress: process.env.NEXT_PUBLIC_MACI_ADDRESS, maciStartBlock: Number(process.env.NEXT_PUBLIC_MACI_START_BLOCK ?? 0), maciSubgraphUrl: process.env.NEXT_PUBLIC_MACI_SUBGRAPH_URL ?? "", @@ -40,12 +37,8 @@ export const eas = { attesterAddress: process.env.NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER ?? "", contracts: { - eas: - process.env.NEXT_PUBLIC_EAS_CONTRACT_ADDRESS ?? - "0x4200000000000000000000000000000000000021", - schemaRegistry: - process.env.NEXT_PUBLIC_EAS_SCHEMA_REGISTRY_ADDRESS ?? - "0x4200000000000000000000000000000000000020", + eas: process.env.NEXT_PUBLIC_EAS_CONTRACT_ADDRESS ?? "0x4200000000000000000000000000000000000021", + schemaRegistry: process.env.NEXT_PUBLIC_EAS_SCHEMA_REGISTRY_ADDRESS ?? "0x4200000000000000000000000000000000000020", }, schemas: { metadata: process.env.NEXT_PUBLIC_METADATA_SCHEMA!, diff --git a/src/contexts/Ballot.tsx b/src/contexts/Ballot.tsx index 1b024b0f..ef1a5464 100644 --- a/src/contexts/Ballot.tsx +++ b/src/contexts/Ballot.tsx @@ -1,115 +1,117 @@ -import React, { createContext, useContext, useState, useEffect } from "react"; +import React, { createContext, useContext, useState, useEffect, useMemo, useCallback } from "react"; +import { useAccount } from "wagmi"; import type { BallotContextType, BallotProviderProps } from "./types"; import type { Ballot, Vote } from "~/features/ballot/types"; -import { useAccount } from "wagmi"; -export const BallotContext = createContext( - undefined, -); +export const BallotContext = createContext(undefined); const defaultBallot = { votes: [], published: false }; -export const BallotProvider: React.FC = ({ children }) => { +export const BallotProvider: React.FC = ({ children }: BallotProviderProps) => { const [ballot, setBallot] = useState(defaultBallot); const { isDisconnected } = useAccount(); - const sumBallot = (votes?: Vote[]) => - (votes ?? []).reduce( - (sum, x) => sum + (!isNaN(Number(x?.amount)) ? Number(x.amount) : 0), - 0, - ); - - const ballotContains = (id: string) => { - return ballot.votes.find((v) => v.projectId === id); - }; - - const toObject = (arr: object[] = [], key: string) => { - return arr.reduce( - (acc, x) => ({ ...acc, [x[key as keyof typeof acc]]: x }), - {}, - ); - }; - - const mergeBallot = (addedVotes: Vote[], pollId: string) => { - return { + const sumBallot = useCallback( + (votes?: Vote[]) => + (votes ?? []).reduce((sum, x) => sum + (!Number.isNaN(Number(x.amount)) ? Number(x.amount) : 0), 0), + [], + ); + + const ballotContains = useCallback((id: string) => ballot.votes.find((v) => v.projectId === id), [ballot]); + + const toObject = useCallback( + (key: string, arr: object[] = []) => arr.reduce((acc, x) => ({ ...acc, [x[key as keyof typeof acc]]: x }), {}), + [], + ); + + const mergeBallot = useCallback( + (addedVotes: Vote[], pollId: string) => ({ ...ballot, pollId, votes: Object.values({ - ...toObject(ballot.votes, "projectId"), - ...toObject(addedVotes, "projectId"), + ...toObject("projectId", ballot.votes), + ...toObject("projectId", addedVotes), }), - }; - }; + }), + [ballot, toObject], + ); // save the ballot to localstorage - const saveBallot = () => { + const saveBallot = useCallback(() => { localStorage.setItem("ballot", JSON.stringify(ballot)); - }; + }, [ballot]); // remove certain project from the ballot - const removeFromBallot = (projectId: string) => { - const votes = (ballot?.votes ?? []).filter( - (v) => v.projectId !== projectId, - ); + const removeFromBallot = useCallback( + (projectId: string) => { + const votes = ballot.votes.filter((v) => v.projectId !== projectId); - setBallot({ ...ballot, votes, published: false }); - }; + setBallot({ ...ballot, votes, published: false }); + }, + [ballot, setBallot], + ); // add to the ballot - const addToBallot = (votes: Vote[], pollId?: string) => { - if (!pollId) throw new Error("PollId is not provided."); - - setBallot(mergeBallot(votes, pollId)); - }; + const addToBallot = useCallback( + (votes: Vote[], pollId?: string) => { + if (!pollId) { + throw new Error("PollId is not provided."); + } + + setBallot(mergeBallot(votes, pollId)); + }, + [setBallot, mergeBallot], + ); // remove the ballot from localstorage - const deleteBallot = () => { + const deleteBallot = useCallback(() => { setBallot(defaultBallot); localStorage.removeItem("ballot"); - }; + }, [setBallot]); // set published to tru - const publishBallot = () => { + const publishBallot = useCallback(() => { setBallot({ ...ballot, published: true }); - }; + }, [ballot, setBallot]); /// Read existing ballot in localStorage useEffect(() => { - setBallot( - JSON.parse( - localStorage.getItem("ballot") ?? JSON.stringify(defaultBallot), - ) ?? defaultBallot, - ); - }, []); + const savedBallot = JSON.parse( + localStorage.getItem("ballot") ?? JSON.stringify(defaultBallot), + ) as typeof defaultBallot; + + setBallot(savedBallot); + }, [setBallot]); /// store ballot to localStorage once it changes useEffect(() => { if (ballot !== defaultBallot) { saveBallot(); } - }, [ballot, ballot.votes, ballot.published]); + }, [ballot, ballot.votes, ballot.published, saveBallot]); useEffect(() => { if (isDisconnected) { deleteBallot(); } - }, [isDisconnected]); - - const value: BallotContextType = { - ballot, - addToBallot, - removeFromBallot, - deleteBallot, - ballotContains, - sumBallot, - publishBallot, - }; - - return ( - {children} + }, [isDisconnected, deleteBallot]); + + const value = useMemo( + () => ({ + ballot, + addToBallot, + removeFromBallot, + deleteBallot, + ballotContains, + sumBallot, + publishBallot, + }), + [ballot, addToBallot, removeFromBallot, deleteBallot, ballotContains, sumBallot, publishBallot], ); + + return {children}; }; export const useBallot = (): BallotContextType => { diff --git a/src/contexts/Maci.tsx b/src/contexts/Maci.tsx index 6ddcb70c..b3b3151b 100644 --- a/src/contexts/Maci.tsx +++ b/src/contexts/Maci.tsx @@ -1,12 +1,4 @@ -import React, { - createContext, - useContext, - useCallback, - useEffect, - useMemo, - useState, -} from "react"; -import { useAccount, useSignMessage } from "wagmi"; +/* eslint-disable no-console */ import { isAfter } from "date-fns"; import { signup, @@ -17,18 +9,19 @@ import { getPoll, genKeyPair, } from "maci-cli/sdk"; +import React, { createContext, useContext, useCallback, useEffect, useMemo, useState } from "react"; +import { useAccount, useSignMessage } from "wagmi"; -import type { Attestation } from "~/utils/fetchAttestations"; import { config } from "~/config"; -import { api } from "~/utils/api"; import { useEthersSigner } from "~/hooks/useEthersSigner"; +import { api } from "~/utils/api"; + import type { IVoteArgs, MaciContextType, MaciProviderProps } from "./types"; +import type { Attestation } from "~/utils/fetchAttestations"; -export const MaciContext = createContext( - undefined, -); +export const MaciContext = createContext(undefined); -export const MaciProvider: React.FC = ({ children }) => { +export const MaciProvider: React.FC = ({ children }: MaciProviderProps) => { const signer = useEthersSigner(); const { address, isConnected, isDisconnected } = useAccount(); @@ -58,17 +51,12 @@ export const MaciProvider: React.FC = ({ children }) => { const attestationId = useMemo(() => { const values = attestations.data?.valueOf() as Attestation[] | undefined; - const attestation = values?.find( - (attestation) => config.admin === attestation.attester, - ); + const attestation = values?.find(({ attester }) => config.admin === attester); return attestation?.id; }, [attestations]); - const isEligibleToVote = useMemo( - () => Boolean(attestationId) && Boolean(address), - [attestationId, address], - ); + const isEligibleToVote = useMemo(() => Boolean(attestationId) && Boolean(address), [attestationId, address]); // on load get the key pair from local storage and set the signature message useEffect(() => { @@ -94,17 +82,11 @@ export const MaciProvider: React.FC = ({ children }) => { localStorage.setItem("maciPubKey", userKeyPair.publicKey); setMaciPrivKey(userKeyPair.privateKey); setMaciPubKey(userKeyPair.publicKey); - }, [address, signMessageAsync, setMaciPrivKey, setMaciPubKey]); + }, [address, signatureMessage, signMessageAsync, setMaciPrivKey, setMaciPubKey]); const votingEndsAt = useMemo( - () => - pollData - ? new Date( - Number(pollData.deployTime) * 1000 + - Number(pollData.duration) * 1000, - ) - : new Date(), - [pollData?.deployTime, pollData?.duration], + () => (pollData ? new Date(Number(pollData.deployTime) * 1000 + Number(pollData.duration) * 1000) : new Date()), + [pollData], ); const onSignup = useCallback( @@ -136,23 +118,11 @@ export const MaciProvider: React.FC = ({ children }) => { setIsLoading(false); } }, - [ - attestationId, - maciPubKey, - address, - signer, - setIsRegistered, - setStateIndex, - setIsLoading, - ], + [attestationId, maciPubKey, signer, setIsRegistered, setStateIndex, setIsLoading], ); const onVote = useCallback( - async ( - votes: IVoteArgs[], - onError: () => Promise, - onSuccess: () => Promise, - ) => { + async (votes: IVoteArgs[], onError: () => Promise, onSuccess: () => Promise) => { if (!signer || !stateIndex || !pollData) { return; } @@ -163,15 +133,13 @@ export const MaciProvider: React.FC = ({ children }) => { return; } - const messages = votes.map( - ({ newVoteWeight, voteOptionIndex }, index) => ({ - newVoteWeight, - voteOptionIndex, - stateIndex: BigInt(stateIndex), - maciContractAddress: config.maciAddress!, - nonce: BigInt(index + 1), - }), - ); + const messages = votes.map(({ newVoteWeight, voteOptionIndex }, index) => ({ + newVoteWeight, + voteOptionIndex, + stateIndex: BigInt(stateIndex), + maciContractAddress: config.maciAddress!, + nonce: BigInt(index + 1), + })); setIsLoading(true); @@ -184,23 +152,15 @@ export const MaciProvider: React.FC = ({ children }) => { signer, }) .then(() => onSuccess()) - .catch((error: Error) => { - setError(error.message); + .catch((err: Error) => { + setError(err.message); return onError(); }) .finally(() => { setIsLoading(false); }); }, - [ - stateIndex, - pollData?.id, - maciPubKey, - maciPrivKey, - signer, - setIsLoading, - setError, - ], + [stateIndex, pollData, maciPubKey, maciPrivKey, signer, setIsLoading, setError], ); useEffect(() => { @@ -239,13 +199,11 @@ export const MaciProvider: React.FC = ({ children }) => { startBlock: config.maciStartBlock, signer, }) - .then( - ({ isRegistered: registered, voiceCredits, stateIndex: index }) => { - setIsRegistered(registered); - setStateIndex(index); - setInitialVoiceCredits(Number(voiceCredits)); - }, - ) + .then(({ isRegistered: registered, voiceCredits, stateIndex: index }) => { + setIsRegistered(registered); + setStateIndex(index); + setInitialVoiceCredits(Number(voiceCredits)); + }) .catch(console.error); } else if (account) { const { id, voiceCreditBalance } = account; @@ -288,7 +246,7 @@ export const MaciProvider: React.FC = ({ children }) => { }) .then(async (data) => { if (!data.isStateAqMerged || isAfter(votingEndsAt, new Date())) { - return; + return undefined; } return fetch(`${config.tallyUrl}/tally-${data.id}.json`) @@ -303,25 +261,41 @@ export const MaciProvider: React.FC = ({ children }) => { .finally(() => { setIsLoading(false); }); - }, [Boolean(signer), setIsLoading, setTallyData, setPollData]); - - const value: MaciContextType = { - isLoading, - isEligibleToVote, - initialVoiceCredits, - votingEndsAt, - stateIndex, - isRegistered: isRegistered ?? false, - pollId: pollData?.id.toString(), - error, - pollData, - tallyData, - maciPubKey, - onSignup, - onVote, - }; + }, [signer, votingEndsAt, setIsLoading, setTallyData, setPollData]); + + const value = useMemo( + () => ({ + isLoading, + isEligibleToVote, + initialVoiceCredits, + votingEndsAt, + stateIndex, + isRegistered: isRegistered ?? false, + pollId: pollData?.id.toString(), + error, + pollData, + tallyData, + maciPubKey, + onSignup, + onVote, + }), + [ + isLoading, + isEligibleToVote, + initialVoiceCredits, + votingEndsAt, + stateIndex, + isRegistered, + pollData, + tallyData, + error, + maciPubKey, + onSignup, + onVote, + ], + ); - return {children}; + return {children}; }; export const useMaci = (): MaciContextType => { diff --git a/src/contexts/types.ts b/src/contexts/types.ts index e7c097cc..02a8f8c5 100644 --- a/src/contexts/types.ts +++ b/src/contexts/types.ts @@ -1,5 +1,6 @@ -import { type ReactNode } from "react"; import { type TallyData, type IGetPollData } from "maci-cli/sdk"; +import { type ReactNode } from "react"; + import type { Ballot, Vote } from "~/features/ballot/types"; export interface IVoteArgs { @@ -22,8 +23,8 @@ export interface MaciContextType { onSignup: (onError: () => void) => Promise; onVote: ( args: IVoteArgs[], - onError: () => Promise, - onSuccess: () => Promise, + onError: () => void | Promise, + onSuccess: () => void | Promise, ) => Promise; } diff --git a/src/env.js b/src/env.js index f094fd45..03d445fc 100644 --- a/src/env.js +++ b/src/env.js @@ -7,20 +7,7 @@ export const env = createEnv({ * isn't built with invalid env vars. */ server: { - NODE_ENV: z - .enum(["development", "test", "production"]) - .default("development"), - NEXTAUTH_SECRET: - process.env.NODE_ENV === "production" - ? z.string() - : z.string().optional(), - NEXTAUTH_URL: z.preprocess( - // This makes Vercel deployments not fail if you don't set NEXTAUTH_URL - // Since NextAuth.js automatically uses the VERCEL_URL if present. - (str) => process.env.VERCEL_URL ?? str, - // VERCEL_URL doesn't include `https` so it cant be validated as a URL - process.env.VERCEL_URL ? z.string() : z.string().url(), - ), + NODE_ENV: z.enum(["development", "test", "production"]).default("development"), }, /** @@ -52,38 +39,22 @@ export const env = createEnv({ // EAS Schemas NEXT_PUBLIC_APPROVED_APPLICATIONS_SCHEMA: z .string() - .default( - "0xebbf697d5d3ca4b53579917ffc3597fb8d1a85b8c6ca10ec10039709903b9277", - ), - NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER: z - .string() - .default("0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9"), + .default("0xebbf697d5d3ca4b53579917ffc3597fb8d1a85b8c6ca10ec10039709903b9277"), + NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER: z.string().default("0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9"), NEXT_PUBLIC_APPLICATIONS_SCHEMA: z .string() - .default( - "0x76e98cce95f3ba992c2ee25cef25f756495147608a3da3aa2e5ca43109fe77cc", - ), + .default("0x76e98cce95f3ba992c2ee25cef25f756495147608a3da3aa2e5ca43109fe77cc"), NEXT_PUBLIC_BADGEHOLDER_SCHEMA: z .string() - .default( - "0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b", - ), - NEXT_PUBLIC_BADGEHOLDER_ATTESTER: z - .string() - .default("0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9"), + .default("0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b"), + NEXT_PUBLIC_BADGEHOLDER_ATTESTER: z.string().default("0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9"), NEXT_PUBLIC_PROFILE_SCHEMA: z .string() - .default( - "0xac4c92fc5c7babed88f78a917cdbcdc1c496a8f4ab2d5b2ec29402736b2cf929", - ), + .default("0xac4c92fc5c7babed88f78a917cdbcdc1c496a8f4ab2d5b2ec29402736b2cf929"), - NEXT_PUBLIC_EAS_CONTRACT_ADDRESS: z - .string() - .default("0x4200000000000000000000000000000000000021"), + NEXT_PUBLIC_EAS_CONTRACT_ADDRESS: z.string().default("0x4200000000000000000000000000000000000021"), - NEXT_PUBLIC_EASSCAN_URL: z - .string() - .default("https://optimism.easscan.org/graphql"), + NEXT_PUBLIC_EASSCAN_URL: z.string().default("https://optimism.easscan.org/graphql"), NEXT_PUBLIC_ADMIN_ADDRESS: z.string().startsWith("0x"), NEXT_PUBLIC_APPROVAL_SCHEMA: z.string().startsWith("0x"), @@ -108,8 +79,6 @@ export const env = createEnv({ */ runtimeEnv: { NODE_ENV: process.env.NODE_ENV, - NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, - NEXTAUTH_URL: process.env.NEXTAUTH_URL, NEXT_PUBLIC_CHAIN_NAME: process.env.NEXT_PUBLIC_CHAIN_NAME, NEXT_PUBLIC_SIGN_STATEMENT: process.env.NEXT_PUBLIC_SIGN_STATEMENT, @@ -118,24 +87,18 @@ export const env = createEnv({ NEXT_PUBLIC_MAX_VOTES_PROJECT: process.env.NEXT_PUBLIC_MAX_VOTES_PROJECT, NEXT_PUBLIC_FEEDBACK_URL: process.env.NEXT_PUBLIC_FEEDBACK_URL, - NEXT_PUBLIC_APPROVED_APPLICATIONS_SCHEMA: - process.env.NEXT_PUBLIC_APPROVED_APPLICATIONS_SCHEMA, - NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER: - process.env.NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER, - NEXT_PUBLIC_APPLICATIONS_SCHEMA: - process.env.NEXT_PUBLIC_APPLICATIONS_SCHEMA, + NEXT_PUBLIC_APPROVED_APPLICATIONS_SCHEMA: process.env.NEXT_PUBLIC_APPROVED_APPLICATIONS_SCHEMA, + NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER: process.env.NEXT_PUBLIC_APPROVED_APPLICATIONS_ATTESTER, + NEXT_PUBLIC_APPLICATIONS_SCHEMA: process.env.NEXT_PUBLIC_APPLICATIONS_SCHEMA, NEXT_PUBLIC_BADGEHOLDER_SCHEMA: process.env.NEXT_PUBLIC_BADGEHOLDER_SCHEMA, - NEXT_PUBLIC_BADGEHOLDER_ATTESTER: - process.env.NEXT_PUBLIC_BADGEHOLDER_ATTESTER, + NEXT_PUBLIC_BADGEHOLDER_ATTESTER: process.env.NEXT_PUBLIC_BADGEHOLDER_ATTESTER, NEXT_PUBLIC_PROFILE_SCHEMA: process.env.NEXT_PUBLIC_PROFILE_SCHEMA, - NEXT_PUBLIC_EAS_CONTRACT_ADDRESS: - process.env.NEXT_PUBLIC_EAS_CONTRACT_ADDRESS, + NEXT_PUBLIC_EAS_CONTRACT_ADDRESS: process.env.NEXT_PUBLIC_EAS_CONTRACT_ADDRESS, NEXT_PUBLIC_EASSCAN_URL: process.env.NEXT_PUBLIC_EASSCAN_URL, NEXT_PUBLIC_WALLETCONNECT_ID: process.env.NEXT_PUBLIC_WALLETCONNECT_ID, NEXT_PUBLIC_ALCHEMY_ID: process.env.NEXT_PUBLIC_ALCHEMY_ID, - NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK: - process.env.NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK, + NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK: process.env.NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK, NEXT_PUBLIC_ADMIN_ADDRESS: process.env.NEXT_PUBLIC_ADMIN_ADDRESS, NEXT_PUBLIC_APPROVAL_SCHEMA: process.env.NEXT_PUBLIC_APPROVAL_SCHEMA, diff --git a/src/features/admin/components/InvalidAdmin.tsx b/src/features/admin/components/InvalidAdmin.tsx index 7ee2ed78..903103c9 100644 --- a/src/features/admin/components/InvalidAdmin.tsx +++ b/src/features/admin/components/InvalidAdmin.tsx @@ -1,12 +1,11 @@ import { Heading } from "~/components/ui/Heading"; -export function InvalidAdmin() { - return ( -
- - Invalid Admin Account - -

Only admins can access this page.

-
- ); -} +export const InvalidAdmin = (): JSX.Element => ( +
+ + Invalid Admin Account + + +

Only admins can access this page.

+
+); diff --git a/src/features/applications/components/ApplicationForm.tsx b/src/features/applications/components/ApplicationForm.tsx index 1b0f1d66..2573d372 100644 --- a/src/features/applications/components/ApplicationForm.tsx +++ b/src/features/applications/components/ApplicationForm.tsx @@ -1,6 +1,11 @@ +import { useController, useFormContext } from "react-hook-form"; +import { useLocalStorage } from "react-use"; +import { toast } from "sonner"; +import { useAccount } from "wagmi"; import { z } from "zod"; import { ImageUpload } from "~/components/ImageUpload"; +import { Alert } from "~/components/ui/Alert"; import { IconButton } from "~/components/ui/Button"; import { ErrorMessage, @@ -14,28 +19,92 @@ import { Textarea, } from "~/components/ui/Form"; import { Spinner } from "~/components/ui/Spinner"; -import { impactCategories } from "~/config"; -import { - ApplicationSchema, - ProfileSchema, - contributionTypes, - fundingSourceTypes, -} from "../types"; -import { useCreateApplication } from "../hooks/useCreateApplication"; -import { toast } from "sonner"; -import { useController, useFormContext } from "react-hook-form"; import { Tag } from "~/components/ui/Tag"; +import { impactCategories } from "~/config"; import { useIsCorrectNetwork } from "~/hooks/useIsCorrectNetwork"; -import { useLocalStorage } from "react-use"; -import { Alert } from "~/components/ui/Alert"; -import { useAccount } from "wagmi"; + +import { useCreateApplication } from "../hooks/useCreateApplication"; +import { ApplicationSchema, ProfileSchema, contributionTypes, fundingSourceTypes } from "../types"; const ApplicationCreateSchema = z.object({ profile: ProfileSchema, application: ApplicationSchema, }); -export function ApplicationForm({ address = "" }) { +export interface IApplicationFormProps { + address?: string; +} + +const ImpactTags = (): JSX.Element => { + const { control, watch, formState } = useFormContext>(); + const { field } = useController({ + name: "application.impactCategory", + control, + }); + + const selected = watch("application.impactCategory"); + + const error = formState.errors.application?.impactCategory; + return ( +
+ + +
+ {Object.entries(impactCategories).map(([value, { label }]) => { + const isSelected = selected.includes(value); + return ( + { + const currentlySelected = isSelected ? selected.filter((s) => s !== value) : selected.concat(value); + + field.onChange(currentlySelected); + }} + > + {label} + + ); + })} +
+ + {error && {error.message}} +
+ ); +}; + +const CreateApplicationButton = ({ isLoading, buttonText }: { isLoading: boolean; buttonText: string }) => { + const { isCorrectNetwork, correctNetwork } = useIsCorrectNetwork(); + + const { address } = useAccount(); + + return ( +
+
+ {!address &&
You must connect wallet to create a list
} + + {!isCorrectNetwork && ( +
You must be connected to {correctNetwork.name}
+ )} +
+ + + {buttonText} + +
+ ); +}; + +export const ApplicationForm = ({ address = "" }: IApplicationFormProps): JSX.Element => { const clearDraft = useLocalStorage("application-draft")[2]; const create = useCreateApplication({ @@ -50,12 +119,15 @@ export function ApplicationForm({ address = "" }) { }); if (create.isSuccess) { return ( - + It will now be reviewed by our admins. ); } - const error = create.error; + const { error } = create; + + const text = create.isAttesting ? "Creating attestation" : "Create application"; + return (
{ - console.log(application, profile); + onSubmit={({ profile, application }) => { create.mutate({ application, profile }); }} > - + +
- + - + +
+ - + - -