diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 5e4377a..459d4b4 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -6,6 +6,9 @@ on: branches: ["**"] tags: ["*.*.*"] +env: + AUBE_ALLOWED_UNPOPULAR_PACKAGES: pglite-cli + jobs: check: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index a2dc17f..ad4cc88 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ .DS_Store +*.graphql +*.graphql.ts +__generated__/ .pgdata/ + node_modules/ packages/*/dist/ + +index.db diff --git a/.oxfmtrc.json b/.oxfmtrc.json index dfd6973..0c1ebc8 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -8,6 +8,7 @@ "**/dist/*.{cjs,d.cts,d.mts,d.ts,js,mjs}", ".agents/skills/", ".claude/skills/", - "plans/" + "plans/", + "**/__generated__/**" ] } diff --git a/.oxlintrc.json b/.oxlintrc.json index 97a9e9d..9126f90 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -24,8 +24,12 @@ { "ignoreConsecutiveComments": true } ], "eslint/curly": ["error", "multi-line"], + "node/no-top-level-await": "off", + "oxc/no-optional-chaining": "off", + "oxc/no-async-await": "off", "eslint/eqeqeq": ["off", "smart"], "eslint/func-style": ["off"], + "eslint/max-lines-per-function": "off", "eslint/id-length": ["warn", { "exceptionPatterns": ["^_", "^[Tertv]$"] }], "eslint/init-declarations": "off", "eslint/max-params": ["warn", { "max": 4 }], diff --git a/mise.toml b/mise.toml index ad24229..3ff244d 100644 --- a/mise.toml +++ b/mise.toml @@ -2,12 +2,12 @@ min_version = "2026.6.10" [tools] "aqua:dahlia/hongdown" = "0.4.3" -"github:nushell/nushell" = "latest" +"github:nushell/nushell" = "0.114.1" node = "26" "npm:@typescript/native-preview" = "7.0.0-dev.20260620.1" -"npm:oxlint" = "latest" -"npm:oxlint-tsgolint" = "latest" -"npm:pglite-cli" = "latest" +"npm:oxlint" = "1.75.0" +"npm:oxlint-tsgolint" = "7.0.2001" +"npm:pglite-cli" = "0.0.1" oxfmt = "0.55.0" pnpm = "11" @@ -17,10 +17,26 @@ auto = true [hooks] postinstall = ["mise deps", "mise generate git-pre-commit --task check --write"] +[tasks.build] +description = "Build the project" +depends = ["build:web"] +silent = "stdout" + +[tasks."build:server"] +description = "Build the project except web" +run = "pnpm --parallel -F @drfed/graphql -F @drfed/models -F @drfed/drfed build" +silent = "stdout" + [tasks."build:web"] description = "Build SolidStart frontend server" +depends = [ + { task = "generate:graphql-schema", args = [ + "--output-file", + "packages/web/schema.graphql", + ] }, +] dir = "./packages/web" -run = "pnpm run build" +run = "pnpm exec relay-compiler --noWatchman && pnpm run build" [tasks.check] description = "Check all" @@ -77,11 +93,6 @@ run = """ node scripts/add-license/main.mts """ -[tasks.build] -description = "Build the project" -run = "pnpm run --parallel --recursive build" -silent = "stdout" - [tasks.test] description = "Run tests" depends = ["build"] @@ -130,7 +141,7 @@ description = "Generate GraphQL schema" usage = """ flag "-o --output-file " help="The output file for the generated GraphQL schema. - for stdout. Defaults to -" """ -depends = ["build"] +depends = ["build:server"] run = """ #!/usr/bin/env nu let output_file = (if "usage_output_file" in $env { $env.usage_output_file } else { "-" }) @@ -154,7 +165,11 @@ run = "node scripts/dev.mts" raw_args = true description = "Run SolidStart frontend server" dir = "./packages/web" -run = "pnpm run dev" +run = """ +#!/usr/bin/env nu +mise run generate:graphql-schema --output-file ./packages/web/schema.graphql +pnpm run dev +""" [tasks."drfed-server"] description = "Invoke drfed-server command" diff --git a/packages/graphql/src/index.ts b/packages/graphql/src/index.ts index 115ec9a..9e991b4 100644 --- a/packages/graphql/src/index.ts +++ b/packages/graphql/src/index.ts @@ -62,6 +62,10 @@ export function createYogaServer( ): YogaServerInstance { const options = fillOptions(_options); return createYoga({ + cors: { + origin: [...options.origins], + credentials: true, + }, async context(ctx) { const anonymous = { db, request: ctx.request, ...options }; const accessToken = getAccessToken(ctx.request.headers); @@ -92,7 +96,14 @@ function mockTransport() { const fillOptions = (opt: YogaServerOptions): Required => ({ mailer: opt?.mailer ?? mockTransport(), emailFrom: opt?.emailFrom ?? "noreply@drfed.org", - origins: opt?.origins ?? new Set(["https://drfed.org"]), + // FIXME: Properly parametrize the following allowlist: + origins: + opt?.origins ?? + new Set([ + "https://drfed.org", + "http://localhost:5173", + "http://0.0.0.0:5173", + ]), }); const getAccessToken = (headers: Headers) => diff --git a/packages/web/.env.example b/packages/web/.env.example new file mode 100644 index 0000000..8ed9c2c --- /dev/null +++ b/packages/web/.env.example @@ -0,0 +1 @@ +VITE_DRFED_URL=http://0.0.0.0:8888/graphql diff --git a/packages/web/.oxlintrc.json b/packages/web/.oxlintrc.json index 201f4f4..147817a 100644 --- a/packages/web/.oxlintrc.json +++ b/packages/web/.oxlintrc.json @@ -1,5 +1,6 @@ { "extends": ["../../.oxlintrc.json"], + "ignorePatterns": ["**/__generated__/**"], "jsPlugins": ["eslint-plugin-solid"], "env": { "browser": true, diff --git a/packages/web/env.d.ts b/packages/web/env.d.ts new file mode 100644 index 0000000..9f25370 --- /dev/null +++ b/packages/web/env.d.ts @@ -0,0 +1,7 @@ +interface ImportMetaEnv { + readonly VITE_DRFED_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/packages/web/package.json b/packages/web/package.json index f66e5c2..f956162 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -50,10 +50,16 @@ "@solidjs/router": "^0.15.0", "@solidjs/start": "2.0.0-alpha.2", "@solidjs/vite-plugin-nitro-2": "^0.1.0", + "relay-runtime": "^21.0.1", "solid-js": "^1.9.5", + "solid-relay": "1.0.0-beta.27", "vite": "^7.0.0" }, "devDependencies": { - "eslint-plugin-solid": "^0.14.5" + "@types/relay-runtime": "^20.1.1", + "eslint-plugin-solid": "^0.14.5", + "relay-compiler": "^21.0.1", + "vite-plugin-cjs-interop": "^4.0.3", + "vite-plugin-relay-lite": "^0.12.0" } } diff --git a/packages/web/relay.config.json b/packages/web/relay.config.json new file mode 100644 index 0000000..89f9e7e --- /dev/null +++ b/packages/web/relay.config.json @@ -0,0 +1,6 @@ +{ + "src": "./src", + "schema": "./schema.graphql", + "language": "typescript", + "eagerEsModules": true +} diff --git a/packages/web/src/RelayEnviroment.ts b/packages/web/src/RelayEnviroment.ts new file mode 100644 index 0000000..0f6bfb9 --- /dev/null +++ b/packages/web/src/RelayEnviroment.ts @@ -0,0 +1,57 @@ +// DrFed: A web-based platform for developing and debugging ActivityPub apps +// Copyright (C) 2026 DrFed team +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { + Environment, + type FetchFunction, + Network, + RecordSource, + Store, +} from "relay-runtime"; +import { getRequestEvent } from "solid-js/web"; + +import { readSessionCookie } from "./routes/session.ts"; + +// oxlint-disable no-async-await +const fetchFn: FetchFunction = async (params, variables) => { + const event = getRequestEvent(); + const accessToken = readSessionCookie(event?.request); + const headers: Record = { + "Content-Type": "application/json", + }; + if (accessToken !== undefined) { + headers.Authorization = `Bearer ${accessToken}`; + } + const response = await fetch(import.meta.env.VITE_DRFED_URL, { + method: "POST", + headers, + body: JSON.stringify({ + query: params.text, + variables, + }), + credentials: "include" + }); + + // oxlint-disable return-await no-unsafe-return + return await response.json(); +}; + +export function createRelayEnvironment() { + return new Environment({ + network: Network.create(fetchFn), + store: new Store(new RecordSource()), + }); +} diff --git a/packages/web/src/app.css b/packages/web/src/app.css index 8187644..98da414 100644 --- a/packages/web/src/app.css +++ b/packages/web/src/app.css @@ -16,44 +16,300 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ +* { + box-sizing: border-box; +} + +html { + background: var(--bg); + color: var(--ink); + font-family: var(--font-sans); + font-size: var(--text-body); +} + body { - font-family: - Gordita, Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", - sans-serif; + margin: 0; +} + +button, +input { + font: inherit; +} + +.app-shell { + min-height: 100svh; +} + +.app-header { + background: color-mix(in srgb, var(--bg) 92%, transparent); + border-bottom: 1px solid var(--line); + position: sticky; + top: 0; + z-index: 10; +} + +.app-header-inner { + align-items: center; + display: flex; + height: var(--header-h); + margin: 0 auto; + max-width: var(--container); + padding: 0 var(--gutter); +} + +.brand { + align-items: center; + color: var(--ink); + display: flex; + font-family: var(--font-serif); + font-size: 1.25rem; + font-weight: 700; + gap: 0.65rem; + letter-spacing: var(--tracking-heading); + text-decoration: none; +} + +.brand img { + border-radius: 50%; +} + +.app-nav { + align-self: stretch; + display: flex; + gap: 0.25rem; + margin-left: clamp(1.5rem, 5vw, 4rem); +} + +.app-nav a, +.header-action { + align-items: center; + color: var(--ink-soft); + display: flex; + font-size: 0.9rem; + font-weight: 600; + padding: 0 0.85rem; + position: relative; + text-decoration: none; } -a { - margin-right: 1rem; +.app-nav a:hover, +.header-action:hover, +.app-nav a.is-active, +.header-action.is-active { + color: var(--ink); } -main { - text-align: center; - padding: 1em; +.app-nav a.is-active::after { + background: var(--accent); + bottom: -1px; + content: ""; + height: 3px; + left: 0.85rem; + position: absolute; + right: 0.85rem; +} + +.header-action { + border: 1px solid var(--line-strong); + border-radius: var(--radius-pill); + margin-left: auto; + min-height: 2.4rem; +} + +.header-action.is-active { + background: var(--accent-tint); + border-color: var(--accent-soft); +} + +.app-header a:focus-visible, +.button:focus-visible { + outline: 3px solid var(--accent-soft); + outline-offset: 0.2rem; +} + +.app-content { margin: 0 auto; + max-width: var(--container); + min-height: calc(100svh - var(--header-h)); + padding: clamp(2rem, 5vw, 4rem) var(--gutter); +} + +.app-content > main:not(.auth-page) { + width: 100%; +} + +.app-content > main:not(.auth-page) :is(h1, h2, p) { + margin-top: 0; +} + +.app-content h1, +.app-content h2 { + font-family: var(--font-serif); + letter-spacing: var(--tracking-heading); +} + +.app-content h1 { + font-size: var(--text-heading-2); + line-height: var(--leading-heading); +} + +.app-content p { + color: var(--ink-soft); + line-height: var(--leading-body); +} + +.auth-page { + align-items: center; + display: flex; + justify-content: center; + min-height: calc(100svh - var(--header-h) - clamp(4rem, 10vw, 8rem)); +} + +.panel { + background: var(--card); + border: 1px solid var(--line); + border-radius: var(--radius); + box-shadow: var(--shadow-sm); +} + +.auth-panel { + max-width: 28rem; + padding: clamp(1.5rem, 4vw, 2rem); + width: 100%; +} + +.panel-header { + border-bottom: 1px solid var(--line); + margin: 0 calc(clamp(1.5rem, 4vw, 2rem) * -1) 1.5rem; + padding: 0 clamp(1.5rem, 4vw, 2rem) 1.5rem; +} + +.panel-header h1 { + font-size: 1.65rem; + margin: 0 0 0.5rem; +} + +.panel-header p { + font-size: 0.95rem; + margin: 0; +} + +.auth-panel form { + display: grid; + gap: 1rem; +} + +.field { + display: grid; + font-size: 0.9rem; + font-weight: 650; + gap: 0.75rem; +} + +.field input { + background: var(--surface-2); + border: 1px solid var(--line-strong); + border-radius: var(--radius-sm); + color: var(--ink); + min-width: 0; + padding: 0.9rem 1rem; + transition: + border-color var(--duration-fast) var(--ease-standard), + box-shadow var(--duration-fast) var(--ease-standard); +} + +.field input::placeholder { + color: var(--ink-faint); +} + +.field input:focus { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-tint); + outline: none; +} + +.button { + align-items: center; + border: 0; + border-radius: var(--radius-sm); + cursor: pointer; + display: inline-flex; + font-weight: 700; + justify-content: center; + min-height: 2.9rem; + padding: 0.75rem 1.1rem; } -h1 { - color: #335d92; - text-transform: uppercase; - font-size: 4rem; - font-weight: 100; - line-height: 1.1; - margin: 4rem auto; - max-width: 14rem; +.button.primary { + background: var(--accent); + color: var(--on-accent); + transition: + background var(--duration-fast) var(--ease-standard), + transform var(--duration-fast) var(--ease-standard); } -p { - max-width: 14rem; - margin: 2rem auto; - line-height: 1.35; +.button.primary:hover:not(:disabled) { + background: var(--accent-strong); } -@media (min-width: 480px) { - h1 { - max-width: none; +.button:disabled { + cursor: wait; + opacity: 0.65; +} + +.notice { + background: var(--accent-tint); + border-radius: var(--radius-sm); + color: var(--ink); + line-height: 1.5; + margin: 1.25rem 0 0; + padding: 0.85rem 1rem; +} + +.notice.error { + border-left: 3px solid var(--danger); +} + +.notice.success { + border-left: 3px solid var(--accent); +} + +@media (max-width: 600px) { + .app-header-inner { + padding: 0 1rem; } - p { - max-width: none; + .brand span { + display: none; + } + + .app-nav { + margin-left: 0.75rem; + } + + .app-nav a, + .header-action { + padding-inline: 0.65rem; + } + + .app-nav a.is-active::after { + left: 0.65rem; + right: 0.65rem; + } + + .app-content { + padding: 1.5rem 1rem 3rem; + } + + .auth-page { + align-items: flex-start; + min-height: auto; + } +} + +@media (prefers-reduced-motion: reduce) { + .button.primary, + .field input { + transition: none; } } diff --git a/packages/web/src/app.tsx b/packages/web/src/app.tsx index baa8157..f6373c9 100644 --- a/packages/web/src/app.tsx +++ b/packages/web/src/app.tsx @@ -15,25 +15,58 @@ // along with this program. If not, see . import { MetaProvider, Title } from "@solidjs/meta"; -import { Router } from "@solidjs/router"; +import { A, Router } from "@solidjs/router"; import { FileRoutes } from "@solidjs/start/router"; import { Suspense } from "solid-js"; +import "./drfed.css"; import "./app.css"; +import { RelayEnvironmentProvider } from "solid-relay"; + +import { createRelayEnvironment } from "./RelayEnviroment"; export default function App() { + const environment = createRelayEnvironment(); + return ( - ( - - SolidStart - Basic - Index - About - {props.children} - - )} - > - - + + ( + + DrFed +
+
+ +
+
+ {props.children} +
+
+
+ )} + > + +
+
); } diff --git a/packages/web/src/drfed.css b/packages/web/src/drfed.css new file mode 100644 index 0000000..b306ab6 --- /dev/null +++ b/packages/web/src/drfed.css @@ -0,0 +1,107 @@ +/* +DrFed: A web-based platform for developing and debugging ActivityPub apps +Copyright (C) 2026 DrFed team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +:root { + color-scheme: light; + + /* Typography */ + --font-serif: + "Fraunces Variable", Fraunces, Georgia, "Times New Roman", serif; + --font-sans: + "Hanken Grotesk Variable", "Hanken Grotesk", system-ui, -apple-system, + "Segoe UI", sans-serif; + --font-mono: + "IBM Plex Mono", ui-monospace, "SF Mono", "SFMono-Regular", Menlo, Consolas, + monospace; + --text-body: clamp(1rem, 0.96rem + 0.2vw, 1.0625rem); + --text-lede: clamp(1.15rem, 1.05rem + 0.5vw, 1.45rem); + --text-heading-1: clamp(2.7rem, 1.9rem + 3.9vw, 4.75rem); + --text-heading-2: clamp(1.9rem, 1.5rem + 1.9vw, 2.85rem); + --text-heading-3: 1.3rem; + --text-label: 0.78rem; + --leading-body: 1.65; + --leading-heading: 1.08; + --tracking-heading: -0.018em; + --tracking-label: 0.13em; + + /* Light palette */ + --bg: #fdfcfb; + --bg-tint: #f4f2f0; + --surface: #ffffff; + --surface-2: #f5f3f1; + --card: #ffffff; + --ink: #26211f; + --ink-soft: #6a615c; + --ink-faint: #998f89; + --accent: #e45b7d; + --accent-strong: #c23a5c; + --accent-soft: #f4a9b8; + --accent-tint: #f7e3e7; + --on-accent: #ffffff; + --line: #e9e5e1; + --line-strong: #dad4cf; + --danger: #cf3f43; + + /* Elevation */ + --shadow-sm: 0 1px 2px rgb(38 33 31 / 5%), 0 2px 8px rgb(38 33 31 / 4%); + --shadow-md: 0 4px 14px rgb(38 33 31 / 6%), 0 12px 36px rgb(38 33 31 / 7%); + + /* Layout */ + --container: 70rem; + --container-narrow: 48rem; + --gutter: clamp(1.25rem, 5vw, 3rem); + --section-space: clamp(4rem, 3rem + 6vw, 8rem); + --header-h: 4.25rem; + + /* Shape */ + --radius-sm: 0.5rem; + --radius: 0.875rem; + --radius-lg: 1.5rem; + --radius-pill: 999px; + + /* Motion */ + --duration-fast: 0.18s; + --duration-normal: 0.25s; + --ease-standard: ease; + --ease-reveal: cubic-bezier(0.2, 0.7, 0.2, 1); +} + +@media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + + --bg: #181613; + --bg-tint: #1e1b17; + --surface: #201d19; + --surface-2: #272420; + --card: #201d19; + --ink: #f0ece8; + --ink-soft: #bab1aa; + --ink-faint: #887f78; + --accent: #ef6a88; + --accent-strong: #f78da4; + --accent-soft: #b34965; + --accent-tint: #322a27; + --line: #332f2a; + --line-strong: #453f39; + --danger: #ef726b; + + --shadow-sm: 0 1px 2px rgb(0 0 0 / 30%); + --shadow-md: 0 6px 24px rgb(0 0 0 / 40%); + } +} diff --git a/packages/web/src/routes/confirm/[slug].tsx b/packages/web/src/routes/confirm/[slug].tsx new file mode 100644 index 0000000..64d4325 --- /dev/null +++ b/packages/web/src/routes/confirm/[slug].tsx @@ -0,0 +1,108 @@ +// DrFed: A web-based platform for developing and debugging ActivityPub apps +// Copyright (C) 2026 DrFed team +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { useParams, useSearchParams } from "@solidjs/router"; +import { graphql } from "relay-runtime"; +import { Show, createSignal, onMount } from "solid-js"; +import { createMutation } from "solid-relay"; + +import type { CompleteLoginChallenge } from "./__generated__/CompleteLoginChallenge.graphql"; + +const signCompleteMutation = graphql` + mutation CompleteLoginChallenge($token: UUID!, $code: String!) { + completeLoginChallenge(token: $token, code: $code) { + accessToken + expires + } + } +`; + +export default function ConfirmPage() { + const params = useParams<{ slug: string }>(); + const [searchParams] = useSearchParams<{ code?: string }>(); + const [complete] = + createMutation(signCompleteMutation); + const [result, setResult] = createSignal<{ + message: string; + status: "error" | "success"; + }>(); + + function showSessionError() { + setResult({ + message: "Unable to save a session", + status: "error", + }); + } + + onMount(() => { + const { code } = searchParams; + const { slug: token } = params; + + if (token === "" || code == undefined || code === "") { + return; + } + + async function saveSession(accessToken: string, expires: string) { + try { + const response = await fetch("/session", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + accessToken, + expires, + }), + }); + + if (!response.ok) { + showSessionError(); + return; + } + // Redirect to the home page + globalThis.location.assign("/"); + } catch { + showSessionError(); + } + } + + complete({ + variables: { token, code }, + onCompleted(data) { + const session = data.completeLoginChallenge; + if ( + session?.accessToken == undefined || + typeof session.expires !== "string" + ) { + setResult({ + message: "The sign-in link is invalid or expired.", + status: "error", + }); + return; + } + + void saveSession(session.accessToken, session.expires); + }, + onError: (error) => { + setResult({ message: error.message, status: "error" }); + }, + }); + }); + + return ( + + {(value) => {value().message}} + + ); +} diff --git a/packages/web/src/routes/index.tsx b/packages/web/src/routes/index.tsx index 32cfe10..35f3258 100644 --- a/packages/web/src/routes/index.tsx +++ b/packages/web/src/routes/index.tsx @@ -15,15 +15,37 @@ // along with this program. If not, see . import { Title } from "@solidjs/meta"; +import { graphql } from "relay-runtime"; +import { Show } from "solid-js"; +import { createLazyLoadQuery } from "solid-relay"; -import Counter from "~/components/Counter"; +import type { HomeViewerQuery } from "./__generated__/HomeViewerQuery.graphql"; + +const homeViewerQuery = graphql` + query HomeViewerQuery { + viewer { + name + admin + } + } +`; export default function Home() { + const query = createLazyLoadQuery(homeViewerQuery, {}); + return (
Hello World

Hello world!

- + You're not signed in.

}> + {(viewer) => ( +

+ {viewer().name} + {viewer().admin ? " (관리자)" : ""} +

+ )} +
+

Visit{" "} diff --git a/packages/web/src/routes/session.ts b/packages/web/src/routes/session.ts new file mode 100644 index 0000000..8e1c11a --- /dev/null +++ b/packages/web/src/routes/session.ts @@ -0,0 +1,111 @@ +// DrFed: A web-based platform for developing and debugging ActivityPub apps +// Copyright (C) 2026 DrFed team +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import type { APIEvent } from "@solidjs/start/server"; + +const SESSION_COOKIE = "session"; +const ACCESS_TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/u; + +// Note: setCookie(nativeEvent, ...) from @solidjs/start/http is intentionally +// NOT used here. In @solidjs/start 2.0.0-alpha.2, that function produces a +// malformed Set-Cookie header in both "use server" RPCs and POST API route +// handlers — the cookie name becomes "[METHOD] URL" instead of the intended +// name. +export async function POST({ request }: APIEvent) { + let body: unknown; + try { + body = await request.json(); + } catch { + return new Response(undefined, { status: 400 }); + } + if (typeof body !== "object" || body == undefined) { + return new Response(undefined, { status: 400 }); + } + + const accessToken = + "accessToken" in body && typeof body.accessToken === "string" + ? body.accessToken + : undefined; + const expiresValue = + "expires" in body && typeof body.expires === "string" + ? body.expires + : undefined; + + if (accessToken == undefined || expiresValue == undefined) { + return new Response(undefined, { status: 400 }); + } + + if (!ACCESS_TOKEN_PATTERN.test(accessToken)) { + return new Response(undefined, { status: 400 }); + } + + let expires: Temporal.Instant; + + try { + expires = Temporal.Instant.from(expiresValue); + } catch { + return new Response(undefined, { status: 400 }); + } + + if (expires.epochNanoseconds <= Temporal.Now.instant().epochNanoseconds) { + return new Response(undefined, { status: 400 }); + } + + const cookie = [ + `${SESSION_COOKIE}=${encodeURIComponent(accessToken)}`, + "HttpOnly", + "Path=/", + "SameSite=Lax", + `Expires=${new Date(expires.epochMilliseconds).toUTCString()}`, + ...(new URL(request.url).protocol === "https:" ? ["Secure"] : []), + ].join("; "); + + return new Response(undefined, { + status: 204, + headers: { "Set-Cookie": cookie }, + }); +} + +export function readSessionCookie( + request: Request | undefined, +): string | undefined { + const cookieHeader = request?.headers.get("cookie"); + + if (cookieHeader == undefined || cookieHeader == "") { + return undefined; + } + for (const part of cookieHeader.split(";")) { + const eq = part.indexOf("="); + if (eq === -1) { + continue; + } + if (part.slice(0, eq).trim() !== SESSION_COOKIE) { + continue; + } + const raw = part.slice(eq + 1).trim(); + if (raw === "") { + return undefined; + } + let decoded: string; + try { + decoded = decodeURIComponent(raw); + } catch { + return undefined; + } + return ACCESS_TOKEN_PATTERN.test(decoded) ? decoded : undefined; + } + return undefined; +} diff --git a/packages/web/src/routes/sign-in.tsx b/packages/web/src/routes/sign-in.tsx new file mode 100644 index 0000000..760f3ec --- /dev/null +++ b/packages/web/src/routes/sign-in.tsx @@ -0,0 +1,117 @@ +// DrFed: A web-based platform for developing and debugging ActivityPub apps +// Copyright (C) 2026 DrFed team +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { Title } from "@solidjs/meta"; +import { graphql } from "relay-runtime"; +import { type JSX, Show, createSignal } from "solid-js"; +import { createMutation } from "solid-relay"; + +import type { SignInMutation } from "./__generated__/SignInMutation.graphql"; + +const signInMutation = graphql` + mutation SignInMutation($email: Email!, $verifyUrl: URITemplate) { + loginByEmail(email: $email, verifyUrl: $verifyUrl) { + token + } + } +`; + +export default function SignInPage() { + const [signIn, isPending] = createMutation(signInMutation); + const [result, setResult] = createSignal<{ + message: string; + status: "error" | "success"; + }>(); + const buttonLabel = () => { + if (isPending()) { + return "Sending link…"; + } + if (result()?.status === "success") { + return "Resend sign-in link"; + } + return "Send sign-in link"; + }; + + const handleSubmit: JSX.EventHandler = (e) => { + e.preventDefault(); + const email = new FormData(e.currentTarget).get("email"); + if (typeof email !== "string" || email === "") { + return; + } + + setResult(); + signIn({ + variables: { + email, + verifyUrl: `${globalThis.location.origin}/confirm/{token}?code={code}`, + }, + onCompleted: (_response, errors) => { + const [error] = errors ?? []; + + setResult({ + message: + error?.message ?? + "Check your inbox for a secure sign-in link. You can close this page.", + status: error === undefined ? "success" : "error", + }); + }, + onError: (error) => { + setResult({ message: error.message, status: "error" }); + }, + }); + }; + + return ( +

+ Sign in — DrFed + +
+
+

Sign in

+

Enter your email address to receive a secure sign-in link.

+
+ +
+ + +
+ + + {(formResult) => ( +

+ {formResult().message} +

+ )} +
+
+
+ ); +} diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index fe104ea..46a2616 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "lib": ["DOM", "DOM.Iterable"], + "lib": ["DOM", "DOM.Iterable", "ESNext"], "target": "ESNext", "module": "ESNext", "moduleResolution": "bundler", diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index 3ceb82f..948ba05 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -17,7 +17,14 @@ import { solidStart } from "@solidjs/start/config"; import { nitroV2Plugin as nitro } from "@solidjs/vite-plugin-nitro-2"; import { defineConfig } from "vite"; +import { cjsInterop } from "vite-plugin-cjs-interop"; +import relay from "vite-plugin-relay-lite"; -export default defineConfig({ - plugins: [solidStart(), nitro()], -}); +export default defineConfig(({ command }) => ({ + plugins: [ + solidStart(), + nitro(), + relay({ codegen: command !== "build" }), + cjsInterop({ dependencies: ["relay-runtime"] }), + ], +})); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a82d5a..8976c7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -241,20 +241,38 @@ importers: version: 0.15.4(solid-js@1.9.14) '@solidjs/start': specifier: 2.0.0-alpha.2 - version: 2.0.0-alpha.2(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + version: 2.0.0-alpha.2(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) '@solidjs/vite-plugin-nitro-2': specifier: ^0.1.0 - version: 0.1.0(@electric-sql/pglite@0.5.3)(rolldown@1.1.1)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + version: 0.1.0(@electric-sql/pglite@0.5.3)(oxc-parser@0.134.0)(rolldown@1.1.1)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + relay-runtime: + specifier: ^21.0.1 + version: 21.0.1 solid-js: specifier: ^1.9.5 version: 1.9.14 + solid-relay: + specifier: 1.0.0-beta.27 + version: 1.0.0-beta.27(relay-runtime@21.0.1)(seroval@1.5.4)(solid-js@1.9.14) vite: specifier: ^7.0.0 version: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) devDependencies: + '@types/relay-runtime': + specifier: ^20.1.1 + version: 20.1.1 eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + version: 0.14.5(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + relay-compiler: + specifier: ^21.0.1 + version: 21.0.1 + vite-plugin-cjs-interop: + specifier: ^4.0.3 + version: 4.0.3(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + vite-plugin-relay-lite: + specifier: ^0.12.0 + version: 0.12.0(graphql@16.14.2)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) packages: @@ -400,6 +418,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -426,12 +448,21 @@ packages: '@electric-sql/pglite@0.5.3': resolution: {integrity: sha512-iTTYbA5Uesrl+N7zss0J5LopT7KE4j9aymYo+EZZh+rZbARQCUQOs+n2pay64JRUpc3fCkpfrniTNJnvYzOE+g==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.0': resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.0': resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} @@ -971,6 +1002,136 @@ packages: resolution: {integrity: sha512-4H+sJbpKlB0DsFYyJmyTj2atDdF+9j14MbH99zPTK7YGQysWQ4Vo8UR1O91+ssIDUnKkMNoss7zMvaMf6A52Jw==} engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} + '@oxc-parser/binding-android-arm-eabi@0.134.0': + resolution: {integrity: sha512-N9Us7l/X9ZC3LA6eWSzPyduvBPXV1eRyDPwM6/UWpxwwXGsatb8131+d2L8UsmyHrixnKLHBd6UeH8wangV7fw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.134.0': + resolution: {integrity: sha512-Ic2oPZESeCaD4+9cKRqp1GMYsTO9Q3Yi9HdY2x9x75ozbnC20sybFHzeBklmaVD9PBzd8KbkmNN0gy+SVlm7zw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.134.0': + resolution: {integrity: sha512-1z9+nVJ1Awq4CPyHAthx5zOUrg5T1zc3dWt6juxwDcuejFGbdYzWJITkS1rv4DCdSTphDU3IW71MzyLV3BjRGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.134.0': + resolution: {integrity: sha512-MpofofaRZnxmYrY3lE8RTLHmE1KkX2q0elEeJ8sMcLbS8At76BjYSL6axssqhx29prGGDzIZ5lYFD+IXqaTzFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.134.0': + resolution: {integrity: sha512-OqnPQY27vqWAbMnHfLcF8CVOUv2cCvdlTiqyK5qz5WCbH3XOLpYVQATv8S5UrR8bbEJCAqJLsI7W6cRFXAxCoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.134.0': + resolution: {integrity: sha512-0eqWl+PWrcwGC3b8DCB58w3QINAuZfpX2ULTGpI01GUMBc6zDKSpttWxvqPIydxuQEkGQTQRAXLLvc+vTDZbQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.134.0': + resolution: {integrity: sha512-YToasuDmyzpyTC1ztrvkaSXz8tP+YUbx041M/4SGxaRGiyMzsKkQ869KPUTGA57A6aVsb1/DiPX8XZQQeSFkiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.134.0': + resolution: {integrity: sha512-qMS7NLc2o8G7LLz53wisol+O7/YbMhtaGVhlfsTVLnrraf9kLFgzpiGjtQALLbdxX8uhx0Zmd4l+vY3s1/K4Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.134.0': + resolution: {integrity: sha512-jUEsnxPXhrCYxswQLYvUOxZEE5UWFMkK5kBnrcPMj7TONz1pD0yKgPmOQCAx2LPoysJ/v2Sjg4RBUVoO2VXoZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.134.0': + resolution: {integrity: sha512-FU5xMUsXnMuWKVCGo43c6SJsnqHcsioqm32PHdDY39cIRJa/AZbo7RMYW0W5gYcNZqb8EMhELkMDwbJOFbUhtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.134.0': + resolution: {integrity: sha512-tPc7OAhslHVmNebho1RSEGL//7i7Nm39gbQ+gYreBYwzvDVqNwdQH3S13ccM+R1TpimQ+3bIyFMfnilJIGRtjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.134.0': + resolution: {integrity: sha512-TtWEC4MUAHodX5a5kGsmK8g5K49V5ewWfwGrXdbw+gXWLXWXuhi+ectNELmOvYIwaqPSTAry1HNS/hfXssaPHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.134.0': + resolution: {integrity: sha512-mF4uls8TA8SPXSDLpclJ6z9S+vaeUnNp95iUEfqwv9oVJUAE7B2j4crOj8UvByRXpbO5N+aAlJadQEyFlnXU6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.134.0': + resolution: {integrity: sha512-hieAQplyJeCvzqdSAxpOOGvVCBVXo/ioIBxioHfsUrQu93Et7Hy52cCG/GHEnjImVyeqEIViyyjuB0nKghxz/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.134.0': + resolution: {integrity: sha512-OQnJAK4sFuNSLgsh2s/K+14a3kwbmqf2yh1JiADU9XSfDuRooZYbAxmmBVPiyQ97+jBIIA1x2oPZeYNto3Ioow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.134.0': + resolution: {integrity: sha512-RYLooe6g31q/PqNFN0NjR80IK/ARGsfLasAXL42LXonL+5Cyy9Or76rjBKQLAjERikJwbRU/sYW9Q5Tnpt1A4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.134.0': + resolution: {integrity: sha512-h8bmHyvc0PxA811prUjfVpJlQAurOOiRbohY4QNGjCEz+L72G9CmWl28OOz3mevrYlURgUsprNuH8hDJXh1VOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.134.0': + resolution: {integrity: sha512-EPTfanpBMLNnSAWCDYpbJp1stmsf5x6hMsAwymf2J8ylRupIvO6FtKmHBMdc/wt43y08iz6ILlzFGIXe32/Kbw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.134.0': + resolution: {integrity: sha512-yAwetF+fTr9lTMtmqvkkWiiMXvH/yjMxGzUDG2rTL/LV1lL37eZ2enUGIlIo0gwhBIKWgabDEidtil+kiqNpgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.134.0': + resolution: {integrity: sha512-4VY39G5tuGlBYiH13XbWqfLcwKygQEv0iyf8vtZ5NyLAGjI8M0MiYyLhj91GkWRznr+5VC0I+5R55HUDV/Rklw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.134.0': + resolution: {integrity: sha512-T0xuRRKrQFmocH8y+jGfpmSkGcheaJExY9lEihmR1Gm2aH+75B8CzgU2rABRQSzzDxLjZ15Sc0bRVLj5lVeNXQ==} + '@oxc-project/types@0.135.0': resolution: {integrity: sha512-wR+xRdFkUBMvcAjBJ2q2kcZM6d+DKu2NgoOyxZgYwZdLhmiv6+rnO8PZ/P68kMiZtIKm+pW7zyEJ4kSOs0vo+Q==} @@ -1534,6 +1695,9 @@ packages: '@types/pg@8.20.0': resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} + '@types/relay-runtime@20.1.1': + resolution: {integrity: sha512-loM2iJteknnJcsxrynmBVb7pIDkSkJUuCMnAa/oDFcrvaxkDvq8iy0J2UshMdDy14iJJocDblXeAu7c6Q1+Ucw==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -1697,6 +1861,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + ast-kit@3.0.0: resolution: {integrity: sha512-8OG92q3R35qjC/4i6BLBMg8IB+fClWu/1PEwg2Z9Rn+BuNaiEgJzpzn+pxWOdHJWDCAwu2JP0wCDTozAM4QirQ==} engines: {node: ^22.18.0 || >=24.11.0} @@ -1932,6 +2099,15 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -1945,6 +2121,9 @@ packages: resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} engines: {node: '>=18.0'} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-inspect@1.0.1: resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} engines: {node: '>=16.0.0'} @@ -2217,6 +2396,13 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -2351,6 +2537,12 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2561,6 +2753,9 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ioredis@5.11.1: resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} engines: {node: '>=12.22.0'} @@ -2568,6 +2763,9 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} @@ -2662,6 +2860,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2701,6 +2902,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + listhen@1.10.0: resolution: {integrity: sha512-kfz4C0OrC6IpaVMtYDJtf6PFjurxe9NBBoDAh/o2p587INryFOO4DQ9OetbCdDrWFt1m1CJKvYrzkGsuPHw8nQ==} hasBin: true @@ -2719,6 +2923,10 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2864,6 +3072,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + obug@2.1.3: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} @@ -2889,6 +3101,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + oxc-parser@0.134.0: + resolution: {integrity: sha512-Hs8fRG6A94BzMrMkGOtrUS7JQjmslfF+IvIXslf3QURzK3ud0QmFJRiYZjTe4TzAQnTfvlk4AwZnqIbrUjiE4w==} + engines: {node: ^20.19.0 || >=22.12.0} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2904,6 +3120,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -3032,6 +3252,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} @@ -3089,6 +3312,13 @@ packages: regex@5.1.1: resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + relay-compiler@21.0.1: + resolution: {integrity: sha512-Wqlg3MtHyBlAYByVo24Wy9H3n2bAw991gPmzdo3XfNv+TzhI8zuGogtiae+7NORI7zhghgZaHC7Sp8S8ZPRYEA==} + hasBin: true + + relay-runtime@21.0.1: + resolution: {integrity: sha512-OS+We56sp6gkGVEcce9VCNOeg/sMbxT9unEoerQPgNAICHowSWrXNc6LJxF2OqjypxYF7kaLDSPPiaPii2Pw1g==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3204,6 +3434,9 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -3238,6 +3471,13 @@ packages: peerDependencies: solid-js: ^1.3 + solid-relay@1.0.0-beta.27: + resolution: {integrity: sha512-/3sVLygnKi+iWpaf38EEhrnLnwZmr4Gy6BbMyxxjz2Zi5b6L9YSEdemk9P2c62+cm46uErRv4V4VVxg6oGeDNg==} + peerDependencies: + relay-runtime: ^18.1.0 || ^19 || ^20 + seroval: ^1.1.0 + solid-js: '>=1.4.0' + solid-use@0.9.1: resolution: {integrity: sha512-UwvXDVPlrrbj/9ewG9ys5uL2IO4jSiwys2KPzK4zsnAcmEl7iDafZWW1Mo4BSEWOmQCGK6IvpmGHo1aou8iOFw==} engines: {node: '>=10'} @@ -3460,6 +3700,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -3654,6 +3898,19 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-plugin-cjs-interop@4.0.3: + resolution: {integrity: sha512-MznW1ysV+8LXiKiZBKFuVAhYc1KKXNYlhCW7URruydtGtRzBPt1Cj5H66YVIdDo2laNNjejxaZD1g/s4UDQ6Xw==} + engines: {node: 22 || 24 || 25 || 26} + peerDependencies: + vite: ~6.4 || ~7.3 || 8 + + vite-plugin-relay-lite@0.12.0: + resolution: {integrity: sha512-oEQTf5VSHhOW8+jpnnA2uxSwVHYucH4LDa5sLdFNvVKcnHBE0A2QNsQjedmInd05sNla9PDjZs/rejhk6l6Heg==} + engines: {node: '>= 18.0.0'} + peerDependencies: + graphql: ^15.0.0 || ^16.0.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vite-plugin-solid@2.11.12: resolution: {integrity: sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA==} peerDependencies: @@ -3802,20 +4059,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@10.2.2)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3851,24 +4108,24 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@10.2.2) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.29.7': + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@10.2.2)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -3877,19 +4134,19 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@10.2.2)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -3899,18 +4156,18 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@10.2.2) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@10.2.2)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -3938,53 +4195,55 @@ snapshots: dependencies: '@babel/types': 8.0.0 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@10.2.2) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) transitivePeerDependencies: - supports-color + '@babel/runtime@7.29.7': {} + '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.7(supports-color@10.2.2)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -3992,7 +4251,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -4012,17 +4271,33 @@ snapshots: '@electric-sql/pglite@0.5.3': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.11.0': dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 @@ -4201,17 +4476,17 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2))': dependencies: - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0)(supports-color@10.2.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.21.2(supports-color@10.2.2)': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -4224,10 +4499,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/eslintrc@3.3.5(supports-color@10.2.2)': dependencies: ajv: 6.15.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -4390,11 +4665,11 @@ snapshots: dependencies: '@logtape/logtape': 2.3.0-dev.840 - '@mapbox/node-pre-gyp@2.0.3': + '@mapbox/node-pre-gyp@2.0.3(supports-color@10.2.2)': dependencies: consola: 3.4.2 detect-libc: 2.1.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@10.2.2) node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.8.4 @@ -4403,6 +4678,13 @@ snapshots: - encoding - supports-color + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': dependencies: '@emnapi/core': 1.11.0 @@ -4433,6 +4715,72 @@ snapshots: dependencies: '@optique/core': 1.2.0 + '@oxc-parser/binding-android-arm-eabi@0.134.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.134.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.134.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.134.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.134.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.134.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.134.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.134.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.134.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.134.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.134.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.134.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.134.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.134.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.134.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.134.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.134.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.134.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.134.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.134.0': + optional: true + + '@oxc-project/types@0.134.0': {} + '@oxc-project/types@0.135.0': {} '@parcel/watcher-android-arm64@2.5.6': @@ -4782,13 +5130,13 @@ snapshots: dependencies: solid-js: 1.9.14 - '@solidjs/start@2.0.0-alpha.2(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': + '@solidjs/start@2.0.0-alpha.2(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': dependencies: - '@babel/core': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 '@solidjs/meta': 0.29.4(solid-js@1.9.14) - '@tanstack/server-functions-plugin': 1.134.5(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + '@tanstack/server-functions-plugin': 1.134.5(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) '@types/babel__traverse': 7.28.0 '@types/micromatch': 4.0.10 cookie-es: 2.0.1 @@ -4811,15 +5159,15 @@ snapshots: srvx: 0.9.8 terracotta: 1.1.0(solid-js@1.9.14) vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) - vite-plugin-solid: 2.11.12(solid-js@1.9.14)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + vite-plugin-solid: 2.11.12(solid-js@1.9.14)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) transitivePeerDependencies: - '@testing-library/jest-dom' - crossws - supports-color - '@solidjs/vite-plugin-nitro-2@0.1.0(@electric-sql/pglite@0.5.3)(rolldown@1.1.1)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': + '@solidjs/vite-plugin-nitro-2@0.1.0(@electric-sql/pglite@0.5.3)(oxc-parser@0.134.0)(rolldown@1.1.1)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': dependencies: - nitropack: 2.13.4(@electric-sql/pglite@0.5.3)(rolldown@1.1.1)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + nitropack: 2.13.4(@electric-sql/pglite@0.5.3)(oxc-parser@0.134.0)(rolldown@1.1.1)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) transitivePeerDependencies: - '@azure/app-configuration' @@ -4861,26 +5209,26 @@ snapshots: '@speed-highlight/core@1.2.17': {} - '@tanstack/directive-functions-plugin@1.134.5(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': + '@tanstack/directive-functions-plugin@1.134.5(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 - '@tanstack/router-utils': 1.133.19 - babel-dead-code-elimination: 1.0.12 + '@tanstack/router-utils': 1.133.19(supports-color@10.2.2) + babel-dead-code-elimination: 1.0.12(supports-color@10.2.2) pathe: 2.0.3 tiny-invariant: 1.3.3 vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.133.19': + '@tanstack/router-utils@1.133.19(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) ansis: 4.3.1 diff: 8.0.4 pathe: 2.0.3 @@ -4888,17 +5236,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.134.5(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': + '@tanstack/server-functions-plugin@1.134.5(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0))': dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 - '@tanstack/directive-functions-plugin': 1.134.5(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) - babel-dead-code-elimination: 1.0.12 + '@tanstack/directive-functions-plugin': 1.134.5(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + babel-dead-code-elimination: 1.0.12(supports-color@10.2.2) tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color @@ -4960,15 +5308,17 @@ snapshots: pg-protocol: 1.14.0 pg-types: 2.2.0 + '@types/relay-runtime@20.1.1': {} + '@types/resolve@1.20.2': {} '@types/unist@3.0.3': {} - '@typescript-eslint/project-service@8.62.1(typescript@6.0.3)': + '@typescript-eslint/project-service@8.62.1(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) '@typescript-eslint/types': 8.62.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4984,13 +5334,13 @@ snapshots: '@typescript-eslint/types@8.62.1': {} - '@typescript-eslint/typescript-estree@8.62.1(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.62.1(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.62.1(typescript@6.0.3) + '@typescript-eslint/project-service': 8.62.1(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) '@typescript-eslint/types': 8.62.1 '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.8.4 tinyglobby: 0.2.17 @@ -4999,13 +5349,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.62.1(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2)) '@typescript-eslint/scope-manager': 8.62.1 '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/typescript-estree': 8.62.1(supports-color@10.2.2)(typescript@6.0.3) + eslint: 9.39.4(jiti@2.7.0)(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5032,9 +5382,9 @@ snapshots: dependencies: '@upyo/core': 0.6.0-dev.263 - '@vercel/nft@1.10.2(rollup@4.62.2)': + '@vercel/nft@1.10.2(rollup@4.62.2)(supports-color@10.2.2)': dependencies: - '@mapbox/node-pre-gyp': 2.0.3 + '@mapbox/node-pre-gyp': 2.0.3(supports-color@10.2.2) '@rollup/pluginutils': 5.4.0(rollup@4.62.2) acorn: 8.17.0 acorn-import-attributes: 1.9.5(acorn@8.17.0) @@ -5152,6 +5502,8 @@ snapshots: argparse@2.0.1: {} + asap@2.0.6: {} + ast-kit@3.0.0: dependencies: '@babel/parser': 8.0.0 @@ -5164,28 +5516,28 @@ snapshots: b4a@1.8.1: {} - babel-dead-code-elimination@1.0.12: + babel-dead-code-elimination@1.0.12(supports-color@10.2.2): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/parser': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7): + babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7(supports-color@10.2.2)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) '@babel/types': 7.29.7 html-entities: 2.3.3 parse5: 7.3.0 - babel-preset-solid@1.9.12(@babel/core@7.29.7)(solid-js@1.9.14): + babel-preset-solid@1.9.12(@babel/core@7.29.7(supports-color@10.2.2))(solid-js@1.9.14): dependencies: - '@babel/core': 7.29.7 - babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@10.2.2) + babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7(supports-color@10.2.2)) optionalDependencies: solid-js: 1.9.14 @@ -5368,6 +5720,15 @@ snapshots: core-util-is@1.0.3: {} + cosmiconfig@9.0.2(typescript@6.0.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 + crc-32@1.2.2: {} crc32-stream@6.0.0: @@ -5377,6 +5738,12 @@ snapshots: croner@10.0.1: {} + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-inspect@1.0.1: dependencies: tslib: 2.8.1 @@ -5397,9 +5764,11 @@ snapshots: optionalDependencies: '@electric-sql/pglite': 0.5.3 - debug@4.4.3: + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 deep-is@0.1.4: {} @@ -5476,6 +5845,12 @@ snapshots: entities@6.0.1: {} + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} error-stack-parser@2.1.4: @@ -5552,10 +5927,10 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-plugin-solid@0.14.5(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-solid@0.14.5(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3): dependencies: - '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + eslint: 9.39.4(jiti@2.7.0)(supports-color@10.2.2) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 @@ -5576,14 +5951,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.7.0): + eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)(supports-color@10.2.2)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 + '@eslint/config-array': 0.21.2(supports-color@10.2.2) '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 + '@eslint/eslintrc': 3.3.5(supports-color@10.2.2) '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 @@ -5593,7 +5968,7 @@ snapshots: ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -5675,6 +6050,20 @@ snapshots: dependencies: reusify: 1.1.0 + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5: + dependencies: + cross-fetch: 3.2.0 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - encoding + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -5857,10 +6246,10 @@ snapshots: http-shutdown@1.2.2: {} - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@10.2.2): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -5885,11 +6274,15 @@ snapshots: inline-style-parser@0.2.7: {} - ioredis@5.11.1: + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ioredis@5.11.1(supports-color@10.2.2): dependencies: '@ioredis/commands': 1.10.0 cluster-key-slot: 1.1.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) denque: 2.1.0 redis-errors: 1.2.0 redis-parser: 3.0.0 @@ -5899,6 +6292,8 @@ snapshots: iron-webcrypto@1.2.1: {} + is-arrayish@0.2.1: {} + is-core-module@2.16.2: dependencies: hasown: 2.0.4 @@ -5967,6 +6362,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -5996,6 +6393,8 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lines-and-columns@1.2.4: {} + listhen@1.10.0: dependencies: '@parcel/watcher': 2.5.6 @@ -6031,6 +6430,10 @@ snapshots: lodash@4.18.1: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lru-cache@10.4.3: {} lru-cache@11.5.1: {} @@ -6132,7 +6535,7 @@ snapshots: natural-compare@1.4.0: {} - nitropack@2.13.4(@electric-sql/pglite@0.5.3)(rolldown@1.1.1)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): + nitropack@2.13.4(@electric-sql/pglite@0.5.3)(oxc-parser@0.134.0)(rolldown@1.1.1)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.62.2) @@ -6142,7 +6545,7 @@ snapshots: '@rollup/plugin-node-resolve': 16.0.3(rollup@4.62.2) '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) '@rollup/plugin-terser': 1.0.0(rollup@4.62.2) - '@vercel/nft': 1.10.2(rollup@4.62.2) + '@vercel/nft': 1.10.2(rollup@4.62.2)(supports-color@10.2.2) archiver: 7.0.1 c12: 3.3.4(magicast@0.5.3) chokidar: 5.0.0 @@ -6166,7 +6569,7 @@ snapshots: h3: 1.15.11 hookable: 5.5.3 httpxy: 0.5.4 - ioredis: 5.11.1 + ioredis: 5.11.1(supports-color@10.2.2) jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 @@ -6189,7 +6592,7 @@ snapshots: scule: 1.3.0 semver: 7.8.4 serve-placeholder: 2.0.2 - serve-static: 2.2.1 + serve-static: 2.2.1(supports-color@10.2.2) source-map: 0.7.6 std-env: 4.1.0 ufo: 1.6.4 @@ -6197,9 +6600,9 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.0(esbuild@0.28.1)(rolldown@1.1.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) + unimport: 6.3.0(esbuild@0.28.1)(oxc-parser@0.134.0)(rolldown@1.1.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) unplugin-utils: 0.3.2 - unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.3))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.3))(ioredis@5.11.1(supports-color@10.2.2)) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.1 @@ -6264,6 +6667,8 @@ snapshots: normalize-path@3.0.0: {} + object-assign@4.1.1: {} + obug@2.1.3: {} ofetch@1.5.1: @@ -6302,6 +6707,31 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + oxc-parser@0.134.0: + dependencies: + '@oxc-project/types': 0.134.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.134.0 + '@oxc-parser/binding-android-arm64': 0.134.0 + '@oxc-parser/binding-darwin-arm64': 0.134.0 + '@oxc-parser/binding-darwin-x64': 0.134.0 + '@oxc-parser/binding-freebsd-x64': 0.134.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.134.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.134.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.134.0 + '@oxc-parser/binding-linux-arm64-musl': 0.134.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.134.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.134.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.134.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.134.0 + '@oxc-parser/binding-linux-x64-gnu': 0.134.0 + '@oxc-parser/binding-linux-x64-musl': 0.134.0 + '@oxc-parser/binding-openharmony-arm64': 0.134.0 + '@oxc-parser/binding-wasm32-wasi': 0.134.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.134.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.134.0 + '@oxc-parser/binding-win32-x64-msvc': 0.134.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -6316,6 +6746,13 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse5@7.3.0: dependencies: entities: 6.0.1 @@ -6425,6 +6862,10 @@ snapshots: process@0.11.10: {} + promise@7.3.1: + dependencies: + asap: 2.0.6 + property-information@7.2.0: {} punycode@2.3.1: {} @@ -6485,6 +6926,16 @@ snapshots: dependencies: regex-utilities: 2.3.0 + relay-compiler@21.0.1: {} + + relay-runtime@21.0.1: + dependencies: + '@babel/runtime': 7.29.7 + fbjs: 3.0.5 + invariant: 2.2.4 + transitivePeerDependencies: + - encoding + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -6596,9 +7047,9 @@ snapshots: semver@7.8.4: {} - send@1.2.1: + send@1.2.1(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -6624,15 +7075,17 @@ snapshots: dependencies: defu: 6.1.7 - serve-static@2.2.1: + serve-static@2.2.1(supports-color@10.2.2): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1 + send: 1.2.1(supports-color@10.2.2) transitivePeerDependencies: - supports-color + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} shebang-command@2.0.0: @@ -6664,15 +7117,23 @@ snapshots: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-refresh@0.6.3(solid-js@1.9.14): + solid-refresh@0.6.3(solid-js@1.9.14)(supports-color@10.2.2): dependencies: '@babel/generator': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 solid-js: 1.9.14 transitivePeerDependencies: - supports-color + solid-relay@1.0.0-beta.27(relay-runtime@21.0.1)(seroval@1.5.4)(solid-js@1.9.14): + dependencies: + dequal: 2.0.3 + relay-runtime: 21.0.1 + seroval: 1.5.4 + solid-js: 1.9.14 + tiny-invariant: 1.3.3 + solid-use@0.9.1(solid-js@1.9.14): dependencies: solid-js: 1.9.14 @@ -6880,6 +7341,8 @@ snapshots: typescript@6.0.3: {} + ua-parser-js@1.0.41: {} + ufo@1.6.4: {} ultrahtml@1.6.0: {} @@ -6906,7 +7369,7 @@ snapshots: unicorn-magic@0.4.0: {} - unimport@6.3.0(esbuild@0.28.1)(rolldown@1.1.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): + unimport@6.3.0(esbuild@0.28.1)(oxc-parser@0.134.0)(rolldown@1.1.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): dependencies: acorn: 8.17.0 escape-string-regexp: 5.0.0 @@ -6923,6 +7386,7 @@ snapshots: unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.1.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) unplugin-utils: 0.3.2 optionalDependencies: + oxc-parser: 0.134.0 rolldown: 1.1.1 transitivePeerDependencies: - '@farmfe/core' @@ -6980,7 +7444,7 @@ snapshots: rollup: 4.62.2 vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) - unstorage@1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.3))(ioredis@5.11.1): + unstorage@1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.3))(ioredis@5.11.1(supports-color@10.2.2)): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -6992,7 +7456,7 @@ snapshots: ufo: 1.6.4 optionalDependencies: db0: 0.3.4(@electric-sql/pglite@0.5.3) - ioredis: 5.11.1 + ioredis: 5.11.1(supports-color@10.2.2) untun@0.1.3: dependencies: @@ -7045,14 +7509,32 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-solid@2.11.12(solid-js@1.9.14)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): + vite-plugin-cjs-interop@4.0.3(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): + dependencies: + estree-walker: 3.0.3 + magic-string: 0.30.21 + minimatch: 10.2.5 + oxc-parser: 0.134.0 + vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) + + vite-plugin-relay-lite@0.12.0(graphql@16.14.2)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): + dependencies: + cosmiconfig: 9.0.2(typescript@6.0.3) + graphql: 16.14.2 + kleur: 4.1.5 + magic-string: 0.30.21 + vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) + transitivePeerDependencies: + - typescript + + vite-plugin-solid@2.11.12(solid-js@1.9.14)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.12(@babel/core@7.29.7)(solid-js@1.9.14) + babel-preset-solid: 1.9.12(@babel/core@7.29.7(supports-color@10.2.2))(solid-js@1.9.14) merge-anything: 5.1.7 solid-js: 1.9.14 - solid-refresh: 0.6.3(solid-js@1.9.14) + solid-refresh: 0.6.3(solid-js@1.9.14)(supports-color@10.2.2) vite: 7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0) vitefu: 1.1.3(vite@7.3.6(@types/node@26.0.0)(jiti@2.7.0)(terser@5.48.0)) transitivePeerDependencies: diff --git a/scripts/add-license/main.mts b/scripts/add-license/main.mts index 1946ae2..b73d833 100644 --- a/scripts/add-license/main.mts +++ b/scripts/add-license/main.mts @@ -24,7 +24,7 @@ import GPL from "./gpl.mts"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", ".."); const INCLUDED = ["scripts/", "packages/*/src/", "packages/*/bin/"]; -const EXCLUDED = ["**/dist/"]; +const EXCLUDED = ["**/dist/", "**/__generated__/**"]; type Extension = keyof typeof GPL;