From 777038e0b4866794c991c07d284c35997f93cb1b Mon Sep 17 00:00:00 2001 From: Szymon Nowakowski Date: Sat, 3 Aug 2024 10:44:42 +0200 Subject: [PATCH] Init backend, frontend and DB schema --- .editorconfig | 15 + .gitignore | 4 + package.json | 9 + packages/backend/package.json | 16 + packages/backend/src/app.ts | 29 + packages/backend/src/index.ts | 67 ++ packages/backend/src/services/request.ts | 13 + packages/backend/src/services/storage.ts | 107 ++ packages/backend/tsconfig.json | 9 + packages/common/package.json | 14 + packages/common/src/index.ts | 86 ++ packages/common/tsconfig.json | 3 + packages/frontend/index.html | 10 + packages/frontend/package.json | 18 + packages/frontend/src/index.css.ts | 20 + packages/frontend/src/index.tsx | 5 + packages/frontend/src/store.ts | 63 + packages/frontend/tsconfig.json | 3 + packages/frontend/vite.config.js | 6 + pnpm-lock.yaml | 1364 ++++++++++++++++++++++ pnpm-workspace.yaml | 13 + tsconfig.base.json | 34 + tsconfig.json | 9 + 23 files changed, 1917 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 package.json create mode 100644 packages/backend/package.json create mode 100644 packages/backend/src/app.ts create mode 100644 packages/backend/src/index.ts create mode 100644 packages/backend/src/services/request.ts create mode 100644 packages/backend/src/services/storage.ts create mode 100644 packages/backend/tsconfig.json create mode 100644 packages/common/package.json create mode 100644 packages/common/src/index.ts create mode 100644 packages/common/tsconfig.json create mode 100644 packages/frontend/index.html create mode 100644 packages/frontend/package.json create mode 100644 packages/frontend/src/index.css.ts create mode 100644 packages/frontend/src/index.tsx create mode 100644 packages/frontend/src/store.ts create mode 100644 packages/frontend/tsconfig.json create mode 100644 packages/frontend/vite.config.js create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 tsconfig.base.json create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d22cd2f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +tab_width = 4 +trim_trailing_whitespace = true + +[*.{yml,yaml}] +indent_size = 2 +indent_style = space +tab_width = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a503509 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +dist +node_modules +storage +tsconfig.tsbuildinfo diff --git a/package.json b/package.json new file mode 100644 index 0000000..4cfe832 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "music-repo", + "license": "UNLICENSED", + "private": true, + "type": "module", + "devDependencies": { + "typescript": "catalog:" + } +} diff --git a/packages/backend/package.json b/packages/backend/package.json new file mode 100644 index 0000000..c2b55b3 --- /dev/null +++ b/packages/backend/package.json @@ -0,0 +1,16 @@ +{ + "name": "backend", + "license": "UNLICENSED", + "private": true, + "type": "module", + "devDependencies": { + "typescript": "catalog:", + "@types/bun": "latest" + }, + "dependencies": { + "@effect/schema": "catalog:", + "effect": "catalog:", + "fast-check": "catalog:", + "ulid": "catalog:" + } +} diff --git a/packages/backend/src/app.ts b/packages/backend/src/app.ts new file mode 100644 index 0000000..10e509e --- /dev/null +++ b/packages/backend/src/app.ts @@ -0,0 +1,29 @@ +import { Effect } from "effect"; +import { Request } from "./services/request"; +import { Storage } from "./services/storage"; + +const match = (method: string, ...pattern: readonly string[]) => Effect.gen(function* () { + + const req = yield* Request; + + return req.method === method + && req.path.length === pattern.length + && pattern.every((x, i) => x === "*" || x === req.path[i]); +}); + +export const app = Effect.gen(function* () { + + const req = yield* Request; + const storage = yield* Storage; + + if (yield* match("GET", "ping")) { + return new Response("pong", { + headers: { + "Content-Length": "4", + "Content-Type": "text/plain;charset=utf-8", + }, + }); + } + + return new Response(null, { status: 404 }); +}); diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts new file mode 100644 index 0000000..d2835da --- /dev/null +++ b/packages/backend/src/index.ts @@ -0,0 +1,67 @@ +import { AccessLog, RequestId } from "common"; +import { DateTime, Effect, Exit, Option as O, pipe } from "effect"; +import { ulid } from "ulid"; +import { app } from "./app"; +import { Request, RequestInterface } from "./services/request"; +import { StorageFilesystem } from "./services/storage"; + +const storage = StorageFilesystem("storage"); + +const server = Bun.serve({ + fetch: (request, server) => { + + const url = new URL(request.url); + + const ip = pipe( + server.requestIP(request), + O.fromNullable, + O.map((a) => a.address), + ); + + const query = Object.freeze(Object.fromEntries(url.searchParams.entries())); + + const requestId = RequestId.make(ulid()); + const timestamp = Effect.runSync(DateTime.now); + + const accessLog = AccessLog.make({ + timestamp, + requestId, + method: request.method, + pathname: url.pathname, + query, + ip: O.getOrNull(ip), + }); + + console.log(JSON.stringify(accessLog)); + + const requestInterface = Object.freeze({ + requestId, + method: request.method, + path: Object.freeze(url.pathname.slice(1).split("/")), + query, + headers: Object.freeze(Object.fromEntries(request.headers.entries())), + ip, + }); + + const fiber = pipe( + app, + Effect.provideService(Request, requestInterface), + Effect.provide(storage), + Effect.runFork, + ); + + return new Promise((resolve, reject) => { + fiber.addObserver(Exit.match({ + onSuccess: resolve, + onFailure: reject, + })); + }); + }, + websocket: { + message: () => { }, + }, +}); + +process.on("SIGINT", () => { + server.stop(); +}); diff --git a/packages/backend/src/services/request.ts b/packages/backend/src/services/request.ts new file mode 100644 index 0000000..3513a88 --- /dev/null +++ b/packages/backend/src/services/request.ts @@ -0,0 +1,13 @@ +import { RequestId } from "common"; +import { Context, Option as O } from "effect"; + +export interface RequestInterface { + readonly requestId: RequestId; + readonly method: string; + readonly path: readonly string[]; + readonly query: { readonly [_: string]: string }; + readonly headers: { readonly [_: string]: string }; + readonly ip: O.Option; +} + +export class Request extends Context.Tag("Request")() { } diff --git a/packages/backend/src/services/storage.ts b/packages/backend/src/services/storage.ts new file mode 100644 index 0000000..1346141 --- /dev/null +++ b/packages/backend/src/services/storage.ts @@ -0,0 +1,107 @@ +import { Sha256 } from "common"; +import { Context, Data, Effect, Layer } from "effect"; +import { NoSuchElementException } from "effect/Cause"; +import { constant, flow } from "effect/Function"; +import path from "node:path"; + +export class StorageError extends Data.TaggedError("StorageError")<{ cause: unknown }> { } + +export interface StorageInterface { + /** + * @param sha256 SHA-256 of blob to read + * @returns Blob, if exists + */ + readonly read: (sha256: Sha256) => Effect.Effect; + /** + * @param data Blob to write + * @param sha256 Precomputed SHA-256, trusted to be accurate if provided + * @returns Precomputed SHA-256, if provided, internally computed SHA-256 + * otherwise + */ + readonly write: (data: Uint8Array, sha256?: Sha256) => Effect.Effect; +} + +export class Storage extends Context.Tag("Storage")() { } + +/** + * Storage implementation that uses the filesystem. + */ +export const StorageFilesystem = (baseDir: string = ".") => { + const sha256toFilePath = (sha256: Sha256): string => { + const sha256hex = Buffer.from(sha256).toString("hex"); + return path.join( + baseDir, + sha256hex.slice(0, 2), + sha256hex.slice(2, 4), + sha256hex.slice(4), + ); + } + + return Layer.succeed(Storage, Object.freeze({ + read: (sha256) => { + const filePath = sha256toFilePath(sha256); + return Effect.gen(function* () { + const arrayBuffer = yield* Effect.tryPromise({ + try: () => Bun.file(filePath).arrayBuffer(), + catch: (error) => new StorageError({ cause: error }), + }); + const array = new Uint8Array(arrayBuffer); + return array; + }); + }, + write: (data, sha256) => Effect.gen(function* () { + if (sha256 === undefined) { + sha256 = Sha256.make(new Uint8Array(Bun.SHA256.byteLength)); + Bun.SHA256.hash(data, sha256); + } + const filePath = sha256toFilePath(sha256); + yield* Effect.tryPromise({ + try: () => Bun.write(filePath, data), + catch: (error) => new StorageError({ cause: error }), + }); + return sha256; + }), + })); +}; + + +const sha256ToBase64 = (sha256: Sha256): string => { + return Buffer.from(sha256).toString("base64"); +} + +/** + * Storage that keeps all data in memory. + */ +export const StorageMemory = Layer.sync(Storage, () => { + const map = new Map(); + + return Object.freeze({ + read: flow( + sha256ToBase64, + _ => map.get(_), + Effect.fromNullable, + ), + write: (data, sha256) => Effect.sync(() => { + if (sha256 === undefined) { + sha256 = Sha256.make(new Uint8Array(Bun.SHA256.byteLength)); + Bun.SHA256.hash(data, sha256); + } + map.set(sha256ToBase64(sha256), data); + return sha256; + }), + }); +}); + +/** + * Storage that discards any writes silently and always fails to read. + */ +export const StorageEmpty = Layer.succeed(Storage, Object.freeze({ + read: constant(Effect.fail(new NoSuchElementException())), + write: (data, sha256) => Effect.sync(() => { + if (sha256 === undefined) { + sha256 = Sha256.make(new Uint8Array(Bun.SHA256.byteLength)); + Bun.SHA256.hash(data, sha256); + } + return sha256; + }), +})); diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json new file mode 100644 index 0000000..4c3148f --- /dev/null +++ b/packages/backend/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["bun"], + }, + "references": [ + { "path": "../common" }, + ] +} diff --git a/packages/common/package.json b/packages/common/package.json new file mode 100644 index 0000000..00cae17 --- /dev/null +++ b/packages/common/package.json @@ -0,0 +1,14 @@ +{ + "name": "common", + "license": "UNLICENSED", + "private": true, + "type": "module", + "devDependencies": { + "typescript": "catalog:" + }, + "dependencies": { + "@effect/schema": "catalog:", + "effect": "catalog:", + "fast-check": "catalog:" + } +} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts new file mode 100644 index 0000000..d61ef18 --- /dev/null +++ b/packages/common/src/index.ts @@ -0,0 +1,86 @@ +import { Schema as S } from "@effect/schema"; +import { Brand as B, pipe } from "effect"; + +export const AttachmentId = pipe(S.ULID, S.brand("AttachmentId")); +export const PieceId = pipe(S.ULID, S.brand("PieceId")); +export const RequestId = pipe(S.ULID, S.brand("RequestId")); +export const UserId = pipe(S.ULID, S.brand("UserId")); + +export type AttachmentId = typeof AttachmentId.Type; +export type PieceId = typeof PieceId.Type; +export type RequestId = typeof RequestId.Type; +export type UserId = typeof UserId.Type; + +export type Sha256 = B.Branded; +export const Sha256 = pipe( + S.Uint8ArrayFromSelf, + S.fromBrand(B.refined( + (array) => array.byteLength === 32, + () => B.error(`Expected Uint8Array to be 32 bytes long`), + )), +); + +export class BooleanFromNumber extends S.transform( + S.Number, + S.Boolean, + { + strict: true, + decode: (a) => a !== 0, + encode: (i) => i ? 1 : 0, + }, +).annotations({ identifier: "BooleanFromNumber" }) { } + +export const SystemInformation = S.Struct({ + createdBy: UserId, + createdAt: S.DateTimeUtc, + modifiedBy: UserId, + modifiedAt: S.DateTimeUtc, +}); + +export type SystemInformation = typeof SystemInformation.Type; + +export const AccessLog = S.Struct({ + timestamp: S.DateTimeUtc, + requestId: RequestId, + method: S.NonEmptyString, + pathname: S.NonEmptyString, + query: S.parseJson(S.Record({ + key: S.String, + value: S.String, + })), + ip: S.Union(S.NonEmptyString, S.Null), +}); + +export const Attachment = pipe( + S.Struct({ + attachmentId: AttachmentId, + pieceId: PieceId, + sha256: Sha256, + filename: S.NonEmptyString, + mediaType: S.NonEmptyString, + }), + S.extend(SystemInformation), +); + +export const Piece = pipe( + S.Struct({ + pieceId: PieceId, + name: S.NonEmptyString, + composer: S.Union(S.NonEmptyString, S.Null), + lyricist: S.Union(S.NonEmptyString, S.Null), + arranger: S.Union(S.NonEmptyString, S.Null), + }), + S.extend(SystemInformation), +); + +export const User = S.Struct({ + userId: UserId, + username: S.NonEmptyString, + password: S.NonEmptyString, + admin: BooleanFromNumber, +}); + +export type AccessLog = typeof AccessLog.Type; +export type Attachment = typeof Attachment.Type; +export type Piece = typeof Piece.Type; +export type User = typeof User.Type; diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json new file mode 100644 index 0000000..f52a4d1 --- /dev/null +++ b/packages/common/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.base.json", +} diff --git a/packages/frontend/index.html b/packages/frontend/index.html new file mode 100644 index 0000000..586c720 --- /dev/null +++ b/packages/frontend/index.html @@ -0,0 +1,10 @@ + + + + + Repozytorium muzyczne + + + + + diff --git a/packages/frontend/package.json b/packages/frontend/package.json new file mode 100644 index 0000000..d157f75 --- /dev/null +++ b/packages/frontend/package.json @@ -0,0 +1,18 @@ +{ + "name": "frontend", + "license": "UNLICENSED", + "private": true, + "type": "module", + "devDependencies": { + "@vanilla-extract/css": "catalog:", + "@vanilla-extract/vite-plugin": "catalog:", + "typescript": "catalog:", + "vite": "catalog:" + }, + "dependencies": { + "@effect/schema": "catalog:", + "effect": "catalog:", + "fast-check": "catalog:", + "preact": "catalog:" + } +} diff --git a/packages/frontend/src/index.css.ts b/packages/frontend/src/index.css.ts new file mode 100644 index 0000000..bf69f16 --- /dev/null +++ b/packages/frontend/src/index.css.ts @@ -0,0 +1,20 @@ +import { globalStyle } from "@vanilla-extract/css"; + +globalStyle("html, body", { + margin: 0, + padding: 0, + + backgroundColor: "white", + color: "black", + + fontFamily: "system-ui, sans-serif", + fontSize: 16, + fontWeight: "normal", + + "@media": { + "(prefers-color-scheme: dark)": { + backgroundColor: "black", + color: "white", + }, + }, +}); diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx new file mode 100644 index 0000000..a801c7e --- /dev/null +++ b/packages/frontend/src/index.tsx @@ -0,0 +1,5 @@ +import { render } from "preact"; + +import "./index.css"; + +render(

Hello World

, document.body); diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts new file mode 100644 index 0000000..897c25e --- /dev/null +++ b/packages/frontend/src/store.ts @@ -0,0 +1,63 @@ +import { identity } from "effect"; +import { useLayoutEffect, useState } from "preact/hooks"; + +export type Update = T | ((prev: T) => T); +export type Updater = (action: Update) => void; + +export interface Store { + readonly count: number; +} + +let store: Store = Object.freeze({ + count: 0, +}); + +// --- STORE IMPLEMENTATION ---------------------------------------------------- + +class Listener { + + private lastState: T; + + constructor( + readonly selector: Selector, + readonly setState: (state: T) => void, + ) { + this.lastState = selector(store); + } + + react() { + const state = this.selector(store); + if (!Object.is(this.lastState, state)) { + this.lastState = state; + this.setState(state); + } + } +} + +const listeners = new Set>(); + +export type Selector = (store: Store) => T; + +function set(action: Partial | ((store: Store) => Partial), replace?: false): void; +function set(action: Update, replace: true): void; +function set(action: Partial | ((store: Store) => Partial), replace: boolean = false): void { + const nextPartial = typeof action === "function" ? action(store) : action; + if (Object.is(store, nextPartial)) return; + store = Object.freeze(replace ? nextPartial as Store : Object.assign({}, store, nextPartial)); + for (const listener of listeners) { + listener.react(); + } +} + +export function useStore(selector: Selector = identity as Selector): T { + + const [state, setState] = useState(() => selector(store)); + + useLayoutEffect(() => { + const listener = new Listener(selector, setState); + listeners.add(listener); + return () => listeners.delete(listener); + }, []); + + return state; +} diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json new file mode 100644 index 0000000..f52a4d1 --- /dev/null +++ b/packages/frontend/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.base.json", +} diff --git a/packages/frontend/vite.config.js b/packages/frontend/vite.config.js new file mode 100644 index 0000000..95fb17b --- /dev/null +++ b/packages/frontend/vite.config.js @@ -0,0 +1,6 @@ +import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; + +/** @type {import("vite").UserConfig} */ +export default { + plugins: [vanillaExtractPlugin()], +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..bc6baee --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1364 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + '@effect/schema': + specifier: ^0.70.1 + version: 0.70.1 + '@vanilla-extract/css': + specifier: ^1.15.3 + version: 1.15.3 + '@vanilla-extract/vite-plugin': + specifier: ^4.0.13 + version: 4.0.13 + effect: + specifier: ^3.6.0 + version: 3.6.0 + fast-check: + specifier: ^3.20.0 + version: 3.20.0 + preact: + specifier: ^10.23.1 + version: 10.23.1 + typescript: + specifier: ^5.6.0-beta + version: 5.6.0-dev.20240802 + ulid: + specifier: ^2.3.0 + version: 2.3.0 + vite: + specifier: ^5.3.5 + version: 5.3.5 + +importers: + + .: + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.6.0-dev.20240802 + + packages/backend: + dependencies: + '@effect/schema': + specifier: 'catalog:' + version: 0.70.1(effect@3.6.0) + effect: + specifier: 'catalog:' + version: 3.6.0 + fast-check: + specifier: 'catalog:' + version: 3.20.0 + ulid: + specifier: 'catalog:' + version: 2.3.0 + devDependencies: + '@types/bun': + specifier: latest + version: 1.1.6 + typescript: + specifier: 'catalog:' + version: 5.6.0-dev.20240802 + + packages/common: + dependencies: + '@effect/schema': + specifier: 'catalog:' + version: 0.70.1(effect@3.6.0) + effect: + specifier: 'catalog:' + version: 3.6.0 + fast-check: + specifier: 'catalog:' + version: 3.20.0 + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.6.0-dev.20240802 + + packages/frontend: + dependencies: + '@effect/schema': + specifier: 'catalog:' + version: 0.70.1(effect@3.6.0) + effect: + specifier: 'catalog:' + version: 3.6.0 + fast-check: + specifier: 'catalog:' + version: 3.20.0 + preact: + specifier: 'catalog:' + version: 10.23.1 + devDependencies: + '@vanilla-extract/css': + specifier: 'catalog:' + version: 1.15.3 + '@vanilla-extract/vite-plugin': + specifier: 'catalog:' + version: 4.0.13(@types/node@20.12.14)(vite@5.3.5(@types/node@20.12.14)) + typescript: + specifier: 'catalog:' + version: 5.6.0-dev.20240802 + vite: + specifier: 'catalog:' + version: 5.3.5(@types/node@20.12.14) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@effect/schema@0.70.1': + resolution: {integrity: sha512-pxHAmOxWXUs7ZcHBTJUHcMg3ici65bOepxWV7cs//ujv1n9cLQJDQE8phUIzbxtROPcEbZwukGgJy7/HlBjx+w==} + peerDependencies: + effect: ^3.6.0 + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@rollup/rollup-android-arm-eabi@4.19.2': + resolution: {integrity: sha512-OHflWINKtoCFSpm/WmuQaWW4jeX+3Qt3XQDepkkiFTsoxFc5BpF3Z5aDxFZgBqRjO6ATP5+b1iilp4kGIZVWlA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.19.2': + resolution: {integrity: sha512-k0OC/b14rNzMLDOE6QMBCjDRm3fQOHAL8Ldc9bxEWvMo4Ty9RY6rWmGetNTWhPo+/+FNd1lsQYRd0/1OSix36A==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.19.2': + resolution: {integrity: sha512-IIARRgWCNWMTeQH+kr/gFTHJccKzwEaI0YSvtqkEBPj7AshElFq89TyreKNFAGh5frLfDCbodnq+Ye3dqGKPBw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.19.2': + resolution: {integrity: sha512-52udDMFDv54BTAdnw+KXNF45QCvcJOcYGl3vQkp4vARyrcdI/cXH8VXTEv/8QWfd6Fru8QQuw1b2uNersXOL0g==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.19.2': + resolution: {integrity: sha512-r+SI2t8srMPYZeoa1w0o/AfoVt9akI1ihgazGYPQGRilVAkuzMGiTtexNZkrPkQsyFrvqq/ni8f3zOnHw4hUbA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.19.2': + resolution: {integrity: sha512-+tYiL4QVjtI3KliKBGtUU7yhw0GMcJJuB9mLTCEauHEsqfk49gtUBXGtGP3h1LW8MbaTY6rSFIQV1XOBps1gBA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.19.2': + resolution: {integrity: sha512-OR5DcvZiYN75mXDNQQxlQPTv4D+uNCUsmSCSY2FolLf9W5I4DSoJyg7z9Ea3TjKfhPSGgMJiey1aWvlWuBzMtg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.19.2': + resolution: {integrity: sha512-Hw3jSfWdUSauEYFBSFIte6I8m6jOj+3vifLg8EU3lreWulAUpch4JBjDMtlKosrBzkr0kwKgL9iCfjA8L3geoA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.19.2': + resolution: {integrity: sha512-rhjvoPBhBwVnJRq/+hi2Q3EMiVF538/o9dBuj9TVLclo9DuONqt5xfWSaE6MYiFKpo/lFPJ/iSI72rYWw5Hc7w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.19.2': + resolution: {integrity: sha512-EAz6vjPwHHs2qOCnpQkw4xs14XJq84I81sDRGPEjKPFVPBw7fwvtwhVjcZR6SLydCv8zNK8YGFblKWd/vRmP8g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.19.2': + resolution: {integrity: sha512-IJSUX1xb8k/zN9j2I7B5Re6B0NNJDJ1+soezjNojhT8DEVeDNptq2jgycCOpRhyGj0+xBn7Cq+PK7Q+nd2hxLA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.19.2': + resolution: {integrity: sha512-OgaToJ8jSxTpgGkZSkwKE+JQGihdcaqnyHEFOSAU45utQ+yLruE1dkonB2SDI8t375wOKgNn8pQvaWY9kPzxDQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.19.2': + resolution: {integrity: sha512-5V3mPpWkB066XZZBgSd1lwozBk7tmOkKtquyCJ6T4LN3mzKENXyBwWNQn8d0Ci81hvlBw5RoFgleVpL6aScLYg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.19.2': + resolution: {integrity: sha512-ayVstadfLeeXI9zUPiKRVT8qF55hm7hKa+0N1V6Vj+OTNFfKSoUxyZvzVvgtBxqSb5URQ8sK6fhwxr9/MLmxdA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.19.2': + resolution: {integrity: sha512-Mda7iG4fOLHNsPqjWSjANvNZYoW034yxgrndof0DwCy0D3FvTjeNo+HGE6oGWgvcLZNLlcp0hLEFcRs+UGsMLg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.19.2': + resolution: {integrity: sha512-DPi0ubYhSow/00YqmG1jWm3qt1F8aXziHc/UNy8bo9cpCacqhuWu+iSq/fp2SyEQK7iYTZ60fBU9cat3MXTjIQ==} + cpu: [x64] + os: [win32] + + '@types/bun@1.1.6': + resolution: {integrity: sha512-uJgKjTdX0GkWEHZzQzFsJkWp5+43ZS7HC8sZPFnOwnSo1AsNl2q9o2bFeS23disNDqbggEgyFkKCHl/w8iZsMA==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@20.12.14': + resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + '@vanilla-extract/babel-plugin-debug-ids@1.0.6': + resolution: {integrity: sha512-C188vUEYmw41yxg3QooTs8r1IdbDQQ2mH7L5RkORBnHx74QlmsNfqVmKwAVTgrlYt8JoRaWMtPfGm/Ql0BNQrA==} + + '@vanilla-extract/css@1.15.3': + resolution: {integrity: sha512-mxoskDAxdQAspbkmQRxBvolUi1u1jnyy9WZGm+GeH8V2wwhEvndzl1QoK7w8JfA0WFevTxbev5d+i+xACZlPhA==} + + '@vanilla-extract/integration@7.1.7': + resolution: {integrity: sha512-xKwrCtmiBq6QzRNj+IOg5cAMRQRXkFnnvcE374MROJPnVvDX0d+lrIQapFGt64F0H8Gjk4kVl4slvCiV3ECQ4w==} + + '@vanilla-extract/private@1.0.5': + resolution: {integrity: sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw==} + + '@vanilla-extract/vite-plugin@4.0.13': + resolution: {integrity: sha512-JeACJlPtsWp/73Ke1Px/QvDA8M3GlBt4ZjWytSm7rYoKv1qEANSnvAZsAevIp56tTMJaqs++R3L7OkmnFeKhlw==} + peerDependencies: + vite: ^4.0.3 || ^5.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bun-types@1.1.17: + resolution: {integrity: sha512-Z4+OplcSd/YZq7ZsrfD00DKJeCwuNY96a1IDJyR73+cTBaFIS7SC6LhpY/W3AMEXO9iYq5NJ58WAwnwL1p5vKg==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caniuse-lite@1.0.30001646: + resolution: {integrity: sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + effect@3.6.0: + resolution: {integrity: sha512-7bUV/Ytt058F3YWZJyra63MGA80msTk4AnFiVlvCM65RN7afc3LsvLOHpMifLqX/8CG0eDlJLg2lDLByyEnYGQ==} + + electron-to-chromium@1.5.4: + resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + fast-check@3.20.0: + resolution: {integrity: sha512-pZIjqLpOZgdSLecec4GKC3Zq5702MZ34upMKxojnNVSWA0K64V3pXOBT1Wdsrc3AphLtzRBbsi8bRWF4TUGmUg==} + engines: {node: '>=8.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + + modern-ahocorasick@1.0.1: + resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.23.1: + resolution: {integrity: sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + rollup@4.19.2: + resolution: {integrity: sha512-6/jgnN1svF9PjNYJ4ya3l+cqutg49vOZ4rVgsDKxdl+5gpGPnByFXWGyfH9YGx9i3nfBwSu1Iyu6vGwFFA0BdQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + typescript@5.6.0-dev.20240802: + resolution: {integrity: sha512-aPQg1SL05JivtUdMmXq3BBa9NqhNbDvOlDPXvCf3K+kZ5jkxDdf2El6BLEkkzxkWOczoxma8l40ppGsC6pF40A==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + ulid@2.3.0: + resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.25.2': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@effect/schema@0.70.1(effect@3.6.0)': + dependencies: + effect: 3.6.0 + fast-check: 3.20.0 + + '@emotion/hash@0.9.2': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@rollup/rollup-android-arm-eabi@4.19.2': + optional: true + + '@rollup/rollup-android-arm64@4.19.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.19.2': + optional: true + + '@rollup/rollup-darwin-x64@4.19.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.19.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.19.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.19.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.19.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.19.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.19.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.19.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.19.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.19.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.19.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.19.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.19.2': + optional: true + + '@types/bun@1.1.6': + dependencies: + bun-types: 1.1.17 + + '@types/estree@1.0.5': {} + + '@types/node@20.12.14': + dependencies: + undici-types: 5.26.5 + + '@types/ws@8.5.12': + dependencies: + '@types/node': 20.12.14 + + '@vanilla-extract/babel-plugin-debug-ids@1.0.6': + dependencies: + '@babel/core': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@vanilla-extract/css@1.15.3': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.5 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.0.1 + picocolors: 1.0.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/integration@7.1.7(@types/node@20.12.14)': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@vanilla-extract/babel-plugin-debug-ids': 1.0.6 + '@vanilla-extract/css': 1.15.3 + dedent: 1.5.3 + esbuild: 0.21.5 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + mlly: 1.7.1 + vite: 5.3.5(@types/node@20.12.14) + vite-node: 1.6.0(@types/node@20.12.14) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + '@vanilla-extract/private@1.0.5': {} + + '@vanilla-extract/vite-plugin@4.0.13(@types/node@20.12.14)(vite@5.3.5(@types/node@20.12.14))': + dependencies: + '@vanilla-extract/integration': 7.1.7(@types/node@20.12.14) + vite: 5.3.5(@types/node@20.12.14) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + acorn@8.12.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001646 + electron-to-chromium: 1.5.4 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bun-types@1.1.17: + dependencies: + '@types/node': 20.12.14 + '@types/ws': 8.5.12 + + cac@6.7.14: {} + + caniuse-lite@1.0.30001646: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + + confbox@0.1.7: {} + + convert-source-map@2.0.0: {} + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + dedent@1.5.3: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + effect@3.6.0: {} + + electron-to-chromium@1.5.4: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + eval@0.1.8: + dependencies: + '@types/node': 20.12.14 + require-like: 0.1.2 + + fast-check@3.20.0: + dependencies: + pure-rand: 6.1.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + globals@11.12.0: {} + + has-flag@3.0.0: {} + + javascript-stringify@2.1.0: {} + + js-tokens@4.0.0: {} + + jsesc@2.5.2: {} + + json5@2.2.3: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.25.0 + + mlly@1.7.1: + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.4 + + modern-ahocorasick@1.0.1: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + node-releases@2.0.18: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + pathe@1.1.2: {} + + picocolors@1.0.1: {} + + pkg-types@1.1.3: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + + postcss@8.4.40: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + preact@10.23.1: {} + + pure-rand@6.1.0: {} + + regenerator-runtime@0.14.1: {} + + require-like@0.1.2: {} + + rollup@4.19.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.19.2 + '@rollup/rollup-android-arm64': 4.19.2 + '@rollup/rollup-darwin-arm64': 4.19.2 + '@rollup/rollup-darwin-x64': 4.19.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.19.2 + '@rollup/rollup-linux-arm-musleabihf': 4.19.2 + '@rollup/rollup-linux-arm64-gnu': 4.19.2 + '@rollup/rollup-linux-arm64-musl': 4.19.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.19.2 + '@rollup/rollup-linux-riscv64-gnu': 4.19.2 + '@rollup/rollup-linux-s390x-gnu': 4.19.2 + '@rollup/rollup-linux-x64-gnu': 4.19.2 + '@rollup/rollup-linux-x64-musl': 4.19.2 + '@rollup/rollup-win32-arm64-msvc': 4.19.2 + '@rollup/rollup-win32-ia32-msvc': 4.19.2 + '@rollup/rollup-win32-x64-msvc': 4.19.2 + fsevents: 2.3.3 + + semver@6.3.1: {} + + source-map-js@1.2.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + to-fast-properties@2.0.0: {} + + typescript@5.6.0-dev.20240802: {} + + ufo@1.5.4: {} + + ulid@2.3.0: {} + + undici-types@5.26.5: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + vite-node@1.6.0(@types/node@20.12.14): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.3.5(@types/node@20.12.14) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite@5.3.5(@types/node@20.12.14): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.19.2 + optionalDependencies: + '@types/node': 20.12.14 + fsevents: 2.3.3 + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..de1331e --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,13 @@ +packages: + - 'packages/*' + +catalog: + '@effect/schema': '^0.70.1' + '@vanilla-extract/css': '^1.15.3' + '@vanilla-extract/vite-plugin': '^4.0.13' + effect: '^3.6.0' + fast-check: '^3.20.0' + preact: '^10.23.1' + typescript: '^5.6.0-beta' + ulid: '^2.3.0' + vite: '^5.3.5' diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..3ca2c6c --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "composite": true, + "emitDeclarationOnly": true, + "declarationMap": true, + + "rootDir": "${configDir}/src", + "outDir": "${configDir}/dist", + + "module": "ES2020", + "moduleResolution": "Bundler", + "moduleDetection": "force", + + "types": [], + + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "jsxImportSource": "preact", + + "strict": true, + "exactOptionalPropertyTypes": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "allowImportingTsExtensions": true, + + "skipLibCheck": true, + + "paths": { + "common": ["./packages/common/src/index.ts"], + }, + }, + "include": ["${configDir}/src"], +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d02120e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "include": [], + "references": [ + { "path": "packages/backend" }, + { "path": "packages/common" }, + { "path": "packages/frontend" }, + ], +}