From 671c9d9bff953c983d3591f7aea9ac80dfe545fb Mon Sep 17 00:00:00 2001 From: l-you Date: Tue, 14 Apr 2026 08:43:02 +0000 Subject: [PATCH 1/4] chore: use the latest Debian and node --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3eb9eba..9035abf 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,7 +3,7 @@ { "name": "Node.js & TypeScript", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile - "image": "mcr.microsoft.com/devcontainers/typescript-node:4-22-bookworm", + "image": "mcr.microsoft.com/devcontainers/typescript-node:4-24-trixie", "customizations": { "vscode": { "extensions": [ From f80ad75946b48346dfe50f7c20d4865d1e0a17b0 Mon Sep 17 00:00:00 2001 From: l-you Date: Tue, 14 Apr 2026 09:40:05 +0000 Subject: [PATCH 2/4] feat: replace eslint with biomejs and auto fix auto fixable issues --- .changeset/config.json | 18 +- .devcontainer/devcontainer.json | 4 +- __tests__/Routes.spec.ts | 280 ++- biome.json | 34 + build.config.json | 5 +- eslint.config.mjs | 18 - next-app-mock/next.config.js | 10 +- next-app-mock/package.json | 44 +- next-app-mock/src/CurrentUrlBlock.tsx | 47 +- next-app-mock/src/app/layout.tsx | 41 +- next-app-mock/src/app/page.module.css | 326 +-- next-app-mock/src/app/page.tsx | 26 +- .../src/app/some-random-page/page.tsx | 12 +- next-app-mock/src/app/url-state-form/Form.tsx | 133 +- next-app-mock/src/app/url-state-form/page.tsx | 21 +- next-app-mock/tsconfig.json | 77 +- package.json | 146 +- playwright.config.ts | 75 +- pnpm-lock.yaml | 2231 ++--------------- renovate.json | 7 +- src/client.ts | 8 +- src/client/useLinker.ts | 20 +- src/client/useRelativeLink.ts | 23 +- src/client/useSearchParam.ts | 26 +- src/index.ts | 32 +- src/parameters/boolType.ts | 34 +- src/parameters/index.ts | 8 +- src/parameters/numberType.ts | 21 +- src/parameters/pageType.ts | 25 +- src/parameters/stringType.ts | 23 +- src/query/getQueryParamValue.ts | 8 +- src/query/setQueryParamValue.ts | 16 +- src/searchParams/getSearchParamValue.ts | 34 +- src/searchParams/setSearchParamValue.ts | 37 +- src/state/useParamState.ts | 99 +- src/types.ts | 74 +- src/utils/createLinker.ts | 75 +- src/utils/createLinkerUrl.ts | 75 +- src/utils/createRelativeLink.ts | 29 +- src/utils/getNormalizedQueryStr.ts | 12 +- src/utils/makeParam.ts | 7 +- src/utils/makeParamType.ts | 18 +- src/utils/parseLink.ts | 20 +- src/utils/parseRelativeLink.ts | 18 +- src/utils/queryToSearchParams.ts | 42 +- tsconfig.eslint.json | 76 +- tsconfig.json | 77 +- tsup.config.ts | 22 +- 48 files changed, 1334 insertions(+), 3180 deletions(-) create mode 100644 biome.json delete mode 100644 eslint.config.mjs diff --git a/.changeset/config.json b/.changeset/config.json index ab848d1..34dfc8e 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,11 +1,11 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] + "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] } diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9035abf..095c0e1 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,9 +6,7 @@ "image": "mcr.microsoft.com/devcontainers/typescript-node:4-24-trixie", "customizations": { "vscode": { - "extensions": [ - "GitHub.vscode-pull-request-github" - ] + "extensions": ["GitHub.vscode-pull-request-github"] } } diff --git a/__tests__/Routes.spec.ts b/__tests__/Routes.spec.ts index 2a2d7d7..baed64d 100644 --- a/__tests__/Routes.spec.ts +++ b/__tests__/Routes.spec.ts @@ -1,124 +1,156 @@ -import { expect, test } from '@playwright/test' -import { createLinkerUrl, parseLink, createLinker, queryToSearchParams } from '../src/index' -import parseRelativeLink from '../src/utils/parseRelativeLink' - -test('URL parameter handling and linker functionality', async ({ page }) => { - - await page.goto('/') - await expect(page).toHaveURL('/') - - await expect(page.getByTestId('current_url')).toHaveText('/') - await expect(page.getByTestId('current_url_1')).toHaveText('/?book_param=1&das_ist=das_ist_string') - await expect(page.getByTestId('current_url_2')).toHaveText('/') - await expect(page.getByTestId('current_url_3')).toHaveText('/?string_param=params_some') - - await page.goto('/?string_param=params_some') - await expect(page.getByTestId('search_params_str')).toHaveText('params_some') - - await page.goto('/some-random-page') - await expect(page).toHaveURL('/some-random-page') - await expect(page.getByTestId('current_url')).toHaveText('/some-random-page') - await expect(page.getByTestId('current_url_1')).toHaveText('/some-random-page?book_param=1&das_ist=das_ist_string') - await expect(page.getByTestId('current_url_2')).toHaveText('/some-random-page') - await expect(page.getByTestId('current_url_3')).toHaveText('/some-random-page?string_param=params_some') -}) - -test('queryToSearchParams utility function', async () => { - const result = queryToSearchParams({ - ww: ['a', 'b'], - c: 'n', - v: undefined - }) - - expect(result.toString()).toBe('ww=a&ww=b&c=n') -}) -test('useParamState hook - URL state synchronization with debouncing', async ({ page }) => { - await page.goto('/url-state-form') - await expect(page).toHaveURL('/url-state-form') - page.on('console', msg => console.log(msg.text())); - - await page.getByTestId('form-input').pressSequentially('Hello World!', { - delay: 100 - }) - - await expect( - page.getByTestId('url_change_time'), - 'No URL changes should occur while user is typing due to debouncing' - ).toHaveText('0') - - await page.waitForTimeout(1000) - - await expect( - page.getByTestId('url_change_time'), - 'Debounce callback should trigger when user stops typing' - ).toHaveText('1') - - await page.waitForTimeout(1000) - await expect( - page.getByTestId('url_change_time'), - 'No additional updates should occur after debounce completes' - ).toHaveText('1') - - const expectedUrl = new URLSearchParams() - expectedUrl.set('url_change_test_input_value', 'Hello World!') - await expect(page).toHaveURL('/url-state-form?' + expectedUrl.toString()) - await expect( - page.getByTestId('form-input'), - 'Input value is the same as typed' - ).toHaveValue('Hello World!',{ - timeout: 3000 - }) - - await page.getByTestId('change_url_button').click() - - await expect(page).toHaveURL('/url-state-form?url_change_test_input_value=text_updated_from_nextjs_router') - - await expect( - page.getByTestId('form-input'), - 'Form input should sync with Next.js router URL changes' - ).toHaveValue('text_updated_from_nextjs_router',{ - timeout: 3000 - }) - - await page.goto('/url-state-form?url_change_test_input_value=text_updated_from_browser_router') - await expect(page).toHaveURL('/url-state-form?url_change_test_input_value=text_updated_from_browser_router') - - await expect( - page.getByTestId('form-input'), - 'Form input should sync with browser API URL changes' - ).toHaveValue('text_updated_from_browser_router',{ - timeout: 3000 - }) - - //Test value change middleware - await expect(page.getByTestId('page_value')).toHaveText('1') - - await page.getByTestId('next_page').click() - await expect(page.getByTestId('page_value')).toHaveText('2') - await page.getByTestId('form-input').pressSequentially('not trigger page reset') - await expect(page.getByTestId('page_value')).toHaveText('2') - - await page.waitForTimeout(1200) - - await page.getByTestId('toggle_page_reset').click() - await expect(page.getByTestId('page_reset_active')).toHaveText('Page reset active') - await page.getByTestId('form-input').pressSequentially('trigger page reset') - await page.waitForTimeout(1200) - await expect(page.getByTestId('page_value')).toHaveText('1') -}) - -test('linker', ()=>{ - const ss = parseLink('/some-pathname?param1=1') - if (ss instanceof URL) { - throw new Error('The link is URL') - } - const builder = createLinker(ss) - expect(builder.asString()).toBe('/some-pathname?param1=1') - expect(builder.getLink()).toEqual(ss) - - expect(parseRelativeLink('/some-pathname?param1=1').asString()).toEqual(ss.asString()) - expect(() => parseRelativeLink('https://example.com/some-pathname?param1=1')).toThrowError('The link is URL') - expect(() => parseRelativeLink('ftp://example.com/some-pathname?param1=1')).toThrowError('The link is URL') - expect(parseRelativeLink('ss/dd').asString()).toBe('/ss/dd') - expect(parseRelativeLink('').asString()).toBe('/') -}) +import { expect, test } from "@playwright/test"; +import { + createLinker, + createLinkerUrl, + parseLink, + queryToSearchParams, +} from "../src/index"; +import parseRelativeLink from "../src/utils/parseRelativeLink"; + +test("URL parameter handling and linker functionality", async ({ page }) => { + await page.goto("/"); + await expect(page).toHaveURL("/"); + + await expect(page.getByTestId("current_url")).toHaveText("/"); + await expect(page.getByTestId("current_url_1")).toHaveText( + "/?book_param=1&das_ist=das_ist_string", + ); + await expect(page.getByTestId("current_url_2")).toHaveText("/"); + await expect(page.getByTestId("current_url_3")).toHaveText( + "/?string_param=params_some", + ); + + await page.goto("/?string_param=params_some"); + await expect(page.getByTestId("search_params_str")).toHaveText("params_some"); + + await page.goto("/some-random-page"); + await expect(page).toHaveURL("/some-random-page"); + await expect(page.getByTestId("current_url")).toHaveText("/some-random-page"); + await expect(page.getByTestId("current_url_1")).toHaveText( + "/some-random-page?book_param=1&das_ist=das_ist_string", + ); + await expect(page.getByTestId("current_url_2")).toHaveText( + "/some-random-page", + ); + await expect(page.getByTestId("current_url_3")).toHaveText( + "/some-random-page?string_param=params_some", + ); +}); + +test("queryToSearchParams utility function", async () => { + const result = queryToSearchParams({ + ww: ["a", "b"], + c: "n", + v: undefined, + }); + + expect(result.toString()).toBe("ww=a&ww=b&c=n"); +}); +test("useParamState hook - URL state synchronization with debouncing", async ({ + page, +}) => { + await page.goto("/url-state-form"); + await expect(page).toHaveURL("/url-state-form"); + page.on("console", (msg) => console.log(msg.text())); + + await page.getByTestId("form-input").pressSequentially("Hello World!", { + delay: 100, + }); + + await expect( + page.getByTestId("url_change_time"), + "No URL changes should occur while user is typing due to debouncing", + ).toHaveText("0"); + + await page.waitForTimeout(1000); + + await expect( + page.getByTestId("url_change_time"), + "Debounce callback should trigger when user stops typing", + ).toHaveText("1"); + + await page.waitForTimeout(1000); + await expect( + page.getByTestId("url_change_time"), + "No additional updates should occur after debounce completes", + ).toHaveText("1"); + + const expectedUrl = new URLSearchParams(); + expectedUrl.set("url_change_test_input_value", "Hello World!"); + await expect(page).toHaveURL("/url-state-form?" + expectedUrl.toString()); + await expect( + page.getByTestId("form-input"), + "Input value is the same as typed", + ).toHaveValue("Hello World!", { + timeout: 3000, + }); + + await page.getByTestId("change_url_button").click(); + + await expect(page).toHaveURL( + "/url-state-form?url_change_test_input_value=text_updated_from_nextjs_router", + ); + + await expect( + page.getByTestId("form-input"), + "Form input should sync with Next.js router URL changes", + ).toHaveValue("text_updated_from_nextjs_router", { + timeout: 3000, + }); + + await page.goto( + "/url-state-form?url_change_test_input_value=text_updated_from_browser_router", + ); + await expect(page).toHaveURL( + "/url-state-form?url_change_test_input_value=text_updated_from_browser_router", + ); + + await expect( + page.getByTestId("form-input"), + "Form input should sync with browser API URL changes", + ).toHaveValue("text_updated_from_browser_router", { + timeout: 3000, + }); + + //Test value change middleware + await expect(page.getByTestId("page_value")).toHaveText("1"); + + await page.getByTestId("next_page").click(); + await expect(page.getByTestId("page_value")).toHaveText("2"); + await page + .getByTestId("form-input") + .pressSequentially("not trigger page reset"); + await expect(page.getByTestId("page_value")).toHaveText("2"); + + await page.waitForTimeout(1200); + + await page.getByTestId("toggle_page_reset").click(); + await expect(page.getByTestId("page_reset_active")).toHaveText( + "Page reset active", + ); + await page.getByTestId("form-input").pressSequentially("trigger page reset"); + await page.waitForTimeout(1200); + await expect(page.getByTestId("page_value")).toHaveText("1"); +}); + +test("linker", () => { + const ss = parseLink("/some-pathname?param1=1"); + if (ss instanceof URL) { + throw new Error("The link is URL"); + } + const builder = createLinker(ss); + expect(builder.asString()).toBe("/some-pathname?param1=1"); + expect(builder.getLink()).toEqual(ss); + + expect(parseRelativeLink("/some-pathname?param1=1").asString()).toEqual( + ss.asString(), + ); + expect(() => + parseRelativeLink("https://example.com/some-pathname?param1=1"), + ).toThrowError("The link is URL"); + expect(() => + parseRelativeLink("ftp://example.com/some-pathname?param1=1"), + ).toThrowError("The link is URL"); + expect(parseRelativeLink("ss/dd").asString()).toBe("/ss/dd"); + expect(parseRelativeLink("").asString()).toBe("/"); +}); diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..c3e7534 --- /dev/null +++ b/biome.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.11/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/build.config.json b/build.config.json index 2c6f04d..c57f6fb 100644 --- a/build.config.json +++ b/build.config.json @@ -1,6 +1,3 @@ { - "paths": [ - "./src/**/*.tsx", - "./src/**/*.ts" - ] + "paths": ["./src/**/*.tsx", "./src/**/*.ts"] } diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index c3d36cb..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,18 +0,0 @@ - -import love from 'eslint-config-love' -import reactHooks from 'eslint-plugin-react-hooks'; -import { defineConfig } from 'eslint/config'; - - -export default defineConfig([ - { - ignores:[ - './dist/**' - ] - }, - { - ...love, - files: ['./src/**/*.tsx', './src/**/*.ts'], - }, - reactHooks.configs.flat['recommended-latest'], -]) \ No newline at end of file diff --git a/next-app-mock/next.config.js b/next-app-mock/next.config.js index e09fc97..658404a 100644 --- a/next-app-mock/next.config.js +++ b/next-app-mock/next.config.js @@ -1,10 +1,4 @@ /** @type {import('next').NextConfig} */ -const nextConfig = { - eslint: { - // Warning: This allows production builds to successfully complete even if - // your project has ESLint errors. - ignoreDuringBuilds: true, - } -} +const nextConfig = {}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/next-app-mock/package.json b/next-app-mock/package.json index ca17847..b882efd 100644 --- a/next-app-mock/package.json +++ b/next-app-mock/package.json @@ -1,25 +1,23 @@ { - "name": "next-app-mock", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "rm -rf .next && next build", - "start": "next start", - "clean": "rm -rf .next" - }, - "dependencies": { - "next": "16.2.3", - "react": "^19.1.0", - "react-dom": "^19.1.0" - }, - "devDependencies": { - "@types/node": "^24.0.3", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "eslint": "^9.29.0", - "eslint-config-next": "16.2.3", - "typescript": "^5.8.3" - }, - "packageManager": "pnpm@10.33.0" + "name": "next-app-mock", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "rm -rf .next && next build", + "start": "next start", + "clean": "rm -rf .next" + }, + "dependencies": { + "next": "16.2.3", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@types/node": "^24.0.3", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "typescript": "^5.8.3" + }, + "packageManager": "pnpm@10.33.0" } diff --git a/next-app-mock/src/CurrentUrlBlock.tsx b/next-app-mock/src/CurrentUrlBlock.tsx index e14763c..72d54d0 100644 --- a/next-app-mock/src/CurrentUrlBlock.tsx +++ b/next-app-mock/src/CurrentUrlBlock.tsx @@ -1,17 +1,32 @@ -'use client' -import {useLinker,useRelativeLink,} from "@/dist-lib/client" -import {stringType,boolType} from "@/dist-lib/parameters" +"use client"; +import { useLinker, useRelativeLink } from "@/dist-lib/client"; +import { boolType, stringType } from "@/dist-lib/parameters"; + const CurrentUrlBlock = () => { - const currentUrl = useRelativeLink() - const link = useLinker() - return
-
{currentUrl.asString()}
-
{link().setValue({name: 'book_param',...boolType}, true).setValue({name: 'das_ist', ...stringType}, 'das_ist_string').asString()}
-
{link().asString()}
-
{ link().setValue({ - ...stringType, - name: 'string_param' - }, 'params_some').asString()}
-
-} -export default CurrentUrlBlock + const currentUrl = useRelativeLink(); + const link = useLinker(); + return ( +
+
{currentUrl.asString()}
+
+ {link() + .setValue({ name: "book_param", ...boolType }, true) + .setValue({ name: "das_ist", ...stringType }, "das_ist_string") + .asString()} +
+
{link().asString()}
+
+ {link() + .setValue( + { + ...stringType, + name: "string_param", + }, + "params_some", + ) + .asString()} +
+
+ ); +}; +export default CurrentUrlBlock; diff --git a/next-app-mock/src/app/layout.tsx b/next-app-mock/src/app/layout.tsx index 10c4e32..ea8e629 100644 --- a/next-app-mock/src/app/layout.tsx +++ b/next-app-mock/src/app/layout.tsx @@ -1,24 +1,23 @@ -import CurrentUrlBlock from "@/CurrentUrlBlock" -import type {Metadata} from 'next' -import {FunctionComponent, ReactNode, Suspense} from "react" - +import type { Metadata } from "next"; +import { type FunctionComponent, type ReactNode, Suspense } from "react"; +import CurrentUrlBlock from "@/CurrentUrlBlock"; export const metadata: Metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -} + title: "Create Next App", + description: "Generated by create next app", +}; const RootLayout: FunctionComponent<{ - children: ReactNode -}> = ({children}) => { - return ( - - - - - - {children} - - - ) -} -export default RootLayout + children: ReactNode; +}> = ({ children }) => { + return ( + + + + + + {children} + + + ); +}; +export default RootLayout; diff --git a/next-app-mock/src/app/page.module.css b/next-app-mock/src/app/page.module.css index 6676d2c..6c6bf6c 100644 --- a/next-app-mock/src/app/page.module.css +++ b/next-app-mock/src/app/page.module.css @@ -1,229 +1,231 @@ .main { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - padding: 6rem; - min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; } .description { - display: inherit; - justify-content: inherit; - align-items: inherit; - font-size: 0.85rem; - max-width: var(--max-width); - width: 100%; - z-index: 2; - font-family: var(--font-mono); + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); } .description a { - display: flex; - justify-content: center; - align-items: center; - gap: 0.5rem; + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; } .description p { - position: relative; - margin: 0; - padding: 1rem; - background-color: rgba(var(--callout-rgb), 0.5); - border: 1px solid rgba(var(--callout-border-rgb), 0.3); - border-radius: var(--border-radius); + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); } .code { - font-weight: 700; - font-family: var(--font-mono); + font-weight: 700; + font-family: var(--font-mono); } .grid { - display: grid; - grid-template-columns: repeat(4, minmax(25%, auto)); - max-width: 100%; - width: var(--max-width); + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + max-width: 100%; + width: var(--max-width); } .card { - padding: 1rem 1.2rem; - border-radius: var(--border-radius); - background: rgba(var(--card-rgb), 0); - border: 1px solid rgba(var(--card-border-rgb), 0); - transition: background 200ms, border 200ms; + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: + background 200ms, + border 200ms; } .card span { - display: inline-block; - transition: transform 200ms; + display: inline-block; + transition: transform 200ms; } .card h2 { - font-weight: 600; - margin-bottom: 0.7rem; + font-weight: 600; + margin-bottom: 0.7rem; } .card p { - margin: 0; - opacity: 0.6; - font-size: 0.9rem; - line-height: 1.5; - max-width: 30ch; + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; } .center { - display: flex; - justify-content: center; - align-items: center; - position: relative; - padding: 4rem 0; + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; } .center::before { - background: var(--secondary-glow); - border-radius: 50%; - width: 480px; - height: 360px; - margin-left: -400px; + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; } .center::after { - background: var(--primary-glow); - width: 240px; - height: 180px; - z-index: -1; + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; } .center::before, .center::after { - content: ''; - left: 50%; - position: absolute; - filter: blur(45px); - transform: translateZ(0); + content: ""; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); } .logo { - position: relative; + position: relative; } /* Enable hover only on non-touch devices */ @media (hover: hover) and (pointer: fine) { - .card:hover { - background: rgba(var(--card-rgb), 0.1); - border: 1px solid rgba(var(--card-border-rgb), 0.15); - } + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } - .card:hover span { - transform: translateX(4px); - } + .card:hover span { + transform: translateX(4px); + } } @media (prefers-reduced-motion) { - .card:hover span { - transform: none; - } + .card:hover span { + transform: none; + } } /* Mobile */ @media (max-width: 700px) { - .content { - padding: 4rem; - } - - .grid { - grid-template-columns: 1fr; - margin-bottom: 120px; - max-width: 320px; - text-align: center; - } - - .card { - padding: 1rem 2.5rem; - } - - .card h2 { - margin-bottom: 0.5rem; - } - - .center { - padding: 8rem 0 6rem; - } - - .center::before { - transform: none; - height: 300px; - } - - .description { - font-size: 0.8rem; - } - - .description a { - padding: 1rem; - } - - .description p, - .description div { - display: flex; - justify-content: center; - position: fixed; - width: 100%; - } - - .description p { - align-items: center; - inset: 0 0 auto; - padding: 2rem 1rem 1.4rem; - border-radius: 0; - border: none; - border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); - background: linear-gradient( - to bottom, - rgba(var(--background-start-rgb), 1), - rgba(var(--callout-rgb), 0.5) - ); - background-clip: padding-box; - backdrop-filter: blur(24px); - } - - .description div { - align-items: flex-end; - pointer-events: none; - inset: auto 0 0; - padding: 2rem; - height: 200px; - background: linear-gradient( - to bottom, - transparent 0%, - rgb(var(--background-end-rgb)) 40% - ); - z-index: 1; - } + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } } /* Tablet and Smaller Desktop */ @media (min-width: 701px) and (max-width: 1120px) { - .grid { - grid-template-columns: repeat(2, 50%); - } + .grid { + grid-template-columns: repeat(2, 50%); + } } @media (prefers-color-scheme: dark) { - .vercelLogo { - filter: invert(1); - } + .vercelLogo { + filter: invert(1); + } - .logo { - filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); - } + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } } @keyframes rotate { - from { - transform: rotate(360deg); - } - to { - transform: rotate(0deg); - } + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } } diff --git a/next-app-mock/src/app/page.tsx b/next-app-mock/src/app/page.tsx index 6886909..6a5fb0e 100644 --- a/next-app-mock/src/app/page.tsx +++ b/next-app-mock/src/app/page.tsx @@ -1,13 +1,15 @@ -import {getQueryParamValue,QueryParameters} from "@/dist-lib" -import { stringType } from "@/dist-lib/parameters" +import { getQueryParamValue, type QueryParameters } from "@/dist-lib"; +import { stringType } from "@/dist-lib/parameters"; -const Page = async ({searchParams}:{searchParams:Promise}) => { - const value = getQueryParamValue(await searchParams,{ - name:'string_param', - ...stringType - }) - return
- {value} -
-} -export default Page +const Page = async ({ + searchParams, +}: { + searchParams: Promise; +}) => { + const value = getQueryParamValue(await searchParams, { + name: "string_param", + ...stringType, + }); + return
{value}
; +}; +export default Page; diff --git a/next-app-mock/src/app/some-random-page/page.tsx b/next-app-mock/src/app/some-random-page/page.tsx index d380b00..69723d5 100644 --- a/next-app-mock/src/app/some-random-page/page.tsx +++ b/next-app-mock/src/app/some-random-page/page.tsx @@ -1,10 +1,8 @@ +import type { FunctionComponent } from "react"; import { ParameterOptions } from "@/dist-lib"; import { pageType } from "@/dist-lib/parameters"; -import { FunctionComponent } from "react"; -const Page:FunctionComponent =()=>{ -return
- Some random page -
-} -export default Page \ No newline at end of file +const Page: FunctionComponent = () => { + return
Some random page
; +}; +export default Page; diff --git a/next-app-mock/src/app/url-state-form/Form.tsx b/next-app-mock/src/app/url-state-form/Form.tsx index db616ef..340614d 100644 --- a/next-app-mock/src/app/url-state-form/Form.tsx +++ b/next-app-mock/src/app/url-state-form/Form.tsx @@ -1,57 +1,82 @@ -'use client' -import { pageType, stringType } from "@/dist-lib/parameters" +"use client"; import { useRouter, useSearchParams } from "next/navigation"; -import { FunctionComponent, useEffect, useRef, useState } from "react"; -import { useParamState } from "@/dist-lib/client"; -import { ParameterOptions, ValuedParameter } from "../../../../dist/types"; import { encode } from "querystring"; -const pageParam:ParameterOptions = { - name:'page', - ...pageType -} -const valueParam = { - ...stringType, - name:'url_change_test_input_value', - } -const Form:FunctionComponent = ()=>{ - const [isResetPage,setIsResetPage] = useState(false) - const [value,setValue] = useParamState(valueParam,{ - updateValue: (link) =>{ - if (isResetPage) { - link.setValue(pageParam,1) - } - return link - }, - }) //This tests `updateValues` type safey. It cause a bad developer experience, so keep it to prrof that type afety works without ny issues for the developer - const [page,setPage] = useParamState(pageParam,) - const router = useRouter() - const [countSearchParamsChanged,setCountSearchParamsChanged] = useState(0) - const queryStr = useSearchParams().toString() - const prevQueryStrRef = useRef(queryStr) - useEffect(()=>{ - if (prevQueryStrRef.current !== queryStr) { - setCountSearchParamsChanged(prev=>prev+1) - prevQueryStrRef.current = queryStr - +import { type FunctionComponent, useEffect, useRef, useState } from "react"; +import { useParamState } from "@/dist-lib/client"; +import { pageType, stringType } from "@/dist-lib/parameters"; +import { type ParameterOptions, ValuedParameter } from "../../../../dist/types"; - } - },[queryStr]) - return
- { - setValue(e.target.value) - }} value={value??''}> -
{countSearchParamsChanged}
- - - -
{page}
- {isResetPage &&
Page reset active
} -
-} -export default Form \ No newline at end of file +const pageParam: ParameterOptions = { + name: "page", + ...pageType, +}; +const valueParam = { + ...stringType, + name: "url_change_test_input_value", +}; +const Form: FunctionComponent = () => { + const [isResetPage, setIsResetPage] = useState(false); + const [value, setValue] = useParamState(valueParam, { + updateValue: (link) => { + if (isResetPage) { + link.setValue(pageParam, 1); + } + return link; + }, + }); //This tests `updateValues` type safey. It cause a bad developer experience, so keep it to prrof that type afety works without ny issues for the developer + const [page, setPage] = useParamState(pageParam); + const router = useRouter(); + const [countSearchParamsChanged, setCountSearchParamsChanged] = useState(0); + const queryStr = useSearchParams().toString(); + const prevQueryStrRef = useRef(queryStr); + useEffect(() => { + if (prevQueryStrRef.current !== queryStr) { + setCountSearchParamsChanged((prev) => prev + 1); + prevQueryStrRef.current = queryStr; + } + }, [queryStr]); + return ( +
+ { + setValue(e.target.value); + }} + value={value ?? ""} + > +
{countSearchParamsChanged}
+ + + +
{page}
+ {isResetPage && ( +
Page reset active
+ )} +
+ ); +}; +export default Form; diff --git a/next-app-mock/src/app/url-state-form/page.tsx b/next-app-mock/src/app/url-state-form/page.tsx index 5d6ebc0..68b6f28 100644 --- a/next-app-mock/src/app/url-state-form/page.tsx +++ b/next-app-mock/src/app/url-state-form/page.tsx @@ -1,12 +1,13 @@ -import { FunctionComponent, Suspense } from "react"; +import { type FunctionComponent, Suspense } from "react"; import Form from "./Form"; -const Page:FunctionComponent = ()=>{ -return
- -
- -
- -} -export default Page \ No newline at end of file +const Page: FunctionComponent = () => { + return ( +
+ + + +
+ ); +}; +export default Page; diff --git a/next-app-mock/tsconfig.json b/next-app-mock/tsconfig.json index 265873b..9a2c33c 100644 --- a/next-app-mock/tsconfig.json +++ b/next-app-mock/tsconfig.json @@ -1,49 +1,30 @@ { - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": [ - "./src/*" - ], - "@/dist-lib": [ - "../dist/index" - ], - "@/dist-lib/client": [ - "../dist/client" - ], - "@/dist-lib/parameters": [ - "../dist/parameters" - ] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} \ No newline at end of file + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"], + "@/dist-lib": ["../dist/index"], + "@/dist-lib/client": ["../dist/client"], + "@/dist-lib/parameters": ["../dist/parameters"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/package.json b/package.json index 6a1fa38..56c9a7b 100644 --- a/package.json +++ b/package.json @@ -1,76 +1,74 @@ { - "author": { - "name": "l-you", - "email": "l-you@revotale.com", - "url": "https://github.com/l-you" - }, - "version": "1.0.4", - "name": "next-navigation-utils", - "main": "src/index.ts", - "license": "MIT", - "private": false, - "sideEffects": false, - "exports": { - "./package.json": "./package.json", - ".": { - "types": "./index.d.ts", - "import": "./index.js", - "require": "./index.cjs" - }, - "./client": { - "types": "./client.d.ts", - "import": "./client.js", - "require": "./client.cjs" - }, - "./parameters": { - "types": "./parameters/index.d.ts", - "import": "./parameters/index.js", - "require": "./parameters/index.cjs" - } - }, - "publishConfig": { - "provenance": true, - "access": "public", - "main": "index.js", - "directory": "dist" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/RevoTale/next-navigation-utils.git" - }, - "type": "module", - "scripts": { - "build": "tsup && cp package.json README.md LICENSE dist/", - "tsc": "tsc --noEmit", - "changeset:version": "changeset version && git add --all", - "changeset:publish": "changeset publish", - "prepare": "pnpm build", - "test": "pnpm lint && pnpm tsc && pnpm unit", - "unit": "playwright test -x", - "lint": "eslint .", - "lint:fix": "eslint --fix ." - }, - "bugs": { - "url": "https://github.com/RevoTale/next-navigation-utils/issues" - }, - "devDependencies": { - "@changesets/cli": "^2.29.7", - "@playwright/test": "^1.55.1", - "@types/node": "^24.6.0", - "@types/react": "^19.1.14", - "changeset": "^0.2.6", - "eslint": "^9.36.0", - "eslint-config-love": "^137.0.0", - "eslint-plugin-react-hooks": "^7.0.0", - "typescript": "^5.9.2" - }, - "peerDependencies": { - "next": "^14.0 || ^15.0 || ^16.0.0", - "react": "^18.0 || ^19.0" - }, - "packageManager": "pnpm@10.33.0", - "dependencies": { - "tsup": "^8.5.0", - "use-debounce": "^10.0.6" - } + "author": { + "name": "l-you", + "email": "l-you@revotale.com", + "url": "https://github.com/l-you" + }, + "version": "1.0.4", + "name": "next-navigation-utils", + "main": "src/index.ts", + "license": "MIT", + "private": false, + "sideEffects": false, + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./index.d.ts", + "import": "./index.js", + "require": "./index.cjs" + }, + "./client": { + "types": "./client.d.ts", + "import": "./client.js", + "require": "./client.cjs" + }, + "./parameters": { + "types": "./parameters/index.d.ts", + "import": "./parameters/index.js", + "require": "./parameters/index.cjs" + } + }, + "publishConfig": { + "provenance": true, + "access": "public", + "main": "index.js", + "directory": "dist" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/RevoTale/next-navigation-utils.git" + }, + "type": "module", + "scripts": { + "build": "tsup && cp package.json README.md LICENSE dist/", + "tsc": "tsc --noEmit", + "changeset:version": "changeset version && git add --all", + "changeset:publish": "changeset publish", + "prepare": "pnpm build", + "test": "pnpm lint && pnpm tsc && pnpm unit", + "unit": "playwright test -x", + "lint": "pnpx @biomejs/biome check .", + "lint:fix": "pnpx @biomejs/biome check --write" + }, + "bugs": { + "url": "https://github.com/RevoTale/next-navigation-utils/issues" + }, + "devDependencies": { + "@changesets/cli": "^2.29.7", + "@playwright/test": "^1.55.1", + "@types/node": "^24.6.0", + "@types/react": "^19.1.14", + "changeset": "^0.2.6", + "typescript": "^5.9.2" + }, + "peerDependencies": { + "next": "^14.0 || ^15.0 || ^16.0.0", + "react": "^18.0 || ^19.0" + }, + "packageManager": "pnpm@10.33.0", + "dependencies": { + "@biomejs/biome": "^2.4.11", + "tsup": "^8.5.0", + "use-debounce": "^10.0.6" + } } diff --git a/playwright.config.ts b/playwright.config.ts index d0aaa12..2bc424c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,4 +1,4 @@ -import { defineConfig, devices } from '@playwright/test' +import { defineConfig, devices } from "@playwright/test"; /** * Read environment variables from file. @@ -9,45 +9,44 @@ import { defineConfig, devices } from '@playwright/test' /** * See https://playwright.dev/docs/test-configuration. */ -const port = Number(process.env.PORT)||3033 +const port = Number(process.env.PORT) || 3033; export default defineConfig({ - webServer: { - command: `pnpm build && pnpm -C ./next-app-mock build && pnpm -C ./next-app-mock start --port ${port}`, - port:port, - reuseExistingServer: false // Always fresh for testing - }, - use: { - baseURL: `http://127.0.0.1:${port}`, - trace: 'on-first-retry', - }, - testDir: './__tests__', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, + webServer: { + command: `pnpm build && pnpm -C ./next-app-mock build && pnpm -C ./next-app-mock start --port ${port}`, + port: port, + reuseExistingServer: false, // Always fresh for testing + }, + use: { + baseURL: `http://127.0.0.1:${port}`, + trace: "on-first-retry", + }, + testDir: "./__tests__", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: [ ['html', { open: 'never' }] ], - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: [["html", { open: "never" }]], + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - ], -}) + { + name: "webkit", + use: { ...devices["Desktop Safari"] }, + }, + ], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 008d530..67b24d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@biomejs/biome': + specifier: ^2.4.11 + version: 2.4.11 next: specifier: ^14.0 || ^15.0 || ^16.0.0 version: 15.4.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -36,15 +39,6 @@ importers: changeset: specifier: ^0.2.6 version: 0.2.6 - eslint: - specifier: ^9.36.0 - version: 9.39.4 - eslint-config-love: - specifier: ^137.0.0 - version: 137.0.0(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - eslint-plugin-react-hooks: - specifier: ^7.0.0 - version: 7.0.1(eslint@9.39.4) typescript: specifier: ^5.9.2 version: 5.9.3 @@ -123,6 +117,63 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@biomejs/biome@2.4.11': + resolution: {integrity: sha512-nWxHX8tf3Opb/qRgZpBbsTOqOodkbrkJ7S+JxJAruxOReaDPPmPuLBAGQ8vigyUgo0QBB+oQltNEAvalLcjggA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.11': + resolution: {integrity: sha512-wOt+ed+L2dgZanWyL6i29qlXMc088N11optzpo10peayObBaAshbTcxKUchzEMp9QSY8rh5h6VfAFE3WTS1rqg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.11': + resolution: {integrity: sha512-gZ6zR8XmZlExfi/Pz/PffmdpWOQ8Qhy7oBztgkR8/ylSRyLwfRPSadmiVCV8WQ8PoJ2MWUy2fgID9zmtgUUJmw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.11': + resolution: {integrity: sha512-+Sbo1OAmlegtdwqFE8iOxFIWLh1B3OEgsuZfBpyyN/kWuqZ8dx9ZEes6zVnDMo+zRHF2wLynRVhoQmV7ohxl2Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.4.11': + resolution: {integrity: sha512-avdJaEElXrKceK0va9FkJ4P5ci3N01TGkc6ni3P8l3BElqbOz42Wg2IyX3gbh0ZLEd4HVKEIrmuVu/AMuSeFFA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.4.11': + resolution: {integrity: sha512-bexd2IklK7ZgPhrz6jXzpIL6dEAH9MlJU1xGTrypx+FICxrXUp4CqtwfiuoDKse+UlgAlWtzML3jrMqeEAHEhA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.4.11': + resolution: {integrity: sha512-TagWV0iomp5LnEnxWFg4nQO+e52Fow349vaX0Q/PIcX6Zhk4GGBgp3qqZ8PVkpC+cuehRctMf3+6+FgQ8jCEFQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.4.11': + resolution: {integrity: sha512-RJhaTnY8byzxDt4bDVb7AFPHkPcjOPK3xBip4ZRTrN3TEfyhjLRm3r3mqknqydgVTB74XG8l4jMLwEACEeihVg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.11': + resolution: {integrity: sha512-A8D3JM/00C2KQgUV3oj8Ba15EHEYwebAGCy5Sf9GAjr5Y3+kJIYOiESoqRDeuRZueuMdCsbLZIUqmPhpYXJE9A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@changesets/apply-release-plan@7.1.0': resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} @@ -337,60 +388,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.21.2': - resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - '@img/sharp-darwin-arm64@0.34.3': resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -757,21 +754,12 @@ packages: cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -781,78 +769,11 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - '@typescript-eslint/eslint-plugin@8.44.1': - resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.44.1 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.44.1': - resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.44.1': - resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.44.1': - resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.44.1': - resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.44.1': - resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.44.1': - resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.44.1': - resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.44.1': - resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/visitor-keys@8.44.1': - resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -882,42 +803,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -929,9 +818,6 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -954,29 +840,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - caniuse-lite@1.0.30001751: resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} @@ -1008,9 +874,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -1028,26 +891,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1057,17 +900,6 @@ packages: supports-color: optional: true - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1080,14 +912,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1100,42 +924,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - esbuild@0.27.0: resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} engines: {node: '>=18'} @@ -1145,153 +937,18 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-love@137.0.0: - resolution: {integrity: sha512-smNgxzXJXPz0tsehcqm3cqEgoLRAehwE9OGYPfYYnrpkmRiPEXjmIHSSVH09OtWlzR71Nkt24PXcQnSbzvdCnQ==} - peerDependencies: - eslint: ^9.35.0 - typescript: '*' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - 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 - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-n@17.23.1: - resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-plugin-promise@7.2.1: - resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -1304,10 +961,6 @@ packages: picomatch: optional: true - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1316,24 +969,9 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.4.1: - resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==} - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1356,110 +994,26 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - - globalthis@1.0.4: - 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'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - human-id@4.1.3: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true @@ -1472,140 +1026,33 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1632,19 +1079,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1653,13 +1087,6 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1675,13 +1102,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -1694,10 +1114,6 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1706,16 +1122,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1738,9 +1148,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.4.7: resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -1770,41 +1177,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -1813,18 +1188,10 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -1839,10 +1206,6 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1851,9 +1214,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -1907,10 +1267,6 @@ packages: engines: {node: '>=18'} hasBin: true - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1933,19 +1289,11 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -1969,30 +1317,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - resolve-from@4.0.0: - 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==} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2005,18 +1333,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2037,18 +1353,6 @@ packages: engines: {node: '>=10'} hasBin: true - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - sharp@0.34.3: resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2061,22 +1365,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2102,10 +1390,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2114,18 +1398,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2138,10 +1410,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -2160,18 +1428,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} - engines: {node: '>=6'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -2198,23 +1454,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-declaration-location@1.0.7: - resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} - peerDependencies: - typescript: '>=4.0.0' - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2237,33 +1479,6 @@ packages: typescript: optional: true - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typescript-eslint@8.44.1: - resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -2275,10 +1490,6 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -2295,40 +1506,17 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-debounce@10.1.1: resolution: {integrity: sha512-kvds8BHR2k28cFsxW8k3nc/tRga2rs1RHYCqmmGqb90MEeE++oALwzh2COiuBLO1/QXiOuShXoSN2ZpWnMmvuQ==} engines: {node: '>= 16.0.0'} peerDependencies: react: '*' - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2340,19 +1528,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - - zod@4.1.12: - resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} - snapshots: '@babel/code-frame@7.27.1': @@ -2360,8 +1535,10 @@ snapshots: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 + optional: true - '@babel/compat-data@7.28.5': {} + '@babel/compat-data@7.28.5': + optional: true '@babel/core@7.28.5': dependencies: @@ -2382,6 +1559,7 @@ snapshots: semver: 6.3.1 transitivePeerDependencies: - supports-color + optional: true '@babel/generator@7.28.5': dependencies: @@ -2390,6 +1568,7 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + optional: true '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -2398,8 +1577,10 @@ snapshots: browserslist: 4.27.0 lru-cache: 5.1.1 semver: 6.3.1 + optional: true - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.28.0': + optional: true '@babel/helper-module-imports@7.27.1': dependencies: @@ -2407,6 +1588,7 @@ snapshots: '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color + optional: true '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: @@ -2416,21 +1598,27 @@ snapshots: '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + optional: true - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.27.1': + optional: true - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.28.5': + optional: true - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.27.1': + optional: true '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 '@babel/types': 7.28.5 + optional: true '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 + optional: true '@babel/runtime@7.28.6': {} @@ -2439,6 +1627,7 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 + optional: true '@babel/traverse@7.28.5': dependencies: @@ -2451,11 +1640,48 @@ snapshots: debug: 4.4.3 transitivePeerDependencies: - supports-color + optional: true '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + optional: true + + '@biomejs/biome@2.4.11': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.11 + '@biomejs/cli-darwin-x64': 2.4.11 + '@biomejs/cli-linux-arm64': 2.4.11 + '@biomejs/cli-linux-arm64-musl': 2.4.11 + '@biomejs/cli-linux-x64': 2.4.11 + '@biomejs/cli-linux-x64-musl': 2.4.11 + '@biomejs/cli-win32-arm64': 2.4.11 + '@biomejs/cli-win32-x64': 2.4.11 + + '@biomejs/cli-darwin-arm64@2.4.11': + optional: true + + '@biomejs/cli-darwin-x64@2.4.11': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.11': + optional: true + + '@biomejs/cli-linux-arm64@2.4.11': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.11': + optional: true + + '@biomejs/cli-linux-x64@2.4.11': + optional: true + + '@biomejs/cli-win32-arm64@2.4.11': + optional: true + + '@biomejs/cli-win32-x64@2.4.11': + optional: true '@changesets/apply-release-plan@7.1.0': dependencies: @@ -2683,63 +1909,6 @@ snapshots: '@esbuild/win32-x64@0.27.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': - dependencies: - eslint: 9.39.4 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/config-array@0.21.2': - dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.3 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 - - '@eslint/core@0.17.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.5': - dependencies: - ajv: 6.14.0 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.4': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.7': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.4.3': {} - '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.0 @@ -2852,15 +2021,18 @@ snapshots: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.25 + optional: true '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + optional: true '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/set-array@1.2.1': + optional: true '@jridgewell/sourcemap-codec@1.5.5': {} @@ -2868,6 +2040,7 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + optional: true '@jridgewell/trace-mapping@0.3.31': dependencies: @@ -3006,18 +2179,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true - '@rtsao/scc@1.1.0': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 '@types/estree@1.0.8': {} - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - '@types/node@12.20.55': {} '@types/node@24.12.2': @@ -3028,112 +2195,8 @@ snapshots: dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.44.1 - eslint: 9.39.4 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.44.1 - debug: 4.4.3 - eslint: 9.39.4 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.44.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.3) - '@typescript-eslint/types': 8.44.1 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.44.1': - dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 - - '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.44.1(eslint@9.39.4)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.4 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.44.1': {} - - '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.44.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.3) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 - debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.9 - semver: 7.7.4 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.44.1(eslint@9.39.4)(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) - eslint: 9.39.4 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.44.1': - dependencies: - '@typescript-eslint/types': 8.44.1 - eslint-visitor-keys: 4.2.1 - - acorn-jsx@5.3.2(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - acorn@8.16.0: {} - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -3154,77 +2217,17 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - array-union@2.1.0: {} - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - - async-function@1.0.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.20: {} + baseline-browser-mapping@2.8.20: + optional: true better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -3240,6 +2243,7 @@ snapshots: electron-to-chromium: 1.5.240 node-releases: 2.0.26 update-browserslist-db: 1.1.4(browserslist@4.27.0) + optional: true bundle-require@5.1.0(esbuild@0.27.0): dependencies: @@ -3248,32 +2252,8 @@ snapshots: cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - caniuse-lite@1.0.30001751: {} - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - changeset@0.2.6: dependencies: udc: 1.0.1 @@ -3307,13 +2287,12 @@ snapshots: commander@4.1.1: {} - concat-map@0.0.1: {} - confbox@0.1.8: {} consola@3.4.2: {} - convert-source-map@2.0.0: {} + convert-source-map@2.0.0: + optional: true cross-spawn@7.0.6: dependencies: @@ -3323,46 +2302,10 @@ snapshots: csstype@3.2.3: {} - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - detect-indent@6.1.0: {} detect-libc@2.0.4: @@ -3372,116 +2315,20 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.240: {} + electron-to-chromium@1.5.240: + optional: true emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.3 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - esbuild@0.27.0: optionalDependencies: '@esbuild/aix-ppc64': 0.27.0 @@ -3511,209 +2358,22 @@ snapshots: '@esbuild/win32-ia32': 0.27.0 '@esbuild/win32-x64': 0.27.0 - escalade@3.2.0: {} + escalade@3.2.0: + optional: true - escape-string-regexp@1.0.5: {} + esprima@4.0.1: {} - escape-string-regexp@4.0.0: {} + extendable-error@0.1.7: {} - eslint-compat-utils@0.5.1(eslint@9.39.4): + fast-glob@3.3.3: dependencies: - eslint: 9.39.4 - semver: 7.7.4 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 - eslint-config-love@137.0.0(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3): - dependencies: - '@typescript-eslint/utils': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 - eslint-plugin-eslint-comments: 3.2.0(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4) - eslint-plugin-n: 17.23.1(eslint@9.39.4)(typescript@5.9.3) - eslint-plugin-promise: 7.2.1(eslint@9.39.4) - typescript: 5.9.3 - typescript-eslint: 8.44.1(eslint@9.39.4)(typescript@5.9.3) - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es-x@7.8.0(eslint@9.39.4): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.4 - eslint-compat-utils: 0.5.1(eslint@9.39.4) - - eslint-plugin-eslint-comments@3.2.0(eslint@9.39.4): - dependencies: - escape-string-regexp: 1.0.5 - eslint: 9.39.4 - ignore: 5.3.2 - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.39.4 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-n@17.23.1(eslint@9.39.4)(typescript@5.9.3): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - enhanced-resolve: 5.18.3 - eslint: 9.39.4 - eslint-plugin-es-x: 7.8.0(eslint@9.39.4) - get-tsconfig: 4.10.1 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.7.4 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript - - eslint-plugin-promise@7.2.1(eslint@9.39.4): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - eslint: 9.39.4 - - eslint-plugin-react-hooks@7.0.1(eslint@9.39.4): - dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - eslint: 9.39.4 - hermes-parser: 0.25.1 - zod: 4.1.12 - zod-validation-error: 4.0.2(zod@4.1.12) - transitivePeerDependencies: - - supports-color - - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint@9.39.4: - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 - - esprima@4.0.1: {} - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - extendable-error@0.1.7: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.20.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -3721,10 +2381,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3734,28 +2390,12 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 mlly: 1.8.0 rollup: 4.53.2 - flat-cache@4.0.1: - dependencies: - flatted: 3.4.1 - keyv: 4.5.4 - - flatted@3.4.1: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -3779,57 +2419,13 @@ snapshots: fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 + gensync@1.0.0-beta.2: + optional: true glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -3839,15 +2435,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - globals@14.0.0: {} - - globals@15.15.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3857,42 +2444,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globrex@0.1.2: {} - - gopd@1.2.0: {} - graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - - has-bigints@1.1.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - human-id@4.1.3: {} iconv-lite@0.7.2: @@ -3901,141 +2454,25 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-arrayish@0.3.2: optional: true - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-windows@1.0.2: {} - isarray@2.0.5: {} - isexe@2.0.0: {} jackspeak@3.4.3: @@ -4046,7 +2483,8 @@ snapshots: joycon@3.1.1: {} - js-tokens@4.0.0: {} + js-tokens@4.0.0: + optional: true js-yaml@3.14.2: dependencies: @@ -4057,33 +2495,16 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 + jsesc@3.1.0: + optional: true - json5@2.2.3: {} + json5@2.2.3: + optional: true jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -4094,12 +2515,6 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - lodash.startcase@4.4.0: {} lru-cache@10.4.3: {} @@ -4107,13 +2522,12 @@ snapshots: lru-cache@5.1.1: dependencies: yallist: 3.1.1 + optional: true magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - math-intrinsics@1.1.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -4121,16 +2535,10 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.12 - minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 - minimist@1.2.8: {} - minipass@7.1.2: {} mlly@1.8.0: @@ -4152,8 +2560,6 @@ snapshots: nanoid@3.3.11: {} - natural-compare@1.4.0: {} - next@15.4.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@next/env': 15.4.7 @@ -4178,60 +2584,13 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-releases@2.0.26: {} + node-releases@2.0.26: + optional: true object-assign@4.1.1: {} - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - outdent@0.5.0: {} - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -4240,18 +2599,10 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@2.1.0: {} p-try@2.2.0: {} @@ -4262,16 +2613,10 @@ snapshots: dependencies: quansync: 0.2.11 - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - path-exists@4.0.0: {} path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -4315,8 +2660,6 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(postcss@8.4.31): dependencies: lilconfig: 3.1.3 @@ -4329,12 +2672,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prelude-ls@1.2.1: {} - prettier@2.8.8: {} - punycode@2.3.1: {} - quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -4355,38 +2694,8 @@ snapshots: readdirp@4.1.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} rollup@4.53.2: @@ -4421,58 +2730,18 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - safer-buffer@2.1.2: {} scheduler@0.26.0: {} - semver@6.3.1: {} + semver@6.3.1: + optional: true semver@7.7.2: optional: true semver@7.7.4: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - sharp@0.34.3: dependencies: color: 4.2.3 @@ -4509,34 +2778,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - signal-exit@4.1.0: {} simple-swizzle@0.2.2: @@ -4557,11 +2798,6 @@ snapshots: sprintf-js@1.0.3: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4574,29 +2810,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4607,8 +2820,6 @@ snapshots: strip-bom@3.0.0: {} - strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.1.1): dependencies: client-only: 0.0.1 @@ -4626,14 +2837,6 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - tapable@2.2.3: {} - term-size@2.2.1: {} thenify-all@1.6.0: @@ -4657,24 +2860,8 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - - ts-declaration-location@1.0.7(typescript@5.9.3): - dependencies: - picomatch: 4.0.3 - typescript: 5.9.3 - ts-interface-checker@0.1.13: {} - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@2.8.1: {} tsup@8.5.1(postcss@8.4.31)(typescript@5.9.3): @@ -4705,67 +2892,12 @@ snapshots: - tsx - yaml - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typescript-eslint@8.44.1(eslint@9.39.4)(typescript@5.9.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.44.1(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - typescript@5.9.3: {} udc@1.0.1: {} ufo@1.6.1: {} - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - underscore@1.13.6: {} undici-types@7.16.0: {} @@ -4777,62 +2909,16 @@ snapshots: browserslist: 4.27.0 escalade: 3.2.0 picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 + optional: true use-debounce@10.1.1(react@19.1.1): dependencies: react: 19.1.1 - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which@2.0.2: dependencies: isexe: 2.0.0 - word-wrap@1.2.5: {} - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -4845,12 +2931,5 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 - yallist@3.1.1: {} - - yocto-queue@0.1.0: {} - - zod-validation-error@4.0.2(zod@4.1.12): - dependencies: - zod: 4.1.12 - - zod@4.1.12: {} + yallist@3.1.1: + optional: true diff --git a/renovate.json b/renovate.json index 6d51eb3..0917216 100644 --- a/renovate.json +++ b/renovate.json @@ -1,7 +1,4 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:recommended", - "group:allNonMajor" - ] + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended", "group:allNonMajor"] } diff --git a/src/client.ts b/src/client.ts index 0361a80..057f867 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,4 +1,4 @@ -export {default as useRelativeLink} from './client/useRelativeLink' -export {default as useLinker} from './client/useLinker' -export {default as useSearchParam} from './client/useSearchParam' -export {default as useParamState} from './state/useParamState' \ No newline at end of file +export { default as useLinker } from "./client/useLinker"; +export { default as useRelativeLink } from "./client/useRelativeLink"; +export { default as useSearchParam } from "./client/useSearchParam"; +export { default as useParamState } from "./state/useParamState"; diff --git a/src/client/useLinker.ts b/src/client/useLinker.ts index e9d7cad..85d45fa 100644 --- a/src/client/useLinker.ts +++ b/src/client/useLinker.ts @@ -1,12 +1,12 @@ -'use client' -import { useCallback } from "react" -import createLinker from "../utils/createLinker" -import type { Linker, RelativeURL } from "../types" -import useRelativeLink from "./useRelativeLink" +"use client"; +import { useCallback } from "react"; +import type { Linker, RelativeURL } from "../types"; +import createLinker from "../utils/createLinker"; +import useRelativeLink from "./useRelativeLink"; -const useLinker = (): () => Linker => { - const link = useRelativeLink() - return useCallback((): Linker => createLinker(link),[link]) -} +const useLinker = (): (() => Linker) => { + const link = useRelativeLink(); + return useCallback((): Linker => createLinker(link), [link]); +}; -export default useLinker +export default useLinker; diff --git a/src/client/useRelativeLink.ts b/src/client/useRelativeLink.ts index b101424..2eb85cd 100644 --- a/src/client/useRelativeLink.ts +++ b/src/client/useRelativeLink.ts @@ -1,13 +1,16 @@ -'use client' -import {usePathname, useSearchParams} from 'next/navigation' -import type { RelativeURL } from '../types' -import { useMemo } from 'react' -import createRelativeLink from '../utils/createRelativeLink'; +"use client"; +import { usePathname, useSearchParams } from "next/navigation"; +import { useMemo } from "react"; +import type { RelativeURL } from "../types"; +import createRelativeLink from "../utils/createRelativeLink"; const useRelativeLink = (): RelativeURL => { - const pathname = usePathname() - const searchParams = useSearchParams() - return useMemo(() => createRelativeLink(pathname, searchParams),[pathname, searchParams]) -} + const pathname = usePathname(); + const searchParams = useSearchParams(); + return useMemo( + () => createRelativeLink(pathname, searchParams), + [pathname, searchParams], + ); +}; -export default useRelativeLink +export default useRelativeLink; diff --git a/src/client/useSearchParam.ts b/src/client/useSearchParam.ts index 1bbcea0..4f328b1 100644 --- a/src/client/useSearchParam.ts +++ b/src/client/useSearchParam.ts @@ -1,11 +1,17 @@ -'use client' -import {useSearchParams} from "next/navigation" -import getSearchParamValue from "../searchParams/getSearchParamValue" -import type {ParameterOptions} from "../types" -import { useMemo } from "react" +"use client"; +import { useSearchParams } from "next/navigation"; +import { useMemo } from "react"; +import getSearchParamValue from "../searchParams/getSearchParamValue"; +import type { ParameterOptions } from "../types"; -const useSearchParam = ({decode,name}: Pick, 'decode' | 'name'>): T => { - const params = useSearchParams() - return useMemo(()=>getSearchParamValue(params, {decode,name}),[decode, name, params]) -} -export default useSearchParam +const useSearchParam = ({ + decode, + name, +}: Pick, "decode" | "name">): T => { + const params = useSearchParams(); + return useMemo( + () => getSearchParamValue(params, { decode, name }), + [decode, name, params], + ); +}; +export default useSearchParam; diff --git a/src/index.ts b/src/index.ts index d98da47..c666014 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,18 +1,14 @@ - - -export {default as getQueryParamValue} from './query/getQueryParamValue' -export {default as setQueryParamValue} from './query/setQueryParamValue' - -export {default as getSearchParamValue} from './searchParams/getSearchParamValue' -export {default as setSearchParamValue} from './searchParams/setSearchParamValue' - -export {default as createRelativeLink} from './utils/createRelativeLink' -export {default as createLinker} from './utils/createLinker' -export {default as createLinkerUrl} from './utils/createLinkerUrl' - -export {default as parseLink} from './utils/parseLink' -export {default as queryToSearchParams} from './utils/queryToSearchParams' -export {default as makeRelativeLink} from './utils/parseRelativeLink' -export {default as makeParamType} from './utils/makeParamType' -export {default as makeParam} from './utils/makeParam' -export type * from './types' +export { default as getQueryParamValue } from "./query/getQueryParamValue"; +export { default as setQueryParamValue } from "./query/setQueryParamValue"; + +export { default as getSearchParamValue } from "./searchParams/getSearchParamValue"; +export { default as setSearchParamValue } from "./searchParams/setSearchParamValue"; +export type * from "./types"; +export { default as createLinker } from "./utils/createLinker"; +export { default as createLinkerUrl } from "./utils/createLinkerUrl"; +export { default as createRelativeLink } from "./utils/createRelativeLink"; +export { default as makeParam } from "./utils/makeParam"; +export { default as makeParamType } from "./utils/makeParamType"; +export { default as parseLink } from "./utils/parseLink"; +export { default as makeRelativeLink } from "./utils/parseRelativeLink"; +export { default as queryToSearchParams } from "./utils/queryToSearchParams"; diff --git a/src/parameters/boolType.ts b/src/parameters/boolType.ts index 4a91c2d..42f5e2b 100644 --- a/src/parameters/boolType.ts +++ b/src/parameters/boolType.ts @@ -1,20 +1,20 @@ +import type { ParameterValueDecoder, ParameterValueEncoder } from "../types"; import makeParamType from "../utils/makeParamType"; -import type {ParameterValueDecoder, ParameterValueEncoder} from "../types" -const decodeBool: ParameterValueDecoder = value => { - if (value === '1') { - return true - } - if (value === '0') { - return false - } - return null -} +const decodeBool: ParameterValueDecoder = (value) => { + if (value === "1") { + return true; + } + if (value === "0") { + return false; + } + return null; +}; -const encodeBool: ParameterValueEncoder = value => { - if (value === null) { - return null - } - return value?'1':'0' -} -export default makeParamType(decodeBool,encodeBool) \ No newline at end of file +const encodeBool: ParameterValueEncoder = (value) => { + if (value === null) { + return null; + } + return value ? "1" : "0"; +}; +export default makeParamType(decodeBool, encodeBool); diff --git a/src/parameters/index.ts b/src/parameters/index.ts index 94f6237..c6090a0 100644 --- a/src/parameters/index.ts +++ b/src/parameters/index.ts @@ -1,4 +1,4 @@ -export { default as numberType } from './numberType' -export { default as pageType } from './pageType' -export { default as stringType } from './stringType' -export { default as boolType } from './boolType' \ No newline at end of file +export { default as boolType } from "./boolType"; +export { default as numberType } from "./numberType"; +export { default as pageType } from "./pageType"; +export { default as stringType } from "./stringType"; diff --git a/src/parameters/numberType.ts b/src/parameters/numberType.ts index 8e4518a..7d80233 100644 --- a/src/parameters/numberType.ts +++ b/src/parameters/numberType.ts @@ -1,15 +1,16 @@ -import type {ParameterValueEncoder,ParameterValueDecoder} from "../types" +import type { ParameterValueDecoder, ParameterValueEncoder } from "../types"; import makeParamType from "../utils/makeParamType"; -const decodeNumber: ParameterValueDecoder = param => { - if (typeof param === 'string') { - const number = Number(param) +const decodeNumber: ParameterValueDecoder = (param) => { + if (typeof param === "string") { + const number = Number(param); if (isNaN(number)) { - return null + return null; } - return number + return number; } - return null -} -const encodeNumber: ParameterValueEncoder = value => value === null ? null : value.toString() -export default makeParamType(decodeNumber,encodeNumber) + return null; +}; +const encodeNumber: ParameterValueEncoder = (value) => + value === null ? null : value.toString(); +export default makeParamType(decodeNumber, encodeNumber); diff --git a/src/parameters/pageType.ts b/src/parameters/pageType.ts index 240320c..ff389d9 100644 --- a/src/parameters/pageType.ts +++ b/src/parameters/pageType.ts @@ -1,13 +1,16 @@ -import type {ParameterValueDecoder, ParameterValueEncoder} from "../types" -import makeParamType from "../utils/makeParamType" -import numberType from "./numberType" +import type { ParameterValueDecoder, ParameterValueEncoder } from "../types"; +import makeParamType from "../utils/makeParamType"; +import numberType from "./numberType"; -const DEFAULT_PAGE = 1 -const MIN_PAGE = 1 -const encodePage: ParameterValueEncoder = value => value === DEFAULT_PAGE ? null : value.toString() +const DEFAULT_PAGE = 1; +const MIN_PAGE = 1; +const encodePage: ParameterValueEncoder = (value) => + value === DEFAULT_PAGE ? null : value.toString(); -const decodePage: ParameterValueDecoder = param => { - const number = numberType.decode(param) - return number === null ? DEFAULT_PAGE : Math.max(Math.trunc(number), MIN_PAGE) -} -export default makeParamType(decodePage,encodePage) +const decodePage: ParameterValueDecoder = (param) => { + const number = numberType.decode(param); + return number === null + ? DEFAULT_PAGE + : Math.max(Math.trunc(number), MIN_PAGE); +}; +export default makeParamType(decodePage, encodePage); diff --git a/src/parameters/stringType.ts b/src/parameters/stringType.ts index 40ad06d..df72a5f 100644 --- a/src/parameters/stringType.ts +++ b/src/parameters/stringType.ts @@ -1,15 +1,16 @@ -import type {ParameterValueEncoder,ParameterValueDecoder} from "../types" -import makeParamType from "../utils/makeParamType" +import type { ParameterValueDecoder, ParameterValueEncoder } from "../types"; +import makeParamType from "../utils/makeParamType"; -const FIRST_ELEMENT_INDEX = 0 +const FIRST_ELEMENT_INDEX = 0; -const decodeString: ParameterValueDecoder = param => { - if (typeof param === 'string') { - return param +const decodeString: ParameterValueDecoder = (param) => { + if (typeof param === "string") { + return param; } else if (param === null) { - return null + return null; } - return param[FIRST_ELEMENT_INDEX] -} -const encodeString: ParameterValueEncoder = value => value ?? null -export default makeParamType(decodeString,encodeString) + return param[FIRST_ELEMENT_INDEX]; +}; +const encodeString: ParameterValueEncoder = (value) => + value ?? null; +export default makeParamType(decodeString, encodeString); diff --git a/src/query/getQueryParamValue.ts b/src/query/getQueryParamValue.ts index 184b779..43ff8a2 100644 --- a/src/query/getQueryParamValue.ts +++ b/src/query/getQueryParamValue.ts @@ -1,7 +1,7 @@ -import type {ParameterOptions, QueryParameters} from "../types" +import type { ParameterOptions, QueryParameters } from "../types"; const getQueryParamValue = ( params: QueryParameters, - {name, decode}: Pick, 'name' | 'decode'> -): T => decode(params[name]??null) -export default getQueryParamValue + { name, decode }: Pick, "name" | "decode">, +): T => decode(params[name] ?? null); +export default getQueryParamValue; diff --git a/src/query/setQueryParamValue.ts b/src/query/setQueryParamValue.ts index 21df2e5..856263d 100644 --- a/src/query/setQueryParamValue.ts +++ b/src/query/setQueryParamValue.ts @@ -1,12 +1,12 @@ -import type {ParameterOptions, QueryParameters} from "../types" +import type { ParameterOptions, QueryParameters } from "../types"; const setQueryParamValue = ( - query: QueryParameters, - {name, encode}: Pick, 'name' | 'encode'>, - value: T + query: QueryParameters, + { name, encode }: Pick, "name" | "encode">, + value: T, ): QueryParameters => ({ - ...query, - [name]: encode(value) ?? undefined, - }) + ...query, + [name]: encode(value) ?? undefined, +}); -export default setQueryParamValue +export default setQueryParamValue; diff --git a/src/searchParams/getSearchParamValue.ts b/src/searchParams/getSearchParamValue.ts index 08fd6e2..768d873 100644 --- a/src/searchParams/getSearchParamValue.ts +++ b/src/searchParams/getSearchParamValue.ts @@ -1,20 +1,20 @@ -import type {ParameterOptions} from "../types" +import type { ParameterOptions } from "../types"; -const SINGLE_VALUE_LENGTH = 1 -const FIRST_VALUE_INDEX = 0 +const SINGLE_VALUE_LENGTH = 1; +const FIRST_VALUE_INDEX = 0; -const getSearchParamValue = (params: URLSearchParams, { - name, - decode -}: Pick, 'name' | 'decode'>): T => { - if (params.has(name)) { - const values = params.getAll(name) - if (values.length === SINGLE_VALUE_LENGTH) { - return decode(values[FIRST_VALUE_INDEX]) - } - return decode(values) - } - return decode(null) -} +const getSearchParamValue = ( + params: URLSearchParams, + { name, decode }: Pick, "name" | "decode">, +): T => { + if (params.has(name)) { + const values = params.getAll(name); + if (values.length === SINGLE_VALUE_LENGTH) { + return decode(values[FIRST_VALUE_INDEX]); + } + return decode(values); + } + return decode(null); +}; -export default getSearchParamValue +export default getSearchParamValue; diff --git a/src/searchParams/setSearchParamValue.ts b/src/searchParams/setSearchParamValue.ts index 4f5a8fb..b12eeee 100644 --- a/src/searchParams/setSearchParamValue.ts +++ b/src/searchParams/setSearchParamValue.ts @@ -1,21 +1,22 @@ -import type {ParameterOptions} from "../types" +import type { ParameterOptions } from "../types"; -const setSearchParamValue = (params: URLSearchParams, { - name, - encode -}: Pick, 'name' | 'encode'>, value: T): void => { - const encoded = encode(value) - params.delete(name) +const setSearchParamValue = ( + params: URLSearchParams, + { name, encode }: Pick, "name" | "encode">, + value: T, +): void => { + const encoded = encode(value); + params.delete(name); - if (encoded !== null) { - if (typeof encoded === 'string') { - params.set(name, encoded) - } else { - for (const item of encoded) { - params.append(name, item) - } - } - } -} + if (encoded !== null) { + if (typeof encoded === "string") { + params.set(name, encoded); + } else { + for (const item of encoded) { + params.append(name, item); + } + } + } +}; -export default setSearchParamValue +export default setSearchParamValue; diff --git a/src/state/useParamState.ts b/src/state/useParamState.ts index c41be58..341e321 100644 --- a/src/state/useParamState.ts +++ b/src/state/useParamState.ts @@ -1,51 +1,58 @@ -'use client' -import { useRouter } from "next/navigation" -import { useEffect, useState } from "react" -import type { ParameterOptions, ParamsStateOptions} from "../types" -import {useDebouncedCallback} from 'use-debounce' -import useSearchParam from "../client/useSearchParam" -import { useRelativeLink } from "../client" -import createLinker from "../utils/createLinker" -export type SetStateCallback = (value:T)=>void -const defaultDebounceTimer = 1000 - +"use client"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; +import { useDebouncedCallback } from "use-debounce"; +import { useRelativeLink } from "../client"; +import useSearchParam from "../client/useSearchParam"; +import type { ParameterOptions, ParamsStateOptions } from "../types"; +import createLinker from "../utils/createLinker"; +export type SetStateCallback = (value: T) => void; +const defaultDebounceTimer = 1000; +const useParamState = ( + params: ParameterOptions, + { + debounce = defaultDebounceTimer, + updateValue, + navigate, + }: ParamsStateOptions = {}, +): [T, SetStateCallback] => { + const router = useRouter(); + const link = useRelativeLink(); + const queryValue = useSearchParam(params); + const [value, setValue] = useState(queryValue); -const useParamState = (params: ParameterOptions, { - debounce = defaultDebounceTimer, - updateValue, - navigate -}: ParamsStateOptions = {}): [T, SetStateCallback] => { - const router = useRouter() - const link = useRelativeLink() - const queryValue = useSearchParam(params) - const [value,setValue] = useState(queryValue) + const updateQueryValue = useDebouncedCallback((value: T) => { + const linkBuilder = createLinker(link); - const updateQueryValue = useDebouncedCallback((value:T)=>{ - const linkBuilder = createLinker(link) + const updatedLink = linkBuilder.setValue(params, value); + const valueMiddleware = + updateValue === undefined + ? updatedLink + : updateValue(updatedLink, linkBuilder); + const targetHref = valueMiddleware.getLink().asString(); + if (navigate?.push === true) { + router.push(targetHref, navigate); + return; + } + router.replace(targetHref, navigate); + }, debounce); + useEffect(() => { + const currentLink = link.asString(); + const inputValueURL = createLinker(link).setValue(params, value).asString(); + if (inputValueURL !== currentLink && !updateQueryValue.isPending()) { + // eslint-disable-next-line react-hooks/set-state-in-effect -- haven't found workaround yet. Looking for the best practice + setValue(queryValue); + } + }, [debounce, link, params, queryValue, updateQueryValue, value]); - const updatedLink = linkBuilder.setValue(params,value) - const valueMiddleware = updateValue === undefined?updatedLink:updateValue(updatedLink,linkBuilder) - const targetHref = valueMiddleware.getLink().asString() - if (navigate?.push === true) { - router.push(targetHref,navigate) - return - } - router.replace(targetHref,navigate) - },debounce) - useEffect(()=>{ - const currentLink = link.asString() - const inputValueURL = createLinker(link).setValue(params,value).asString(); - if (inputValueURL !== currentLink && !updateQueryValue.isPending()) { - // eslint-disable-next-line react-hooks/set-state-in-effect -- haven't found workaround yet. Looking for the best practice - setValue(queryValue) - } - },[debounce, link, params, queryValue, updateQueryValue, value]) + return [ + value, + (value: T) => { + setValue(value); + updateQueryValue(value); + }, + ]; +}; - return [value,(value:T)=>{ - setValue(value) - updateQueryValue(value) - }] -} - -export default useParamState \ No newline at end of file +export default useParamState; diff --git a/src/types.ts b/src/types.ts index 07f3892..10ebfef 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,52 +1,60 @@ import type { ReadonlyURLSearchParams } from "next/navigation"; -export type QueryParameterValue = string | string[] | null +export type QueryParameterValue = string | string[] | null; export type QueryParameters = Record; -export type ParameterValueEncoder = (value: T) => QueryParameterValue -export type ParameterValueDecoder = (value: QueryParameterValue) => T +export type ParameterValueEncoder = (value: T) => QueryParameterValue; +export type ParameterValueDecoder = (value: QueryParameterValue) => T; export interface ParameterValueCoderOptions { - decode: ParameterValueDecoder - encode: ParameterValueEncoder + decode: ParameterValueDecoder; + encode: ParameterValueEncoder; } -export interface Linker { - setValue: SetValueCallback, - getValue: GetValueCallback, - getLink: () => T - asString: () => string +export interface Linker { + setValue: SetValueCallback; + getValue: GetValueCallback; + getLink: () => T; + asString: () => string; } export interface AbsoltuteLinkBuilder { - setValue: SetValueCallback - getLink: () => URL - asString:()=>string + setValue: SetValueCallback; + getLink: () => URL; + asString: () => string; } -export interface ParameterOptions extends ParameterValueCoderOptions { - name: string +export interface ParameterOptions extends ParameterValueCoderOptions { + name: string; } export interface ValuedParameter extends ParameterOptions { - value: T + value: T; } export interface ParamsStateOptions { - debounce?: number //Default 1000ms. Interval after shich state is being commited to the url. - updateValue?: (link: RelativeLinkBuilder, source: Linker) =>RelativeLinkBuilder - navigate?:{ - scroll?:boolean - push?:boolean - } -} -export type RelativePathname = `/${string}` | '' + debounce?: number; //Default 1000ms. Interval after shich state is being commited to the url. + updateValue?: ( + link: RelativeLinkBuilder, + source: Linker, + ) => RelativeLinkBuilder; + navigate?: { + scroll?: boolean; + push?: boolean; + }; +} +export type RelativePathname = `/${string}` | ""; export interface RelativeURL { - readonly pathname: RelativePathname - readonly search: ReadonlyURLSearchParams|URLSearchParams - readonly asString: () => string + readonly pathname: RelativePathname; + readonly search: ReadonlyURLSearchParams | URLSearchParams; + readonly asString: () => string; } -export type SetValueCallback = (opt: Pick, 'name' | 'encode'>, value: T) => N -export type GetValueCallback = (opt: Pick, 'name' | 'decode'>) => V +export type SetValueCallback< + R extends URL | RelativeURL, + N = R extends URL ? AbsoltuteLinkBuilder : RelativeLinkBuilder, +> = (opt: Pick, "name" | "encode">, value: T) => N; +export type GetValueCallback = ( + opt: Pick, "name" | "decode">, +) => V; export interface RelativeLinkBuilder { - setValue: SetValueCallback - getLink: () => RelativeURL - asString:()=>string -} \ No newline at end of file + setValue: SetValueCallback; + getLink: () => RelativeURL; + asString: () => string; +} diff --git a/src/utils/createLinker.ts b/src/utils/createLinker.ts index 2b035d1..972e999 100644 --- a/src/utils/createLinker.ts +++ b/src/utils/createLinker.ts @@ -1,39 +1,44 @@ -import type { Linker, ParameterOptions, RelativeLinkBuilder, RelativeURL} from "../types" -import setSearchParamValue from "../searchParams/setSearchParamValue" -import createRelativeLink from "./createRelativeLink" +import setSearchParamValue from "../searchParams/setSearchParamValue"; +import type { + Linker, + ParameterOptions, + RelativeLinkBuilder, + RelativeURL, +} from "../types"; +import createRelativeLink from "./createRelativeLink"; - - - -const startBuilder = ({pathname,search}:RelativeURL):RelativeLinkBuilder=>{ - const newSearch = new URLSearchParams() - search.forEach((value, key) => { - newSearch.append(key, value) - }) - const builder:RelativeLinkBuilder = { - setValue:(param,value)=>{ - setSearchParamValue(newSearch, param, value) - return builder - }, - getLink:()=>createRelativeLink(pathname,newSearch), - asString:()=>builder.getLink().asString() - } - return builder -} +const startBuilder = ({ + pathname, + search, +}: RelativeURL): RelativeLinkBuilder => { + const newSearch = new URLSearchParams(); + search.forEach((value, key) => { + newSearch.append(key, value); + }); + const builder: RelativeLinkBuilder = { + setValue: (param, value) => { + setSearchParamValue(newSearch, param, value); + return builder; + }, + getLink: () => createRelativeLink(pathname, newSearch), + asString: () => builder.getLink().asString(), + }; + return builder; +}; const createLinker = (link: RelativeURL): Linker => { + const getValue = ({ + decode, + name, + }: Pick, "name" | "decode">): V => + decode(link.search.getAll(name)); - - - const getValue = ({decode, name}: Pick, 'name' | 'decode'>): V => - decode(link.search.getAll(name)) - - const linker: Linker = { - setValue:(param,value)=>startBuilder(link).setValue(param,value), - getValue, - getLink:()=>link, - asString:()=>linker.getLink().asString() - } - return linker -} + const linker: Linker = { + setValue: (param, value) => startBuilder(link).setValue(param, value), + getValue, + getLink: () => link, + asString: () => linker.getLink().asString(), + }; + return linker; +}; -export default createLinker +export default createLinker; diff --git a/src/utils/createLinkerUrl.ts b/src/utils/createLinkerUrl.ts index 2c57a54..7995b8e 100644 --- a/src/utils/createLinkerUrl.ts +++ b/src/utils/createLinkerUrl.ts @@ -1,42 +1,41 @@ -import type {AbsoltuteLinkBuilder, Linker, ParameterOptions} from "../types" -import setSearchParamValue from "../searchParams/setSearchParamValue" +import setSearchParamValue from "../searchParams/setSearchParamValue"; +import type { AbsoltuteLinkBuilder, Linker, ParameterOptions } from "../types"; - - - -const startBuilder = (url:URL):AbsoltuteLinkBuilder=>{ - const newSearch = new URLSearchParams() - url.searchParams.forEach((value, key) => { - newSearch.append(key, value) - }) - const builder:AbsoltuteLinkBuilder = { - setValue:(param,value)=>{ - setSearchParamValue(newSearch, param, value) - return builder - }, - getLink:()=>{ - const newURL = new URL(url) - newSearch.forEach((value, key) => { - newURL.searchParams.append(key, value) - }) - return newURL - }, - asString:()=>builder.getLink().toString() - } - return builder -} +const startBuilder = (url: URL): AbsoltuteLinkBuilder => { + const newSearch = new URLSearchParams(); + url.searchParams.forEach((value, key) => { + newSearch.append(key, value); + }); + const builder: AbsoltuteLinkBuilder = { + setValue: (param, value) => { + setSearchParamValue(newSearch, param, value); + return builder; + }, + getLink: () => { + const newURL = new URL(url); + newSearch.forEach((value, key) => { + newURL.searchParams.append(key, value); + }); + return newURL; + }, + asString: () => builder.getLink().toString(), + }; + return builder; +}; const createLinker = (link: URL): Linker => { + const getValue = ({ + decode, + name, + }: Pick, "name" | "decode">): V => + decode(link.searchParams.getAll(name)); - const getValue = ({decode, name}: Pick, 'name' | 'decode'>): V => - decode(link.searchParams.getAll(name)) - - const linker: Linker = { - setValue:(param,value)=>startBuilder(link).setValue(param,value), - getValue, - getLink:()=>link, - asString:()=>linker.getLink().toString() - } - return linker -} + const linker: Linker = { + setValue: (param, value) => startBuilder(link).setValue(param, value), + getValue, + getLink: () => link, + asString: () => linker.getLink().toString(), + }; + return linker; +}; -export default createLinker +export default createLinker; diff --git a/src/utils/createRelativeLink.ts b/src/utils/createRelativeLink.ts index cfee9b7..1419723 100644 --- a/src/utils/createRelativeLink.ts +++ b/src/utils/createRelativeLink.ts @@ -1,17 +1,20 @@ -import type { RelativePathname, RelativeURL } from "../types"; +import type { RelativePathname, RelativeURL } from "../types"; import getNormalizedQueryStr from "./getNormalizedQueryStr"; const isRelativePathname = (pathname: string): pathname is RelativePathname => - pathname === '' || pathname.startsWith('/'); + pathname === "" || pathname.startsWith("/"); -const createRelativeLink = (pathname: string, search: URLSearchParams): RelativeURL => { - if (isRelativePathname(pathname)) { - return ({ - pathname, - search, - asString: () => `${pathname}${getNormalizedQueryStr(search)}` - }) - } - throw new Error(`Invalid path: ${pathname}`); -} -export default createRelativeLink; \ No newline at end of file +const createRelativeLink = ( + pathname: string, + search: URLSearchParams, +): RelativeURL => { + if (isRelativePathname(pathname)) { + return { + pathname, + search, + asString: () => `${pathname}${getNormalizedQueryStr(search)}`, + }; + } + throw new Error(`Invalid path: ${pathname}`); +}; +export default createRelativeLink; diff --git a/src/utils/getNormalizedQueryStr.ts b/src/utils/getNormalizedQueryStr.ts index 30b7cd9..c3e05a2 100644 --- a/src/utils/getNormalizedQueryStr.ts +++ b/src/utils/getNormalizedQueryStr.ts @@ -1,6 +1,6 @@ -const ZERO_LENGTH = 0 -const getNormalizedQueryStr = (params:URLSearchParams):string=>{ - const str= params.toString() - return str.length === ZERO_LENGTH ? '' : `?${str}` -} -export default getNormalizedQueryStr \ No newline at end of file +const ZERO_LENGTH = 0; +const getNormalizedQueryStr = (params: URLSearchParams): string => { + const str = params.toString(); + return str.length === ZERO_LENGTH ? "" : `?${str}`; +}; +export default getNormalizedQueryStr; diff --git a/src/utils/makeParam.ts b/src/utils/makeParam.ts index 2f14228..b77dcaf 100644 --- a/src/utils/makeParam.ts +++ b/src/utils/makeParam.ts @@ -1,4 +1,7 @@ import type { ParameterOptions } from "../types"; -const makeParam = (name:string,type:Pick, 'decode' | 'encode'>):ParameterOptions => ({ name, ...type }) -export default makeParam \ No newline at end of file +const makeParam = ( + name: string, + type: Pick, "decode" | "encode">, +): ParameterOptions => ({ name, ...type }); +export default makeParam; diff --git a/src/utils/makeParamType.ts b/src/utils/makeParamType.ts index f082aa1..18a5a02 100644 --- a/src/utils/makeParamType.ts +++ b/src/utils/makeParamType.ts @@ -1,6 +1,14 @@ -import type { ParameterOptions, ParameterValueDecoder, ParameterValueEncoder } from "../types" +import type { + ParameterOptions, + ParameterValueDecoder, + ParameterValueEncoder, +} from "../types"; -const makeParamType = (decode:ParameterValueDecoder,encode:ParameterValueEncoder):Pick, 'decode' | 'encode'>=>({ - encode,decode - }) -export default makeParamType \ No newline at end of file +const makeParamType = ( + decode: ParameterValueDecoder, + encode: ParameterValueEncoder, +): Pick, "decode" | "encode"> => ({ + encode, + decode, +}); +export default makeParamType; diff --git a/src/utils/parseLink.ts b/src/utils/parseLink.ts index 5d7aab7..eb372b5 100644 --- a/src/utils/parseLink.ts +++ b/src/utils/parseLink.ts @@ -1,12 +1,12 @@ +import type { RelativeURL } from "../types"; import createRelativeLink from "./createRelativeLink"; -import type { RelativeURL } from "../types" -const parseLink = (link:string):RelativeURL|URL=>{ - try { - return new URL(link); // succeeds only if it's absolute - } catch { - const url = new URL(link, 'https://example.com'); // base is required but irrelevant - return createRelativeLink(url.pathname, url.searchParams); - } -} -export default parseLink \ No newline at end of file +const parseLink = (link: string): RelativeURL | URL => { + try { + return new URL(link); // succeeds only if it's absolute + } catch { + const url = new URL(link, "https://example.com"); // base is required but irrelevant + return createRelativeLink(url.pathname, url.searchParams); + } +}; +export default parseLink; diff --git a/src/utils/parseRelativeLink.ts b/src/utils/parseRelativeLink.ts index 17e7fcf..ec6607f 100644 --- a/src/utils/parseRelativeLink.ts +++ b/src/utils/parseRelativeLink.ts @@ -1,11 +1,11 @@ -import type { RelativeURL } from "../types" -import parseLink from "./parseLink" +import type { RelativeURL } from "../types"; +import parseLink from "./parseLink"; const parseRelativeLink = (link: string): RelativeURL => { - const lin = parseLink (link) - if (lin instanceof URL) { - throw new Error (`The link is URL`) - } - return lin -} -export default parseRelativeLink \ No newline at end of file + const lin = parseLink(link); + if (lin instanceof URL) { + throw new Error(`The link is URL`); + } + return lin; +}; +export default parseRelativeLink; diff --git a/src/utils/queryToSearchParams.ts b/src/utils/queryToSearchParams.ts index c40af64..a14029f 100644 --- a/src/utils/queryToSearchParams.ts +++ b/src/utils/queryToSearchParams.ts @@ -1,23 +1,23 @@ -import type {QueryParameters} from "../types" +import type { QueryParameters } from "../types"; const queryToSearchParams = (query: QueryParameters): URLSearchParams => { - const params = new URLSearchParams() - for (const name in query) { - if (!Object.prototype.hasOwnProperty.call(query, name)) { - continue - } - const {[name]: encoded} = query - if (encoded === undefined) { - continue - } - if (typeof encoded === 'string') { - params.set(name, encoded) - } else { - for (const item of encoded) { - params.append(name, item) - } - } - } - return params -} -export default queryToSearchParams + const params = new URLSearchParams(); + for (const name in query) { + if (!Object.hasOwn(query, name)) { + continue; + } + const { [name]: encoded } = query; + if (encoded === undefined) { + continue; + } + if (typeof encoded === "string") { + params.set(name, encoded); + } else { + for (const item of encoded) { + params.append(name, item); + } + } + } + return params; +}; +export default queryToSearchParams; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 8af5f66..c66b878 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,44 +1,34 @@ { - "compilerOptions": { - "module": "esnext", - "jsx": "react-jsx", - "target": "ESNext", - "lib": [ - "es6", - "es7", - "esnext", - "dom" - ], - "moduleResolution": "node", - "noImplicitReturns": true, - "strict": true, - "strictFunctionTypes": true, - "noUnusedLocals": true, - "pretty": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "downlevelIteration": true, - "skipLibCheck": true, - "listEmittedFiles": true, - "allowJs": false, - "declaration": true, - "forceConsistentCasingInFileNames": true, - "noImplicitAny": true, - "alwaysStrict": true, - "noImplicitThis": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "resolveJsonModule": true, - "isolatedModules": true, - "outDir": "dist", - "noEmit": false, - "emitDeclarationOnly": false, - }, - "include": [ - "./", - "./next-app-mock/__tests__/**.spec.ts" - ], - "exclude": [ - "next-app-mock/next.config.js" - ] -} \ No newline at end of file + "compilerOptions": { + "module": "esnext", + "jsx": "react-jsx", + "target": "ESNext", + "lib": ["es6", "es7", "esnext", "dom"], + "moduleResolution": "node", + "noImplicitReturns": true, + "strict": true, + "strictFunctionTypes": true, + "noUnusedLocals": true, + "pretty": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "downlevelIteration": true, + "skipLibCheck": true, + "listEmittedFiles": true, + "allowJs": false, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": true, + "alwaysStrict": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "dist", + "noEmit": false, + "emitDeclarationOnly": false + }, + "include": ["./", "./next-app-mock/__tests__/**.spec.ts"], + "exclude": ["next-app-mock/next.config.js"] +} diff --git a/tsconfig.json b/tsconfig.json index 4642f18..7918f76 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,45 +1,34 @@ { - "compilerOptions": { - "module": "esnext", - "jsx": "react-jsx", - "target": "ESNext", - "lib": [ - "es6", - "es7", - "esnext", - "dom" - ], - "moduleResolution": "node", - "noImplicitReturns": true, - "strict": true, - "strictFunctionTypes": true, - "noUnusedLocals": true, - "pretty": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "downlevelIteration": true, - "skipLibCheck": true, - "listEmittedFiles": true, - "allowJs": false, - "declaration": true, - "forceConsistentCasingInFileNames": true, - "noImplicitAny": true, - "alwaysStrict": true, - "noImplicitThis": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "resolveJsonModule": true, - "isolatedModules": true, - "outDir": "dist", - "noEmit": false, - "emitDeclarationOnly": false, - "paths": { - "@/dist-lib": [ - "./dist" - ], - } - }, - "include": [ - "src" - ], -} \ No newline at end of file + "compilerOptions": { + "types": ["node"], // @types are no longer auto-discovered (see ยง1.6) + "rootDir": "./src", + "jsx": "react-jsx", + "lib": ["es6", "es7", "esnext", "dom"], + "noImplicitReturns": true, + "strict": true, + "strictFunctionTypes": true, + "noUnusedLocals": true, + "pretty": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "skipLibCheck": true, + "listEmittedFiles": true, + "allowJs": false, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": true, + "alwaysStrict": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "dist", + "noEmit": false, + "emitDeclarationOnly": false, + "paths": { + "@/dist-lib": ["./dist"] + } + }, + "include": ["src"] +} diff --git a/tsup.config.ts b/tsup.config.ts index 14e668e..295d897 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,13 +1,13 @@ -import { defineConfig } from 'tsup' +import { defineConfig } from "tsup"; export default defineConfig({ - entry: ['src/**/*'], - sourcemap: true, - clean: true, - format: ['cjs', 'esm'], - dts: true, - bundle: false, - esbuildOptions(options) { - options.drop = ['console']; // this is the esbuild option - }, -}) \ No newline at end of file + entry: ["src/**/*"], + sourcemap: true, + clean: true, + format: ["cjs", "esm"], + dts: true, + bundle: false, + esbuildOptions(options) { + options.drop = ["console"]; // this is the esbuild option + }, +}); From 4c252967070f10a53e99e8df99c4c9d2b527771c Mon Sep 17 00:00:00 2001 From: l-you Date: Thu, 28 May 2026 10:46:55 +0300 Subject: [PATCH 3/4] build: migrate package output to TypeScript 6 Generate declarations with tsc, bundle publishable ESM/CJS outputs, and align the CI framework matrix with compatible React versions. AI-Impact: co-developed AI: cx --- .changeset/strict-ts6-package-output.md | 5 + .github/workflows/test.yml | 60 +- __tests__/Routes.spec.ts | 9 +- biome.json | 8 +- next-app-mock/package.json | 2 +- .../src/app/some-random-page/page.tsx | 2 - next-app-mock/src/app/url-state-form/Form.tsx | 8 +- next-app-mock/tsconfig.json | 17 +- package.json | 25 +- pnpm-lock.yaml | 1610 ++++++----------- src/parameters/numberType.ts | 2 +- src/state/useParamState.ts | 3 +- tsconfig.json | 13 +- tsup.config.ts | 4 +- 14 files changed, 650 insertions(+), 1118 deletions(-) create mode 100644 .changeset/strict-ts6-package-output.md diff --git a/.changeset/strict-ts6-package-output.md b/.changeset/strict-ts6-package-output.md new file mode 100644 index 0000000..773a307 --- /dev/null +++ b/.changeset/strict-ts6-package-output.md @@ -0,0 +1,5 @@ +--- +"next-navigation-utils": patch +--- + +Migrate the package build and test setup to TypeScript 6 while keeping strict deprecation checks. Fix the published output so ESM and CJS consumers resolve the exported entrypoints correctly. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ddf34c1..b537fc8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,18 +10,52 @@ permissions: contents: read jobs: Unit: - name: Unit Tests (Node ${{ matrix.node-version }}, Next.js ${{ matrix.nextjs-version }}) + name: Unit Tests (Node ${{ matrix.node-version }}, Next.js ${{ matrix.nextjs-version }}, React ${{ matrix.react-version }}) runs-on: ${{ matrix.os }} timeout-minutes: 15 strategy: matrix: - node-version: [20,22] - nextjs-version: ['14.0.0', '14.2.30', '15.0.0', '15.3.4'] - os: [ubuntu-latest] - exclude: - # Node 22 wasn't supported in early Next.js 14 versions - - node-version: 22 + include: + - node-version: 20 nextjs-version: '14.0.0' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 20 + nextjs-version: '14.2.30' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 22 + nextjs-version: '14.2.30' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 20 + nextjs-version: '15.0.0' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 22 + nextjs-version: '15.0.0' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 20 + nextjs-version: '15.3.4' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 22 + nextjs-version: '15.3.4' + react-version: '18.2.0' + react-types-version: '18' + os: ubuntu-latest + - node-version: 24 + nextjs-version: '16.2.3' + react-version: '19.2.5' + react-types-version: '19' + os: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: pnpm/action-setup@v5.0.0 @@ -33,18 +67,20 @@ jobs: pnpm-lock.yaml next-app-mock/pnpm-lock.yaml - run: pnpm i && pnpm build - - name: Install Next.js version ${{ matrix.nextjs-version }} + - name: Install framework versions run: | cd next-app-mock echo "Installing Next.js version ${{ matrix.nextjs-version }}" - pnpm add next@${{ matrix.nextjs-version }} - echo "Installed Next.js version:" - pnpm list next + pnpm add next@${{ matrix.nextjs-version }} react@${{ matrix.react-version }} react-dom@${{ matrix.react-version }} + pnpm add -D @types/react@${{ matrix.react-types-version }} @types/react-dom@${{ matrix.react-types-version }} + echo "Installed framework versions:" + pnpm list next react react-dom - run: pnpm playwright install --with-deps - run: pnpm test env: CI: true NEXTJS_VERSION: ${{ matrix.nextjs-version }} + REACT_VERSION: ${{ matrix.react-version }} NODE_VERSION: ${{ matrix.node-version }} - uses: actions/upload-artifact@v7 with: @@ -85,4 +121,4 @@ jobs: runs-on: ubuntu-latest steps: - name: Success - run: echo "Ready to merge!" \ No newline at end of file + run: echo "Ready to merge!" diff --git a/__tests__/Routes.spec.ts b/__tests__/Routes.spec.ts index baed64d..4fc1672 100644 --- a/__tests__/Routes.spec.ts +++ b/__tests__/Routes.spec.ts @@ -1,10 +1,5 @@ import { expect, test } from "@playwright/test"; -import { - createLinker, - createLinkerUrl, - parseLink, - queryToSearchParams, -} from "../src/index"; +import { createLinker, parseLink, queryToSearchParams } from "../src/index"; import parseRelativeLink from "../src/utils/parseRelativeLink"; test("URL parameter handling and linker functionality", async ({ page }) => { @@ -77,7 +72,7 @@ test("useParamState hook - URL state synchronization with debouncing", async ({ const expectedUrl = new URLSearchParams(); expectedUrl.set("url_change_test_input_value", "Hello World!"); - await expect(page).toHaveURL("/url-state-form?" + expectedUrl.toString()); + await expect(page).toHaveURL(`/url-state-form?${expectedUrl.toString()}`); await expect( page.getByTestId("form-input"), "Input value is the same as typed", diff --git a/biome.json b/biome.json index c3e7534..bdd34c4 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.11/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.12/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -15,7 +15,11 @@ "linter": { "enabled": true, "rules": { - "recommended": true + "recommended": true, + "correctness": { + "useExhaustiveDependencies": "error", + "useHookAtTopLevel": "error" + } } }, "javascript": { diff --git a/next-app-mock/package.json b/next-app-mock/package.json index b882efd..6fbab42 100644 --- a/next-app-mock/package.json +++ b/next-app-mock/package.json @@ -17,7 +17,7 @@ "@types/node": "^24.0.3", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", - "typescript": "^5.8.3" + "typescript": "^6.0.3" }, "packageManager": "pnpm@10.33.0" } diff --git a/next-app-mock/src/app/some-random-page/page.tsx b/next-app-mock/src/app/some-random-page/page.tsx index 69723d5..49fb590 100644 --- a/next-app-mock/src/app/some-random-page/page.tsx +++ b/next-app-mock/src/app/some-random-page/page.tsx @@ -1,6 +1,4 @@ import type { FunctionComponent } from "react"; -import { ParameterOptions } from "@/dist-lib"; -import { pageType } from "@/dist-lib/parameters"; const Page: FunctionComponent = () => { return
Some random page
; diff --git a/next-app-mock/src/app/url-state-form/Form.tsx b/next-app-mock/src/app/url-state-form/Form.tsx index 340614d..84286c9 100644 --- a/next-app-mock/src/app/url-state-form/Form.tsx +++ b/next-app-mock/src/app/url-state-form/Form.tsx @@ -1,10 +1,9 @@ "use client"; import { useRouter, useSearchParams } from "next/navigation"; -import { encode } from "querystring"; import { type FunctionComponent, useEffect, useRef, useState } from "react"; +import type { ParameterOptions } from "@/dist-lib"; import { useParamState } from "@/dist-lib/client"; import { pageType, stringType } from "@/dist-lib/parameters"; -import { type ParameterOptions, ValuedParameter } from "../../../../dist/types"; const pageParam: ParameterOptions = { name: "page", @@ -23,7 +22,7 @@ const Form: FunctionComponent = () => { } return link; }, - }); //This tests `updateValues` type safey. It cause a bad developer experience, so keep it to prrof that type afety works without ny issues for the developer + }); // Tests updateValue type safety against the generated package declarations. const [page, setPage] = useParamState(pageParam); const router = useRouter(); const [countSearchParamsChanged, setCountSearchParamsChanged] = useState(0); @@ -47,6 +46,7 @@ const Form: FunctionComponent = () => { >
{countSearchParamsChanged}