From 5b2caf4a968ba6c3ab5d4e5c15c47af9549bfa0f Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Wed, 12 Mar 2025 09:44:06 -0400 Subject: [PATCH] add stylelint --- .devcontainer/devcontainer.json | 6 +- .prettierrc.js => .prettierrc.mjs | 4 +- .stylelintrc.mjs | 19 + app/contact/form.module.css | 1 + app/notes/[slug]/page.module.css | 4 +- app/notes/page.module.css | 1 + app/page.module.css | 1 + app/projects/page.module.css | 12 +- app/projects/page.tsx | 8 +- app/themes.css | 8 +- components/CodeBlock/CodeBlock.module.css | 27 +- components/CopyButton/CopyButton.module.css | 20 - components/CopyButton/CopyButton.tsx | 18 +- components/Footer/Footer.module.css | 1 + components/Menu/Menu.tsx | 6 +- components/YouTube/YouTube.module.css | 1 + eslint.config.js => eslint.config.mjs | 3 +- next.config.ts | 15 +- package.json | 17 +- pnpm-lock.yaml | 714 ++++++++++++++++++-- tsconfig.json | 17 +- 21 files changed, 748 insertions(+), 155 deletions(-) rename .prettierrc.js => .prettierrc.mjs (81%) create mode 100644 .stylelintrc.mjs delete mode 100644 components/CopyButton/CopyButton.module.css rename eslint.config.js => eslint.config.mjs (96%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 21c057f2..103bea24 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -20,10 +20,12 @@ "typescript.tsdk": "node_modules/typescript/lib" }, "extensions": [ - "EditorConfig.EditorConfig", "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", "prisma.prisma", - "unifiedjs.vscode-mdx" + "unifiedjs.vscode-mdx", + "esbenp.prettier-vscode", + "stylelint.vscode-stylelint" ] } }, diff --git a/.prettierrc.js b/.prettierrc.mjs similarity index 81% rename from .prettierrc.js rename to .prettierrc.mjs index 47506984..49b1fa75 100644 --- a/.prettierrc.js +++ b/.prettierrc.mjs @@ -1,6 +1,4 @@ -/** - * @type {import("prettier").Config} - */ +/** @type {import("prettier").Config} */ const config = { singleQuote: false, jsxSingleQuote: false, diff --git a/.stylelintrc.mjs b/.stylelintrc.mjs new file mode 100644 index 00000000..b6c5c7d1 --- /dev/null +++ b/.stylelintrc.mjs @@ -0,0 +1,19 @@ +/* eslint-disable import/no-anonymous-default-export */ + +/** @type {import("stylelint").Config} */ +export default { + extends: ["stylelint-config-standard", "stylelint-config-css-modules"], + rules: { + "selector-class-pattern": null, + "custom-property-pattern": null, + "media-feature-range-notation": null, + "rule-empty-line-before": [ + "always-multi-line", + { + except: ["after-single-line-comment"], + ignore: ["inside-block"], + }, + ], + "color-hex-length": "long", + }, +}; diff --git a/app/contact/form.module.css b/app/contact/form.module.css index bc898b10..203a861f 100644 --- a/app/contact/form.module.css +++ b/app/contact/form.module.css @@ -58,6 +58,7 @@ .result.success { color: var(--colors-success); } + .result.error { color: var(--colors-error); } diff --git a/app/notes/[slug]/page.module.css b/app/notes/[slug]/page.module.css index df8436a1..98091860 100644 --- a/app/notes/[slug]/page.module.css +++ b/app/notes/[slug]/page.module.css @@ -35,11 +35,13 @@ white-space: nowrap; margin-right: 0.75em; } -.meta .metaTag:before { + +.meta .metaTag::before { content: "\0023"; /* cosmetically hashtagify tags */ padding-right: 0.125em; color: var(--colors-light); } + .meta .metaTag:last-of-type { margin-right: 0; } diff --git a/app/notes/page.module.css b/app/notes/page.module.css index be7e73e6..934bd04c 100644 --- a/app/notes/page.module.css +++ b/app/notes/page.module.css @@ -7,6 +7,7 @@ .section:first-of-type { margin-top: 0.25em; } + .section:last-of-type { margin-bottom: 0.25em; } diff --git a/app/page.module.css b/app/page.module.css index eddb1e84..16b56eca 100644 --- a/app/page.module.css +++ b/app/page.module.css @@ -60,6 +60,7 @@ 30% { transform: rotate(0deg); } + /* pause for ~9 out of 10 seconds */ 100% { transform: rotate(0deg); diff --git a/app/projects/page.module.css b/app/projects/page.module.css index 44ad26af..344b1dfd 100644 --- a/app/projects/page.module.css +++ b/app/projects/page.module.css @@ -11,7 +11,7 @@ .card { flex-grow: 1; width: 370px; - padding: 1.2em 1.2em 0.8em 1.2em; + padding: 1.2em 1.2em 0.8em; border: 1px solid var(--colors-kindaLight); border-radius: var(--radii-corner); font-size: 0.9em; @@ -32,7 +32,6 @@ .card .meta { display: flex; flex-wrap: wrap; - align-items: baseline; } .card .metaItem { @@ -51,7 +50,7 @@ } .card .metaIcon { - display: inline; + display: inline-block; width: 1.25em; height: 1.25em; vertical-align: -0.25em; @@ -61,9 +60,10 @@ .card .metaLanguage { display: inline-block; position: relative; - width: 1.15em; - height: 1.15em; + width: 1.1em; + height: 1.1em; + line-height: 1; margin-right: 0.5em; border-radius: 50%; - vertical-align: text-top; + vertical-align: -0.2em; } diff --git a/app/projects/page.tsx b/app/projects/page.tsx index 543f969f..35e5f173 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -114,11 +114,7 @@ export default async function Page() {
{repos?.map((repo) => (
- + {repo.name} @@ -137,7 +133,6 @@ export default async function Page() { {repo.stars && repo.stars > 0 && (
0 && (
svg { + vertical-align: middle; +} + +.cornerCopyButton:hover, +.cornerCopyButton:focus-visible { + color: var(--colors-link); } diff --git a/components/CopyButton/CopyButton.module.css b/components/CopyButton/CopyButton.module.css deleted file mode 100644 index cbd3e2f0..00000000 --- a/components/CopyButton/CopyButton.module.css +++ /dev/null @@ -1,20 +0,0 @@ -.button { - color: var(--colors-mediumDark); - line-height: 1px; - cursor: pointer; -} - -.button:hover, -.button:focus-visible { - color: var(--colors-link); -} - -.button.copied { - color: var(--colors-success) !important; -} - -.icon { - width: 1.25em; - height: 1.25em; - vertical-align: -0.3em; -} diff --git a/components/CopyButton/CopyButton.tsx b/components/CopyButton/CopyButton.tsx index 7b05530b..cf7fe211 100644 --- a/components/CopyButton/CopyButton.tsx +++ b/components/CopyButton/CopyButton.tsx @@ -3,24 +3,18 @@ import { forwardRef, useState, useEffect } from "react"; import innerText from "react-innertext"; import copy from "copy-to-clipboard"; -import clsx from "clsx"; import { ClipboardIcon, CheckIcon } from "lucide-react"; -import type { ReactNode, Ref, ComponentPropsWithoutRef, ElementRef, MouseEventHandler } from "react"; - -import styles from "./CopyButton.module.css"; +import type { ReactNode, Ref, ComponentPropsWithoutRef, ComponentRef, MouseEventHandler } from "react"; export type CopyButtonProps = ComponentPropsWithoutRef<"button"> & { source: string | ReactNode; timeout?: number; }; -const CopyButton = ( - { source, timeout = 2000, className, ...rest }: CopyButtonProps, - ref: Ref> -) => { +const CopyButton = ({ source, timeout = 2000, style, ...rest }: CopyButtonProps, ref: Ref>) => { const [copied, setCopied] = useState(false); - const handleCopy: MouseEventHandler> = (e) => { + const handleCopy: MouseEventHandler> = (e) => { // prevent unintentional double-clicks by unfocusing button e.currentTarget.blur(); @@ -54,13 +48,13 @@ const CopyButton = ( aria-label="Copy to clipboard" onClick={handleCopy} disabled={copied} - className={clsx(styles.button, copied && styles.copied, className)} + style={{ cursor: copied ? "default" : "pointer", ...style }} {...rest} > {copied ? ( - + ) : ( - + )} ); diff --git a/components/Footer/Footer.module.css b/components/Footer/Footer.module.css index 7dd42ef1..9a989b14 100644 --- a/components/Footer/Footer.module.css +++ b/components/Footer/Footer.module.css @@ -66,6 +66,7 @@ 8% { transform: scale(1); } + /* pause for ~9 out of 10 seconds */ 100% { transform: scale(1); diff --git a/components/Menu/Menu.tsx b/components/Menu/Menu.tsx index bbbe2f67..a339759f 100644 --- a/components/Menu/Menu.tsx +++ b/components/Menu/Menu.tsx @@ -6,7 +6,6 @@ import MenuItem from "../MenuItem"; import ThemeToggle from "../ThemeToggle"; import { menuItems } from "../../lib/config/menu"; import type { ComponentPropsWithoutRef } from "react"; -import type { LucideIcon } from "lucide-react"; import styles from "./Menu.module.css"; @@ -29,7 +28,10 @@ const Menu = ({ className, ...rest }: MenuProps) => { })}
  • - +
  • ); diff --git a/components/YouTube/YouTube.module.css b/components/YouTube/YouTube.module.css index b41bfbc6..5961175c 100644 --- a/components/YouTube/YouTube.module.css +++ b/components/YouTube/YouTube.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable-next-line selector-type-no-unknown */ .wrapper lite-youtube { margin: 0 auto; } diff --git a/eslint.config.js b/eslint.config.mjs similarity index 96% rename from eslint.config.js rename to eslint.config.mjs index e5b8d0c1..6ee767e3 100644 --- a/eslint.config.js +++ b/eslint.config.mjs @@ -16,7 +16,8 @@ const compat = new FlatCompat({ export default [ { ignores: ["README.md", ".next", ".vercel", "node_modules"] }, ...compat.config({ - extends: ["eslint:recommended", "next/core-web-vitals", "next/typescript"], + plugins: ["css-modules"], + extends: ["eslint:recommended", "next/core-web-vitals", "next/typescript", "plugin:css-modules/recommended"], }), ...eslintCustomConfig, eslintPluginPrettierRecommended, diff --git a/next.config.ts b/next.config.ts index 09ccc5a3..e258d87d 100644 --- a/next.config.ts +++ b/next.config.ts @@ -77,7 +77,7 @@ const nextConfig: NextConfig = { // NOTE: don't remove this, it ensures de-AMPing the site hasn't offended our google overlords too badly! // https://developers.google.com/search/docs/advanced/experience/remove-amp#remove-only-amp - { source: "/notes/:slug/amp.html", destination: "/notes/:slug/", permanent: true }, + { source: "/notes/:slug/amp.html", destination: "/notes/:slug", permanent: true }, // mastodon via subdomain: // https://docs.joinmastodon.org/admin/config/#web_domain @@ -107,32 +107,29 @@ const nextConfig: NextConfig = { permanent: true, }, - // google search console has tons of 404s for images prefixed with /public... why? no clue. - { source: "/public/static/:path*", destination: "/static/:path*", permanent: true }, - // remnants of previous sites/CMSes: { source: "/index.xml", destination: "/feed.xml", permanent: true }, { source: "/feed", destination: "/feed.xml", permanent: true }, { source: "/rss", destination: "/feed.xml", permanent: true }, - { source: "/blog/:path*", destination: "/notes/", permanent: true }, - { source: "/archives/:path*", destination: "/notes/", permanent: true }, + { source: "/blog/:path*", destination: "/notes", permanent: true }, + { source: "/archives/:path*", destination: "/notes", permanent: true }, { source: "/resume", destination: "/static/resume.pdf", permanent: false }, { source: "/resume.pdf", destination: "/static/resume.pdf", permanent: false }, // WordPress permalinks: { source: "/2016/02/28/millenial-with-hillary-clinton", - destination: "/notes/millenial-with-hillary-clinton/", + destination: "/notes/millenial-with-hillary-clinton", permanent: true, }, { source: "/2018/12/04/how-to-shrink-linux-virtual-disk-vmware", - destination: "/notes/how-to-shrink-linux-virtual-disk-vmware/", + destination: "/notes/how-to-shrink-linux-virtual-disk-vmware", permanent: true, }, { source: "/2018/12/10/cool-bash-tricks-for-your-terminal-dotfiles", - destination: "/notes/cool-bash-tricks-for-your-terminal-dotfiles/", + destination: "/notes/cool-bash-tricks-for-your-terminal-dotfiles", permanent: true, }, ], diff --git a/package.json b/package.json index c0be6412..b8df9583 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "email": "jake@jarv.is", "url": "https://github.com/jakejarvis" }, - "type": "module", "scripts": { "dev": "next dev -H 0.0.0.0", "build": "next build", @@ -23,9 +22,9 @@ "@giscus/react": "^3.1.0", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", - "@next/bundle-analyzer": "15.3.0-canary.0", - "@next/mdx": "15.3.0-canary.0", - "@next/third-parties": "15.3.0-canary.0", + "@next/bundle-analyzer": "15.3.0-canary.1", + "@next/mdx": "15.3.0-canary.1", + "@next/third-parties": "15.3.0-canary.1", "@octokit/graphql": "^8.2.1", "@octokit/graphql-schema": "^15.26.0", "@prisma/client": "^6.5.0", @@ -37,7 +36,7 @@ "feed": "^4.2.2", "lucide-react": "0.479.0", "modern-normalize": "^3.0.1", - "next": "15.3.0-canary.0", + "next": "15.3.0-canary.1", "obj-str": "^1.1.0", "p-map": "^7.0.3", "p-memoize": "^7.1.1", @@ -78,8 +77,9 @@ "@types/react-is": "^19.0.0", "cross-env": "^7.0.3", "eslint": "^9.22.0", - "eslint-config-next": "15.3.0-canary.0", + "eslint-config-next": "15.3.0-canary.1", "eslint-config-prettier": "^10.1.1", + "eslint-plugin-css-modules": "^2.12.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-mdx": "^3.2.0", @@ -91,6 +91,10 @@ "prisma": "^6.5.0", "schema-dts": "^1.1.5", "simple-git-hooks": "^2.11.1", + "stylelint": "^16.15.0", + "stylelint-config-css-modules": "^4.4.0", + "stylelint-config-recommended": "^15.0.0", + "stylelint-config-standard": "^37.0.0", "typescript": "5.8.2" }, "optionalDependencies": { @@ -112,6 +116,7 @@ "eslint" ], "*.css": [ + "stylelint", "prettier --check" ] }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d74ce7fa..50134af1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,14 +21,14 @@ importers: specifier: ^3.1.0 version: 3.1.0(@types/react@19.0.10)(react@19.0.0) '@next/bundle-analyzer': - specifier: 15.3.0-canary.0 - version: 15.3.0-canary.0 + specifier: 15.3.0-canary.1 + version: 15.3.0-canary.1 '@next/mdx': - specifier: 15.3.0-canary.0 - version: 15.3.0-canary.0(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0)) + specifier: 15.3.0-canary.1 + version: 15.3.0-canary.1(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0)) '@next/third-parties': - specifier: 15.3.0-canary.0 - version: 15.3.0-canary.0(next@15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.1 + version: 15.3.0-canary.1(next@15.3.0-canary.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@octokit/graphql': specifier: ^8.2.1 version: 8.2.1 @@ -63,8 +63,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 next: - specifier: 15.3.0-canary.0 - version: 15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.1 + version: 15.3.0-canary.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) obj-str: specifier: ^1.1.0 version: 1.1.0 @@ -181,11 +181,14 @@ importers: specifier: ^9.22.0 version: 9.22.0 eslint-config-next: - specifier: 15.3.0-canary.0 - version: 15.3.0-canary.0(eslint@9.22.0)(typescript@5.8.2) + specifier: 15.3.0-canary.1 + version: 15.3.0-canary.1(eslint@9.22.0)(typescript@5.8.2) eslint-config-prettier: specifier: ^10.1.1 version: 10.1.1(eslint@9.22.0) + eslint-plugin-css-modules: + specifier: ^2.12.0 + version: 2.12.0(eslint@9.22.0) eslint-plugin-import: specifier: ^2.31.0 version: 2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.22.0) @@ -219,6 +222,18 @@ importers: simple-git-hooks: specifier: ^2.11.1 version: 2.11.1 + stylelint: + specifier: ^16.15.0 + version: 16.15.0(typescript@5.8.2) + stylelint-config-css-modules: + specifier: ^4.4.0 + version: 4.4.0(stylelint@16.15.0(typescript@5.8.2)) + stylelint-config-recommended: + specifier: ^15.0.0 + version: 15.0.0(stylelint@16.15.0(typescript@5.8.2)) + stylelint-config-standard: + specifier: ^37.0.0 + version: 37.0.0(stylelint@16.15.0(typescript@5.8.2)) typescript: specifier: 5.8.2 version: 5.8.2 @@ -241,10 +256,36 @@ packages: resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@4.0.2': + resolution: {integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} @@ -579,6 +620,9 @@ packages: peerDependencies: eslint: ^7 || ^8 || >=9 + '@keyv/serialize@1.0.3': + resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@lit-labs/ssr-dom-shim@1.3.0': resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} @@ -602,17 +646,17 @@ packages: '@types/react': '>=16' react: '>=16' - '@next/bundle-analyzer@15.3.0-canary.0': - resolution: {integrity: sha512-7xMSGa0whsN8igWtsmliaMF9x1BQro0sysoTKz+9B6mLOE481+C//ZsLK9hAM4b0MCL3gYAFKgBzcGaWT2Q6Yg==} + '@next/bundle-analyzer@15.3.0-canary.1': + resolution: {integrity: sha512-tLOAh4ePVjyng2dB8BYpkVlzA6S+qGxm+7BF70y7av++YFuu21NgjYbweYll72CGB82mrLUV2Z1Ubb6oy1jKFQ==} - '@next/env@15.3.0-canary.0': - resolution: {integrity: sha512-DsS8aqEHx5JeyPel3GaHtg5p9zytWsU17b6kTFPm19OmaAdh7AaNyDw4a/0170vdB90Gi/dXe87sInRRHRetfw==} + '@next/env@15.3.0-canary.1': + resolution: {integrity: sha512-LxOpzp7p89RpQg7Y1mL3FPIunyjiHOi6TS8b0GXlirRre8+9WlbuQruzw3hsPOJsw16/4evm4mg+rE31N62A9g==} - '@next/eslint-plugin-next@15.3.0-canary.0': - resolution: {integrity: sha512-uYOOe6k0obZMUMX8dfWeRHy9zQd2zZCSHGpeMnt5gJ5W0YdbuRi/WvsT/kZDPfqYuyT0rTpViKymvRCGYPvzxw==} + '@next/eslint-plugin-next@15.3.0-canary.1': + resolution: {integrity: sha512-6VDzSfREQfsseH5c6JImXZrRmK9AM5f6Hzf3CVGh/BQTyzfIN6KFD6sZAnbvSOHziVbhx16EndQEfiRb41Ukxg==} - '@next/mdx@15.3.0-canary.0': - resolution: {integrity: sha512-6RSTK8tXja6etVRsRP+4qwk4cBZ4mn4i3ZSIEUw0fAKmo8QzxOW+ZWuAqOqBCf8WgxyOegYUcqjUzstR+aEdKQ==} + '@next/mdx@15.3.0-canary.1': + resolution: {integrity: sha512-4bs+/+C8tfp8xUW2WjbfBU++ackMG6nSda07LT2Grrkn3qUICB2DfwBlqHuhnZYGHxxi5coUGAhnL5IDL0qunA==} peerDependencies: '@mdx-js/loader': '>=0.15.0' '@mdx-js/react': '>=0.15.0' @@ -622,56 +666,56 @@ packages: '@mdx-js/react': optional: true - '@next/swc-darwin-arm64@15.3.0-canary.0': - resolution: {integrity: sha512-b7coo/zIlV5j6ouCyo7HaZr31JSaq37AWJMtzP2midjklGqA2ZnFEAOVAWHMz/niV/SdwFBLGA08fVTX0KCbaw==} + '@next/swc-darwin-arm64@15.3.0-canary.1': + resolution: {integrity: sha512-WgVf9tBA3xK1cT8g3MbNQsaYIGZX4BZYXnDU7tBrY3lX4UBKeKD5Cq9c6AMaYPRW8V0XqZESlrFqUX+VeNs4UQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.0-canary.0': - resolution: {integrity: sha512-CBKyXc/fUA0ehOf707hwBIRMFMG94Udv7HK7ddBUED4P6xFtk8uohxZ9865Ms/K4c/qX+WS0V3QzPTfjbdI24w==} + '@next/swc-darwin-x64@15.3.0-canary.1': + resolution: {integrity: sha512-L5yHSiTQJU83C/k20CWr5IO2tEoPuDiSCgfoimZcHXC1WdZdD7BB5zYJEyH4ZbpEVsE9ZDY27xEDRt2hWcaxaQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.0-canary.0': - resolution: {integrity: sha512-FeKG+2YVcxAwAGXCvbYTy2skJ5k5J6EzRhfAqQ6pMuDQkfRZLDuMRKfv37c3BsA4H/MJy47cPXCnS5dE9WjJVQ==} + '@next/swc-linux-arm64-gnu@15.3.0-canary.1': + resolution: {integrity: sha512-+deffYQ/1ERayGl6SclzwwxFtDRBHbeLpd5tmeImiIdDytlyHoivHuQOlGbObl8+yV/HN5sj0TzaAoTeoj6DuA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.0-canary.0': - resolution: {integrity: sha512-E8OZM3hYQ3ftxRTqNCVHmWC5CnC9tCrKzWBvBDUXD2SV9VMat3sv7ido22W1+9DFhYxC9qHuPNZCt1B0M/kvMQ==} + '@next/swc-linux-arm64-musl@15.3.0-canary.1': + resolution: {integrity: sha512-vL+3Gu+IosQBnl6I6Xec53PCkUF3ktddffDv9r6uiyTjzj49eIalSUPlivCJTFDyt9vuaGFzsVqtUBW/Ek8I2w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.0-canary.0': - resolution: {integrity: sha512-T6Zt3mdDqUpDxQCFmw+JfYLvmxsFWQaX9ECR2nXHoztRa75GGAnr0DBr8T1OJXH5YVLSz3bDsAuwzuwdSSgW4w==} + '@next/swc-linux-x64-gnu@15.3.0-canary.1': + resolution: {integrity: sha512-QZ0zjZ+xO9EiG8i2lvpaL+EbmaVUdMgMn5mW7QUoo/La3MBfR696KIoA8rg2hyCR4NHd9MLSP3N+tm/fmcmGGA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.0-canary.0': - resolution: {integrity: sha512-4SvZWk0BBFuByZHRh+00tr6e93AnIgCRka7aVNOxvohmUqJpKDW4TPCz+SzRvS2qKcvoEgmQ6tS1eYUk6V4czQ==} + '@next/swc-linux-x64-musl@15.3.0-canary.1': + resolution: {integrity: sha512-4eQR+PkeIWlkcImA5bWsssCn9aCY2QVuVhofj9MVKLaXYgIQ7P7LR2mwJBB6M14/87C/+OcCEZUOi7gsxIrXLQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.0-canary.0': - resolution: {integrity: sha512-s/SYd2gbUUfB/pRLUs8s9LP2jkuo+rUYsoOrvTte3gjzpIfc7XMz9KVZtWw6gWIKtKsy+ip0pAGx/qFsEQOeXA==} + '@next/swc-win32-arm64-msvc@15.3.0-canary.1': + resolution: {integrity: sha512-FYLvC0fJdPPEwBhyRYeomhE0PqGgjlZazlPTT3oB/0xnNmwuJdXhOko+MRpgKozxERqQRdwM+8QdN3wNAa3fvw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.0-canary.0': - resolution: {integrity: sha512-Kz4lnTvVpY4dr3mHs9MvuJbLXM0JWzBwNJntt4dBmRRUmYqTTpvdx6nXwLBw6S6uOUq3fhKljxCGHV4qiowK6g==} + '@next/swc-win32-x64-msvc@15.3.0-canary.1': + resolution: {integrity: sha512-TxA2JAwXx27nYhccGbRSvC+/RdT70SIcL8cII5EidCxu7t074p8sAEOo0XImydHooDjmvJ0/oKmU85c7RHz+vw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/third-parties@15.3.0-canary.0': - resolution: {integrity: sha512-gcjV+VS/JT/jGmP0lbaPImMvHndN8xUwhYpHmZrE/KGUK78ozHjx0ARtGMZDYpOXYnHu/xsUMUphXmBasc1M0Q==} + '@next/third-parties@15.3.0-canary.1': + resolution: {integrity: sha512-8F+19i9kjz6ODEKmLBBLzux1//m0adj1SBmq+nonEKU3NzN9yfA5F324IayT75jius9CXIWmyAtrBlzBr/c9+A==} peerDependencies: next: ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -955,6 +999,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} @@ -993,6 +1040,10 @@ packages: array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -1020,6 +1071,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -1046,6 +1101,12 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1059,10 +1120,16 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + cacheable@1.8.9: + resolution: {integrity: sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1141,6 +1208,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1175,6 +1245,15 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -1184,6 +1263,19 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1258,6 +1350,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1307,6 +1403,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -1373,8 +1473,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-next@15.3.0-canary.0: - resolution: {integrity: sha512-yY81GoFDjajTnLq92PjBA0DuJWU8hmU88xlCE+OSCs+RuTp9Ta16+IZVVTZgWTz1zI/wVNtA8wMvc7qXs51aHA==} + eslint-config-next@15.3.0-canary.1: + resolution: {integrity: sha512-TJIN5vFgnDPNloe+M9MHw7ZJXy83UALu3TM1A/Onj88OFj4I5lUOfo9P0+DtBW0Ptz3VGenLQVqDStHSHuZ6AA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -1431,6 +1531,12 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-plugin-css-modules@2.12.0: + resolution: {integrity: sha512-ruFBdad69ABrbCDCh5mXj7UzNmrvytfzPACjyvZWIAjFZAG8BXpYSbqmE8gU5wF+pIzV3jU2CWhLvfekXT/IgQ==} + engines: {node: '>=4.0.0'} + peerDependencies: + eslint: '>=2.0.0' + eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -1585,6 +1691,13 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1600,6 +1713,9 @@ packages: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} + file-entry-cache@10.0.7: + resolution: {integrity: sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1616,6 +1732,9 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flat-cache@6.1.7: + resolution: {integrity: sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==} + flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -1683,6 +1802,14 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -1691,6 +1818,18 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1790,6 +1929,9 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hookified@1.7.1: + resolution: {integrity: sha512-OXcdHsXeOiD7OJ5zvWj8Oy/6RCdLwntAX+wUrfemNcMGn6sux4xbEHi2QXwqePYhjQ/yvxxq2MvCRirdlHscBw==} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -1797,6 +1939,10 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} @@ -1811,6 +1957,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1819,6 +1968,10 @@ packages: resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} engines: {node: '>= 4'} + ignore@7.0.3: + resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2027,6 +2180,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2034,6 +2190,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2048,10 +2207,20 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.3.1: + resolution: {integrity: sha512-13hQT2q2VIwOoaJdJa7nY3J8UVbYtMTJFHnwm9LI+SaQRfUiM6Em9KZeOVTCKbMnGcRIL3NSUFpAdjZCq24nLQ==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -2070,6 +2239,9 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@2.0.4: resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2102,6 +2274,12 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -2132,6 +2310,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -2180,6 +2361,16 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdn-data@2.18.0: + resolution: {integrity: sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2345,8 +2536,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.3.0-canary.0: - resolution: {integrity: sha512-5PT9X65OBHwY22hu3O04ylZ4zznRhKdMOR1A4Hagw3eHrXO4UYtkcnhMErWq4BbrgYKYg+5XJ+kgNcHN7H8big==} + next@15.3.0-canary.1: + resolution: {integrity: sha512-g0OKVhukIcZocIABXMqA9I7Y2CxLpIEvzplGsTrxbRPtada6VaXxwn3LaqrCT5Im4olJMNUxfvgC0Jrlhnzm8g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -2378,6 +2569,10 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-install-checks@6.3.0: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2480,6 +2675,10 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-json@7.1.1: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} @@ -2518,6 +2717,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} @@ -2545,10 +2748,33 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2731,6 +2957,10 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resend@4.1.2: resolution: {integrity: sha512-km0btrAj/BqIaRlS+SoLNMaCAUUWEgcEvZpycfVvoXEwAHCxU+vp/ikxPgKRkyKyiR2iDcdUq5uIBTDK9oSSSQ==} engines: {node: '>=18'} @@ -2739,6 +2969,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -2876,6 +3110,14 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -3002,6 +3244,34 @@ packages: babel-plugin-macros: optional: true + stylelint-config-css-modules@4.4.0: + resolution: {integrity: sha512-J93MtxPjRzs/TjwbJ5y9SQy4iIqULXwL1CF1yx2tQCJfS/VZUcDAmoGOwqlLbhHXSQtZO5XQiA75NVWUR3KDCQ==} + peerDependencies: + stylelint: ^14.5.1 || ^15.0.0 || ^16.0.0 + + stylelint-config-recommended@15.0.0: + resolution: {integrity: sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.13.0 + + stylelint-config-standard@37.0.0: + resolution: {integrity: sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.13.0 + + stylelint-scss@6.11.1: + resolution: {integrity: sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + + stylelint@16.15.0: + resolution: {integrity: sha512-OK6Rs7EPdcdmjqiDycadZY4fw3f5/TC1X6/tGjnF3OosbwCeNs7nG+79MCAtjEg7ckwqTJTsku08e0Rmaz5nUw==} + engines: {node: '>=18.12.0'} + hasBin: true + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3010,10 +3280,17 @@ packages: resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} engines: {node: '>=12'} + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + swr@2.3.3: resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} peerDependencies: @@ -3023,6 +3300,10 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -3236,6 +3517,10 @@ packages: resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3262,6 +3547,10 @@ packages: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -3307,8 +3596,25 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} + + '@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + '@discoveryjs/json-ext@0.5.7': {} + '@dual-bundle/import-meta-resolve@4.1.0': {} + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -3542,6 +3848,10 @@ snapshots: dependencies: eslint: 9.22.0 + '@keyv/serialize@1.0.3': + dependencies: + buffer: 6.0.3 + '@lit-labs/ssr-dom-shim@1.3.0': {} '@lit/reactive-element@2.0.4': @@ -3592,53 +3902,53 @@ snapshots: '@types/react': 19.0.10 react: 19.0.0 - '@next/bundle-analyzer@15.3.0-canary.0': + '@next/bundle-analyzer@15.3.0-canary.1': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@15.3.0-canary.0': {} + '@next/env@15.3.0-canary.1': {} - '@next/eslint-plugin-next@15.3.0-canary.0': + '@next/eslint-plugin-next@15.3.0-canary.1': dependencies: fast-glob: 3.3.1 - '@next/mdx@15.3.0-canary.0(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))': + '@next/mdx@15.3.0-canary.1(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))': dependencies: source-map: 0.7.4 optionalDependencies: '@mdx-js/loader': 3.1.0(acorn@8.14.1) '@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0) - '@next/swc-darwin-arm64@15.3.0-canary.0': + '@next/swc-darwin-arm64@15.3.0-canary.1': optional: true - '@next/swc-darwin-x64@15.3.0-canary.0': + '@next/swc-darwin-x64@15.3.0-canary.1': optional: true - '@next/swc-linux-arm64-gnu@15.3.0-canary.0': + '@next/swc-linux-arm64-gnu@15.3.0-canary.1': optional: true - '@next/swc-linux-arm64-musl@15.3.0-canary.0': + '@next/swc-linux-arm64-musl@15.3.0-canary.1': optional: true - '@next/swc-linux-x64-gnu@15.3.0-canary.0': + '@next/swc-linux-x64-gnu@15.3.0-canary.1': optional: true - '@next/swc-linux-x64-musl@15.3.0-canary.0': + '@next/swc-linux-x64-musl@15.3.0-canary.1': optional: true - '@next/swc-win32-arm64-msvc@15.3.0-canary.0': + '@next/swc-win32-arm64-msvc@15.3.0-canary.1': optional: true - '@next/swc-win32-x64-msvc@15.3.0-canary.0': + '@next/swc-win32-x64-msvc@15.3.0-canary.1': optional: true - '@next/third-parties@15.3.0-canary.0(next@15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': + '@next/third-parties@15.3.0-canary.1(next@15.3.0-canary.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': dependencies: - next: 15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 third-party-capital: 1.0.20 @@ -3979,6 +4289,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -4013,6 +4330,8 @@ snapshots: array-iterate@2.0.1: {} + array-union@2.1.0: {} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 @@ -4065,6 +4384,8 @@ snapshots: ast-types-flow@0.0.8: {} + astral-regex@2.0.0: {} + astring@1.9.0: {} async-function@1.0.0: {} @@ -4081,6 +4402,10 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@2.0.0: {} + + base64-js@1.5.1: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -4096,10 +4421,20 @@ snapshots: buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 + cacheable@1.8.9: + dependencies: + hookified: 1.7.1 + keyv: 5.3.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4173,6 +4508,8 @@ snapshots: color-string: 1.9.1 optional: true + colord@2.9.3: {} + colorette@2.0.20: {} comma-number@2.1.0: {} @@ -4203,6 +4540,15 @@ snapshots: dependencies: toggle-selection: 1.0.6 + cosmiconfig@9.0.0(typescript@5.8.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.8.2 + cross-env@7.0.3: dependencies: cross-spawn: 7.0.6 @@ -4213,6 +4559,15 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-functions-list@3.2.3: {} + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} @@ -4278,6 +4633,10 @@ snapshots: diff@5.2.0: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -4330,6 +4689,8 @@ snapshots: entities@4.5.0: {} + env-paths@2.2.1: {} + environment@1.1.0: {} err-code@2.0.3: {} @@ -4489,9 +4850,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@15.3.0-canary.0(eslint@9.22.0)(typescript@5.8.2): + eslint-config-next@15.3.0-canary.1(eslint@9.22.0)(typescript@5.8.2): dependencies: - '@next/eslint-plugin-next': 15.3.0-canary.0 + '@next/eslint-plugin-next': 15.3.0-canary.1 '@rushstack/eslint-patch': 1.10.5 '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2) @@ -4568,6 +4929,12 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-css-modules@2.12.0(eslint@9.22.0): + dependencies: + eslint: 9.22.0 + gonzales-pe: 4.3.0 + lodash: 4.17.21 + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.22.0): dependencies: '@rtsao/scc': 1.1.0 @@ -4821,6 +5188,10 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -4833,6 +5204,10 @@ snapshots: dependencies: xml-js: 1.6.11 + file-entry-cache@10.0.7: + dependencies: + flat-cache: 6.1.7 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -4851,6 +5226,12 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 + flat-cache@6.1.7: + dependencies: + cacheable: 1.8.9 + flatted: 3.3.3 + hookified: 1.7.1 + flatted@3.3.3: {} for-each@0.3.5: @@ -4933,6 +5314,16 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + globals@14.0.0: {} globalthis@1.0.4: @@ -4940,6 +5331,21 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globjoin@0.1.4: {} + + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -5118,12 +5524,16 @@ snapshots: property-information: 7.0.0 space-separated-tokens: 2.0.2 + hookified@1.7.1: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 html-escaper@2.0.2: {} + html-tags@3.3.1: {} + html-to-text@9.0.5: dependencies: '@selderee/plugin-htmlparser2': 0.11.0 @@ -5143,10 +5553,14 @@ snapshots: human-signals@5.0.0: {} + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@6.0.2: {} + ignore@7.0.3: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -5350,10 +5764,14 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -5371,8 +5789,16 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.3.1: + dependencies: + '@keyv/serialize': 1.0.3 + + kind-of@6.0.3: {} + kleur@4.1.5: {} + known-css-properties@0.35.0: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -5388,6 +5814,8 @@ snapshots: lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} + lines-and-columns@2.0.4: {} lint-staged@15.4.3: @@ -5443,6 +5871,10 @@ snapshots: lodash.merge@4.6.2: {} + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 @@ -5469,6 +5901,8 @@ snapshots: math-intrinsics@1.1.0: {} + mathml-tag-names@2.1.3: {} + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -5632,6 +6066,13 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.12.2: {} + + mdn-data@2.18.0: + optional: true + + meow@13.2.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -5939,9 +6380,9 @@ snapshots: natural-compare@1.4.0: {} - next@15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.3.0-canary.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.3.0-canary.0 + '@next/env': 15.3.0-canary.1 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -5951,14 +6392,14 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.0-canary.0 - '@next/swc-darwin-x64': 15.3.0-canary.0 - '@next/swc-linux-arm64-gnu': 15.3.0-canary.0 - '@next/swc-linux-arm64-musl': 15.3.0-canary.0 - '@next/swc-linux-x64-gnu': 15.3.0-canary.0 - '@next/swc-linux-x64-musl': 15.3.0-canary.0 - '@next/swc-win32-arm64-msvc': 15.3.0-canary.0 - '@next/swc-win32-x64-msvc': 15.3.0-canary.0 + '@next/swc-darwin-arm64': 15.3.0-canary.1 + '@next/swc-darwin-x64': 15.3.0-canary.1 + '@next/swc-linux-arm64-gnu': 15.3.0-canary.1 + '@next/swc-linux-arm64-musl': 15.3.0-canary.1 + '@next/swc-linux-x64-gnu': 15.3.0-canary.1 + '@next/swc-linux-x64-musl': 15.3.0-canary.1 + '@next/swc-win32-arm64-msvc': 15.3.0-canary.1 + '@next/swc-win32-x64-msvc': 15.3.0-canary.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -5978,6 +6419,8 @@ snapshots: semver: 7.7.1 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + npm-install-checks@6.3.0: dependencies: semver: 7.7.1 @@ -6101,6 +6544,13 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-json@7.1.1: dependencies: '@babel/code-frame': 7.26.2 @@ -6144,6 +6594,8 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-type@4.0.0: {} + peberminta@0.9.0: {} picocolors@1.1.1: {} @@ -6160,12 +6612,34 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-media-query-parser@0.2.3: + optional: true + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.1(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + postcss@8.4.31: dependencies: nanoid: 3.3.9 picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.3: + dependencies: + nanoid: 3.3.9 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -6433,6 +6907,8 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + require-from-string@2.0.2: {} + resend@4.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@react-email/render': 1.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -6442,6 +6918,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve@1.22.10: @@ -6633,6 +7111,14 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -6779,14 +7265,93 @@ snapshots: client-only: 0.0.1 react: 19.0.0 + stylelint-config-css-modules@4.4.0(stylelint@16.15.0(typescript@5.8.2)): + dependencies: + stylelint: 16.15.0(typescript@5.8.2) + optionalDependencies: + stylelint-scss: 6.11.1(stylelint@16.15.0(typescript@5.8.2)) + + stylelint-config-recommended@15.0.0(stylelint@16.15.0(typescript@5.8.2)): + dependencies: + stylelint: 16.15.0(typescript@5.8.2) + + stylelint-config-standard@37.0.0(stylelint@16.15.0(typescript@5.8.2)): + dependencies: + stylelint: 16.15.0(typescript@5.8.2) + stylelint-config-recommended: 15.0.0(stylelint@16.15.0(typescript@5.8.2)) + + stylelint-scss@6.11.1(stylelint@16.15.0(typescript@5.8.2)): + dependencies: + css-tree: 3.1.0 + is-plain-object: 5.0.0 + known-css-properties: 0.35.0 + mdn-data: 2.18.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + stylelint: 16.15.0(typescript@5.8.2) + optional: true + + stylelint@16.15.0(typescript@5.8.2): + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.8.2) + css-functions-list: 3.2.3 + css-tree: 3.1.0 + debug: 4.4.0 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 10.0.7 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 7.0.3 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.35.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.5.3) + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.2.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + supports-color@7.2.0: dependencies: has-flag: 4.0.0 supports-color@9.4.0: {} + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} + svg-tags@1.0.0: {} + swr@2.3.3(react@19.0.0): dependencies: dequal: 2.0.3 @@ -6798,6 +7363,14 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tapable@2.2.1: {} third-party-capital@1.0.20: {} @@ -7111,6 +7684,10 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -7139,6 +7716,11 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@7.5.10: {} xml-js@1.6.11: diff --git a/tsconfig.json b/tsconfig.json index 82d7b8a3..06aabcf4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -24,13 +20,6 @@ } ] }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] }