From 590b7c569600e7f4dda44d9ddbea5e865632c17f Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Mon, 19 May 2025 21:44:53 +0200 Subject: [PATCH 001/136] feat: added figma css variables to globals.css --- .vscode/extensions.json | 4 +- src/app/globals.css | 81 +++++++++++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index c1401b2..36e0b18 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,6 +4,8 @@ "vivaxy.vscode-conventional-commits", "dbaeumer.vscode-eslint", "bradlc.vscode-tailwindcss", - "bourhaouta.tailwindshades" + "bourhaouta.tailwindshades", + "nize.oklch-preview", + "azizziy.oklch-as" ] } diff --git a/src/app/globals.css b/src/app/globals.css index 322500b..0d04624 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -4,9 +4,40 @@ @custom-variant dark (&:is(.dark *)); :root { - --radius: 0.625rem; + /* Custom values */ - --background: oklch(1 0 0); + --neutral-000: oklch(0 0 0); + --neutral-100: oklch(0.2264 0 0); + --neutral-150: oklch(0.2972 0 0); + --neutral-200: oklch(0.3407 0 0); + --neutral-300: oklch(0.4495 0 0); + --neutral-400: oklch(0.5486 0 0); + --neutral-500: oklch(0.6434 0 0); + --neutral-600: oklch(0.738 0 0); + --neutral-700: oklch(0.8266 0 0); + --neutral-750: oklch(0.9128 0 0); + --neutral-800: oklch(0.9702 0 0); + --neutral-900: oklch(1 0 0); + + --background: var(--neutral-750); + --base: var(--neutral-800); + --text: var(--neutral-000); + --text-alt: var(--neutral-900); + --background-disabled: var(--neutral-500); + --text-disabled: var(--neutral-700); + --radius: 0.688rem; + + --primary: oklch(0.7493 0.1551 74.95); + --hover-primary: oklch(0.6568 0.1358 74.86 / 0.8); + --active-primary: oklch(0.5911 0.1135 78.29); + --disabled-primary: oklch(0.6568 0.1358 74.86 / 0.5); + + --secondary: oklch(0.4937 0.1697 271.26); + --hover-secondary: oklch(0.4937 0.1697 271.26 / 0.8); + --active-secondary: oklch(0.4254 0.133 272.15); + --disabled-secondary: oklch(0.4937 0.1697 271.26 / 0.5); + + /* ------------------- */ --foreground: oklch(0.13 0.028 261.692); @@ -18,12 +49,8 @@ --popover-foreground: oklch(0.13 0.028 261.692); - --primary: oklch(0.21 0.034 264.665); - --primary-foreground: oklch(0.985 0.002 247.839); - --secondary: oklch(0.967 0.003 264.542); - --secondary-foreground: oklch(0.21 0.034 264.665); --muted: oklch(0.967 0.003 264.542); @@ -70,6 +97,10 @@ } @theme inline { + --radius: 0.688rem; + + /* Custom values */ + --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); @@ -142,7 +173,39 @@ } .dark { - --background: oklch(0.13 0.028 261.692); + /* Custom values */ + + --neutral-000: oklch(1 0 0); + --neutral-100: oklch(0.9128 0 0); + --neutral-150: oklch(0.9702 0 0); + --neutral-200: oklch(0.8266 0 0); + --neutral-300: oklch(0.738 0 0); + --neutral-400: oklch(0.6434 0 0); + --neutral-600: oklch(0.4495 0 0); + --neutral-500: oklch(0.5486 0 0); + --neutral-700: oklch(0.3407 0 0); + --neutral-750: oklch(0.2972 0 0); + --neutral-800: oklch(0.2264 0 0); + --neutral-900: oklch(0 0 0); + + --background: var(--neutral-750); + --base: var(--neutral-800); + --text: var(--neutral-000); + --text-alt: var(--neutral-900); + --background-disabled: var(--neutral-500); + --text-disabled: var(--neutral-700); + + --primary: oklch(0.6568 0.1358 74.86); + --hover-primary: oklch(0.6568 0.1358 74.86 / 0.8); + --active-primary: oklch(0.5274 0.0997 78.52); + --disabled-primary: oklch(0.6568 0.1358 74.86 / 0.4); + + --secondary: oklch(0.6065 0.213 271.11); + --hover-secondary: oklch(0.6065 0.213 271.11 / 0.8); + --active-secondary: oklch(0.4471 0.15 271.61); + --disabled-secondary: oklch(0.6065 0.213 271.11 / 0.4); + + /* ------------------- */ --foreground: oklch(0.985 0.002 247.839); @@ -154,12 +217,8 @@ --popover-foreground: oklch(0.985 0.002 247.839); - --primary: oklch(0.928 0.006 264.531); - --primary-foreground: oklch(0.21 0.034 264.665); - --secondary: oklch(0.278 0.033 256.848); - --secondary-foreground: oklch(0.985 0.002 247.839); --muted: oklch(0.278 0.033 256.848); From 88dc6303c193385a53aaf702427107b3ee36452c Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Tue, 20 May 2025 17:12:47 +0200 Subject: [PATCH 002/136] feat: add transparent color variable and update background color in globals.css --- src/app/globals.css | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index 0d04624..a7bbb2b 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -6,6 +6,8 @@ :root { /* Custom values */ + --transparent: transparent; + --neutral-000: oklch(0 0 0); --neutral-100: oklch(0.2264 0 0); --neutral-150: oklch(0.2972 0 0); @@ -19,7 +21,7 @@ --neutral-800: oklch(0.9702 0 0); --neutral-900: oklch(1 0 0); - --background: var(--neutral-750); + --background: var(--neutral-800); --base: var(--neutral-800); --text: var(--neutral-000); --text-alt: var(--neutral-900); @@ -97,8 +99,39 @@ } @theme inline { + --transparent: var(--transpatent); + + --color-neutral-000: var(--neutral-000); + --color-neutral-100: var(--neutral-100); + --color-neutral-150: var(--neutral-150); + --color-neutral-200: var(--neutral-200); + --color-neutral-300: var(--neutral-300); + --color-neutral-400: var(--neutral-400); + --color-neutral-500: var(--neutral-500); + --color-neutral-600: var(--neutral-600); + --color-neutral-700: var(--neutral-700); + --color-neutral-750: var(--neutral-750); + --color-neutral-800: var(--neutral-800); + --color-neutral-900: var(--neutral-900); + + --background: var(--neutral-750); + --base: var(--neutral-800); + --text: var(--neutral-000); + --text-alt: var(--neutral-900); + --background-disabled: var(--neutral-500); + --text-disabled: var(--neutral-700); --radius: 0.688rem; + --color-primary: var(--primary); + --color-hover-primary: var(--hover-primary); + --color-active-primary: var(--active-primary); + --color-disabled-primary: var(--disabled-primary); + + --color-secondary: var(--secondary); + --color-hover-secondary: var(--hover-secondary); + --color-active-secondary: var(--active-secondary); + --disabled-secondary: var(--disabled-secondary); + /* Custom values */ --radius-sm: calc(var(--radius) - 4px); @@ -175,6 +208,8 @@ .dark { /* Custom values */ + --transparent: transparent; + --neutral-000: oklch(1 0 0); --neutral-100: oklch(0.9128 0 0); --neutral-150: oklch(0.9702 0 0); From 0ec5dc3bb61c41a10aa89ba62aeb41b7b96ad70c Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Thu, 8 May 2025 18:23:24 +0200 Subject: [PATCH 003/136] test: initialize cypress e2e testing library --- cypress.config.ts | 16 + cypress/fixtures/example.json | 5 + cypress/support/commands.ts | 37 + cypress/support/component-index.html | 14 + cypress/support/component.ts | 36 + cypress/support/e2e.ts | 17 + package.json | 5 +- yarn.lock | 1358 ++++++++++++++++++++++++-- 8 files changed, 1420 insertions(+), 68 deletions(-) create mode 100644 cypress.config.ts create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/support/commands.ts create mode 100644 cypress/support/component-index.html create mode 100644 cypress/support/component.ts create mode 100644 cypress/support/e2e.ts diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 0000000..768b87a --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'cypress'; + +export default defineConfig({ + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, + + component: { + devServer: { + framework: 'next', + bundler: 'webpack', + }, + }, +}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 0000000..02e4254 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 0000000..95857ae --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,37 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } diff --git a/cypress/support/component-index.html b/cypress/support/component-index.html new file mode 100644 index 0000000..2cbfac6 --- /dev/null +++ b/cypress/support/component-index.html @@ -0,0 +1,14 @@ + + + + + + + Components App + +
+ + +
+ + diff --git a/cypress/support/component.ts b/cypress/support/component.ts new file mode 100644 index 0000000..23fbccc --- /dev/null +++ b/cypress/support/component.ts @@ -0,0 +1,36 @@ +// *********************************************************** +// This example support/component.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; + +import { mount } from 'cypress/react'; + +// Augment the Cypress namespace to include type definitions for +// your custom command. +// Alternatively, can be defined in cypress/support/component.d.ts +// with a at the top of your spec. +declare global { + namespace Cypress { + interface Chainable { + mount: typeof mount; + } + } +} + +Cypress.Commands.add('mount', mount); + +// Example use: +// cy.mount() diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts new file mode 100644 index 0000000..e66558e --- /dev/null +++ b/cypress/support/e2e.ts @@ -0,0 +1,17 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; diff --git a/package.json b/package.json index 37849ca..5f6038f 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,11 @@ "scripts": { "dev": "next dev --turbopack", "build": "prettier --check . && next build", - "start": "next start", + "start": "node .next/standalone/server.js", "lint": "next lint", "format": "prettier --write .", + "cypress:open": "cypress open", + "cypress:run": "cypress run", "prisma:migrate": "dotenv -e .env.local -- prisma migrate dev", "prisma:generate": "dotenv -e .env.local -- prisma generate", "prisma:studio": "dotenv -e .env.local -- prisma studio", @@ -47,6 +49,7 @@ "@types/node": "22.15.21", "@types/react": "19.1.4", "@types/react-dom": "19.1.5", + "cypress": "14.3.3", "dotenv-cli": "8.0.0", "eslint": "9.27.0", "eslint-config-next": "15.3.2", diff --git a/yarn.lock b/yarn.lock index 9639608..d4dd356 100644 --- a/yarn.lock +++ b/yarn.lock @@ -57,6 +57,42 @@ __metadata: languageName: node linkType: hard +"@cypress/request@npm:^3.0.8": + version: 3.0.8 + resolution: "@cypress/request@npm:3.0.8" + dependencies: + aws-sign2: "npm:~0.7.0" + aws4: "npm:^1.8.0" + caseless: "npm:~0.12.0" + combined-stream: "npm:~1.0.6" + extend: "npm:~3.0.2" + forever-agent: "npm:~0.6.1" + form-data: "npm:~4.0.0" + http-signature: "npm:~1.4.0" + is-typedarray: "npm:~1.0.0" + isstream: "npm:~0.1.2" + json-stringify-safe: "npm:~5.0.1" + mime-types: "npm:~2.1.19" + performance-now: "npm:^2.1.0" + qs: "npm:6.14.0" + safe-buffer: "npm:^5.1.2" + tough-cookie: "npm:^5.0.0" + tunnel-agent: "npm:^0.6.0" + uuid: "npm:^8.3.2" + checksum: 10c0/76cabf6ad64df224bab9b66869f71c4fb63315f9775ef1769da9da6c8d6d470899bee7f5b800379020efb6c7f37fd16a4a8e25c61319e14cd720bd3f606a38fd + languageName: node + linkType: hard + +"@cypress/xvfb@npm:^1.2.4": + version: 1.2.4 + resolution: "@cypress/xvfb@npm:1.2.4" + dependencies: + debug: "npm:^3.1.0" + lodash.once: "npm:^4.1.1" + checksum: 10c0/1bf6224b244f6093033d77f04f6bef719280542656de063cf8ac3f38957b62aa633e6918af0b9673a8bf0123b42a850db51d9729a3ae3da885ac179bc7fc1d26 + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/core@npm:1.4.3" @@ -67,7 +103,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.4.3": +"@emnapi/runtime@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/runtime@npm:1.4.3" dependencies: @@ -302,9 +338,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-arm64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-darwin-arm64@npm:0.34.1" +"@img/sharp-darwin-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-darwin-arm64@npm:0.34.2" dependencies: "@img/sharp-libvips-darwin-arm64": "npm:1.1.0" dependenciesMeta: @@ -314,9 +350,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-darwin-x64@npm:0.34.1" +"@img/sharp-darwin-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-darwin-x64@npm:0.34.2" dependencies: "@img/sharp-libvips-darwin-x64": "npm:1.1.0" dependenciesMeta: @@ -389,9 +425,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-arm64@npm:0.34.1" +"@img/sharp-linux-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-arm64@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-arm64": "npm:1.1.0" dependenciesMeta: @@ -401,9 +437,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-arm@npm:0.34.1" +"@img/sharp-linux-arm@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-arm@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-arm": "npm:1.1.0" dependenciesMeta: @@ -413,9 +449,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-s390x@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-s390x@npm:0.34.1" +"@img/sharp-linux-s390x@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-s390x@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-s390x": "npm:1.1.0" dependenciesMeta: @@ -425,9 +461,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-x64@npm:0.34.1" +"@img/sharp-linux-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-x64@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-x64": "npm:1.1.0" dependenciesMeta: @@ -437,9 +473,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-arm64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.1" +"@img/sharp-linuxmusl-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.2" dependencies: "@img/sharp-libvips-linuxmusl-arm64": "npm:1.1.0" dependenciesMeta: @@ -449,9 +485,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linuxmusl-x64@npm:0.34.1" +"@img/sharp-linuxmusl-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.2" dependencies: "@img/sharp-libvips-linuxmusl-x64": "npm:1.1.0" dependenciesMeta: @@ -461,25 +497,32 @@ __metadata: languageName: node linkType: hard -"@img/sharp-wasm32@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-wasm32@npm:0.34.1" +"@img/sharp-wasm32@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-wasm32@npm:0.34.2" dependencies: - "@emnapi/runtime": "npm:^1.4.0" + "@emnapi/runtime": "npm:^1.4.3" conditions: cpu=wasm32 languageName: node linkType: hard -"@img/sharp-win32-ia32@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-win32-ia32@npm:0.34.1" +"@img/sharp-win32-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-win32-arm64@npm:0.34.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-win32-ia32@npm:0.34.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@img/sharp-win32-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-win32-x64@npm:0.34.1" +"@img/sharp-win32-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-win32-x64@npm:0.34.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1634,7 +1677,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.21": +"@types/node@npm:*, @types/node@npm:22.15.21": version: 22.15.21 resolution: "@types/node@npm:22.15.21" dependencies: @@ -1661,6 +1704,29 @@ __metadata: languageName: node linkType: hard +"@types/sinonjs__fake-timers@npm:8.1.1": + version: 8.1.1 + resolution: "@types/sinonjs__fake-timers@npm:8.1.1" + checksum: 10c0/e2e6c425a548177c0930c2f9b82d3951956c9701b9ebf59623d5ad2c3229c523d3c0d598e79fe7392a239657abd3dbe3676be0650ce438bcd1199ee3b617a4d7 + languageName: node + linkType: hard + +"@types/sizzle@npm:^2.3.2": + version: 2.3.9 + resolution: "@types/sizzle@npm:2.3.9" + checksum: 10c0/db0277ff62e8ebe6cdae2020fd045fd7fd19f29a3a2ce13c555b14fb00e105e79004883732118b9f2e8b943cb302645e9eddb4e7bdeef1a171da679cd4c32b72 + languageName: node + linkType: hard + +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": version: 8.32.1 resolution: "@typescript-eslint/eslint-plugin@npm:8.32.1" @@ -1912,6 +1978,16 @@ __metadata: languageName: node linkType: hard +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + "ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -1924,7 +2000,30 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.1.0": +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -1933,6 +2032,13 @@ __metadata: languageName: node linkType: hard +"arch@npm:^2.2.0": + version: 2.2.0 + resolution: "arch@npm:2.2.0" + checksum: 10c0/4ceaf8d8207817c216ebc4469742052cb0a097bc45d9b7fcd60b7507220da545a28562ab5bdd4dfe87921bb56371a0805da4e10d704e01f93a15f83240f1284c + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -2061,6 +2167,22 @@ __metadata: languageName: node linkType: hard +"asn1@npm:~0.2.3": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 10c0/00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: 10c0/b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -2068,6 +2190,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -2075,6 +2204,27 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.0": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -2084,6 +2234,20 @@ __metadata: languageName: node linkType: hard +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 10c0/021d2cc5547d4d9ef1633e0332e746a6f447997758b8b68d6fb33f290986872d2bff5f0c37d5832f41a7229361f093cd81c40898d96ed153493c0fb5cd8575d2 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: 10c0/c993d0d186d699f685d73113733695d648ec7d4b301aba2e2a559d0cd9c1c902308cc52f4095e1396b23fddbc35113644e7f0a6a32753636306e41e3ed6f1e79 + languageName: node + linkType: hard + "axe-core@npm:^4.10.0": version: 4.10.3 resolution: "axe-core@npm:4.10.3" @@ -2105,6 +2269,36 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: 10c0/ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 + languageName: node + linkType: hard + +"blob-util@npm:^2.0.2": + version: 2.0.2 + resolution: "blob-util@npm:2.0.2" + checksum: 10c0/ed82d587827e5c86be122301a7c250f8364963e9582f72a826255bfbd32f8d69cc10169413d666667bb1c4fc8061329ae89d176ffe46fee8f32080af944ccddc + languageName: node + linkType: hard + +"bluebird@npm:^3.7.2": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -2133,6 +2327,23 @@ __metadata: languageName: node linkType: hard +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer@npm:^5.7.1": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "busboy@npm:1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -2142,6 +2353,13 @@ __metadata: languageName: node linkType: hard +"cachedir@npm:^2.3.0": + version: 2.4.0 + resolution: "cachedir@npm:2.4.0" + checksum: 10c0/76bff9009f2c446cd3777a4aede99af634a89670a67012b8041f65e951d3d36cefe8940341ea80c72219ee9913fa1f6146824cd9dfe9874a4bded728af7e6d76 + languageName: node + linkType: hard + "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -2188,7 +2406,14 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0": +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: 10c0/ccf64bcb6c0232cdc5b7bd91ddd06e23a4b541f138336d4725233ac538041fb2f29c2e86c3c4a7a61ef990b665348db23a047060b9414c3a6603e9fa61ad4626 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -2198,6 +2423,13 @@ __metadata: languageName: node linkType: hard +"check-more-types@npm:^2.24.0": + version: 2.24.0 + resolution: "check-more-types@npm:2.24.0" + checksum: 10c0/93fda2c32eb5f6cd1161a84a2f4107c0e00b40a851748516791dd9a0992b91bdf504e3bf6bf7673ce603ae620042e11ed4084d16d6d92b36818abc9c2e725520 + languageName: node + linkType: hard + "chownr@npm:^3.0.0": version: 3.0.0 resolution: "chownr@npm:3.0.0" @@ -2205,6 +2437,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^4.1.0": + version: 4.2.0 + resolution: "ci-info@npm:4.2.0" + checksum: 10c0/37a2f4b6a213a5cf835890eb0241f0d5b022f6cfefde58a69e9af8e3a0e71e06d6ad7754b0d4efb9cd2613e58a7a33996d71b56b0d04242722e86666f3f3d058 + languageName: node + linkType: hard + "class-variance-authority@npm:^0.7.1": version: 0.7.1 resolution: "class-variance-authority@npm:0.7.1" @@ -2214,6 +2453,45 @@ __metadata: languageName: node linkType: hard +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-table3@npm:0.6.1": + version: 0.6.1 + resolution: "cli-table3@npm:0.6.1" + dependencies: + colors: "npm:1.4.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + colors: + optional: true + checksum: 10c0/19ab1bb14bd11b3ca3557ce5ad37ef73e489ea814b99f803171e6ac0a3f2ae5fffb6dbc8864e33cdcf2a3644ebc31b488b8e624fd74af44a1c77cc365c143db4 + languageName: node + linkType: hard + +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: "npm:^3.0.0" + string-width: "npm:^4.2.0" + checksum: 10c0/dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 + languageName: node + linkType: hard + "client-only@npm:0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" @@ -2264,6 +2542,43 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.16": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"colors@npm:1.4.0": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 10c0/9af357c019da3c5a098a301cf64e3799d27549d8f185d86f79af23069e4f4303110d115da98483519331f6fb71c8568d5688fa1c6523600044fd4a54e97c4efb + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:^6.2.1": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + +"common-tags@npm:^1.8.0": + version: 1.8.2 + resolution: "common-tags@npm:1.8.2" + checksum: 10c0/23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -2271,7 +2586,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.6": +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 10c0/980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -2289,6 +2611,59 @@ __metadata: languageName: node linkType: hard +"cypress@npm:14.3.3": + version: 14.3.3 + resolution: "cypress@npm:14.3.3" + dependencies: + "@cypress/request": "npm:^3.0.8" + "@cypress/xvfb": "npm:^1.2.4" + "@types/sinonjs__fake-timers": "npm:8.1.1" + "@types/sizzle": "npm:^2.3.2" + arch: "npm:^2.2.0" + blob-util: "npm:^2.0.2" + bluebird: "npm:^3.7.2" + buffer: "npm:^5.7.1" + cachedir: "npm:^2.3.0" + chalk: "npm:^4.1.0" + check-more-types: "npm:^2.24.0" + ci-info: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-table3: "npm:0.6.1" + commander: "npm:^6.2.1" + common-tags: "npm:^1.8.0" + dayjs: "npm:^1.10.4" + debug: "npm:^4.3.4" + enquirer: "npm:^2.3.6" + eventemitter2: "npm:6.4.7" + execa: "npm:4.1.0" + executable: "npm:^4.1.1" + extract-zip: "npm:2.0.1" + figures: "npm:^3.2.0" + fs-extra: "npm:^9.1.0" + getos: "npm:^3.2.1" + is-installed-globally: "npm:~0.4.0" + lazy-ass: "npm:^1.6.0" + listr2: "npm:^3.8.3" + lodash: "npm:^4.17.21" + log-symbols: "npm:^4.0.0" + minimist: "npm:^1.2.8" + ospath: "npm:^1.2.2" + pretty-bytes: "npm:^5.6.0" + process: "npm:^0.11.10" + proxy-from-env: "npm:1.0.0" + request-progress: "npm:^3.0.0" + semver: "npm:^7.7.1" + supports-color: "npm:^8.1.1" + tmp: "npm:~0.2.3" + tree-kill: "npm:1.2.2" + untildify: "npm:^4.0.0" + yauzl: "npm:^2.10.0" + bin: + cypress: bin/cypress + checksum: 10c0/b802fd1c29069037cf72d59fdfdb79c8b4779e5dd1fa58ea67c8b520fd66e64e204db9d03817950519779af081b925416ffd5ec23f7dcbf6ac52a9da1af5cfec + languageName: node + linkType: hard + "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -2296,6 +2671,15 @@ __metadata: languageName: node linkType: hard +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 10c0/64589a15c5bd01fa41ff7007e0f2c6552c5ef2028075daa16b188a3721f4ba001841bf306dfc2eee6e2e6e7f76b38f5f17fb21fa847504192290ffa9e150118a + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" @@ -2329,7 +2713,14 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": +"dayjs@npm:^1.10.4": + version: 1.11.13 + resolution: "dayjs@npm:1.11.13" + checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 + languageName: node + linkType: hard + +"debug@npm:^3.1.0, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -2338,7 +2729,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": +"debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -2379,6 +2770,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": version: 2.0.4 resolution: "detect-libc@npm:2.0.4" @@ -2441,6 +2839,23 @@ __metadata: languageName: node linkType: hard +"ecc-jsbn@npm:~0.1.1": + version: 0.1.2 + resolution: "ecc-jsbn@npm:0.1.2" + dependencies: + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.1.0" + checksum: 10c0/6cf168bae1e2dad2e46561d9af9cbabfbf5ff592176ad4e9f0f41eaaf5fe5e10bb58147fe0a804de62b1ee9dad42c28810c88d652b21b6013c47ba8efa274ca1 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + "emoji-regex@npm:^9.2.2": version: 9.2.2 resolution: "emoji-regex@npm:9.2.2" @@ -2448,6 +2863,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.18.1": version: 5.18.1 resolution: "enhanced-resolve@npm:5.18.1" @@ -2458,6 +2882,16 @@ __metadata: languageName: node linkType: hard +"enquirer@npm:^2.3.6": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: "npm:^4.1.1" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 + languageName: node + linkType: hard + "es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": version: 1.23.9 resolution: "es-abstract@npm:1.23.9" @@ -2596,6 +3030,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -2893,6 +3334,77 @@ __metadata: languageName: node linkType: hard +"eventemitter2@npm:6.4.7": + version: 6.4.7 + resolution: "eventemitter2@npm:6.4.7" + checksum: 10c0/35d8e9d51b919114eb072d33786274e1475db50efe00960c24c088ce4f76c07a826ccc927602724928efb3d8f09a7d8dd1fa79e410875118c0e9846959287f34 + languageName: node + linkType: hard + +"execa@npm:4.1.0": + version: 4.1.0 + resolution: "execa@npm:4.1.0" + dependencies: + cross-spawn: "npm:^7.0.0" + get-stream: "npm:^5.0.0" + human-signals: "npm:^1.1.1" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.0" + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/02211601bb1c52710260edcc68fb84c3c030dc68bafc697c90ada3c52cc31375337de8c24826015b8382a58d63569ffd203b79c94fef217d65503e3e8d2c52ba + languageName: node + linkType: hard + +"executable@npm:^4.1.1": + version: 4.1.1 + resolution: "executable@npm:4.1.1" + dependencies: + pify: "npm:^2.2.0" + checksum: 10c0/c3cc5d2d2e3cdb1b7d7b0639ebd5566d113d7ada21cfa07f5226d55ba2a210320116720e07570ed5659ef2ec516bc00c8f0488dac75d112fd324ef25c2100173 + languageName: node + linkType: hard + +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + +"extract-zip@npm:2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + languageName: node + linkType: hard + +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: 10c0/f75114a8388f0cbce68e277b6495dc3930db4dde1611072e4a140c24e204affd77320d004b947a132e9a3b97b8253017b2b62dce661975fb0adced707abf1ab5 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: 10c0/e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -2949,6 +3461,15 @@ __metadata: languageName: node linkType: hard +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + "fdir@npm:^6.4.4": version: 6.4.4 resolution: "fdir@npm:6.4.4" @@ -2961,6 +3482,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -3015,6 +3545,37 @@ __metadata: languageName: node linkType: hard +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: 10c0/364f7f5f7d93ab661455351ce116a67877b66f59aca199559a999bd39e3cfadbfbfacc10415a915255e2210b30c23febe9aec3ca16bf2d1ff11c935a1000e24c + languageName: node + linkType: hard + +"form-data@npm:~4.0.0": + version: 4.0.2 + resolution: "form-data@npm:4.0.2" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.12" + checksum: 10c0/e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c + languageName: node + linkType: hard + +"fs-extra@npm:^9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + languageName: node + linkType: hard + "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -3078,6 +3639,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + "get-symbol-description@npm:^1.1.0": version: 1.1.0 resolution: "get-symbol-description@npm:1.1.0" @@ -3090,11 +3660,29 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.10.0": - version: 4.10.0 - resolution: "get-tsconfig@npm:4.10.0" + version: 4.10.1 + resolution: "get-tsconfig@npm:4.10.1" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/c9b5572c5118923c491c04285c73bd55b19e214992af957c502a3be0fc0043bb421386ffd45ca3433c0a7fba81221ca300479e8393960acf15d0ed4563f38a86 + checksum: 10c0/7f8e3dabc6a49b747920a800fb88e1952fef871cdf51b79e98db48275a5de6cdaf499c55ee67df5fa6fe7ce65f0063e26de0f2e53049b408c585aa74d39ffa21 + languageName: node + linkType: hard + +"getos@npm:^3.2.1": + version: 3.2.1 + resolution: "getos@npm:3.2.1" + dependencies: + async: "npm:^3.2.0" + checksum: 10c0/21556fca1da4dfc8f1707261b4f9ff19b9e9bfefa76478249d2abddba3cd014bd6c5360634add1590b27e0b27d422e8f997dddaa0234aae1fa4c54f33f82e841 + languageName: node + linkType: hard + +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 10c0/c13f8530ecf16fc509f3fa5cd8dd2129ffa5d0c7ccdf5728b6022d52954c2d24be3706b4cdf15333eec52f1fbb43feb70a01dabc639d1d10071e371da8aaa52f languageName: node linkType: hard @@ -3116,6 +3704,15 @@ __metadata: languageName: node linkType: hard +"global-dirs@npm:^3.0.0": + version: 3.0.1 + resolution: "global-dirs@npm:3.0.1" + dependencies: + ini: "npm:2.0.0" + checksum: 10c0/ef65e2241a47ff978f7006a641302bc7f4c03dfb98783d42bf7224c136e3a06df046e70ee3a010cf30214114755e46c9eb5eb1513838812fbbe0d92b14c25080 + languageName: node + linkType: hard + "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -3140,7 +3737,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.4": +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -3211,6 +3808,31 @@ __metadata: languageName: node linkType: hard +"http-signature@npm:~1.4.0": + version: 1.4.0 + resolution: "http-signature@npm:1.4.0" + dependencies: + assert-plus: "npm:^1.0.0" + jsprim: "npm:^2.0.2" + sshpk: "npm:^1.18.0" + checksum: 10c0/b9806f5a9ed82a146589837d175c43b596b1cc8c9431665e83d47c152aa8a4629dd1b1e050f8f56e7f17f62cf97b58e888775093310441ddee5f105f28646b2b + languageName: node + linkType: hard + +"human-signals@npm:^1.1.1": + version: 1.1.1 + resolution: "human-signals@npm:1.1.1" + checksum: 10c0/18810ed239a7a5e23fb6c32d0fd4be75d7cd337a07ad59b8dbf0794cb0761e6e628349ee04c409e605fe55344716eab5d0a47a62ba2a2d0d367c89a2b4247b1e + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -3242,6 +3864,20 @@ __metadata: languageName: node linkType: hard +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"ini@npm:2.0.0": + version: 2.0.0 + resolution: "ini@npm:2.0.0" + checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 + languageName: node + linkType: hard + "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -3365,6 +4001,13 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + "is-generator-function@npm:^1.0.10": version: 1.1.0 resolution: "is-generator-function@npm:1.1.0" @@ -3386,6 +4029,16 @@ __metadata: languageName: node linkType: hard +"is-installed-globally@npm:~0.4.0": + version: 0.4.0 + resolution: "is-installed-globally@npm:0.4.0" + dependencies: + global-dirs: "npm:^3.0.0" + is-path-inside: "npm:^3.0.2" + checksum: 10c0/f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d + languageName: node + linkType: hard + "is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" @@ -3410,6 +4063,13 @@ __metadata: languageName: node linkType: hard +"is-path-inside@npm:^3.0.2": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -3438,6 +4098,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + "is-string@npm:^1.0.7, is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" @@ -3468,6 +4135,20 @@ __metadata: languageName: node linkType: hard +"is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -3508,6 +4189,13 @@ __metadata: languageName: node linkType: hard +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 10c0/a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f + languageName: node + linkType: hard + "iterator.prototype@npm:^1.1.4": version: 1.1.5 resolution: "iterator.prototype@npm:1.1.5" @@ -3556,6 +4244,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: 10c0/e046e05c59ff880ee4ef68902dbdcb6d2f3c5d60c357d4d68647dc23add556c31c0e5f41bdb7e69e793dd63468bd9e085da3636341048ef577b18f5b713877c0 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -3570,6 +4265,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -3577,6 +4279,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -3588,6 +4297,31 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsprim@npm:^2.0.2": + version: 2.0.2 + resolution: "jsprim@npm:2.0.2" + dependencies: + assert-plus: "npm:1.0.0" + extsprintf: "npm:1.3.0" + json-schema: "npm:0.4.0" + verror: "npm:1.10.0" + checksum: 10c0/677be2d41df536c92c6d0114a492ef197084018cfbb1a3e10b1fa1aad889564b2e3a7baa6af7949cc2d73678f42368b0be165a26bd4e4de6883a30dd6a24e98d + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -3625,6 +4359,13 @@ __metadata: languageName: node linkType: hard +"lazy-ass@npm:^1.6.0": + version: 1.6.0 + resolution: "lazy-ass@npm:1.6.0" + checksum: 10c0/4af6cb9a333fbc811268c745f9173fba0f99ecb817cc9c0fae5dbf986b797b730ff525504128f6623b91aba32b02124553a34b0d14de3762b637b74d7233f3bd + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -3745,6 +4486,27 @@ __metadata: languageName: node linkType: hard +"listr2@npm:^3.8.3": + version: 3.14.0 + resolution: "listr2@npm:3.14.0" + dependencies: + cli-truncate: "npm:^2.1.0" + colorette: "npm:^2.0.16" + log-update: "npm:^4.0.0" + p-map: "npm:^4.0.0" + rfdc: "npm:^1.3.0" + rxjs: "npm:^7.5.1" + through: "npm:^2.3.8" + wrap-ansi: "npm:^7.0.0" + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 10c0/8301703876ad6bf50cd769e9c1169c2aa435951d69d4f54fc202a13c1b6006a9b3afbcf9842440eb22f08beec4d311d365e31d4ed2e0fcabf198d8085b06a421 + languageName: node + linkType: hard + "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -3761,6 +4523,42 @@ __metadata: languageName: node linkType: hard +"lodash.once@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 + languageName: node + linkType: hard + +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"log-symbols@npm:^4.0.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: "npm:^4.3.0" + cli-cursor: "npm:^3.1.0" + slice-ansi: "npm:^4.0.0" + wrap-ansi: "npm:^6.2.0" + checksum: 10c0/18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86 + languageName: node + linkType: hard + "loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -3824,6 +4622,7 @@ __metadata: "@types/react-dom": "npm:19.1.5" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" + cypress: "npm:14.3.3" dotenv-cli: "npm:8.0.0" eslint: "npm:9.27.0" eslint-config-next: "npm:15.3.2" @@ -3844,6 +4643,13 @@ __metadata: languageName: unknown linkType: soft +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + "merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" @@ -3861,6 +4667,29 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + "minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -3879,7 +4708,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -4036,6 +4865,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^4.0.0": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + "oauth4webapi@npm:^3.3.0": version: 3.5.1 resolution: "oauth4webapi@npm:3.5.1" @@ -4125,6 +4963,24 @@ __metadata: languageName: node linkType: hard +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -4139,6 +4995,13 @@ __metadata: languageName: node linkType: hard +"ospath@npm:^1.2.2": + version: 1.2.2 + resolution: "ospath@npm:1.2.2" + checksum: 10c0/e485a6ca91964f786163408b093860bf26a9d9704d83ec39ccf463b9f11ea712b780b23b73d1f64536de62c5f66244dd94ed83fc9ffe3c1564dd1eed5cdae923 + languageName: node + linkType: hard + "own-keys@npm:^1.0.1": version: 1.0.1 resolution: "own-keys@npm:1.0.1" @@ -4168,6 +5031,15 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -4184,7 +5056,7 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.1.0": +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c @@ -4198,6 +5070,20 @@ __metadata: languageName: node linkType: hard +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 10c0/22c54de06f269e29f640e0e075207af57de5052a3d15e360c09b9a8663f393f6f45902006c1e71aa8a5a1cdfb1a47fe268826f8496d6425c362f00f5bc3e85d9 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -4219,6 +5105,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^2.2.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -4280,6 +5173,13 @@ __metadata: languageName: node linkType: hard +"pretty-bytes@npm:^5.6.0": + version: 5.6.0 + resolution: "pretty-bytes@npm:5.6.0" + checksum: 10c0/f69f494dcc1adda98dbe0e4a36d301e8be8ff99bfde7a637b2ee2820e7cb583b0fc0f3a63b0e3752c01501185a5cf38602c7be60da41bdf84ef5b70e89c370f3 + languageName: node + linkType: hard + "prisma@npm:6.8.2": version: 6.8.2 resolution: "prisma@npm:6.8.2" @@ -4297,6 +5197,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + "prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -4308,6 +5215,23 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:1.0.0": + version: 1.0.0 + resolution: "proxy-from-env@npm:1.0.0" + checksum: 10c0/c64df9b21f7f820dc882cd6f7f81671840acd28b9688ee3e3e6af47a56ec7f0edcabe5bc96b32b26218b35eeff377bcc27ac27f89b6b21401003e187ff13256f + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.2 + resolution: "pump@npm:3.0.2" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -4315,6 +5239,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.14.0": + version: 6.14.0 + resolution: "qs@npm:6.14.0" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -4428,6 +5361,15 @@ __metadata: languageName: node linkType: hard +"request-progress@npm:^3.0.0": + version: 3.0.0 + resolution: "request-progress@npm:3.0.0" + dependencies: + throttleit: "npm:^1.0.0" + checksum: 10c0/d5dcb7155a738572c8781436f6b418e866066a30eea0f99a9ab26b6f0ed6c13637462bba736357de3899b8d30431ee9202ac956a5f8ccdd0d9d1ed0962000d14 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -4494,6 +5436,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.1.0 resolution: "reusify@npm:1.1.0" @@ -4501,6 +5453,13 @@ __metadata: languageName: node linkType: hard +"rfdc@npm:^1.3.0": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -4510,6 +5469,15 @@ __metadata: languageName: node linkType: hard +"rxjs@npm:^7.5.1": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.3": version: 1.1.3 resolution: "safe-array-concat@npm:1.1.3" @@ -4523,6 +5491,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + "safe-push-apply@npm:^1.0.0": version: 1.0.0 resolution: "safe-push-apply@npm:1.0.0" @@ -4544,6 +5519,13 @@ __metadata: languageName: node linkType: hard +"safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + "scheduler@npm:^0.26.0": version: 0.26.0 resolution: "scheduler@npm:0.26.0" @@ -4560,7 +5542,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.0, semver@npm:^7.7.1": +"semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -4607,11 +5589,11 @@ __metadata: linkType: hard "sharp@npm:^0.34.1": - version: 0.34.1 - resolution: "sharp@npm:0.34.1" + version: 0.34.2 + resolution: "sharp@npm:0.34.2" dependencies: - "@img/sharp-darwin-arm64": "npm:0.34.1" - "@img/sharp-darwin-x64": "npm:0.34.1" + "@img/sharp-darwin-arm64": "npm:0.34.2" + "@img/sharp-darwin-x64": "npm:0.34.2" "@img/sharp-libvips-darwin-arm64": "npm:1.1.0" "@img/sharp-libvips-darwin-x64": "npm:1.1.0" "@img/sharp-libvips-linux-arm": "npm:1.1.0" @@ -4621,18 +5603,19 @@ __metadata: "@img/sharp-libvips-linux-x64": "npm:1.1.0" "@img/sharp-libvips-linuxmusl-arm64": "npm:1.1.0" "@img/sharp-libvips-linuxmusl-x64": "npm:1.1.0" - "@img/sharp-linux-arm": "npm:0.34.1" - "@img/sharp-linux-arm64": "npm:0.34.1" - "@img/sharp-linux-s390x": "npm:0.34.1" - "@img/sharp-linux-x64": "npm:0.34.1" - "@img/sharp-linuxmusl-arm64": "npm:0.34.1" - "@img/sharp-linuxmusl-x64": "npm:0.34.1" - "@img/sharp-wasm32": "npm:0.34.1" - "@img/sharp-win32-ia32": "npm:0.34.1" - "@img/sharp-win32-x64": "npm:0.34.1" + "@img/sharp-linux-arm": "npm:0.34.2" + "@img/sharp-linux-arm64": "npm:0.34.2" + "@img/sharp-linux-s390x": "npm:0.34.2" + "@img/sharp-linux-x64": "npm:0.34.2" + "@img/sharp-linuxmusl-arm64": "npm:0.34.2" + "@img/sharp-linuxmusl-x64": "npm:0.34.2" + "@img/sharp-wasm32": "npm:0.34.2" + "@img/sharp-win32-arm64": "npm:0.34.2" + "@img/sharp-win32-ia32": "npm:0.34.2" + "@img/sharp-win32-x64": "npm:0.34.2" color: "npm:^4.2.3" - detect-libc: "npm:^2.0.3" - semver: "npm:^7.7.1" + detect-libc: "npm:^2.0.4" + semver: "npm:^7.7.2" dependenciesMeta: "@img/sharp-darwin-arm64": optional: true @@ -4670,11 +5653,13 @@ __metadata: optional: true "@img/sharp-wasm32": optional: true + "@img/sharp-win32-arm64": + optional: true "@img/sharp-win32-ia32": optional: true "@img/sharp-win32-x64": optional: true - checksum: 10c0/50f5ffb18a775ec9f0d4d39bdc4356fdfa1fc97e69d8800d68e960b93b1c0cce7ee5242225d3b86ffae5801890fd7f93acfee00018f247e7df70fee2b4de7945 + checksum: 10c0/43967dbaaf1e1140a2f43b51d54762cc1bba01648392e355028568e4838833bf1abc2a96c09b893e6407b0c59a2c271d66e8d56a582aa6c951d476ab83a37fba languageName: node linkType: hard @@ -4742,6 +5727,13 @@ __metadata: languageName: node linkType: hard +"signal-exit@npm:^3.0.2": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + "simple-swizzle@npm:^0.2.2": version: 0.2.2 resolution: "simple-swizzle@npm:0.2.2" @@ -4751,6 +5743,28 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + "source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -4758,6 +5772,27 @@ __metadata: languageName: node linkType: hard +"sshpk@npm:^1.18.0": + version: 1.18.0 + resolution: "sshpk@npm:1.18.0" + dependencies: + asn1: "npm:~0.2.3" + assert-plus: "npm:^1.0.0" + bcrypt-pbkdf: "npm:^1.0.0" + dashdash: "npm:^1.12.0" + ecc-jsbn: "npm:~0.1.1" + getpass: "npm:^0.1.1" + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.0.2" + tweetnacl: "npm:~0.14.0" + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: 10c0/e516e34fa981cfceef45fd2e947772cc70dbd57523e5c608e2cd73752ba7f8a99a04df7c3ed751588e8d91956b6f16531590b35d3489980d1c54c38bebcd41b1 + languageName: node + linkType: hard + "stable-hash@npm:^0.0.5": version: 0.0.5 resolution: "stable-hash@npm:0.0.5" @@ -4772,6 +5807,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^4.1.0, string-width@npm:^4.2.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + "string.prototype.includes@npm:^2.0.1": version: 2.0.1 resolution: "string.prototype.includes@npm:2.0.1" @@ -4852,6 +5898,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -4859,6 +5914,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -4891,6 +5953,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -4913,9 +5984,9 @@ __metadata: linkType: hard "tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + version: 2.2.2 + resolution: "tapable@npm:2.2.2" + checksum: 10c0/8ad130aa705cab6486ad89e42233569a1fb1ff21af115f59cebe9f2b45e9e7995efceaa9cc5062510cdb4ec673b527924b2ab812e3579c55ad659ae92117011e languageName: node linkType: hard @@ -4933,6 +6004,20 @@ __metadata: languageName: node linkType: hard +"throttleit@npm:^1.0.0": + version: 1.0.1 + resolution: "throttleit@npm:1.0.1" + checksum: 10c0/4d41a1bf467646b1aa7bec0123b78452a0e302d7344f6a67e43e68434f0a02ea3ba44df050a40c69adeb9cae3cbf6b36b38cfe94bcc3c4a8243c9b63e38e059b + languageName: node + linkType: hard + +"through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.13": version: 0.2.13 resolution: "tinyglobby@npm:0.2.13" @@ -4943,6 +6028,31 @@ __metadata: languageName: node linkType: hard +"tldts-core@npm:^6.1.86": + version: 6.1.86 + resolution: "tldts-core@npm:6.1.86" + checksum: 10c0/8133c29375f3f99f88fce5f4d62f6ecb9532b106f31e5423b27c1eb1b6e711bd41875184a456819ceaed5c8b94f43911b1ad57e25c6eb86e1fc201228ff7e2af + languageName: node + linkType: hard + +"tldts@npm:^6.1.32": + version: 6.1.86 + resolution: "tldts@npm:6.1.86" + dependencies: + tldts-core: "npm:^6.1.86" + bin: + tldts: bin/cli.js + checksum: 10c0/27ae7526d9d78cb97b2de3f4d102e0b4321d1ccff0648a7bb0e039ed54acbce86bacdcd9cd3c14310e519b457854e7bafbef1f529f58a1e217a737ced63f0940 + languageName: node + linkType: hard + +"tmp@npm:~0.2.3": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -4952,6 +6062,24 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^5.0.0": + version: 5.1.2 + resolution: "tough-cookie@npm:5.1.2" + dependencies: + tldts: "npm:^6.1.32" + checksum: 10c0/5f95023a47de0f30a902bba951664b359725597d8adeabc66a0b93a931c3af801e1e697dae4b8c21a012056c0ea88bd2bf4dfe66b2adcf8e2f42cd9796fe0626 + languageName: node + linkType: hard + +"tree-kill@npm:1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 + languageName: node + linkType: hard + "ts-api-utils@npm:^2.1.0": version: 2.1.0 resolution: "ts-api-utils@npm:2.1.0" @@ -4980,6 +6108,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + "tw-animate-css@npm:1.3.0": version: 1.3.0 resolution: "tw-animate-css@npm:1.3.0" @@ -4987,6 +6124,13 @@ __metadata: languageName: node linkType: hard +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 10c0/4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -4996,6 +6140,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -5088,6 +6239,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + "unrs-resolver@npm:^1.6.2": version: 1.7.2 resolution: "unrs-resolver@npm:1.7.2" @@ -5149,6 +6307,13 @@ __metadata: languageName: node linkType: hard +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: 10c0/d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -5189,6 +6354,26 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + languageName: node + linkType: hard + +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: 10c0/37ccdf8542b5863c525128908ac80f2b476eed36a32cb944de930ca1e2e78584cc435c4b9b4c68d0fc13a47b45ff364b4be43aa74f8804f9050140f660fb660d + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" @@ -5268,6 +6453,35 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + "yallist@npm:^5.0.0": version: 5.0.0 resolution: "yallist@npm:5.0.0" @@ -5275,6 +6489,16 @@ __metadata: languageName: node linkType: hard +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From 86f8834a3b65dc8aba52d47b351114273218ca09 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 12 May 2025 22:59:55 +0200 Subject: [PATCH 004/136] test: helper functions --- cypress/support/commands.ts | 25 +++++++++++++++++++++++++ cypress/support/component.ts | 2 ++ tsconfig.json | 3 ++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 95857ae..59717f5 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -35,3 +35,28 @@ // } // } // } + +Cypress.Commands.add('getBySel', (selector, ...args) => { + return cy.get(`[data-cy=${selector}]`, ...args); +}); + +Cypress.Commands.add('getBySelLike', (selector, ...args) => { + return cy.get(`[data-cy*=${selector}]`, ...args); +}); + +declare global { + namespace Cypress { + interface Chainable { + getBySel( + selector: string, + ...args: any[] + ): Chainable>; + getBySelLike( + selector: string, + ...args: any[] + ): Chainable>; + } + } +} + +export {}; diff --git a/cypress/support/component.ts b/cypress/support/component.ts index 23fbccc..b1f1c92 100644 --- a/cypress/support/component.ts +++ b/cypress/support/component.ts @@ -13,6 +13,8 @@ // https://on.cypress.io/configuration // *********************************************************** +import '@/app/globals.css'; + // Import commands.js using ES2015 syntax: import './commands'; diff --git a/tsconfig.json b/tsconfig.json index c133409..6bd88b8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,8 @@ ], "paths": { "@/*": ["./src/*"] - } + }, + "types": ["node", "cypress"] }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] From 5d023ce7a2d3fcf43166a351aa4f593d47f090dc Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 12 May 2025 23:00:04 +0200 Subject: [PATCH 005/136] test: icon-button --- src/components/icon-button.cy.tsx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/components/icon-button.cy.tsx diff --git a/src/components/icon-button.cy.tsx b/src/components/icon-button.cy.tsx new file mode 100644 index 0000000..b5a1ff0 --- /dev/null +++ b/src/components/icon-button.cy.tsx @@ -0,0 +1,24 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +import React from 'react'; +import { IconButton } from './icon-button'; +import { faOpenid } from '@fortawesome/free-brands-svg-icons'; + +describe('', () => { + it('renders', () => { + cy.mount(Button); + }); + + it('is clickable', () => { + const onClick = cy.stub(); + cy.mount( + + Button + , + ); + cy.getBySel('icon-button') + .click() + .then(() => { + expect(onClick).to.be.calledOnce; + }); + }); +}); From b0065c81500b525fe419775b7fca7ad1afd40b88 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 12 May 2025 23:00:14 +0200 Subject: [PATCH 006/136] test: theme-picker --- src/components/user/theme-picker.cy.tsx | 41 +++++++++++++++++++++++++ src/components/user/theme-picker.tsx | 16 +++++++--- 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 src/components/user/theme-picker.cy.tsx diff --git a/src/components/user/theme-picker.cy.tsx b/src/components/user/theme-picker.cy.tsx new file mode 100644 index 0000000..23dc01b --- /dev/null +++ b/src/components/user/theme-picker.cy.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { ThemePicker } from '@/components/user/theme-picker'; +import { ThemeProvider } from '../theme-provider'; + +describe('', () => { + it('renders', () => { + cy.mount(); + }); + + it('toggle open and close', () => { + cy.mount(); + cy.getBySel('theme-picker').click(); + cy.getBySel('theme-picker-content').should('exist'); + cy.get('html').click(); + cy.getBySel('theme-picker-content').should('not.exist'); + }); + + it('enable dark mode', () => { + cy.mount( + + + , + ); + + cy.getBySel('theme-picker').click(); + cy.getBySel('dark-theme').click(); + cy.get('html').should('have.attr', 'data-theme', 'dark'); + }); + + it('enable light mode', () => { + cy.mount( + + + , + ); + + cy.getBySel('theme-picker').click(); + cy.getBySel('light-theme').click(); + cy.get('html').should('have.attr', 'data-theme', 'light'); + }); +}); diff --git a/src/components/user/theme-picker.tsx b/src/components/user/theme-picker.tsx index 5341c3c..3ceca4c 100644 --- a/src/components/user/theme-picker.tsx +++ b/src/components/user/theme-picker.tsx @@ -18,20 +18,26 @@ export function ThemePicker() { return ( - - - setTheme('light')}> + + setTheme('light')} + data-cy='light-theme' + > Light - setTheme('dark')}> + setTheme('dark')} data-cy='dark-theme'> Dark - setTheme('system')}> + setTheme('system')} + data-cy='system-theme' + > System From 1ec78ab46c5d0a8482af2d0a2311b29f3a6be573 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 12 May 2025 23:00:29 +0200 Subject: [PATCH 007/136] chore: add testing workflow --- .github/workflows/tests.yml | 27 +++++++++++++++++++++++++++ cypress.config.ts | 6 ------ 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..23c73d1 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,27 @@ +name: tests +on: + push: + branches: + - main + - renovate/* + pull_request: +jobs: + tests: + name: Tests + runs-on: docker + container: + image: cypress/browsers:latest + options: --user 1001 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Enable corepack + run: corepack enable + + - name: Cypress run + uses: https://github.com/cypress-io/github-action@v6 + with: + build: yarn run build + start: yarn start + component: true diff --git a/cypress.config.ts b/cypress.config.ts index 768b87a..d2013c5 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,12 +1,6 @@ import { defineConfig } from 'cypress'; export default defineConfig({ - e2e: { - setupNodeEvents(on, config) { - // implement node event listeners here - }, - }, - component: { devServer: { framework: 'next', From 09a523a04f98060584bc395b5bea954682923102 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Tue, 13 May 2025 09:04:37 +0200 Subject: [PATCH 008/136] test(e2e): test login page --- .env.test | 5 ++++ .github/workflows/tests.yml | 2 +- .gitignore | 1 + cypress.config.ts | 6 +++++ cypress/e2e/login.cy.ts | 31 ++++++++++++++++++++++++ package.json | 1 + src/app/login/page.tsx | 5 +++- src/components/labeled-input.tsx | 6 +++-- src/components/user/login-form.tsx | 4 +++ src/components/user/sso-login-button.tsx | 4 ++- 10 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 .env.test create mode 100644 cypress/e2e/login.cy.ts diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..f841afc --- /dev/null +++ b/.env.test @@ -0,0 +1,5 @@ +AUTH_SECRET="auth_secret" +AUTH_URL="http://localhost:3000" +DATABASE_URL="file:./dev.db" +AUTH_AUTHENTIK_ID="id" +AUTH_AUTHENTIK_ISSUER="issuer" \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 23c73d1..5a12acc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,5 +23,5 @@ jobs: uses: https://github.com/cypress-io/github-action@v6 with: build: yarn run build - start: yarn start + start: yarn cypress:start_server component: true diff --git a/.gitignore b/.gitignore index 918f651..5c96c35 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* !.env.example +!.env.test # vercel .vercel diff --git a/cypress.config.ts b/cypress.config.ts index d2013c5..bebdaa5 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -7,4 +7,10 @@ export default defineConfig({ bundler: 'webpack', }, }, + + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, }); diff --git a/cypress/e2e/login.cy.ts b/cypress/e2e/login.cy.ts new file mode 100644 index 0000000..6045354 --- /dev/null +++ b/cypress/e2e/login.cy.ts @@ -0,0 +1,31 @@ +describe('login', () => { + it('loads', () => { + cy.visit('http://localhost:3000/'); + + cy.getBySel('login-header').should('exist'); + }); + + it('shows login form', () => { + cy.visit('http://localhost:3000/'); + + cy.getBySel('login-form').should('exist'); + cy.getBySel('email-input').should('exist'); + cy.getBySel('password-input').should('exist'); + cy.getBySel('login-button').should('exist'); + }); + + it('shows sso button', () => { + cy.visit('http://localhost:3000/'); + + cy.getBySel('sso-login-button_authentik').should('exist'); + }); + + it('allows login', () => { + cy.visit('http://localhost:3000/'); + + cy.getBySel('email-input').type('test@example.com'); + cy.getBySel('password-input').type('password'); + cy.getBySel('login-button').click(); + cy.url().should('include', '/home'); + }); +}); diff --git a/package.json b/package.json index 5f6038f..15b17ea 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "node .next/standalone/server.js", "lint": "next lint", "format": "prettier --write .", + "cypress:start_server": "cp .next/static/ .next/standalone/.next/ -r && dotenv -e .env.test -- node .next/standalone/server.js", "cypress:open": "cypress open", "cypress:run": "cypress run", "prisma:migrate": "dotenv -e .env.local -- prisma migrate dev", diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 1786e82..34d1b07 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -30,7 +30,9 @@ export default async function LoginPage() {
- Login + + Login + @@ -42,6 +44,7 @@ export default async function LoginPage() { key={provider.id} provider={provider.id} providerDisplayName={provider.name} + data-cy={'sso-login-button_' + provider.name.toLowerCase()} /> ))} diff --git a/src/components/labeled-input.tsx b/src/components/labeled-input.tsx index 7a416d4..5ff31f7 100644 --- a/src/components/labeled-input.tsx +++ b/src/components/labeled-input.tsx @@ -7,13 +7,14 @@ export default function LabeledInput({ placeholder, value, name, + ...props }: { type: 'text' | 'email' | 'password'; label: string; placeholder?: string; + name: string; value?: string; - name?: string; -}) { +} & React.InputHTMLAttributes) { return (
@@ -24,6 +25,7 @@ export default function LabeledInput({ defaultValue={value} id={name} name={name} + {...props} />
); diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx index 7c44f6f..fadf2ea 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/user/login-form.tsx @@ -10,6 +10,7 @@ export default function LoginForm() { return (
{ 'use server'; try { @@ -27,17 +28,20 @@ export default function LoginForm() { label='E-Mail or Username' placeholder='What you are known as.' name='email' + data-cy='email-input' /> diff --git a/src/components/user/sso-login-button.tsx b/src/components/user/sso-login-button.tsx index c1bd0e2..b333d29 100644 --- a/src/components/user/sso-login-button.tsx +++ b/src/components/user/sso-login-button.tsx @@ -5,10 +5,11 @@ import { Fingerprint } from 'lucide-react'; export default function SSOLogin({ provider, providerDisplayName, + ...props }: { provider: string; providerDisplayName: string; -}) { +} & React.HTMLProps) { return ( diff --git a/src/components/user/sso-login-button.tsx b/src/components/user/sso-login-button.tsx index c1bd0e2..09a76f6 100644 --- a/src/components/user/sso-login-button.tsx +++ b/src/components/user/sso-login-button.tsx @@ -1,6 +1,6 @@ import { signIn } from '@/auth'; -import { Button } from '@/components/ui/button'; -import { Fingerprint } from 'lucide-react'; +import { IconButton } from '@/components/icon-button'; +import { faOpenid } from '@fortawesome/free-brands-svg-icons'; export default function SSOLogin({ provider, @@ -17,19 +17,15 @@ export default function SSOLogin({ await signIn(provider); }} > - + Login with {providerDisplayName} + ); } From 89cc743fdafff469504085ac39974402c51e000a Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Tue, 20 May 2025 17:05:25 +0200 Subject: [PATCH 051/136] feat: add logo component refactor: restyle input according to figma --- src/components/labeled-input.tsx | 2 +- src/components/logo.tsx | 74 ++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/components/logo.tsx diff --git a/src/components/labeled-input.tsx b/src/components/labeled-input.tsx index 7a416d4..250dd5f 100644 --- a/src/components/labeled-input.tsx +++ b/src/components/labeled-input.tsx @@ -15,7 +15,7 @@ export default function LabeledInput({ name?: string; }) { return ( -
+
{ + colorType: ColorType; + logoType: LogoType; + theme: Theme; + alt?: string; +} + +const LOGO_BASE_PATH = '/assets/logo/'; +const IMAGE_EXTENSION = 'svg'; + +export default function Logo({ + colorType, + logoType, + theme, + alt, + className = '', + width, + height, + onError, + ...imageProps +}: LogoProps) { + if (!colorType || !logoType || !theme) { + const errorMessage = + 'Logo: colorType, logoType, and theme props are required.'; + console.error(errorMessage); + return ( +
+ Error: Missing required logo props. Check console. +
+ ); + } + + if (width === undefined || height === undefined) { + console.warn( + `Logo: 'width' and 'height' props are required by next/image for ${logoType} logo. Path: ${LOGO_BASE_PATH}logo_${colorType}_${logoType}_${theme}.${IMAGE_EXTENSION}`, + ); + } + + const colorTypeInFilename = colorType === 'monochrome' ? 'mono' : colorType; + const filename = `logo_${colorTypeInFilename}_${logoType}_${theme}.${IMAGE_EXTENSION}`; + const logoUrl = `${LOGO_BASE_PATH}${filename}`; + const defaultAltText = `Logo: ${colorType} ${logoType} ${theme}`; + + const handleImageError: ImageProps['onError'] = (e) => { + console.error(`Error loading logo via next/image: ${logoUrl}`, e); + if (onError) { + onError(e); + } + }; + + return ( + {alt + ); +} From 198520ff8394b2dde6255a91fabfe5fde591f468 Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Tue, 20 May 2025 17:06:39 +0200 Subject: [PATCH 052/136] refactor: restyle login form acording to figma --- src/components/user/login-form.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx index 42e2b49..a2ab6c9 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/user/login-form.tsx @@ -34,9 +34,14 @@ export default function LoginForm() { placeholder="Let's hope you remember it." name='password' /> - +
+ + +
); } From f3b5f5c87cfc3b22351e1db3f6d534aef3e95c9a Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Tue, 20 May 2025 17:07:35 +0200 Subject: [PATCH 053/136] feat: add separator component --- src/components/{ui => custom-ui}/separator.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) rename src/components/{ui => custom-ui}/separator.tsx (69%) diff --git a/src/components/ui/separator.tsx b/src/components/custom-ui/separator.tsx similarity index 69% rename from src/components/ui/separator.tsx rename to src/components/custom-ui/separator.tsx index 39eb020..3b4f1ef 100644 --- a/src/components/ui/separator.tsx +++ b/src/components/custom-ui/separator.tsx @@ -16,10 +16,7 @@ function Separator({ data-slot='separator-root' decorative={decorative} orientation={orientation} - className={cn( - 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', - className, - )} + className={cn('shrink-0', className)} {...props} /> ); From b5d10861317f3d06be452beb1f625074f88eae2e Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Tue, 20 May 2025 17:09:31 +0200 Subject: [PATCH 054/136] feat(login): enhance login page UI with logo and separator refactor: restyle login page according to figma --- src/app/login/page.tsx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 1786e82..db24650 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -4,6 +4,8 @@ import LoginForm from '@/components/user/login-form'; import { redirect } from 'next/navigation'; import { Button } from '@/components/ui/button'; import Image from 'next/image'; +import { Separator } from '@/components/custom-ui/separator'; +import Logo from '@/components/logo'; import '@/app/globals.css'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; @@ -30,12 +32,20 @@ export default async function LoginPage() {
- Login + - + - {providerMap.length > 0 &&
} + + + {providerMap.length > 0} {providerMap.map((provider) => (
- + From 9f9c2157f533b772fcf1da3a54a6d59ba0581634 Mon Sep 17 00:00:00 2001 From: Micha Date: Wed, 21 May 2025 10:33:27 +0200 Subject: [PATCH 055/136] feat: refactor logo component to use dynamic imports for assets and remove theme prop --- src/app/login/page.tsx | 1 - src/components/logo.tsx | 76 ++++++++++++++++++++++++++++++++++------- 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index db24650..3049198 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -35,7 +35,6 @@ export default async function LoginPage() { diff --git a/src/components/logo.tsx b/src/components/logo.tsx index 3e6c064..f1d2cff 100644 --- a/src/components/logo.tsx +++ b/src/components/logo.tsx @@ -1,8 +1,26 @@ 'use client'; -import React from 'react'; +import React, { useEffect, useState } from 'react'; import Image, { ImageProps } from 'next/image'; +import logo_colored_combo_light from '@/assets/logo/logo_colored_combo_light.svg'; +import logo_colored_combo_dark from '@/assets/logo/logo_colored_combo_dark.svg'; +import logo_colored_primary_light from '@/assets/logo/logo_colored_primary_light.svg'; +import logo_colored_primary_dark from '@/assets/logo/logo_colored_primary_dark.svg'; +import logo_colored_secondary_light from '@/assets/logo/logo_colored_secondary_light.svg'; +import logo_colored_secondary_dark from '@/assets/logo/logo_colored_secondary_dark.svg'; +import logo_mono_combo_light from '@/assets/logo/logo_mono_combo_light.svg'; +import logo_mono_combo_dark from '@/assets/logo/logo_mono_combo_dark.svg'; +import logo_mono_primary_light from '@/assets/logo/logo_mono_primary_light.svg'; +import logo_mono_primary_dark from '@/assets/logo/logo_mono_primary_dark.svg'; +import logo_mono_secondary_light from '@/assets/logo/logo_mono_secondary_light.svg'; +import logo_mono_secondary_dark from '@/assets/logo/logo_mono_secondary_dark.svg'; +import logo_mono_submark_light from '@/assets/logo/logo_mono_submark_light.svg'; +import logo_mono_submark_dark from '@/assets/logo/logo_mono_submark_dark.svg'; +import logo_colored_submark_light from '@/assets/logo/logo_colored_submark_light.svg'; +import logo_colored_submark_dark from '@/assets/logo/logo_colored_submark_dark.svg'; +import { useTheme } from 'next-themes'; + type ColorType = 'colored' | 'monochrome'; type LogoType = 'combo' | 'primary' | 'secondary' | 'submark'; type Theme = 'light' | 'dark'; @@ -10,7 +28,7 @@ type Theme = 'light' | 'dark'; interface LogoProps extends Omit { colorType: ColorType; logoType: LogoType; - theme: Theme; + overrideTheme?: Theme; alt?: string; } @@ -20,14 +38,32 @@ const IMAGE_EXTENSION = 'svg'; export default function Logo({ colorType, logoType, - theme, + overrideTheme, alt, className = '', width, height, - onError, + // onError, ...imageProps }: LogoProps) { + const [mounted, setMounted] = useState(false); + let { resolvedTheme: theme } = useTheme(); + + useEffect(() => { + setMounted(true); + }, []); + + if (overrideTheme) { + theme = overrideTheme; + } + + // Prevent rendering until mounted (theme is available) + if (!mounted && !overrideTheme) { + return null; + } + + console.log(colorType, logoType, theme); + if (!colorType || !logoType || !theme) { const errorMessage = 'Logo: colorType, logoType, and theme props are required.'; @@ -49,25 +85,39 @@ export default function Logo({ } const colorTypeInFilename = colorType === 'monochrome' ? 'mono' : colorType; - const filename = `logo_${colorTypeInFilename}_${logoType}_${theme}.${IMAGE_EXTENSION}`; - const logoUrl = `${LOGO_BASE_PATH}${filename}`; const defaultAltText = `Logo: ${colorType} ${logoType} ${theme}`; + const varName = `logo_${colorTypeInFilename}_${logoType}_${theme}`; - const handleImageError: ImageProps['onError'] = (e) => { - console.error(`Error loading logo via next/image: ${logoUrl}`, e); - if (onError) { - onError(e); - } + const logoAssets = { + logo_colored_combo_light, + logo_colored_combo_dark, + logo_colored_primary_light, + logo_colored_primary_dark, + logo_colored_secondary_light, + logo_colored_secondary_dark, + logo_mono_combo_light, + logo_mono_combo_dark, + logo_mono_primary_light, + logo_mono_primary_dark, + logo_mono_secondary_light, + logo_mono_secondary_dark, + logo_mono_submark_light, + logo_mono_submark_dark, + logo_colored_submark_light, + logo_colored_submark_dark, }; + // Match the varName with the Logo-Asset name and store it in "logoVar" + const logoVar = logoAssets[varName as keyof typeof logoAssets]; + return ( {alt ); From 4f4e73318a59e97c79420fe8c2be804cc963bb45 Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Wed, 21 May 2025 16:42:48 +0200 Subject: [PATCH 056/136] feat(ui): Improve login card design and theme customization Refactor the `Button` component, add new `LoginCard` component, update `ThemePicker` component, edit global CSS styles to include card background and foreground and style the login page, including the logo and login form. --- src/app/globals.css | 22 ++--- src/app/login/page.tsx | 19 ++--- src/app/logout/page.tsx | 2 +- src/app/settings/page.tsx | 2 +- src/components/{ui => custom-ui}/button.tsx | 3 +- src/components/custom-ui/login-card.tsx | 92 +++++++++++++++++++++ src/components/icon-button.tsx | 4 +- src/components/user/login-form.tsx | 2 +- src/components/user/redirect-button.tsx | 2 +- src/components/user/sso-login-button.tsx | 1 - src/components/user/theme-picker.tsx | 2 +- 11 files changed, 122 insertions(+), 29 deletions(-) rename src/components/{ui => custom-ui}/button.tsx (98%) create mode 100644 src/components/custom-ui/login-card.tsx diff --git a/src/app/globals.css b/src/app/globals.css index a7bbb2b..558d875 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -39,6 +39,8 @@ --active-secondary: oklch(0.4254 0.133 272.15); --disabled-secondary: oklch(0.4937 0.1697 271.26 / 0.5); + --card: var(--neutral-800); + /* ------------------- */ --foreground: oklch(0.13 0.028 261.692); @@ -99,7 +101,7 @@ } @theme inline { - --transparent: var(--transpatent); + --transparent: var(--transparent); --color-neutral-000: var(--neutral-000); --color-neutral-100: var(--neutral-100); @@ -114,12 +116,12 @@ --color-neutral-800: var(--neutral-800); --color-neutral-900: var(--neutral-900); - --background: var(--neutral-750); - --base: var(--neutral-800); - --text: var(--neutral-000); - --text-alt: var(--neutral-900); - --background-disabled: var(--neutral-500); - --text-disabled: var(--neutral-700); + --color-background: var(--neutral-750); + --color-base: var(--neutral-800); + --color-text: var(--text); + --color-text-alt: var(--text-alt); + --color-background-disabled: var(--neutral-500); + --color-text-disabled: var(--neutral-700); --radius: 0.688rem; --color-primary: var(--primary); @@ -224,7 +226,7 @@ --neutral-900: oklch(0 0 0); --background: var(--neutral-750); - --base: var(--neutral-800); + --base: var(--neutral-750); --text: var(--neutral-000); --text-alt: var(--neutral-900); --background-disabled: var(--neutral-500); @@ -240,12 +242,12 @@ --active-secondary: oklch(0.4471 0.15 271.61); --disabled-secondary: oklch(0.6065 0.213 271.11 / 0.4); + --card: var(--neutral-750); + /* ------------------- */ --foreground: oklch(0.985 0.002 247.839); - --card: oklch(0.21 0.034 264.665); - --card-foreground: oklch(0.985 0.002 247.839); --popover: oklch(0.21 0.034 264.665); diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 3049198..f49fb8f 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -2,13 +2,17 @@ import { auth, providerMap } from '@/auth'; import SSOLogin from '@/components/user/sso-login-button'; import LoginForm from '@/components/user/login-form'; import { redirect } from 'next/navigation'; -import { Button } from '@/components/ui/button'; +import { Button } from '@/components/custom-ui/button'; import Image from 'next/image'; import { Separator } from '@/components/custom-ui/separator'; import Logo from '@/components/logo'; import '@/app/globals.css'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { + Card, + CardContent, + CardHeader, +} from '@/components/custom-ui/login-card'; import { ThemePicker } from '@/components/user/theme-picker'; import { HoverCard, @@ -30,14 +34,9 @@ export default async function LoginPage() {
- - - + + + diff --git a/src/app/logout/page.tsx b/src/app/logout/page.tsx index 15f29aa..c819a45 100644 --- a/src/app/logout/page.tsx +++ b/src/app/logout/page.tsx @@ -1,5 +1,5 @@ import { signOut } from '@/auth'; -import { Button } from '@/components/ui/button'; +import { Button } from '@/components/custom-ui/button'; import { Card, CardContent, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 45974fb..9afe7c6 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -1,4 +1,4 @@ -import { Button } from '@/components/ui/button'; +import { Button } from '@/components/custom-ui/button'; import { Card, CardContent, diff --git a/src/components/ui/button.tsx b/src/components/custom-ui/button.tsx similarity index 98% rename from src/components/ui/button.tsx rename to src/components/custom-ui/button.tsx index f47a756..51f3b63 100644 --- a/src/components/ui/button.tsx +++ b/src/components/custom-ui/button.tsx @@ -15,8 +15,9 @@ const buttonVariants = cva( 'bg-secondary text-text-alt shadow-xs hover:bg-hover-secondary active:bg-active-secondary', outline: 'border-2 border-primary bg-transparent text-text shadow-xs hover:bg-primary hover:border-neutral-000 hover:border-1.5 hover:text-neutral-000 active:bg-active-primary', - destructive: + /*destructive: 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + */ ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', link: 'text-text underline-offset-4 hover:underline', diff --git a/src/components/custom-ui/login-card.tsx b/src/components/custom-ui/login-card.tsx new file mode 100644 index 0000000..616a45c --- /dev/null +++ b/src/components/custom-ui/login-card.tsx @@ -0,0 +1,92 @@ +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +function Card({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function CardDescription({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function CardAction({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function CardContent({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardAction, + CardDescription, + CardContent, +}; diff --git a/src/components/icon-button.tsx b/src/components/icon-button.tsx index 8888b6b..ad67eaa 100644 --- a/src/components/icon-button.tsx +++ b/src/components/icon-button.tsx @@ -1,4 +1,4 @@ -import { Button } from '@/components/ui/button'; +import { Button } from '@/components/custom-ui/button'; import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; @@ -12,7 +12,7 @@ export function IconButton({ children: React.ReactNode; } & React.ComponentProps) { return ( - diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx index a2ab6c9..ec7b8c1 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/user/login-form.tsx @@ -1,6 +1,6 @@ import { signIn } from '@/auth'; import LabeledInput from '@/components/labeled-input'; -import { Button } from '@/components/ui/button'; +import { Button } from '@/components/custom-ui/button'; import { AuthError } from 'next-auth'; import { redirect } from 'next/navigation'; diff --git a/src/components/user/redirect-button.tsx b/src/components/user/redirect-button.tsx index c4bf997..e4f8a62 100644 --- a/src/components/user/redirect-button.tsx +++ b/src/components/user/redirect-button.tsx @@ -1,4 +1,4 @@ -import { Button } from '../ui/button'; +import { Button } from '../custom-ui/button'; import Link from 'next/link'; export function RedirectButton({ diff --git a/src/components/user/sso-login-button.tsx b/src/components/user/sso-login-button.tsx index 09a76f6..76eac83 100644 --- a/src/components/user/sso-login-button.tsx +++ b/src/components/user/sso-login-button.tsx @@ -22,7 +22,6 @@ export default function SSOLogin({ type='submit' variant='secondary' icon={faOpenid} - icon={faOpenid} > Login with {providerDisplayName} diff --git a/src/components/user/theme-picker.tsx b/src/components/user/theme-picker.tsx index 5341c3c..37a2ceb 100644 --- a/src/components/user/theme-picker.tsx +++ b/src/components/user/theme-picker.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { Moon, Sun } from 'lucide-react'; import { useTheme } from 'next-themes'; -import { Button } from '@/components/ui/button'; +import { Button } from '@/components/custom-ui/button'; import { DropdownMenu, DropdownMenuContent, From a1a482abcc1fe454c3e210a0d1b1cc7062b541dc Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Thu, 22 May 2025 15:20:47 +0200 Subject: [PATCH 057/136] feat(fonts): Add Varela Round and Comfortaa fonts and their OFL licenses The changes add the SIL Open Font License (OFL) text files for the Varela Round and Comfortaa font families. This ensures the proper licensing information is included with the font files, allowing users to understand the terms under which they can use and distribute these fonts. --- .../Comfortaa-VariableFont_weight.ttf | Bin 0 -> 203040 bytes public/fonts/Comfortaa/OFL.txt | 93 ++++++++++++++++++ public/fonts/Comfortaa/README.txt | 67 +++++++++++++ .../fonts/Comfortaa/static/Comfortaa-Bold.ttf | Bin 0 -> 111492 bytes .../Comfortaa/static/Comfortaa-Light.ttf | Bin 0 -> 111296 bytes .../Comfortaa/static/Comfortaa-Medium.ttf | Bin 0 -> 111344 bytes .../Comfortaa/static/Comfortaa-Regular.ttf | Bin 0 -> 111304 bytes .../Comfortaa/static/Comfortaa-SemiBold.ttf | Bin 0 -> 111424 bytes public/fonts/VarelaRound/OFL.txt | 93 ++++++++++++++++++ .../fonts/VarelaRound/VarelaRound-Regular.ttf | Bin 0 -> 132204 bytes 10 files changed, 253 insertions(+) create mode 100644 public/fonts/Comfortaa/Comfortaa-VariableFont_weight.ttf create mode 100644 public/fonts/Comfortaa/OFL.txt create mode 100644 public/fonts/Comfortaa/README.txt create mode 100644 public/fonts/Comfortaa/static/Comfortaa-Bold.ttf create mode 100644 public/fonts/Comfortaa/static/Comfortaa-Light.ttf create mode 100644 public/fonts/Comfortaa/static/Comfortaa-Medium.ttf create mode 100644 public/fonts/Comfortaa/static/Comfortaa-Regular.ttf create mode 100644 public/fonts/Comfortaa/static/Comfortaa-SemiBold.ttf create mode 100644 public/fonts/VarelaRound/OFL.txt create mode 100644 public/fonts/VarelaRound/VarelaRound-Regular.ttf diff --git a/public/fonts/Comfortaa/Comfortaa-VariableFont_weight.ttf b/public/fonts/Comfortaa/Comfortaa-VariableFont_weight.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9918535da56c3be9cffea2727f23b228c1bc6813 GIT binary patch literal 203040 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

5Ti~= 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

ywkTjaPXSm50{ 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 Qvy5msBP-u!kAyP(*+@c+k;$#eo?e|f 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 U6okA(<+3QcAiDvS5Zc!N0dN2f+W-In literal 0 HcmV?d00001 diff --git a/public/fonts/Comfortaa/OFL.txt b/public/fonts/Comfortaa/OFL.txt new file mode 100644 index 0000000..5c7930b --- /dev/null +++ b/public/fonts/Comfortaa/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Comfortaa Project Authors (https://github.com/alexeiva/comfortaa), with Reserved Font Name "Comfortaa". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fonts/Comfortaa/README.txt b/public/fonts/Comfortaa/README.txt new file mode 100644 index 0000000..1d01eab --- /dev/null +++ b/public/fonts/Comfortaa/README.txt @@ -0,0 +1,67 @@ +Comfortaa Variable Font +======================= + +This download contains Comfortaa as both a variable font and static fonts. + +Comfortaa is a variable font with this axis: + wght + +This means all the styles are contained in a single file: + Comfortaa-VariableFont_wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Comfortaa: + static/Comfortaa-Light.ttf + static/Comfortaa-Regular.ttf + static/Comfortaa-Medium.ttf + static/Comfortaa-SemiBold.ttf + static/Comfortaa-Bold.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/public/fonts/Comfortaa/static/Comfortaa-Bold.ttf b/public/fonts/Comfortaa/static/Comfortaa-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e64de93f18fbf613b994c881170696c654b215cf GIT binary patch literal 111492 zcmdqK2YeO9`o}#pds0cLA)Vw9LJ<(ssM1pD#Q=(kl8^)lgd~PgMCBqXa;?b4epJNX z8@6LdE-K=&q2^i;v1|0&yX5`O?4CWLh_~o{|L=Rw=b3$W>ND*(voo{%2q}bUkKqww zbWw516;rM%5kh4OA-@#Y^yCH$x2-&4oLh*DY@B_`w6D)%O=6 zQgZ4Ws_N&5pF{dG2LBNc$d)ti^qkABkS#5u9amvhi zwRHRC!Z2$;KRUGb6>03_jF~FbvU&3xO=Qa02pOgxHZf~UEBT$zrfvP(>~_Px6_)jp zwtuzP9ZCB7R{H44E#3BR4zt3-2pKMvw&mwhrxHUL^>&t`WW;#;DvuXAl9~$rHVV}; zN{Ew!HigHO7K@ES{H&aOgvkkBA+OTzs+$$d#Vd5Kl$fOL_;oa<#Fk=&$UQYmF0BH5 zSyrxYB zUMN1m{77~YQl`sv%&xKZ<%xXpZQH#_f%sN$vd4f6tbD3I(d7?TI^AvRo=Ber&%s168 z%-w1?=KJb>%n#Lvn4hZ8F~3q@VSb~&p{}AVHYY2hYLY2jys!+U6%r#pOD zC@(Txq=~tXeT2vmMGhZHPsnumC^#CqE*}|f@>MA6#3I7gi3ZUq%K0BIriv=;szm{| zHMH-8`I(5HO8hLr=fT`dai5244KX$x)W-xu&lB@Wb^r8Q$GvYnp)f}ie=xj`qfyk0 zp`t(k#iD`~tGRE4?*~;QML(0ndALs&C1Qe@M#|N=dAX|-wfOZSM;#^6D3%$StFWI(4teMnX;A zR+8a>?}ujTM!r_;?BM;gA7GVz)+{&&k~-!j$hVgZuQ=UR)D zI`2zKQ{U-UquWkDa;V$VIM<&SIm*RClhYcf%nsI8g6(YoGRZY%k|hQlr2Tl^)*143 z1pbZ@r69EC4s6%Kbb{9d{b-wdaiVEIcH8ud9FaxMWK)j1&FIoTFq~IRAxs@*R7EN1 zwvpr4e zW&dnJFUkXBK;9cwzoD zulT626m$Fd{Fz>H>%_?nw&#^jp6C_zOr5-yedrm99%Vg@>#<;1JJEr$ zw-czfziZ4PUE3VeHTsaQQHOMmJfv&HAzi}{aBV|=nLn8Pw$3f{Qj=rt9xRX6?s4Vi zHI3qnii$<`;uB-;sjRJAB;K6cP+lQkt*M?@E?!`!SR=L@bE`2QHRc1xyxW+!8uNN% zZmeChs6kv-*HBq2);BC|s1@fd)~T#nyf`actXjOJez90#C~tmQT6zwO*>C*4IggIcE(IFW(Q;H`IX|&?2Zt6#-~Y&6l*?E9y`T+%&}9H zfl`;L%dt`FZ|cHUDe9TBme6DM6_)I)ZiJU&He|=A$8?WeCoj;X{XtdYN!gb?>GH`W zZk=8pr01(TTqjH=s_>&-n5*sQBE^%qOLd;Q7~i4X&w?LD-jhj_l++EvQumvDc=SBS z@LHa5b&a`OudZ`!ElR6BGmERu{W`VDalh7a*Rh?iE--ly=1kX0tdZkMlaZ<08cjeQ!*j#i(;; zu8zsGP^%J{M2NnWC^I`kwinS>xlqOKeCSzhzOmPB zGRg6ybM5AwR;gsPWXA5Ktwe9p(X=34lIvtL?TPYKCCaC+P*kR7x>k8{8>t5^c){E9# z*2mVj9_fkoBzd}fvOU8+V?EP7<({)W?|44*{1_G%)*-A**o3edVU=MghdmtjblA?Y z-C@mPKZJY2+l8lu_YBVs9~nL_{HXBL!p{%i8va7~=ixs^ghzCYNQ*c+;)00BBA$(S zE#lqCevv~X8zWamo)dXV^UgQ^1BC35Z4Xg zt&8$S-59kw>hb8r=*;M>=uy#^ML!e$Ynuse&TeyYn`_$K(dMBxPsOCh^oq%g85J`j zW=72BnD1k|#P*8Kiyaj^A@=0hwXqvwH^$x?`#|j0*cW2ojQuF~hqjSz6WjJ`JGgC8 z+bL~lwVmI#vF)n1H@5w_?YHe@yV!O~?T%@8X1l+&yQYe7ck*^RqtgYQ-i}L;>k~I9t}t$L z+|0NIaZBP>#ho2@aonc3+vEIk+u~k|dn@jvxNqWGI*;tUxbxGUcXr<0xw-QX@t*j} z@yEu`i*JZOEB?ax=M$n5;u0n#9Gy^=P@iy8!o3MkCw!eK6Jrt+5{D+POuRpFOXAN- zX-P*XRV39Wtw_2nIV^cZ^0?%qlIJAfl6+tCN6Fu$h?JO=#FSnsc`2h(CZx^iFJsa?)LXsLwbl(U~JNM`zB>Y{v4IHYkJ($(f6mr%MZWi@UQzF(eIRg_w={=x9K0>zr6qL{Xgvg&;CDW6=xlpbzD|e)(Khn zXFZwqeAXLTA7*`>otHf-dqVb%?8@v5v#-v+Df_PM2Xi8GCgfb2b6w8UIWOci<-C{k z&)ng;7v^4(dt>hA+)s1A&+D2uBk!+y7vx=glIHKzj zCm!+Eu;gKt!)_S%$?&w{Rl^qzziIfFBZiJB7%^_dQ6sJxapQ=4Mm#iP+sN>d9Y=N< z*=uC($Ppu#j9fMH?2#9b+%)p%Q4yosjY=3baMXxVC8MfFEgH3C)G4FR81>Sq*GKKi zkIZkMpO`-*zbyZZ{B!f4%zrlj<%0eNg9=s`>@0Y@;M0Qd3$4O-g(-zS3v&xc7M@-B zZc%>GNkv##wU)SIR5FP;$O?qO|i<3T_+-7q8yfXNMwJdLEh{~})K_|K>BFTvOPfo- znHn=Saq8fyMN?0idf(Jnr@lS4Wm?g+^QYZA?XBri)4NR{JH2lDvgxax|E{C@9(BP{ zUmiW<=m%zG%s6_+hGWz*Cm*wYX8z1eX1+f2{bPF_yYko_vvOu#JnQ-6yvH>j_tbIk z9-nc1@8jnmzv1}Xj(>M{%IuQa=gq!r_A9gBnf+N=pR&Pa`DJBgXO=aUN0jH6k1cO3 zzpVU)@?Yi@&RI9-_KM7ktcv3+&Z&5);*-k5E9)z_RSm21RXsbmaPIB%lIJa&_u2gP z`NQWgnSb7V|NIZDdsSCgzq}xJLB9o)7971`*@E*IY+kT^!3PUH3x_YPTzLAzTNb`p z6J3*0b4<+zH4oIhS@Xl9wu^EX9k*!1q8*FAu5DABSv$OTPVMsA4YhaHepJ`Cu3z2s zx|8ZQ*X^j6^@HkX)n8cuYW)u<3^`%h37Z>Y8mbzuY1qAZ@Zt;jKhW5nF-^}m^_Uxn zsmIPZ;fc!N`hi%*$UPS>mi2%kVx=4-|02(4?d@uLrwquQ@tXej zdPcovd8`<#oz>Awu`;b*RzEA7(XPl^Vy(2!vd*#ASywaO-Dy2zJ#W3{N%nN}4D}Rx zW_v0;3q4CbS9q@T+~T>*^N?qYXNTt>p0_<8GwyXsI|DTP(c9kJ*_-Cg@b&<|a=k;r zuo2!OZ>hJ@d$spk?+xCYytjMr_TKCDdmrf<*0odD_^ugUdvxvB_4uwAcD*q}WrSz6 z%jlTVIU_kEJ>#&9J{e;&$}_5Ze*ClIc})Leg_oz;p<<&PXY#pG-eL0jf&4`N#2R0g z$>&3A8~JQvq7qI%JCM(ARu7ZU0pzohe4b7|&tqi2#=6MBtpJf@9JwN)HRc~vq3Q*<8oBWEFFnOfr_Ws(k z&bBdk@9w>h>)AY8+rKR8zb9pr&MY~RXP$%>f6Gily$0R4_g>5gG$+KbYoRSps6$-d z`BsQM_wKnvd)c#Q&wG2m-gC*G<@{&uxpq&VJ;Sjr-ZL%~!Jf1|347xAh1}fuYVSPu4%;M zTWP;f9(z zt9#XMtCQ75?NomCkh(|xsBTh^s~dT8xmn%9uWPupP$XV_H20waRQQA^Kq15R zJY1&oOxRuaV8%S2Rr*PC8msi>a+zE%Phk#xrh3@wsUESy)a&YY^_KcVy{*0h6Vj~- zmRGJ*&s*W@39GAh6i8v|Ik`32YR^;eUDnacCofPhs7>l>b&a}{Cjlj*cn)tb5@>^7 z*1CF$KCC%SVvk|07|#=7C2Ko#Sv@*c)Ty7vU&Phoa&d*YO588bkTb*6i(F00L-iqFNj%-q|^SlLc|$bQ36dARHk#tl@z$P!sC=g2BK55$`wPo>Q_fsTLY z`RE@!CBGxOiuYJ4dY>M#M|2k-@%;EP&)z?a!$h;l72koDzwq?&nHb5M^l&Lfz6=wi zq(>CVNKq&w#8jCmj^ycmjEoVbGC@pWow-DI7Sm;lI9hg*Y2p~^701d9F;jLGvt&1M zoXiwuvZt8C?nt@pB`RcZaf&Pw^JG79k}MFX$#G(>oGi|wNB>n$5$DP2;sQBCtdmEJ z^W{-IKh72xvtx9TJWkv$mx^2DV&Rh&;x@TN+$2vBx5`Fww_G6}kgLRl;&HiFY+=9U z3HeuftXLw4iEHFSF+wUvfnqS=4Uxjr&nh{Zb*q;cF z6rMQ;@+3LT8qPXM9#4NGtRt*J)(~r!b)1^5UQ=bNT+LCHs!E-%=Bjz@h@Gv@QLELN z>NK@RtyO2JzpDB2GI_b&!jqVveV~WsBl1yszkEPG#*^7bd8@pKvFvZ`B3&piVHe3K zuaH;Ds~FvGV+ZL@u>UTe-|l4}X|sGtJ}#e-&GIw(IlDz)$*<*i@_YG%{89d_BG@g8 zR#B>ric#&@Gis|kvs;wHTFtjARequ3*g=X{2`W)_P#sm0{DrY3T*b;KRTsHcrOCgm zbh%A=<;C(#`IPD^pH><28P!d0SDErz)m`pTJ>+w$rwpiG@_BWbd_nb=FRDKBCDm8H ztPYnuRX_QP>MviFuc>U=q;gc2{D;bwud6)yh8iH>R0HK(YLMKe2FthA5V>0omG7t{ zOP(n1kteZ6xs#Qa zS9y|uj`gnR88KgA-Qh)6x&l1OZ)3jjG;0gb@KnB?6|JXOq4}QY{2v)pe`Sr~pRA*P z$yo9gqwLr0pnM@F%T8jV>>wKC5YZ@)5Y;kEER;E-M&^n|GEXd!**v@OpaiLo-a1Z1>#y+Bd(XV;s#kKZj|-nI=M(ZBu^85xmr9dPZy7Z|4*@s_MCcJ z1$gp)Ry|`KX7%AY{5|!NdPnVH2kk5M8M|p8u)Fr9`ltF>eWE_M60Ocwyp>=jS;M_yg&nD|*_E{nIvZ%D8#HfQ(JKWkawmVn$iYxz6 zBCiKcSIaYxwC9NgeWmUy)!Ft{X0?0^eTQ8%*JiFqIb?Ai=(v9fp924}Y7mDTx|}#P zt=^Buaes+uW4%gxBlacrnR93RMtMyWdFgS4Gm4u3GZQ{*w09Z0%v zO9^)&^}HWh6LI^4NxdW5S~s&BydS9@?DJm9>gDgz2VwxL$|1T&j9_*2PbbeHF+vl4 zZl*eh>%r(T?5`FhtW4u?gj&S)kELE_^|Q z-L$)c20$J)(fG$*B;)5Jncm_Hk{Uw14zb2vV(0?rdLq{{)@^Ub&;E3^WA{I(A5$h< z#bBk$NzapG>S3m-GwMcuz>FqDoq{~)D)J6W-9!&&G{e{jh})mY>*PO$GDU=H5-|tR z;i8915n;besbY|7O}j+2CkBe9-7JI71QXv8z2q*@%Zwi%f)`)__-E5H`ut3h)EdJ* z1I1zNTnw@}X%Hm!2L3fYC1MROYAn{6RD_+zBJkPZ$)hd*RFHK7_w;cqM&w%yMWyFx z=r8!w{Min3*)YbM@sBah z8YV^^P!0|T>-+^t$EV9u=f#u#4)DCF~)Z@G7l7yvIV>8#FOpFT!r7` zpjWU*Mr$#=j<+4VRO3WXBafB|jMDgF@~ZEHeN|(tT^79#D2E_^IC<3hH1Q>hUOF$7 z!wB79hU~+wyo=ODsFl#eMyWo zZI?D;JtU4W?e<3e={BtAT@Sa+w&u0WrcKVaE^WD7UDg=? z`QHRzDJF7qE6-r$yO^B|EPYbrw)S@v{>UqHyfjm{72JOb7ajxh@o5*LLolpD7 z;5rOCT;31f{SCjh@DoHD?V^iZ4rZ+4{z~qLwA^DY5nZfgXf}Pa7uWGzS3~W1M*Upm zh;N}Md18K2bRjRjc%saKDos1=#!3M8@=P&So&v_6$=Ls#=qq1oc}cz^(xEOq?{;Bs z-VI8|Jrhc2{+$mA=N`M3=d7Dso>Pyt1dQD)l*J1z0r83G&73`jr&b}oEx(9|k>z3g zO5EKIb>M1Kn(&dQaOR8QB1y|-Wa~~?hYXg{md!PeHhVIC>2%u6aL%&5!hHM#k!##u zp&YN^K2s#p_QS0qw1W}c-^5upO{Y=UNtDGegm>mz^v}V1&coAcjupmph|a%u*ZozG zKS6o1Yi%ENcl_uwOAq>||Maq$w{hRowApR6pU0@*$7nmT;G!P8PB8bqtYbw=SQ=&Z zipW5gUgmlW;cpf_HLuB20$#mAzK^8-k%usc8;S)}Z*JME?M#`K;r~qWH_Cssk>$*m zz542DLY5PVFI?o>W!&c`nSt(jvON5p>C|5WD~YG=R>-&mXgc- zXq1kt6&>D+*Y^0O&FrBMy&?{0&B**(e6F0fg=1QJeKS)$BbBtIM~2C8R%V`(k*sV* zvn~`PV_9u!%L++5*_P)~SwQJ!TKj(Ajdh93e;YTs)T?zCgcxQ5MKT zStN^D!5Yol&=@&ZjuS7lIyb?r&rOz7qRJ)c{j23^@^pEI zTqDn9?P($FPG@n}_Z)dH=TK@mk+Q&?2VuR2m8A`w)!Ha8WCgQ?6<#6gSmC*tmB3F} z$B|+TYfG2P%UDym++EYzC>FD>vx(KFYd9%kw{hn9Y55Fij-O>UY=?Y~Q^zah^PD?=QNAQ!W)I~Ry>26$d|U43+4&t-8-I~|DpYW-ic^0x zvz>Lp3bQh(*9GTu%6frXsA|+ARm&;sdd^rksKu&LEm2E3X}z3t)+^LW>SRt@uT+0g zt2k@Dnl;4JSwURGYT{bf5$(0bb2-BiIuWwLoC&#DUBU?xeU2n}req^4)|*(fzE)kw zd5;@dhrda$!>e0atG`{{q3%?7vHEn6+RVEBeXP+xpdK{q_7AH^SZ#ldmHQ{u7WJgs zs{YPC(^ITlJ!96b^cq$`Ji|Qp-{dcNY)T^w6Hn9uvx_X1vtGCoH*4KBNRjqef z-_mPZAF|4&SF}D=&8%{LE-q(<>kHPozEWRvQv6%>o%&w=z>dLB>Sy%}I|X}H3;SA< zH7<*FzBtys)P%sV=;9^8f5 z$1SV|Uc(CcCNTd@o=(~`66^DgBdw0C6~-{ul!+0bd3&pqxLe#~#aW$20nZX!nR9G5 zdk^wYrMy#rIYQyKtFScdLih zlN|=0AFMvi(ax|AXJ@XzxQNx|Y%7NucUx8=zu?52SDeo(emeUd8yGEb5apbq%NOgd zJmJ%8&+LL+Dz0N@dx#A#MOGsD^J z1gy3S#TMsnh|&6e2+sM8XTM{jHHqDgDb|rzDeK(RSmQp*I-0faW2~8+&1Y5HI^LRX zm09K19IHZ{C*Bl=?8dy!zQa4Lw!g)`!|P&~*lkr>Rn}Z)rW#YX(_VqIpqy)#)SN+vE#zW zx+RVbPJ)Fd!R+EfbB}#~#8@Zcv3A1YV;ie$Dy!Oz3q@upm^(0hf+?`@32q@|W#<-n zCLl)mB-?3HE2q2xR&njT@X4+i*~LXp5fwS&6gfpzwe z8vrCfewkZhH+ccQZ=4m)HRd207Pk=bGzW2k2{7cA-<9`R1N*MYems z6E1&?E?oU$5}Z8hJ?>E zDYuyylG0>4J0~}Ko*TPozJ`VQAwS{OZn;wqL!zqt>2v3t{nRY6k~3%2AqacSQ1tj>OnWtBwKIptxaMnRjp15l$VoOb{iV!|6*Wo&>WWww!u{+%1X z*lucz_bb7i>>*(_b+z*rdm1%XG`5Olpwou43&NMUC6twI<0o-CB~l!`4hmZm%5kw% zekD%16bDPd$$4=}?2-d>oQ>SU96Ok?#9+n}8#9*KnOGLeMAR}DGnUzyabn2PZfPY0 z!cT0C8BW>cI(1PpBz%R5HhP8In60_9=Y~PEtBqM>8e5)&!Ff)p=4IPpnwM=CR34pO z*HhjQ8>{ndRL#n>ODZeRo;q-~Yb6haH2!t2bvPTqx!PSK&uL?M+4jhk=ZsW&*>;=D z%eF_ZyllHI=4IQ!pOdf^s|YW(Cu6{U9g)AwRMYQoD|JXBqtJCsE>3HqTXf7yZht@Z?vlE56Y3JMo zy~pi$Z-;P1GB?pCHJddVx4k%-H8+uD)-bmGMT4SNR5jG~tEgL4A6-?=7c2Vd*D9mt zRxhpUr(chZUd%E=tzk`wET=bQ71;eXtH89zoUB24Q9SXRDCWmB&Syeu^NZW)xEwyl z#OB;YRV}Zelq=_$xdqP&#qsr34b^p(dOd)Lph`1a=6zZ_Vf*=m#|+c#xn{*KsjaMP zSX@zu-#In0CoHMc!IolGRjI?|46+9Yu0x{AYjLfqs&<Ku)eR;-EDaoTHDG|_!0`I2#l+*p zZLk4n)AzZWzRK00BHoQSTy1-%q;@zP6?2$rwy8Q{N%hk5nyT80s+ekBK#Qv?8mn1r z(K*ewCn`BP&V+)@MAtPm&et=@@|uY9hK9OjOX{P|wLw>Nlwm9Dmetx^P1Rh-Zcbg} zeA{kGePwNo6ST5+&f+RNsjLCvi>hn&d>aYsYVD%Vwr7Aj+1Uf5sunl$5YuQ^LRPLb zC&_gXJjX7gteoKEm-G0O>&$&}vj#<(xhidPPL!FJYEGw}mFvula-Dflt}`FZb+VnC zl^&#^OxMmu+ck5`|W-_rvBDU(3gH^ zb+Fim?W_1oV0HL*aU<)>K5-H6Yo5iq^_A?mG>97Zz{NMYb{@1A_kF(yq+5gip6>1Jdn(#M46P*6{1tCHmQerEyt&*(`%|4v$y@f`A3F)5 z*f+Q-h;FOlHSq>Tx1~@$v;eAvj)!JIr9yTqfkr{Rk=%{9#k=)_GH{#V_|g6}wTGe| zqNQi-Mb0p%z6z}p_Sp58jXIgH=yWzU7;k!n$yYb!EfHZ|U*N=8jyF#TZ$ED@Oww_< zRF`9Kyp>&hO>cJXJ_vGNH;we&LA&(VgPf7i4!bjG zm(CkOPP$LK+?F60%26nm^oN74>G!$ZooxBvOdX2!YhCV2xJ!)PdN}hIO!^v^Tjg@v zb%pWQ=-Sn~+(5&#(qLk# zaqZ^1T$#(wbh%Kv(_Fhra3;TLV_dEPZkWzdn&t)?E-S5fS|)dCX^AcuveR5g;~KJy z;Xd4i#pv>r=DK|2a-RpeG;RNpaorQN>+)uoSG&B>WqX&cT^@D02VCxMm%G*FwB7Y4 z#75WdGMC%na_70+T9;exawof-mcWj0scTp7atD*|&>~c9S*VpB=zaGY)*R@M_xj2_=>vEBB%7nNx$ff+^a^Jb!7ktO@la%)`cexx$ z;n=<8a@uZ(@wd&jd)(#xF1Oj`Zg;sGT~6ECv21efd@dJC?IPE1oy%!S?XX~{Bj4#R z7fN@fYZuC!8%sLn?1WwJat&}bCU0|Ht}JC{%CwY8DPvL!up6dJGG(C4Wx1So?QL8$ zUAr`wOHAqL?Z;Oq!ujsRfgHh-e@gxa^K+N`$mRC9+?y`^A+7fjgguH9Cbd(`C~ zaJjo(?$#ieq9w3nxjtx@ywT-C5?mIvGa+o5Hw5jH&x2c=yc+XlXsIa;%09W?aI_qU zqmCSoc3^YK3tXxp)&_ zd)HrdkV~Vc?bLK$;B~s5pk1;XOVZw;UD6MH{P8R8HwjF1xDQ-zH{9#SRdYKH7f5vd%Z0lfUhMc1ei9<#8yzCybC>(b<@N-*R!@BNTKoAe z;Y}S5AFn375ai6$j(Oe+J?*5^!t7_TgzdIJ!fb^eHK8AH?Lr*LZ~qc*b*|SZYz%T~ z0hY3Wnw52QqUbDo)2x*WA?Kf8paYE@RDoQLvuvYlGO(zM5IE^TutwbUZy8-aB7 zA+D9AA(63smoEiPQ8`5cB6t^m(a6| zJLgXr8gxy_bGd#l*GqE=y2L}Ri4wPeq4G;@42~ozU+A*ebDxA%+gCz-Li-@6UF~r? zAsWt%`w5;P7r)o#esGcy@n7+JLbJZpctF3PMnjy&65B5R13N_g?s!T~|KfLt#;Bw_ zZ9BqJQw|mvzzx&(N$xn9SQGTuio=iH&*OL6uJM8Rr(J));A*fqG_Q-_Lh27|AEEI) zo;2)nKQx}l-x+^%{I&5{#$OVWG@f3efAQzIsjUf>LHsJ?DB@RyQnPIc(ddQ{15d&wW)q>jV5nO}o3=?qOq{D?UEQkWwO@Rz@X&<&!nzLom zoGpRjOuC_%L$QQhQ~MGh?U(!#v;B*A; z$7oZWYIyx7pp-`#bE@hIf3fkIVa!6kvmg@;e}*x;xBP_78N7kSH}Oq88+ltv@=X^^ z*-zW30?n(dc%uql%fq_|?8ES`g-+LwKhel}xJmb7V|L}_xs<%mfjPyb6>CySH8$qE zw@9L0&oJhA<0r{TINsP48JqS-lJ>^tZR;QSUuMj8*1Pbt4L{p@7XE(2-*5P-npY{t z=5kYdm+_961E>-Uk$&Pxr zNT%wYBe7fk2*07lYwUH6uh6?ivc!blV8WWc581`UFx2?3F|Ip}&y9w!F+OXIpN@v_ zX!z+SEwkT59`#;THxt8jlj3v}cDmlll8>0!rt5txm1y={l64H?9kaLdmNB1^ldyTq z#2;s!1b>b8FO#&ZJjKM&+3=lB35+%IcQ*bz8+lU9uGu={$1cOk+K)KL_(?H-zG=A$ z8E!EtKC5~5?sQEx8rNCY2KdX=Czx}23s1@?*`I=M`5E&K-rI&(X_%*(oR(Ubz?bSh zKHhE9ZT=43&iR@SEnLnvHFAuRXS$Ku?BDVJo9>m<3GWK z?WFySvyJ`xx*Wt>6Y4w@YOUGnyUgqlUTpRXuQs(`r6m*>>$(sZo09p)guU489zJVI z#`HCDu`U5joyx@~wr|Z&YYkCxdr_h?1^gEYmICH$!;m{ z6=Ea%nA}Y;B~W16$pq6v+M9AKF!2VM zKC5F8WjY4gXmS^4e6G~4>R6pF$VeV}#|#@e%jB`tl zK$QOs&|BGOY8{CQj_;mQzoS*ziUjovrStqHPV)v)E8S@@xRz&zm)H4 z>5^Y;;ylKB9DcGvvtz7Z;ky{LnQUU7Z2be9`;8>08Gf<}JK2PtYxuc_zs7`mMf*|1 zwSN_5{PX5BF__(IS!eh<|C) zr%q9p89%d(pLNEMo~==v#?N45zUEnp&2uJ4&l#V4jr^~f9KB|8bh)v4&a+zk^jvKG z>#}{$r1G3c_mppKd(Q>h-sJr|52&sN7-^r=x#mS+6UyZ1SyRi;nY^#({c!DYN;vt29x3%lj2&F>z$_b)*Ab@#{LPN zqB_jPbH5|A?t|YN8SXbe?GqaMd08Wy&h@><^;>PDPBrmVm>g~JT!)`Bldm!()dG{d zekONiCRCZp*IJXKGLxgfn!G%1WGM5Xr$?4~zBJ|?+BEqsGv!cb^0>j|@kGwp;A*5Q zLk7j$hgxeAYPxtcx0p91=kSiM)|ynt8JE-fqM_EBw2Jo?Kj6JUtu^Uw-Y!q){qwH8 zSsu@u<%jX^Ia-r=>m02~ycv$xB;F23YZ7~`rlg83F5`jYq(9r}{w zujZXzOY2MG{bTec@eZi8M`a(RNNH4_Gg5+s|F9F!Z6MY%GiLlY|d<6r3moe=TRG1i67}K8dTyJ>u%)kjJJqLQnn140q z7GpkP%u9?p$CwWobE7evG3}E^pqe=!lVr}vBx8#vgZ>ZGmsMt(J}uLGO^-NQw;tvH z)1SsDVP=xQ9fPiqfAiO}hqG-OSN@A%%T^uBzw>KpCRND(wKNffZcm~`w+umS(fS(v zg?t8WjGxd=tGH}SJD!jSzRGflpD6>{iMiSm9Mb>6qT;*2hYZuQ^%LO|mam{aWxan1JD7T4KMjWYbFVFX z=o@BS{&UkgRP6skKi_B0a;Uie6}Nrs%#2L`*2wm+r15)x_HExSEBXIdh|se3Uns?W zgxbH>_Z{u`@%mrg?3+_Ns{PZ(HtoMkNgGzc_Scyxc9xHWg z360W(U{v~VXZ8P)xWPbwXi1SD_gTSCAk+?i6CwZD-uS!dqerIS{q_1?ABXT@Fu)xh zC=-W2NIN}5EFq`;%QWPoxnS%eTigFW_D&fG?OJ$-`v2B1)Mx%!xqqu{>Bpue2i=`J zX8pmQ-CB-d%`*D!*Zy1k`Xl(@lNi@vt8!b~{_zLr=KI_0`$M@M%>RF87c7_mEc71{ z>d&r^KSD-o<2PE3)9Utd{Vl(?ByOu{6^40wD^zUFlky?gLjIWC{cEx4ex;>%p6pu5 zufyBDjwd{0f3Q9nN+noA!E4CnKj1c-Fy|aH4A*!<0%hpbz?XmD{gDGa|G^gaywjHL|Lo||D$l`w8oai0`qSC}J9F+( zR`)H3-;?l-n^7LxVJWDCXHa&-)-6dqd8Ado&&G@_C#vp|8}o|A7II30C?xQTD+Z$zU9`uXo6KxcZWL(|4*oSXX!jT*P0{q+~L#O~$f z+r8+=Xd|Ccu_{(>F{j|3{=ngqCav|L*9Rcpmv)zU|dPSYK3PSa(fJ#`P-JhY~X z98T1Ij!us+_zy$3#J6bk_@4hLbVWp{d@BvD&IJ~_8dRay&!CDq9rg&dp2E4XE}Xbi ze6K4X6RjugFI9=t;Mee1oON7}me~#b6=xqW; zJrP?(BKjuu8NA(MFJ=q>I4NWpXXT=JZzY13l!Bh6H1sQ5oSy50*%$pdoXF)&u0@NQ zia8Ap#k!r9p@pa%P03+susIoRYp0+ms{Omris(tge-{&l=dlBC<8@Nh!X zC)%Q8<{J3xc^^ojUFIgto8`^u{JTxw27fzRX4;}p=3Z>>m-plILHVGFMMp8G1UY^A zD4LKSlaJxLMQ*{QjpCmZnYhwYMH}?VJcG@1@;O{zkS}15HW~Cvz9wJ8{vYU&@t`^8 zE$ny6UD#-?F$x{_pJ0B9o|rbA;%p|@pUW@F?^p6$`0wO*Ll9J>f-Q^PGs~f(nCawJ}rtXJ%kuIGm0zygqS%wihVcE7S&k2W`r7r{{mHr|6yWt?zDestDgb256+hUwF;qBGiSR${YCt%5&Q zohlAPkIm`Cb_V(;JEO;DEv|o6f5rYRbrzDGjjrDAoRB?-)WHie3hg%Mi$S2qI&|+{ zpe{hu-FmeieR+RVe-pXj$OiQAU5M7Sq3R-a5&GgTMkD1wjV$Q+L&uHC)c68_2O18C zXgxRRv%QBmEV`l9=1KT%Y8$R-w87l2wxeYc#KA3@bw*cL8vig(XrBR+*_d@ECsY#*a&>HlT!|ppCUEK|@GHvTS6hQ$-3@-VG5FOL z{L)gs1&T$W{pD@W4(~?uQ!J;xc>_Uw$lqdQ{0RON@hg7z^0y4q9d3{=2`y%k^k z7#xf?IGAj3u!F(DZs6eAXeeVeCKX0wOpS)&dNc+lFO`>rDH<7L(6D|5HdmvGE5@K? zxPy{6qK&JI!OBR3m5Hsevb({@js_ni(Yy5!D5g;|iZT3gc#V(U4KlXXV>t1nXN&kX zGDaF?Y-5ly24s94sos!pB2Ne(W6-emHlg-M$+iwkekMONDESp7@HJQ&VX!jUV5P@k zWt_oEkHJdIV5QclrRb#^D`O2-N`sZr1}iOtmC2lIk3#D&a|cX~m>z?b9)prv!&V$& zJFCvbqfs)$LCF;K&w312CL5HDX0+~!cEMhXHwp|g#u{Xd)*83)sqs;wcPk6z)hLGn3h4zWP_LCv+xQLJY}BHy4}iNUoZgKLEb*N!lV zR$vfqltHwi2GNEaM2k0A7H_a@1X{c91QSDu)<@5t!2Ji+gW#H9`N7bK)I%Wk!)QD0 zi7u~4;2%|w!at_az3C$0Ga}w#Uyi}P96j4&L}9jtsc|q{&$ft@*%o7u#>7a2iLnL~ zBMl~YG-w#f%e#`uV!#x>;CGZXJ@!-+-z%b zvyF|LdZs4&8uaXA<0eROpFXiKUhVrutN-@C+xtG=>i&zq_wirFe?hCi_Vu6sC-j{_ z*b%M%+f5oeorC{9ecgYbzybfq`-J}fKB52SKJMShzlu~RkTadOHt&Nx#^nngC){>J zI$s{*+^pm672V_79wRa{GghRX+$%a`Me3Z?UWq+AJ>35G_Lc2t#+)9rGNv-7AbLV% zX=GMpMx=-cL_8j`K2pR~Ml?oDiYSU0X#Rb}Kj;6RF*WzOV?QwbCI0Ke*I9G>e$hvl zyOvE~b$Q>{XEPE{K$?IKja=Iq6JBKuN<*ue7u{wVjA`8&zlMq7VuTneMlr+I^J_hV z&Ct34jSj%$7{%rabUBJ@u|O>3JGzTRt*8_A;sm~`yI3@eC1R;q#y56P6f49@;$(3O zU)=qRSS3zn^wXo>8b-SF(5AMIr?&NscbAFFd6xyvf#NEj;I3xO(|X))5x0ul82Ro% z+vHtZ=Nt3)`^5cdVtbIcV;(}2+#}55ccblW4{x-*C*Ef)+DBWZJW3vI^i%ru_`$ew zBjd$wj17Lqghv?*wrSi4^_dHU_gZrzh|a9{Q&3o=X>agKYZIIRGHES>(^XJ=pw=B& zspc^&)A|7$m~+{B0ku}Zzc6z;2kf{IY|zh8w}J@Z0P~s$U0r=4J$*aO6Vq$-Tdj?6 zH~myU9erqY@EHw!w%$GZnx3C*7hQN(PJ_}RFVq#vfQCWCp%KtXXcUwWRY7y1dC+{Q z8d?A?gleEgP%Tsk)k7yh4bWn!5n2K*g_c3fp%bAM&`HqA&?(SL=r7PJ=u~JmbQ-h< z+5p|by4Ic0UC`aoJ#3Tj)FJd*}z~N9ZT$XXqE`S7P3u20#O$LC|1m2s9Kr0vZMlhekjnp;1siQ~(u1MNlzR0*!{oKx3hC(Df~Q z`@b1{Av={BcbWg4DOFk z8FV6a67(1B)^a_EbtjLBL5J2pap5^)bjwQOTghnqU*v;$v|Px<3~CaROoxu)q>Z)@ za2H?{p474xZYxr+N8%ixvdxBR}y|D z;a3uVCG&}6S{hA?AO^LxRc$9PJD`^-&zJ(OTXQzOFKKZUC{4M`0!G~t>p&5K= z1|OQihi36K^bE8edKTINJqPKtuFpd+KrccsK`%o)p;w?+q1PaNCh#B7>(Cp}o6uX( zE@(IO4zve)7kUqRANm0L5c&xE82SYI6w>cueFl9F{S*2E`V#sI`WpHM`WE^Q`X2fL z`VsmG`WgBK`W4#S(hNQ{gAdK%Lo@i$3_di256$31Gx*Rf`$7GoEGQewfpVcdXaF=2 z8Uzi7hCoB1BcNf>aA*WH5*h{NLj_PFR0I`6CD3SS3^W!R2a!Medo%sLnf~5Pe{ZJ0 zH`Cvn>F>?-_h$NgGyT1p{@zS~Z>GOD)8Cuv@6Gi0X6pQUQ_IWXPlDD$ztINi)6Mkf zX66e|(g(Iee}}d~PeD&Z&p@;*YCb^C2dMb~H6Nhn1Jrzgnh#L(0ct)#%?GIY05u<= z<^$AxfSM0b^8so;K+OlJ`2aN^pymVAe1Mt{Q1bz5K0wU}sQCajAE4#~)I2)sp--V^ z=ribZ=%3IR(3j9x(AUs6(6`Wc(D%>}(2vkh(9h5>(67+mmH;&$pymVAe1Mt{Q1bz5 zK0wU}sQCajAE4#~)O>)N4^Z;~YCb^C2dMb~H6Nhn1Jrzgnh#L(0ct)#%?GIY05u<= z<^$AxfSM0b^8so;K+OlJ`2aN^pymVAe1Mt{Q1bz5K0wU}sQCajAE4#~)O>)N4^Z;~ zYCb^C2dMb~H6Nhn1Jrzgnh#L(0ct*AYQC0hJ+y?HUCMPCbRu*T^cT|_0@QkdS`Qcm z*=pJfa|v}Y1mO+umbC^iw&P<56hsrL(FDE1U5FLM*(I>0cJ-5 zW=8=*Sui^aFgpq`I|?v63NSkgFgpr}1<*pM23iD>2WCeBW=8>LM*(I>0cJ-5W=8>L zM*(I>0cJ-5W=8>LM`-JY$RD$#0JEb2v!ejBqX4s`0JEb2v!ejBqX4s`0JEb2^V?`< zxY5jUqnYJKGtZ4?rW;Kk@X-f+^Z_4zz(*hO(Fc6=0Uv$9M<4Lf2YmDaAAP__AMnu! zeDnbyeZWT_@X-f+^Z_4zz(*hO(Fc6=0Uv$9M<4Lf2YmDaAAP__AMnu!eDnbyeZWT_ z@X-f+^Z_4zz(*hO(Fc6=0Uv$9M<4Lf2YmDaAAP__AMnu!eDnbyeZWT_@X-f+^Z_4z zz(*hO(Fc6=0Uv$9M<4Lf2YmDaAAP__AMnu!eDnbyeZWT_@X-f+^Z_4zz(*hO(Fc6= z0Uv$9M<4Lf2YmDaAAP__AMnu!eDnbyeZWT_@X-f+^Z_4zz(*hO(Fc6=0Uv$9M<4Lf z2YmDaAAP__AMnu!eDnbyeZVKnTke!|pbDrGs)FW1^Pu@qHM9U)2-QG~pjxO7s)tU1 z8lc4xZ=%R0&{F7n`qNF&ZIB=OJG4!&%X6hKFzX61>k2UI3b67XO<(lU7k%_aAAQkB zU-Zczi04P>r(cHIzVxYEAdngY3bf`B(nbB8$^i>~y)u)Eyegs50 z(Pw?kYJAK*0?cuI%sv9DhIvXIGlT|+wod=`IWrI+NbXbTV85R6{l=CuW(Q@=3d+=7 z*xwC34m|;Ffu4l6;r2B24D=>((e9YR>Avq{1{Yuk7hs(sT9H2sxh?uHGr0h>A}xjP zbsfQyCb&InG1#GT zAc7x6@Pi0`5Wx>3_(23eh~Nhi{2+oKMDT+Meh|SABKScBKZxK55&R&6A4Kqj2!0U3 z4Ac7x6@Pi0`5Wx>3_(23eh~Nhi z{2+oKMDT+Meh|SABKScBKZxK55&R&6A4Kqj2!0U34Ac7x6@Pi0`5Wx>3_(23eh~Nhi{2+oKMDT+Meh|SABKScBKZxK5 z5&R&6A4Kqj2!0U34!+9c>7{;psh=MC|FHKa;B8gc+OYOHwq(oJWJyQ1 zEXjjx$@3)3@;t^rDRp@^$$`r~p$_&anl=Ue8U(&fiF$NT4KrsdsgG8TE z2Q#1-19~w+t`wwt!I<65VV;ou;3Q@Nd%5Ui>CKU4h?~C|ExU>nCCDB&;3R z-$1-`>Tn>L1SC6yE>Dmq{h!k149QcW$Nx83=r_TabTi5=DDOpi9}3+fCd>U%MD-?6 zzJu~FDBnf-9?JJoet_~rlpmq|E6QUikE1++@?(^rp!^i&XDB~M`31_qp*)H5OO#)s z{2JvqD8EH{3gu~(XHZU|{5#6;QT~APN0k3Sc^2h4ls}<7k8&F2&nW+i@&d|VP+mm& zE6PhKFQfbos&JId=Q|3G;IWdS9bnuk7~hd!Q%KAwj@o`*i3hd!PMlFUON z&qE*2Lm$sWAJ0P{&qE*2Lm$sWAJ0P{&qE*2Lm$sWAJ0P{&qE*2Lm$sWAJ0P{&qE(0 zN(*HWWe8;$Wdvmf$|%Yh$~ejd$|TB4l-($MP|icyi?R>pe3bnt2T%^8%%dDaxd7!b z%7rLLP%c8b808X_OHq!ZT!!)%luQf#A^1KuD}6Z&9W(|q%tP1DL)Xtk*U!T`pNDlm z59@p$NH7l+m+z259@p$l0OfrpNDkML$c>#3(Uh7n1?Me59@p$ z*7-baf_c~k^N{G1(n=Izp`YXy`c_EuPSnAtj|dS1to5U?7ZTFN+-5!sOZgO}{Ufj) z=3zUWfbB3ZU4?Qr$}w2)C-D0kJP)5e?1*_-^haUM$6?LKVa>;3SDb)daRPS53D^}U zU{{=gT|vITIIQ_NtogWV&Chdd{%N!W9@Q=SzokyVnxBWQA*^|;v>moPP988yvSvWx>qqjJ$l{ij~9))k{|M~;}cl!f{-~2Ron5W>gF~i>@ z_?Gc0-7fQ z&69xUNkH=?pm`F|JPBx?1T;?qnkNCxlYr()K=UM^c@oe(322@KG*1GWCjrfqfaXa+ z^CX~o63{#eXr2T#PXd}J0nL+u=1D;FB%pZ`&^!rfo&+>c0-7fQ&69xUNkH=?pm`F| zJPBx?1T;?qnkNCxlYr()K=UM^c@oe(322@KG*1GWCjrfqfaXa+^CX~o63{#eXr2T# zPXd}J0nL+u=1D;FB%pZ`&^!rfo&+>c0-7fQ&69xUNkH=?pm`F|JPBx?1T;?qnkNCx zlYr()K=UM^c@oe(322@KG*1GWCjrfqfaXa+^CX~o63{#eXr2T#&nal0Q_wu8pm|O~ z^PGa_IR(vg3YzB>G|wq$o>R~~r=WRGLGzq~<~aq;a|)X06g1B%Xr5EhJg1;}PC@gW zg625|&6D0?3eA(=W&Rkxpr4>D-EAhIffCR_322}MG*AK>=oB>2DQKWm&_D@jpae8f z0vhNPG|(w%pi|I5r=WpOK?5bAffCR_322}MG*AK>C;<(WfCf4R4Ri_`C;<(W(08R< zpk3x5z1vatqX<6{VLI8Dq;Y7sngG7j*&2EN6TtYmx?4>^%bWt%pKZsQ;5$~KO%nR9 z^=0%$J6DVw8s$luyf*WY{?o82PaAL+0bkB(_;OCemvb7voYU~-oQ5ywv;k)y2Aq8u zaQ0!?hjKp3ev|_!2T|rx4xwCtau@}81Ygc+_;OCemvb7voYMy26MQ+R;mbJx={r{T*v4PVY__;OAgZa}#W1GnP9tvGNi4%~_Zx8lI9IB+Wt+=>IY;=rvqa4QbniUYUez^yoND-PU> z1GnP9tvGNi4%~_Zx8lI9IB+Wt+=>IY;=rvqa4QbniUYUez^yoND-PU>1GnP9tvGNi z4%~_Zx8lI9IB+Wt+=>IY;=rvqa4QbniUYUez^yoND-PU>1GnP9tvGNi4%~_Zx8lI9 zIB+Wt+=>IY;=rvqa4QbniUYUez^yoND-PU>1GnP9tvGNi4%~_Zx8lI9IB+Wt+=>IY z;=rvqa4QbniUYUez^yoND-PU>1GnP9tvGNi4%~_Zx8lI9IB+Wt+=>IY;=rvqa4Qbn ziUYUk1Rr-1P%sx@MI2ZW2R_7s4{_i_99R$s7Q}%CabQ6lSP%ym#DN8IU_cxg5QnUv zR!@}^sF(M_-knqU(&p@%css7_&hHj{y-L10p;IM0jjjBoHX@7*K%D6|ztO2tZL78VXPp#%XCY$`;hm zf$D?=+wmLcVp!W(K>1gs2k_mQr2b{@P2|#!DC7T)RQ@pb^mn3s1m&MlK8o@&l#io) z0_C4k?n1d6<&!9goiTh0TNv!BetmsLs=t->TNv!C}|GU=#$2Oq+PsKhguUk*5y7eTa>f~an zf^Iztg#CXWGeNpp=;f1;#*>i3ld46Pj-dcAA;Kn(Q}8&X@>b~LTe&WVq;q}z41Q}m z`A?ACm+<_{I8`(8lQki!I5h_ungx5sv5&V-}}i7g7`x#arE z&4KqAty9d{3H;3o{LKl(y=x~Xnr%vUDeUbmd-O_tCR_BKD6m0!L>KRg|LdLT^PPyj zI+uNP4|XOwm@rQ@w~5Ibv-=$%bA+)^t;-g3jGm7%Dky(3c5rnnt0V=#=*_=ry~ zqp8AC;pCrV{Zh0&6s$C&Hppw}5qidGGE(JqQAtS=`$bW4anWg4AmDNZ{J&!#NY4Mj zp#(}Cen)M2ZG+;lE47m?^&{cp+LA(>yTlNSIzgMyO zt4hmi8)_YHx1)J1Ts2fz-BIr{R~0!FOak}h3=+NH$c6iHG>aI+kUUJG@rC7xY&6DV z6`oOFppcc=DyuBaTj2NGN{z4i-Y}JhYuGz$T1usl1%nGaeT@#AbYS6wcKc^GZcL>_ z%Q>~i5MqxF29w-@+bDn1>g8AU`ffx6>-9PRrq}Ns5Auf7+`APH%L6^vlJbphNm+Yf-7<_P$i= zc9*{Hbt|O-<%;)|1yS~OX=}cbN~uM!C(~sBv1%`PzeN-7gp@=i8c*S4;@|g#1lRPkgm&ajZq1R-ynMMdR8&1R)N^2}p<(JkPh@LdQLs2K zuj6WS-{D&~%)ak%e@&CoV##-w$ky`8mf0f%gGXkYgJl-EL@_(_>Ki~AJ`PS9dUF{l z!*=rZ7WEA4DeAib3&dxGDcpLIJ$n5Z^KiKq^C7tx&v)w2(>(vA*SE6@&KE@aCqVfk zdS1ihNE^-HDrHif6Z(rAZ#vM~dElmv*IhSz-O82tAqd=c@aByhZ#metZOuD2ZN34w z-!MYauEkJps5cna3uIThOU5U{{pI>;Q~Z8~c|Cr==L@v9OS@!q#cp>om1KPR?$JA+ zR}RrF$m!W-_%6{+8<)|Dn~C%`4|?tv%)dN6drbs%Sn~zu{P#2Lz4Tj* zBb)WrQQX2;HLR{`6<3NcP>lK(K59|lW%y3Io}-GW@64>{C@bpsAVQ9} z1C+f*e?AOUMmrp3lblO<{~3RGp7wV{4UV#+y}j_XrpHAnE9&QM67^}6BGe&17xig0%2&}#)Q>WI z26_=niF$!jTuNmbQd*X#JDH3X1S0egVHo1G%gBY)<7ZC<6cS7&kZkb_%KJUZXCSoz zmW8c+f$EaKPy!e|kW+?Tie88LtX8G|z&wHr&?}8z)OQ+Q;#>f(#QVQ2xI?USff$6^ zx85K1gB9Kj9TUd$enP_0%8+j4Dhk(V=~);xWEAbOj=r58n1{c#rL3ku=!ahFzu*rv zcFe-uG!v!Cl!TS);d=HG{X1zHJKV<_z1e2i0lmaj%9-nUBFLRfb(dMwZ8Dl*gB6r)MT?gHD3uxx^5@X9u}Jb~_&PsO>qr@rA9aLF6}D;OMZpiLeCi35pcOL7 zqd-ZJfsf!IMu2yrYUswL3_l=XcPRb<^*K+ClSI+)g!Xl^?B(*wu6t2c3f}4*nrbCwx~&L1!FN)c-%2g zC%4OFa;T7ew-P9{xs-C-MjGQ)c}}wuuqCwdKWVWA6t`_7>!F4E`DJ;g3YXjVNb+y= zuu2X267*P=K@ATJ(oQdpI59?R!eScm1njJqe}QkWx`U%8m9JPSo#JeG7bCIb_|5`hA8!XY^0jm#80L;dDL6dr=?39b?rBK>K&7&%+Nw z^%z&5;bFcv75%(b|Gu3y>fe6?YdDyqd3p5yvgeZ?N0hlU`rD*G-_N?z_40*!{V;N_ zJj&ar`D^WjWnPc*buevxsDJJ6(%&yXj`a7-k0^y6iLFr0m;~$M&B?YC@Ln#q2frbY7)>#+j5|JM!L~9P#n; z^}1#mInwB8lC$Y|LZ>gU=lqvImK2T!IomM*a@^a`zyc-W&fMq6+#zF3MXV*py|xuh zBSp`AW6k`aiVs8APBk33niM08^X=iyc&|LUOj7I;`mN8~e5uW@L5BZgR-odUzB%B& z6OOj{L2om4W!k=2Fz)_@zs3a@jqVlU_UHFj9UX!rUg z_>r2i#+J!C!g96sV%jBV=zQ`Aow)~(|F$#q;rHz5J~%dVekTl1RuJq9*9}&~xYkkF z0{>3bVAvN9wZ}TzJkS{?W97NHPI~IccDp@n|FMnXSMqn~;5Pe@@vPnc6MM*R*Xey` zyjHzWWO=z@p(87%Mu#jKz#$fvV@}1$7Lof4f)v;K**mSCyf5s#yU3fo>{>zjYX#*8 zE}UF3-}`r%BNkTaPrl}lu$zJdH4Q65nqIz`bNM?2mm6N^Qq1i^u9ro97qUQTdRbU+ zqJ9*4j+Sd@0FhGsd93lpTw93e2f0U(8R+);WwK)E%+liA(?zZ|_`cwaCv1Rfhoe0d zhMo+;-A*7j{(QDV(?I2#J=P5pH% z_m-_+d->a&r}mj^CYs$n`YqrZrGvg!W6uL>J5al4y>dD6=>bnegsPziXOs^k9teD;or-XREQ-3}`>-kZ{ zlWDR?UP&L}g~}D2AdotfDI6ozfTaU_ECTM}^n&9s%^v^}?&K1p^Z{@2ipy6HAMA5j zKihe~ceJH(yv}#Jq@&nut}H2VD`vqn^{&!V*NTCI14BnkUF`Jeg#)#NL7&g|#g0e( zCE<~}q~adR2B}Wg9h=gQM475z81_C0|go z+b|!2_3Vq&@7&iJ@=Mzn-rXZlT(xrIlHsWvH??gI+batTnKg3N>h-rA>WS{WCco>z zyVv=G+ZDeu*LNB;FB$4H+8JQTS*Eqm?J?0#1pF)N%V}PE`y(tOkb?TnXeVlTA>9t& zX^VFHnNzEmFOYB7+ZmQrWJ&!+zCdq>>>1Q^drF&MdB)$Rzt0%QvVWg39(+&s9gQdb z_u1njJ0Sb}Uc4n*r;9#5vZrk6`V9IG;_cG<^W1YF=HG|hJEFcOi;m;$fT2jEdk&q^ zi06Bd8!p|BHZHPHFdp!k6%z4Nu4f<*VHSey@eL(miizP^;i7U|^4C_SENEe@fEn}L zMFCG?@=24YLi%WBL)pR|(!nB2y?0@Y-9d5=kBNL2+6!~}3d_`>;&BF@9JcvCsAZf+ z(!P-&OEPnj&-i__$LsJJA5i`|$5&+c=iKEwX|DCz^S*B?EpnC`KT&*_sZ?=FAE^jC zT?-$Tw%J?`$HHCG{>pm)!ak>`*dblG@O~$G$oL32g-@!SE&QrtWW>Ruz7y~JCd!C< zI(-xM5yNxo`iyp>cpE$I-mt@zK7koJ)LnRc%o%giEHNw0iz{WCH&N2*fp#|T_7oSs z(fCKJ$6YKHzEuBL8+*m#%zLi-`NEtMx3}P_(5r<~i9c*-(>1Kk<_#4k9|iB zNEsWmhkUl=kIItw+H0@{=MtF;^5;D^`z}ZeV2M>A;v*IV^QC3_$kIG zBdYZcWV8z#?6CK7rl|T|IrF%KbhxLP&7{L&)#O4mMPnXX&;H4yBa_G1u01vx9yuC~ zOgA-6N7`nZn`c;&;&-n1=S&`-nmRE#d14AGaISSjv|~eS>xPc#hSp7fl!flMEwzFgYJSD2osvwS=c%8byv==FZm zf45WrJ5V5}RBvxrX1)AHy?(dh@{D#odVLqp*wgK&$J?1z|G57A9^^4wZoK^YCF4#1 z-Ff=oVZ8E!-rip10ZsQ${tQ8{eaNGhu20i<02$Hrdg%rAd7~UTUmuke)?3M@Ub>Yi zp}9`g!}|06@F=D0)6^Kuq^k6c-fQ0ge;OxDzscxzoPC3zFbN*0&|B{@d_Ubf*C}GH zc|A#i;V*_CX`_-})_du_*Z_YxTFbG4*Xxj-ZWS`pWpg{7=SM3{l4)PtR8!lgSZrgP$5tQ}+JhEv@Z91hD3N31()C*vC%%K8(V>fw4P;H0c>|OkVf4(iG2bvCWG*7-SqMCv8$$f_Jpl@Mb=7d z>ttkYL*sNb7**_*7DtYCf?x&~WMd;fn@!gC=GiWE=_sg6&fYDN7RoYo1n(iWgKBdeW(6BW+fZ+=i8BSkZ7zTSenM_R?(x8 zdKr9W>((Bh9637Kv$v86J$YsP-jNxq>Y zv!zaxsnWIg?NgO3`SC(?-mW~i#bz?@G8X3yU$$!XrNhIQu3mN7@Lc`s*49<^^{ZO( z$M@`?xoB;#FTccDl#^GrcGt0W7qjgqr|o{LoR{w|_^jEe(pzqm-8kj=Bj{<8w@BOZ zTj;EBfOqNCq1|8@%HAxcCH1UyzBnC0k^JsiXfEw8w!589x4n4b&U2DqaQG<4m`n~Q zaXJgSu&wK_n;gAr>P(Okv~bACIU^#l0$Y`(v{L2uQO@gs;xy|Z9@gs#k41gA;o6LP z(q^K*3;8vdd%iQPp0pA@ZhfjS!N94O30Qw!`DgHAThA&#-Y=9;jy90+ns@~^G8USsyoYkm$|)O z_p9{7=V5=In1>26?#?AFH>R>_y?i(sk`EGc6TEW5-pt>FR|E{ycQB_cwXRi!3%?;hW+5P0yb*oud%WN#Rp`~R*EH>LBRuv;9-ey=-a9-LD zrFuw?TA#K9v!74ffmDB|{``>PNtMT_9@;}~ryUkMq1;?51so@o3lYj)4yvd11~n2SGtf6bJbHM*pPW*^`Yz(gp61%5T=9R; zue{PV5v=U09yqVN=aTiWaFF~u|9V*QBNAXij0&SQa%!wh-OpB_{&`;is$Soj`Vrrc zz{)cGlFtsD1(|4nmAD*UTf-0Vb_I*>F(ek#j%?8#2K6=GD>w_Xg6CNyp&ApdbkKH& zGDWi*P^g6V_Ui@ib5>gU6+GVk89_ zV^OCJN2@;l>{yw$lB%kb;;O38l>~$I`?xla+xf?0wHm({4lNqRGAoI(ZAg`8tZ#^~ zFJe`KBsp{v{)3EhM}J4PSUMJzfvM_R_RHE@5?!^m)WLvo2eTpL5CqPqY_qetX1KOy zxW?mhU^SI+>1J&{+x<#aXGKM4ReC|Q*OHH2VXw)C95E6x_Av9ZCXCx8w=)I5B~JY+ zybHpDczi8FQw79Dv~?60JHAKp_2+4$ct^3q|0`a&auGGXh_i9&a-q>}{8fs!c@`8J zk#U%yQfTh$pc~$ktbm$?6Y#T;B++BM_N$O2x4|&3t~#QB(?DTtQ+z(9rkBE^e0}qO z;?{d_nEfZ0t|IOWN4~rif=M}7!yA4ku2ylM063%ls%5zQ{H#8uWqACJ2bLKKVcu&} z4#q*=aQK-o4>M8#Mia{tsA?Rugz1#&;eHmeRa>l*E%{NUv{XT1Q}(dshhtAz6Wle@k73n^DU}1w&nro5m{}@gg?A64LbMSVfM^F{6EKqgyEdqNn4tmSW|Lfym z-=c9O2eQTiL>$9nR$}Jhxl0MjbP6jxauHJS8=Qps6rya2t0WX?S>GX5(x-)|s#~a@ zcvZCWpxAMop&h=A0<qdWu^TPfHKtts`iFTOGrA=}$=LgXQ9u zxX2-FNfo`1W0*F#tIWCqBMKBdobG^ix5op;5pe(9V)H95`z(vm8S_tyZ2`B-zBBoE zdQ#P_@>aaHLc#t4C;Zrng4`TnbWI9Xl&wj{rzH=`P#*nl?IY_u_YHMzZuKp!RYf0t z(-$iS+PC%47uYtlz(C(b=g@hbZM#R4r|7w~j$8UIR+C!*7-zA%M^A?h>Em3Y@g)rC z44NK8IGb`8(m*x`=~=7B_CR&&w#9LJ_DoNdz9pb@6cgw+w@Z{ z&6HYZo6OeD92*y==Gd_ru@PQsRn9H7AIV=wG;L66y2!t&)~D@CdY%wTJfF57sUCYM zwSI{ok=N7S3;sx~UAE^g{dY_Jh-!OF{D^A(5Ho>(hQj8twh+XhY;(#F+XF z18M)9{6Y2GuqMF% zL&Q?LKFt|Re5&dSs6N${GmD1f%$8cfzM?brymSL((_;*t z`Sx&i_Mld5lH^9Y})+B8KlEqZChE+B4s0HXGz{fN%BYDnfyZG z$q@UnB@)9&D0hQ8V?tt(_23^GUAPPr)v~E|n@Ypjl5}?eZ?-dM84}E$%gsZ`HHXvt>o70wzr`9x9sP7A zi%$x$8V0&L7j2cX8Dta3)=nMc{>AfxzVByvZ($g+@9C#Ct#!%2;_1Q6LmRzUSSe+O zW`lwE%6C~NIVf&~rMp*_>mD|rpA}ZsjcsUv`xxllzqgF}zt2Imos$s5kl)8m)6UWT zV?jZko=6gBMQkt&Svh(u+=rm~u%ixshMQhM5Mi;uK#F+$m3z7Onjc;HUd`~Y5)rJL z?;6g&Waknhfbvjqzs1`CZHR+1tQTTpvP$6)P7TPm(k(aRyLn$$93E#%vot@!Qs|{wS(%Y2$G^)N)>@6ut4i$UB<-C24O=|`BBYzXuVAL=7H&DG% z?wX@oC+sYY2HY=dM_))kO9&!r2QEw35`Ku0u5Hzba!N=qORH=EG)>g78eElMSf3#t*Ni3X=MYAnU9WB zV^*cc=Q%Y*Jy|4F4{FScr?I2sdPCHX@p+49Y2Ko?Q++l+>)FvOh#IhOBuOsBn~N63 zGVu$JGEEucMJz@kLEO*KB-4FJb&Cp?+oJfp&+F^i(pp?m?60fyw{7VyA8Ym~c9*NH zw7#h{94^H-J#EcH0ly;IdbYN=u8UMORRuksP^ht|Cc3`K+vrsko7>i26KD$8wpCWu z1w!R@Eq#%N7jbCH=-v;TfgEDj2P>agPTl!yKDxtMUb&^dI7p8RZCoh*m|MXVd6dDq z`ksUMIqmAharJZ)Z8aLoD~n1hyni7--+$1L$mSUPE#D{vYdYwOEMK426Zz{AtHAe{ zbghxlB8V=|-SddvQ~sHTz-*d#G5O-zh6A3W@!Tn24}RFjd1?zHPcEc-?1C?neyr9T z<*`2EDHkLRbkb`_2MGzMQvbl)oT_x&9H-*K;Y5ez++j&4EzqPHc)$k9^QOQ+pJ=Qf zfh+Fdht=IeuI6idrE@Y^*uYDq&wbd9K1&^32+p1TSeIBqMo>0)OQ=+&m~0E zlZ1$R&1PTxe5Y#5FK&MT?-bDcB@a7q2lm}TQA_XGtI}H^K@_|GbjB#7cq3Q3{;>Xh zzu{YY{S(rCdi}5j?}j?tC-in;K~a6ytjneJ-=)9L9LI8hpE;f&nh&a{ES$DcF`9k_m}nz(u&ES2`M1Hlis4(wm zHdevD;i$;ZFLWd~u=^Z^`FWL&Jcl0!-ihGl zxy5c*NzQKDTdX0UtKhaAufy)k*>Aoer_^a>kCcVoCCRt2TPbHm@&1WuWLk6bgX#6e>7u?TCJq(#5tZtT+lk_h7_|QwC{&c*8?wZ7^k2>DY&10WiHBlpz5<0Nl}We_jw<&v6AG4E|2xo z9Urru8vR6GQGo)>!D#+T)noQ*uj5C>&){x*NmbF$SAWkAjra?*376l28o4REREsxa z7EnCUCY<6Rzkr9L+MIA{X-lUVA2C}ST&&eq-{?v{R=Cw!Vg7^J=5$u(|Jt1U7o)3Q zda$m@*|0EOhUhnolYQP9%){^G8fOqx;(c)Hoe=FSkxQB z%#8O36UVkoKi8ha>#7$&XJTdiIhnU#DZ3CkSA*N8nYtXhF^GF6nm*4~#Lg_Wf@^L) z*X(NS6etcflFabCF^QyzWO32$#R9xg=J(`5aEUl%J<4`yH zi3?VNW_}zN290bWYh*wb=xrQ8l1H8_>}(rhd3BC4ww<@q)9$PA`OAH+?#?kW#($?V zveInVCXIFIf^vHJ`BYT0-?tn^d8BsN%trGM|ywhZqS(8OGfh;gx);y9o^#uehcbHKi|!Ag=c1+kV(mpQ|HL2}V-JJPo)4^WgMyPeBL2g}Dv zx@h&V{0)+HeKxxNgh&a!>BAI7jvL$WR~tV;pFXVwcn6Z9B(+u^!syI~N^x31vBD-f z!ayQwk4QvDCVi~HKfbm_%QUn;X-(ci?qTVh)FfKG$6sDAvJKTr2j2LXfD)%K;`Gdk z6Z-94WWfM!pc}DDM4QaK6EBLdTPQfmRs&+#0&>bI! zz~*XNSLAHbHjoi_5Oko!4#w~Z^pNaSlrFn$dFhuH$!cw~u>9mRmR9ytC2;rMM5w#( z_Ol;Z+X|DvV+EEbt5q)i)ytL~i=)!PR6YwSKB+rqgy%~$6HIv z-7Pac!-ob0f5~~^3-GYUUv$2leJdFx|FBYCu6Rn>)AnM)1<6VizqL)D7QQcScIuaq zI~MNAGpnmE=j9ZFr$5S9cRzLyJf0nDERXZLsE<_JsFD02f}NJm5=5V zs^rn_S4Jo9(nFvOtVK{}QARFMWIQt)S1D!Vdc8blFqJON#HG;!x4$6~J2Z))3>5f0 z%s-2}mmYlHhfxT*e;U1K$~`TNdK93`z2s7tV>T;G1f=!&!u7f=;>I6Zew)@4&y`^$ zuMA{Uy9;CFcVVQ|3#nJ7&&WRPcJVz~UOe1Q#2TtLm@&ps>0ysH)j9JE3ThNnk*Tyx zVNRvKUP=DBYR~56=Zfp=N?2EZX<^7wWGc+bjWkK^4Nhm{!Vf3ceM+jTEh(;Bpi^$q zALkO>ssRSU?&MZg>Y*}SOZ6sgNI%} zwEo6@vDm&F*K5BK&O$Lf^mDxu$jv1*$j$Z7HOyQ%JbZYjp<(9m@bHB*4YM74hK6=` zbnG4)+SBpbfYMdRep5D1#D*8Qs&a_a7JGEMPXO9}5o4DOL-=tI#>~&5_K}v;hLgG1 zrJ-u9jOg%#yWX~fMp3&WF_BP2ynshQjN-$Xs$wEA#&AR6r35lsn&BxH^A z32=P^J(i2pxhQOMy=^_62{{me>9Pyp{T0zT`wVr_j@Ca1)Yep1u=kuOC3NkREMPXRTlHLd>Ea+$2f9a?I?=}q*&7nzcE@%b#< z-vQhJ`v~T6wti{K+w>Wx)=DI48U+cbwbjX-9o>y(|EvU{0r>nl0sWp|EKfkp4yurN zf^;9<`pdd;OA|PwG2-z*AD^nqkC+>6Qo@Ox^sfo%fLBb)0~?yj*tOcvJ6V-8HCa#;p{|kUCn)6gjl+uJQ%<^{5=TE z8@_baZ;)AN$}e?jq|s)M979zZOHbwq86oN*f#2%ATVT*l9D|@q2;UKrft}s@sA~Jl zI(%yWXaKvGrvf93b#VH@D7l2qkS)yKTuM5&V;co7CO`NlQ_~U8;=S3@_c6jI8X@c`Z;_8mPyy7ZH-PVYfCU0nM2w7=z^76WltX}sX zo=$JQn25Qdo|3hc$dvekbfDDf@@^CM zDrIB>O-D&bo-reln$-u-&4Tta=~B5Ld_nl%uHNy|bkvz65y%EtO>lDaBCSkt-FR$c zOKbm;@$J_P`;&R9LP(}EFSg#a<^okKke;ANC?A+m4H?&6A-Snnat?srPFT~>q>Hnb zaBCX1O}_Y6@hR>A(L1lm?KyDzh} zTJ1*jc_jnuqK_8J*8Gw}Dc|bJ$42bY==4Czd1j;CT;?}k=585@_=~=jyp@2@(^~VC zomm|L_jlU{s!Ys;jhZ<(*G&7czniKC+P>=!zzdRB_*6}+hftDz`3*?3Zd)@%T*0QX zg4dqGeRf1Cg3r{8v)m616vRSePISqYZFecA!z?$7?s`CVn8-e2o?m6Te3XDV^n z#SPl)Bv;SMJR|tfZOU)2Sojwg#d@W1YleIQ>TcdBue@`VECKKs-C!>=w4}9$=9>V0 z$hsjp)R``m=dv9LkE)#3yska8u|a1v0Rfs{LF2N4>9E^{$*4>Q3e=|7{I_=Bn9a|y4zOkjaiT%m^y=%N5gm7fg-=5z zy7X}+kYg#$OQsGH)rrRYnMK_N|D_s4ra>{2StGL03$P@H_08~i1wny)>0NgjSu^`o zJW(Mxh}6yGRXNK(oCOP=&ca;!!LB;%mi$-tLKZEw+Y6IFEVTct>PFFrwA}ujBXdf= z4m8SxRt23j^mDUw4s3t}Zdfv(bx=Z8?poOOrp7~3yjH%9qcN~ptXfoE7_Jx8Rm z+%?<>`30WJa*w`E5~(aTe7Fx%a=TKrY(DV4cUX| z+`VH|7(4k3Y~oa7-y+!~SbH-bgd@5D7My8d*JX;{iE|B2>{@?_k#SGP5N)o=!Xb>x zv}eP_b*k2A?_hWBzJ3KE5Ez)|4>E1gkH#xrGmy`-MIN ztqs2rtK)tltR$zIdfSJuBxDYjD@F)|?9EV2sw4TE@9;l)CVF8Z;nm)TJ^VQr5@YA5 z5HwckR^h`s!abehbb@j$h(YW;Ofh7b zCsZ8m(=u}ckqH(?G9D}pk1JDi@7&z7Z?oURii&DoO6ySLx~oQdE}GtWS+CqJ9bWj7 zueyEvwX4@$yR$uZ-VH`iW2G%*wdT28e%sm`x6Hj~dfm<2n&yJObvMoT_FVA(&6|+B z5OWkhdCY~0^@y-$K1bpAruu*4bB`GIr@g$C{Y3Tt_8IQZsHf+J_cvnrA+Hx!8qtb8 zpmY{M+5XbGzGV19>-mn>&GgNz<_pxejUu`FyQQ}#zj=p)*dG;JcxofsvfH$UKZS)h%PZD@?^s$^Zi_6(`|p z)HgmqioYWieM8zI5Ahq*@O^TgjGQI@mErL9p6%;wk3b&VUK0L6WMmGmE?dLaq z0=i#DgnPLoZp}YLTO&Gb48}lX@h>7a-@qa6Q}W?L$G63`#&3VSrmd~!+n4SvDG&Ky zf4zCKZqpFO8XD!Mfn6$5vGUH$~v^aObwzj$Ko|jCFUnPr9vD zPKT}HEji(_#>T-0i#1$UUWThCW>aCvUfmd6(bhfXw$}&BD&30BY`0d~E9$Y{d}REr z{{_wm9dt_)5fJV_9zxzv{!R7jA>YYA=3!`fMm3R(ODZCzWQ#)x)xT7sSi)bAYZOPvrVdPs) z6$L%|2qT1;k>Mn6sMzkX)!T|Enqx!F!7h?& zx{nvFAM@C&9TwSEenC&)j*jZS>iW@|u046Kpxah!!KT^mZ?3Kgvtoxsk!k`Jp<)mA zUgnTJ*ibiC7mWJza67eSbt6_nL{(K`Wp?wG5OGtLzyo|nY{&k+v_7JiVpgb@)`t+C zBB)bR2rFSjwncs}CnF;i(HaDI<*En;O8`9KsPLn$wKB=YV2pxbFPKW>vM?TFWMmF1buE_PpXgR{V# zA8@g6Py`nt2Hmd30j}=F^*DJ(DBZ4szX{z?MrJMo<;vraE9Ep|#qa$}Nq6xVy{a^n zC4bK9%aELt-|=P_EGtMw{ zEgy*tj+JsTGH@(dk?t%g()VDcI&emaz3XU{M;C{5@j{LoLf?p+F67f8p)-rh>`U!a zjg3?7Ggps|UHxVLb0$J*J0cM^7$|3swaj+JW?Sbbj?W;$3S;BPr)Q2&%(c$OI%Zo~ z@|#*1{u@U)2C5Nrpx|+$Ao=Uq8(4F?K}UP*OzV{N55>MNIuA5V>}VvM>YC`9jJ9v( zT!+QK8;1m|iSJfVYzqaNCu;A`Tz~3o3YPI_d894;OQf66xOd>MdeFEHphU(!8yq{_ zPyNcPF8_ruLl*T_ChwaI;c5Bw6e zDpRS~1G`m4$TVy7gJeE!aC`>Kr|YY;)=1icOMx^7U!)>BQs2BTdAw^=8&&w* zDx$;nP3zb%)WtI5x*!Yi!JMj#l}^M4`3=IwRmN<((RkO&L^m4mxJo&VIO5#)tm7pF zT#lgU9=X(=Md3F&ejGe5r8?sAQx~uls9w%zkUgSIX9QP{$UAleQ4O(TmH>{01Ii7) z+x*II1eATv9SFFSZ(%p`-y`n8ZbC280?^rG6?!GUdUJ9)3MNp_Lf?e-!hgKkv6BK=nFTX=TPIzw7@ok@&rVB|nI@Bdv$ z`s|Yj% zfR%e=Nx^{v9?xPjNRe6+|sdG9Dq-}ea7LQM8k_wcpAIC{55clNh5c7qhqPwEXDpeLQD ziCd?X1(__8hwmV!dhu!_s z+4E#!Ts_zam110~b*fsV9KuKhFcK5F&`DY9>ycUJ{5;@ zesLE$io~|KgzSS2gVhH%^A%wSX>zc-pA@%|an&1l+@7RIq7(dim%_f__T3a+*A&^(eLpe)l_qbn zO9fZG{XR$AJ;#pK^!ECdw^`~|wnk@Lp=*Z~Um;SweeCCo#0nmY)YM_27~RT|?!d|k zor{q0^huIYbKmLVA+%cDW*6cV)UK6NBJK~Al(f~2)i+H?)!XC)G;dtU@%R$-uLN$E z<7BgO)z&|GOCrS^7X5rRcoY0Y@~mEvNE*k{oA(PaY2uY@2fCEiiKH( zv6QYrTP#hBWHS}p51io`n}sdUaad_0Pb0w$lBJS063@mKcBjruk|7AB|1(yog-`_; z8;y#COh5?kGvFi>@=Tm;GG(4&0*b*)axBQ;citOohR++(G9=pRefHKfJE*%5}B3733QWO{LbW8d^(?4=Yt6*H?`tt@T&g zyrx2vx!|_iI{CXUFN=IU(~g(0mRQ+5fMEmnn^45a^sAZLCa6Y!VhOOJ|LM%qT48(K zWGQl0<$t;1VozUPS-m+A*}%P)6Q<${_Dx)5F&8+K2N(-=ugZh#!D@#6UC>gI{DQ+l zi0eXk&x1DH7o{SuD%3z+E^+Edx;Q(|X>TOje}VrqNbK=f?;kX3|3M%=2@Ojgh9N`XgxHjh)Iy&>iP_d=?7N5z!%QH&}3gfqfVIL|&fe%td~ z?8ZeyN;_QGztUaLjmd#?IbKM^u9d#TCBIa>)m5y_Vox;G#q!>Yce#D-JFp6u6GMBl zy%xkP8~GA^PBQ^jFNuDW1`Z5DI{e^!$Ly0$*q_-rz~z(fDZE=XIxT2d1s@1t@+H+L z1HaOzGGyMbJOV3JSe9#fe$_mRJI#_L^u#UgGaHp`BS}p0ISoopLOy$TdlGn`m#UNU zrD~&5I>hll42-P8S|AcilMl{=GB>i2n_Rf4TsS4s)HkrPTESHzzfU>%HQDbjvwrNO zmI`+u=W7RPBX`sX{JS;a#)j|C`~r8to4lLN`2z03yyQNry%l7U@h-VF@D~yKYj5KM z3ThmH-IfpqG8zmEs;XIw4_3?lA)nQ#LAmhDQ(IbFVe|sn{!6Ns4B_4Zn%9 zYxztvDNCrb+^OXm=CR-D4Jcb%eaDuc1-R|w9{)x>(C`udmd}uT>uH9nw|+mD+yBvQoEqKv4oA>EV)zgrt?<;-jn`Mj zoa$+&!XLimmNCDnPS5TZ&+_}*I#tx1F_fQ2WY)!52mVF(6AYJQ$DFYv)eKp6GbpyD zyV$d@oMD^s=anm8Jma21^M2B;Xx014?}w`1S&Ub$vZNd5#lE;u`*0+;tA(Gu?F-XI#GnmMp!WM}{Te z5^5S`v89OC3qUOWo*_QdiGAknKlsa~G3;!XwoZXR;sw4BbJyfmaJDTzpT%EECvp4L zC>JJaE<7H9pTi;^0G|<&O7BL141R-u#`o#lL*PO692dCF--k5>oJ{M>bm;f;r{%1N z8_!i_S>JlDQ}gvc+QfSlU-GUub9PQM$&94tGrO42WFub{S|yw~)4l^IFpDDhv7s6D z`3soMR#|0X_5wfMvieWoUyZ(IpSXbNYjoJ80}CIt+XdC=4V$169C|7h>5Y>{0}d2H zB}AL^cazik3pA@1NhUNXa(RPhF?DkTU6(<@L*yWp+K5caQhTM}&F-L@q%U1B#bNYN zu!}!=KPxSE1>iZr!6-cB^o+RUnLcf&2nTV;>jlg`f(?DRE6&lTShH1H&_A5h2>;2Rg0M)rFUw){9>Vuwq%^GcCU#Z*adlDy%HlOdM9K2wI?!h9KMM6|7sC+x8 zIy^|}cq~x8Cv^((dr|m9>J3A%xHDptW3XO0RGNb7K~2O1u;E8Fk%$RyoaL@`JttLc zy?S8a>a8JGbH%4N&E9pzfh+D_zv)v~)Uc5FqCzUjxZ2e=JA8B%?tIK{`S9+Ycg*GH z&fT$d_lM?Y;c;4Zba-|;pfuM>4dQOsy1>G-%iir0_g_|kru61d$m2c?9;Z#jCEOmu z)f22*hJl2fHxZAvXBNxKewtU-x3QyyA~q*(KiYrv_6hoDNyo;%vOGqN0v7tlmWs~t z@ax1(ug_e+diC`);@{!%&WbJH5ZECYfOu#SjNOKKSnOc2(lnY#RHdaxTeoH-5;?)* z{EQ4_<_BV+KX@T{j5`1D*v{6i_g;3{y<1y%j(wPFzNPqWO5a4;E!V&Gy=4=93bI8~ z&YCLUwkt;u-MN1KorgxR+=h>+3n&L%ia9X8sqN@H-f^^T(|EwFxNsQ@9HL>Th=MZ8 z+g|<>bQ)w5@03T3v>NlYE!B`x>p8ZC=w>AFJ)@o@NyspoRez^=BP-e=siNl(@OGf@ zvfg8}E%`dH|D>Q8^aoIaKYt0YKMis&_tt5_&lH#RCH_2rPYy|MD#qWhOy`b*^5BP9 zOs4lKXKZ6}m6kXJ-Wgm;_K?`Y!4`CvdF;huzbF4KFM|aZzkT_2dmhWPUgK}?{l44d za+z&Kd572vdfPHBKmE*n8S{f~SDw{ld5bsfCY0-k74rjFCUjST-}d0ZMq}{cI8+xe z8Z0i%=2nI&K`coj{vnR_F-SH(amD2D6*GsgEgSXrkJq-Xu4`J;)Hu>!=d3Pn?wVr0 zYRmTVOC?r(xO=my*s1s=#OsV5U$^?i>Z>lVU$;IG+0c$RS=5ZpwO-u3u0P0vfA38G zSvE_G@8>&y>TodTQzWyj`h%{5T$LF{bgwRrmSYrYEJzmOy+ociHO`CZORTOtI1%?{ z!l@Iqcw9S)*JZSz=nFT zm$q+%_QLVivN>f40MZ!2@+)jVFcmr-)uu;U9u^s9eqcj7aq?LCc&3?hbACZlR;HPM z^DEC148y%jeUd%87xB;){KQ+0goDd6Q(*~+N2)cQKmt_R^x*m9)q(EW*k|+dVCCHC zhTJCq`lB_yjcfKsGg9;A)UP?Ovt{dKOU}pgJh(dLaVxF|hcE9N**{*DorMsRum&TF zg5$7$kOUeBUS)`%d=-VV!Gd9gD)VUxtpo7Sn zAvjH#1w4k0!U({Y$bZA;sw&HraJZ`V-Pd=`wO*cl)fosl*-^!3vEMv8SI?R^#0HSj zv1a1goZ=EsQI09-^H;IlV|!L!b79lPiU)Y0SlredhUO89IZ`Ieb%UYWNgUn_FDd1P zgPr?X_VCFkewGV|3ZD-{28s7xo$0&*Zf(&gYR2XdJN ziJvnSiD0H!ML?1(1dOn`i9=(-skg3PbKTnD*rCaW^_@A%cjtDlyMpNNh z1vgFIc>nbDXKtLj`GWo}%@^(7eNi);+kR17+eM)M6qaB$Y;r}|DVpmK$>ud4No8j- zqkLt}WT+;8EYhcuoyT)wOAS~Mgdc!*IOCFVw;r}Q1ZFqC;lqUk2*?Ok_?n7~WbARb z)0F&$1lz~%HL)6FAc>QwoadS!GI@(^(p|avIi7N-ZDFUyOkR}20;%F1$$ong#!i0h z8L5h5Qa5ETgL(>>J{u;m!U+S306OOz4aHx-qPk@TPc=>sWB+7B-E@rnaohud$O}{kD*s9tK<5FB{6%CnFN-?M<4gv=3?ZjgMkcF%NI?TAMqcG* zq(DeBOfybKAqz%`DtUo~+`{&uGYDNWZV-~u(sj+-gTsx(Jx%L7KF@{Y-HI>QQ@ZZP zbt5DD@K$!Eqi1sqV;iqtBNQjL6sHD-(-lXOs^Tn{w6$$P~OP{-`_)I{ySWP%H7dn`c&6y#obB2~!Nfcs@^pn3Yc)K1$xZfj)thlObu#G#>V z+^G1CpZzStpUN!neXpfV2^jDFyetQlQpfGL+x`^5Ss?3SU4^*tSb`Ufvyw8mr7-zK z@{!y^qsO!O zJJx&t>U#RnvZk)gPRNduyG^bd?@+1Vx2?adtbbddx-uQ(RWicve2Tn@o_^zA%ID7v z6NnF33tC`rAZ!qrx2oZ-2ZiVyK*LgPM<{wypY%E}ZfN3^7bZwq|L#stdBA8XEdmgj z8*7WBja5-Uf-t@Qj$mVlr?wH6Y)Mh6#TY2}bnfnN8Lqe4>W6YV4^Q{*9IeZIbuM=&v3wb@?Z^&CQmV;`auNZPL7H$>t z=MSs(PpM;3kU5{`c|@)MJ${q)7US(t4QgBf8Ij^pI2>NIqjGB(3WRBCWLMG|P1yxT_G}5V5z2YBWlHmS=LJn4qUXiyCGP*Fc=5$2KiRt@ z8d**6u!kim*YT3uP=FTDQhSTxKH@1@it&{A$CyhF0Zrnggfw}kA0*@T@}g$ z(Yy>*#PSebNI$9TQ9(``&S7j|;?fbIV4!BSzG1YcX0+i`gmd&xV0a(@aCGw0k&#PB zj!qDD>c?to#^@;+@>V5K=5__{#in=S=m>C{IHMT(nTd~K|D21HanMXdz!jaw(L=qx zhek)|dwb`{Y6q&S25M^ug291LJX_>*`%DEl_Z=D?JJi>AXl(RQ-(2-beZz1lG~7@> zQq7#~dS7u>5xG)mM=a&0xg6}xKyK0$V$R6rd5bHMo5RYIPtau8aU534$#2>N?mSz* zG)qb$;5J!I3)_M4ImqP9;4q+^g_Kjhk1XG`Y??IL?9g|a3al6*yB(NT_V=(B3LezNORG;AP$he_bbIT?||&{%pnJ zfo(M-wKW6P)dMxPBY639+lG!VXzBL3?v4#@>jSNUKvQWqF6WR>rV**Kb5u;hS`4Xc z4JP0t^k_a$b-V7ANk))&krj{eRak))S+W)`Kh{FFVl_rD=i_OJK8@=AfQsmk8HljK<*AbnI zbzboVuWm`LU8*WosY+XE?QW^}c5hOJj3E$`A#4d?Ccy~?2227o49PI_LVygANdlQ6IOJtM!tjM8JV==DeGdps z0wf_2TK#_KR!M4gdttu3{~oxdQb~31x%ZxX_H%CQ>O!KaDUoQ#VLl`m7=|}F*xX)n zyE1JZ%a?bwWn7+8Tk~LYCLPf;EFF!cpJI`aq%o$;I64nF*uk!5RP_+lagzxTheQMO zC%+bLLPAIryj-rb2_Gs9XS6_2%Njd#X!PH zHHH*Pon0|LRR~>UzfXxqRCaY#aZ9c{rFcL|HbroFduV8OY9QC6T-&Iqs?O*9GPViz zOw=(5)$C`caRWzr@{EgE>kf$a#4&B-Qslx9XLnDKQ)tQ`(^&>@rm*Vs0%z zo7}+08MUj9W`S~Q^TIv0cku2K?qctjuYwF^AX4$Qy6>Oj-ydQZ^6yc9$X>7~@ci9% z&mUqBR-gZ4-ShvzpTC`|jG}#dK3VrX&&(5UXa7?D-ewP?{X4Aoe{4N}h<~31e6RBF z@3g+Bd_otV|0}#R(1hRFzGJ(BJOE@Pv2ek;FVWJHFbV|;uPrS`0?s)4?Iy$>TtT)V z^S3}$Zh*o>>QF2;_yf8wsZwJK1u4S0!h@1mHL?*|QzD^wV_$oEa+p_S*3sub2syy~ z%@20joWkG#jz(%w>-_EmfXs>Ww041JVP6QJv)u^zbdt*UEP%21DAyMzS_+0yX!&uX zwZ$-6T7S$xw_rg0M!|fi0VY~o6BrtoC~e60hIbY!@IJI#vkj4XxH>Du1vMk3nzPgL zSW0DYabrIU5I=@aF;zwZ?d_b`ZT|(!6K`*m=~|+Fgl3E89_Fn+ph6C!HVHzs$<9Y! zhe8dqx6~9GBmmJMT5QGw%-IciMf*8l1x%)!h$uykR1i*c5)Su2Hp)Wa=_LC?Yog0Y z77NS9kp-t2BfDlM&KhbQEyUCWvWoaxKW1q8t&Neck@j>c*Errr;7y)4QrtFC+BlI8 zuMBI(V^yS}NZk|J2f~FWT;Q72DK|T5ruxSBuBEpDW>aOTn*=)l*@UZ<2V7)l2V6L0 zq;V`CQw;#k7mT4E1_x}og8-XoB{driwYYtJaKnle0MiqE3HXw7>fBNy@1L& zx0`EMU>vPEYBSp!=3pyX8N8Q%OAB6|$fvV|Ssb33E#)$U%wc}Wm9jWq6MZzZU$HZQ zH;}Q-K8h7HKX!y}ny9fNG%2p4H5D%8Wa35+dTbu6^yx_4?=SSI$xO&CyYfL4zz0e& zA(#(_LYbJ}+X5k4RI!>3sO_3o0%5m-!>Tb_XG5a1!Q~)yakv_~3|~T5lF&TlC=6Ay z)YFT2VeBhtOYAdLw_A9S@B9aO?2tefFX3yThbt+g3M&U#ayiQ3A>eZK2~@IJyTB*R zN^jBR2e{yK~66f!b5%_BRdF?6U#GS$@uu)a0m> zbv7i|OQP_5k6%Y*`JB%Sr#4YC#xc)9G>lq=70C7;E_*Y5y zlm<(KBFz5Gd2X@SnRr7~_Px1p-=8^gcR_jnV-Gjm9$ju5^8;)BBI4coEL(6SVU)5 zXCZP~tK5T23njAThIWxN+PuLA?j0uLFnlk`ej}2U9>K*M_r5+t0VpG{-wTBgZ@E&q zWfJ#5ZfGu2=x2x7kI6%NsSA=pYkgL`$Wfmgc=KsVqUJTLPuSt9kI9yBDMuY@N$M9t zFX$J&OrVzutReJw>V>Fz1+gni)YgX=o9#5(USXeLtH2KyEOzJFZ!UYNf_0PUplS*vQn=jH&uK(>jqAt?e{vck{*WIigmp)xiLPrpyn z$kX%h&wmE<-8#Ptr!JmL5;fWZR&!d+mo6yGO0p~Dc6l44sjQZ1{*EEFKu*?T*}i;i z)dY_kjL)xPW43eA?lW&wyU*CJ2UG(7WpL8*B)5p#HgQ_V*(Aque%KiH%fdSs%CdVw zUth2PXrDBsLO=SB=FGkqeMDaNhv+d~?UAn;oj`^C$!#g-_F8!7m1v{a<(A#DBsFKW z>?8Fbg-kB0<(m5olF>G?DwgkC^bvE{BV=q(@*a;c!b8Uy0M_I~#KV5U9tRD5X8xzb zL%c;BT5K})n~IF*J`ay8|$S)gXxyHv}XEMuj_54Md`BzyQ7~i@%{SP&b=^ z5bTDQ4P0oqJM0&@Vu!;9z+jGKnBQ~Z7W|K%!-pHZE-jJz1rEt}23#*nII^|=ZXkf0 zm|x6~?E}n@X=TLhES-iQ9%;}^M_6kMO7)&2jgLlg%JBg)%%ng+_|qg87YUPaLZ zL)-P?Hw^9Uvo+(~k65)07%)125ArX*0Qq^DNsal50}!E#H3@lvbCd)bjYB(t4drq^ zE{0u9aEIkkLwVkF^>I@%&WtFiYZ?vCZPK?*qdlOr9GuwA8m=6{~|3nusTzwSFek?@-mG|(h@5uI=dNg7)4A@HwHJ>}?VBDsbzBcPWVzte z)=sS65??!g(dXJ{x3&dBh!v7$Z+1mzIM?7%LQS2?!Ir)aUiZ+}q4Cp~Wrhn{lg}Se zT6=MR)$(Mq)$QA}t+=_E*b)lZKaEF&AAT+Xk;B2`k3VInIumrN38JMITCjC%=aP5Y zQmid0=Q!T^0hs$oFIbtH7!1LC5*@#&%%viJaKH;4Q!Oo1NEB~vohtI%JXdq?#O}$} z7mexp=mT45WYH6A5XrFFj->%$-wIm8_k;LnE58GyFXVBzx z`Q~_(g-a+EUq@5jC&B&E_QKp8ujct2y_UP^RnY0x`w_PTQ(zkew+Kfbj;L}pDy!T= zOfvY-!HE!OZ^@QD#i|g#P&?t91gfj7a)14`LWJg1f0IP>>$a1tVmntGu49LYj7Hxg z1?BoEX(r`uZ-O@<*I0N0J$0Bo)U-d6$Pc;ST4@yWGZkd+4g#%)NgDh|GkQrz?u9V^ z9qO)pDT`Bw<^PR107Lr*F1K;D{uTOGOT3E@$xU=;8{`uQ=-GbIvuiCLal&85C5rhf zHiJPwxBzLHUH95MG8C($FsX@P8QEnP+Oo zCl;+_ObDj4-J5rfjqlprl}iQeQO&Ek+uN>GzZFx}m;u4Y0bT5m!e8@R&Mnwq8@a84 z^E2!k&<7U}OCpvBdsfByX}Y2G%3O1FWER^gqEwJ+tp;HP2?4cd7foKgBHMQD(6WuA z?JK%NzIH`!2*xKr{=5*u(d+)X*XVV@HEY~>#j1|;woZ*!RBvLxUF$x1 zq%ac?4fhNUGQD6ZLBB7rwG3y=PfAiiQ38^58NJYl@@;J!M_R}8LgP?J$H4LqMR7Fb zw3&~Sr-hV`J-{U5`H(m#`Yqfv$Az3S1w*RX7^~sOOe5hcZzpd$>w7O0iG<2_B_3B! zmlww$Gl$<1Q4`|abdudXsfwaXf0N}sM+!f_8&&r;b}~gL12$|bL4gED6nhiLbj-ZH zN~S@iNe<>Bh#8kbWV^Q#0SfmczON?`^`AZyj=Nl;uul-=sK2;l;@p)1A*y?{2CXBX z?KOfCNeF5`b3@q)qq>93-RO>p*mLPx3pXUqdW4j9G(^U#k2>^Bu8E{AF6bYsQdwQD{({!1iF?kY@n zbgyXzEvZ2fM{Nky7$ME1Mx7h#K7n9VEI&kVjs?}+zaAe#m?f=kc3I`3yy0k|0#=G~ zy@b!02Ja?(ZTsq=vo=j{^_=aaO&(tx*2uR8oQ8(BA8}zvn!;<~Q`NMPtlt<5Ywr*4mWU@BNeMIFAkHlJYZ3 zHkb?jhoJ6$>8u|I9PzRlD{&ENgor8t(`4Or%_iswKNKxPI73|3;)TxBSC4KhmcNHn zAXXdY7m(Dz-p4`Gv3OXEJzTjUjSdz|Aqsl7rlR>`SDWUQUYuwJP-z2kQIm*kE%<=y zGyyGg(BEq04Jshfx6ef5j%bXv(sZXq)mPk796B?LL#XtyH{R8p>4^BX;8pbPJ|@aP zbNPsvAzF`UnV|*TL!T_Bz}%aQy-AR*jt-}c141B%8_Uv>fgy7Gq`J5F1fn2b2;uXA zdJ(O{3*~8nYw%ih+X#Q@42xsUIGd$|E6Oj|#I3p4YuCVlra9U|@6(w<^!IS(0vKB9 zkFxE|)2yAev_u0jG0^lDezG4KntM?wEX;W6pz=etYn0oshl=fXra+gSr#UmA($4a4 z>pwykTXL)h=wS)daw%qn=W}5`sIUsHCO-NfkP>&^9J$36MKcy9A^A4Mry+E(?@n56y2SCQAjHWXuWY+sVRJeto}Y_=TV+46lf9?k$l$Q5YO7 zv+T} z3)6hA;g&uY2dJOj+YwB{mI z@S6gECe6^S;0IKz)w#7u3Ko;xt-OHWbtzR(Tt@=jb%~1%?K(7UTt}T^+sE!6!M-rU*I?5<${rJHQ@BG%bAMoUf48lAi0)VJ`q`5h1f|1$o#B zkTMax_~IbOBJJ8OVnpKZ-LOk)bQ4tt@xEJz58J$}$h$8VF$eS|&3L6R@@B(kSwG_o zUCh?b6%v2QI%)C=;LW$me{N!Ml}pqv%$b8Nn9m@1L+!%pM5RD`Zj{P* ze7yNuT8aBQ{mta6Z5pHA&S<`d-tOyYh$q8d&z>Y)w3ibgU&*apn>hW{lSG3Di8+(?SgwEaj*sBsr| zS+gw$Xnp|C$-M0ZcuqdB*~;(m`*HI=NL=OqyL^p4gZukTN%eSpq25|@#GPRV7;;3v zyMB`ZS+Pk{733$1V0(srm;Kq9huz6G??Mzc-pgmuH>?%kJnS^@e4o$Hi`ZGulMjPK zY0)Yo&9q6MRg>lKSNGV9NeyZ`ZTADF->!*0179$Y12(a~$Tt^U26!0Kgt@aE_OD2> zfady&JBc%%&p%&e&mb8n*zjx3=lgXa7*48R{i+InTdXte+w zAwZQXn;Np2gqJY`;<)ZB#H%Mg_nlV0bHRt|dCVu9=Q}Syt$OV9!e8OKdPZ~QC}^T8 zh*1|_N0bTZ8|{%}X&<*~#>QK=o_Sys`AP?Ou0T;uBnz?UH`2MC8_OM>WIc}pUtOC9 z=o4Dc&)vGn`;rwvWi1bYz0irI{Fs*7&ON`uEO zdHrmSWBTl|u1H1-s-n*;yw){7-WkdG-NB^KGZ*b1C+;y00*35saE~*i&>w}Fp@sDt$fH=X}f$n&hNqLJ&Y$Izme2KL3Tg8KNvDy+vS_Z zkP>5=WX|6i(ycBmM8tg-TjkcJ8QL(dbSV2{GJZC2fLQbXGlPqykzo^6arMMbxf7)epOCu2CRGwvL*!{ z=e!PU-b}LDwyI53@1$I77hfX2>EL`Jd-P&!E-MY5wXUsg-C2WMrsOqe_Ui@N<5GM^VS@n@0&p zUL@eLtLRZQz=M~~_~dw;$0wH)M-5%ZF2-0JkT2?Jwu4)OI~}y2iFev}JJ`2{@0jNx z1Cy-9JNN9S2n%vt;OcV61N5_-yi3t@p*NaD75gH`qmbM6_zg2NH$1+J-uq4;E>0;U z(~avdUp;-*hK*NELuGA=;H;ukPdRYG(9i`3PAP27WZOnBn(8~DqvM1={`yAcaeCi+ z%f_L;j_g2k`l^k19YKxki`v_-W8EXM+VOr8apf*2b+vwzF%rv4=B?QS2?W9)~L zLrSO1ec8tD&3yx#y5pse_1S^cXleM=&M%2ENn+xc`aTuxI(cN(MZ+sv$Ft3)zFe#) zR$eY8@F06Ox2~;wU3=$=J^AsG#<6&5C{r3NcHbenMKLYkF+}In0IP*Y(00gS+lVn* zb}UX5oUV#kLAlT@su_Kom-U@q`cOB*66l(-j*w*5F>p%%;OTvaF2x(>zQAeIB_M4) zE(ad9e}RO-F#(bo7cYq3Sd5u72!0o?=mqj9-_14V0ch}y(@F_gj1X^^wiYRvF3}N> zcO>wN&)G~_Vx#;*hSe!`>ci;o;w{ zcur}5kW66JHL*4VdwkV-BSW89wR5H4DF@R2!cgmYu4$sJm<^`=IOAnx`-c4&AV+Ke z#tkO`c1=y~8b49Y1U$|_dtth(Yr0_g?cQKE zFmzz({QaBg!Ql&T-mq!^`9mA4Pg*V58VE=Ds8m>G=+xkKCZ8f6Vy%p6@$RMiF&HVb zM~L_5a?0_>wnhm@lpWnOIQXe+Ec|lJch1_aLHR#d=i1wIt5+RoVE1bhyFm^&t!Qgo z)qK6Ag&vIDr8U0W+SFK>d-nL_f)$hAcaMO@xuSll_#p)w?gFz70p2dIMz(y&Y85AUmuCVZ@ak zV!13LyrBGcKvjbO`Ep1Iy~ut=*Q~4jTu{MTZ4_n@9;wkujbtgQ1k_^<0W)!I_03qx{YgS;zn%5To)q?EN(u|>x({f&k!QlK7Gn$;T2Yns58*_btI~lzoi*-SK*Uoe>ZK3^I}OKg%49^&xISd8ZJAze)#1FNagxx9;pEfiQ{odQB308>H?Wn#%%tjpzfNx>BPc(MMkm|MR@I#>x>6I8D_rF}v( z{JU^cnR`wUNiw9o^N`Rr_f9zZThcv%H_6YNTitv;2T$<_6L=*|L}ZOH16y*Mu4?+R zNwzX!tYk%MMO}h^tgnj=mUgUdYg@acRNTH63TgSlWvfOzC78U$*_U4HUb(uvZFWbA ze$zU;b5KjHYtN(nvnsD(tJZdaaUs?Q{k>&B*^Dj5?yPK1GZ6P295T4h9R+#{_6?q> zkc(-)(35H?uA$P!VGSvKh~z9kYtc?|hOK z?|hdP@B9};Py?cru!HRo4ll6cn*v*IBdr3D@)vdxY7vrQ-p7S~>^9-IJh!c4=cbW3 zdriFI*Po6yHbx_jjZc%I9Ph$D{uZ%5;vGGoAzW#D6&Bh>xlZ@Q^Z7Xbge&^cwE~v=y5GBnOuhs}k8A2)O;OU6F+572WIC2ZeL= zP%N~@ZEskEcfG+`D*5=zUX0ds$_c8>nXVThjS#3$ioV^EW!d%Xn>!-A{KCcVnNUX>PdX`y6WB$Z1lTC{zQuoY=$ znxQFVyi;(2L^RB1Qkb#*-kw>CHw*2>pYIwT?xH_p6rkk73_gyG;8qD#hMb&cK8|o6 z`>ybNvXMd3vP`cgHRsIMvd<21eaOkyW_ytK>kn#v93B^R`t+6g^fFnG1Olon7*j-h zpjo&m?DhM+vLt$3%~CcS_5{3MSJ3D46r?W9#dhI(_5prqVfMI zV!THHs)D6v8e;T#G==begM)Fib#HL!}U>{4RF zsWC+>c$^MZQbS&6gA)-G0o11J>gmLhPASZ71en^#u^e*4M0I~uF^8h`&7gJQ673o0 zjrmKk^GR`7rxJHXgGD>TIa2tDL)qiPxv@(AapQ6h^UJu(I6~00Ez5%go3(E3f#=AqYD3aE4!+Cc2 zw5Ft@$1@Q>B2lUT`Lyj()V={7s#^E~#U&OU`c;(-VWxZLo7m^)?=rD?;jb4`zg>%{ z-!GRCKlIu-?_s(57oi7HuO#YGmW`$E5Gm!G&H2^%@&Y1vLUL3$B2CTV`10YInfK&e zTnq&jQBu^fB;}TOEQ4bPm5iVx_rhKbEU3a}?ggM8$vP&^xh(DX(D1qh3K}-JQYeq2 zMpIFr7o}jLQJ>h?-MHe7o~)Yi!EK;`MLHT%>4X|i>seoCbF3RiI&Sl4hOLiq+#CT~ z=RB9nk@6@!j0Roufq>-PgLKqBU%(Meg$QEc9N#n@z z>d+m&25&$Rbg!XBOScC1+a{gpQGQK0T3))iD)2rdsxbTK09ma6TAmAXoIC{5gEi=&jxRO zc`1!th+Ru~>)A`ti?om}$ny9VHGaIRaa?*SIRws0tfBvX+w))ze|4W`)p>E*%N26}Q zzhe-$VB67YTT6|!)hL@uM+s#XQnsqOwSw)72%C2aT^nw#(lw8-j;t};GWG}C3-&PO ziEZNHxycfpI@~H; z!mhQujx7~oB;W`j&ny*dRs53I8+3cps6^up_oQ-#fM0a^e7>}-_ejG~ZHgOwyWJK#3TYc1|}$ zB6zo_8X}KbJd=%9Rfd?>;Pvhc$D_K#@7o)WFClXnb1!01{sS5rJZvVNtM45uncdOn z)wxbq@5yaXk$aYt=yBuc}IQ;W39tNZeE>FD$&eqDu zK>+Y6tCzK*i&vPdh~dsKCb+{6r7G@Nz_LG@9W1FvH@=g;Jv~A2;ha^4A^#*nJOMt zBdPAamzJzs^k|#W@AYLQY(@pWFO_5d?O6MhX80WTQ~SRoY6L!ezCY@DAJ-@WZ#`B) zJXxY*9f_>7D^}@x`(uE2`LSk-1bApxps6Iu*Yw;fR$Y38b-V2& z;MEa;{@$_hirI#R^V#3ov&WXi-|pSm9Yf||AM&N?y?cXjer}{WoJgSRRxV2Ks1Zr~ z3i%^XA=hez{9Kmj6M6%8Ue#w>fhL0Xz~f8#S0)>V#xXz)jr$~sY+6z|`{c&Gqn)RY z4;EMF#Zy*vPWCEhf>mP8j)^sUSL@v~y`8I0%5R?SJZZvDxm1cL{P8Qx5AZnjetPvT v+d7U@-0f}2?&a}Csa4%uR-~s!n@i0jnZChjTa@ys8pGYwdA7b9t8V+hUCZR_ literal 0 HcmV?d00001 diff --git a/public/fonts/Comfortaa/static/Comfortaa-Light.ttf b/public/fonts/Comfortaa/static/Comfortaa-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2310cd244f25d21db32801494a3f90f2eee48e77 GIT binary patch literal 111296 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

IqLLx!H?kh0T#&s17}l*hDHOW&aqNW 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 _H$l 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�T)q{6VQ32UhFw9vn3Qkg?eD=8Z1 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

iwIomrz+;jPRU0{VPUi z^WsK)V-j}z2ubpKE4t6&Mb&Atvpwz$SY#LeV`@H@>}rqs0#?PT$(%P@aQ33t74B$^ z#eH6f*XxXQWU$A`XLr}Q=LZIt{IrgH$lDj(^Fke*ynO+G-VEn?4T2;80WK!GS}p(4 zb5_5n>icmn9VBi?Eo*u0GYdqNp0nQTpIK1f5w-?Zr}lQYlv~SroEnY&xBOrrEuati zU#7UNp#|Q=kp&Z!*VuB^xKItdW>N!rQ!1m)q$or#LtcOVyiga5x2N2Ny5kDMX6=FG zd(ZL{z(oqDs&(NlOuw(6R!|-)A{&%H>$HMe7Kr4L7WA*3Rv_xCauiX)&SZ1a$lRUG zH`L8A`A)5)b^tTraE?JksU4^+PNy6Au?FducF4M|BN=ayQ}~)~ciqPd5vbvgsVzWi$7HnnW4BAtJ>isW-#b=FK++CmQ3(2e zu8zJh*5E}MaEih~o2}GRX059CdqVFgpER@?^{Z(;aX-?Iru*@=e?|E+_@D#AZdUrD z$ob$f1G}S*AHI#6Iec-6FUW#WN~qlkirL`@+m$0O98aK2Pmfb3@o7WQUC2*UmQeIY zJ*D0m0$Bg&it83Cx$+Q`aPa+XdA7f|3%kMfTp_d^aw2rHq)BSNQPmobU)NKFD-S!+ zFMrHP7gkT3_)Qa%6GQz|XXV{dxjC-o-mA~oaUE5pMNpCE z;1y}tRs2*i#Ea1q*vCtUgODeLO>vr9B3D<-!wFX7DW)8Eg3$?fEOFY|eZWAq$}=s` zq16jCXBkdRp!ux6{F1IiW)*WN0na|98_-9 z5Sk!b=8#rW4^+@938li1c+pmpau@Y0S>H!n$y()CT@9hg1{y{LKlVcufYq{rkb>+r zD)kzyFaP=%qw)(&xm;UBUQT%C3R=oq>6eH|up2lY<{wFb&kdh31b0yIGX;sYKuuK8 zC<4lYMztUK*_$zOG&2ZN-yvnHfus}-!Z4b1sD&X?+Xk#^A{n;!?nqMjlkos}d(#LU z!gz0~`h5}gM6~V(E`8r6q^|=X@KrW(IC;|o{)`SsEdXX@z+d`9(VwDzZ#CWLmsN&`>S=VOj)BKWIAZ}yUn(yYgVCVVnVRYt8El`On{B^f zsdaOs&mRj~Y)X7MR~~Dhou6%Aa>XN_h(BTRgqriwcu>s^cdlRbxh*kwAkLV>)sji3 zgQ46=@A!UTSImZV-Ul!{SZB=wiyW@()8IvdL$^JNvp^n#2ZsHP4+#%UTu-Ybu79TP zdaCsycu@viyPk9zuGe&4=W>CtXO}^zDEtb3fCG<-A>1!EQ<)EQ z0EvlGO1t=A$8zhUUNstY*fSmKQ0oO-LMZ&5*f=|uooJy5>B!;f;PDiz2ZE@}`d)MXG3V_I3Ga#k-Sj442BRHq<6W1KnzrAQ35YIO<%S8Ele ztW}P3=HGeTTLqmRl`p{g6c-7j8HMJGd?z#s<1f3Q3DB!+DCWjP0!{pPeaEz^AM}RN zjW2FfK8ItCBPx%5v*xx_{F>@t=kyHR!CBRg#l_gkp6 z25&C&#A68P$3m?xdt#`I4XG~soid`IJ9u%;4;!%YF&v0_94?~!IOcXG<~Ams5OXVG z2`qOarRZSHi9!cDsmOW=1MkJFcAQRW3EP>)EW3D5yc^NUT+S2X3Oaq#I@DZGb*aZ{=z*jZD^D4k2e_pCS&NXADkK;v!hpXV(%_I(X821woG1vH zMSdUn!%zI;5F{d#PaYByRfV21Uxy9CTo0iewAwna*g{Gy@}4 zO{0Z*8xOb!7YA9IX1IUzidUtS;o~7#R|VXRj6ZY$WqMaM&=~r6?4iUwz@MP5EG)pR`FwWL&#q z4e#gH)Ee;5?dd&<@3@#G3rHZmr0g z6Yv-6;1r`0@aN5NC8@y?qe6BVJb9F2RI+?h)adfH9^_nBmM*Kf({@mg4H949H&K6F z23GP7kISg*!^M9egki1`?}-ay|7V$%HQkPtH1>ZQyhq|r&*lbc+s?|;+RxF3&&C6K zrJKQ<^;?Kr$F>SqsloNCJNuHM4l?)Iltr>ATx^of z@bfavZ(_j92Zj8J)xvwaQ-j(V+j(l-^}E08PO5RwyWi!Bg_ExP@3UEBv8eanyKrI# z>N+3&y3Zep2OoSem*oIX{D!h6q8pcto z4XlBV%FsfN3U{-~z0!_00l6TF@Xb&{nR<-zm9c*GW44GND^h*I7Je=na@v2NeaGUm zs;Pjd`c`&}F94EpoVnT?0`|oy2y1^1Y(aO;;=_Ow_67V@9h|T);7_apf3glvI*R(E zvOxL^)BS7DeX6cM=_qmkU(~@#?g{wwb?`46@aG5)?6%;~cUZOl+zc+P-ss#6&EDn* zW*FyY97#3@SoRD*z^pr&^;Mr?jE>E~D{n!{bV^ubG8U|Um5$8-_W0AeHu*kA1FZJr z!+?JaqZROH>fnS`0e@15!-m2v4ET#0oT_jBRsJDz$s@RNQGWVi2^%E0Pz?^}ps(PQ zumE2Lv5%+m)|q{k-3|(>Qn9=TJBe{}r=8(^4gNMz7rjxH$@}ROFRt{uW$fOe)HHz>NwYi5E<0B74*!d=~vqL&xy0n59fmy76tHpl;?-9kpHD&}! zfe`b{0sqkznDTizrgrUQ(&GM|=kGc+Keu_~`kBhasyN%hcBuaaoDoHu@kMCouUcYc z6p@QaZWU~#H;qWvLt#gt@eKd_gQWaJqa2drTdVD6Sbib4?q?&8=I8Fm{88{sUcfYpvq!WRi3CZDf zI~{Jkst);kI)c@XqdzFw?C~+T&Er1mqW9J+2(%pq!$U$WP}*5qB11*miIQX&?lN=M zUFgjyILLGDn_)PTyueL<+)Bo+{;Oj__N|#t6`7qL+d95wXrQ;dtAmbwq%EI*AFt>^ zSsjTWoHVAn3FI>H)#9A-`cetONi3wgf^*mxYUMtHDOTO^!}`_usM}zbTDfk7M9UhC zgJZ_d{ME>IWuJ*PIA`!x?3JddmVi=RZKimV2jK~R00T~D5Odg=<2DJW&pRMPERsjD zc(7YW^5ISHN0EzzNb*{3M1u1ivF9Q~@)q`%fKWraAHl!cSv$uKM;sz2KnIO@-Np_Y7`0@v+PNu!5QdhlCNqn42QQ-3 zk1MhR0vka)YVX@!8@BJ7Yi~<+sy2&P^}3Q{h5kxo#P5#;Mq>>F!S$U34F}x8pqt^< zANad_xUX+m?kYL$GI|FrE??_p;T!%)#P1AcrqXIpB&jxhDd?uo?jZ270r+?f_;AC^ zX{9V4h#hGMxcQLfWLsG-)B`x1lx+=Z+AP$ROSd+(pkOcMO^NM7PE3}Bu&{2zXI1Cb z&x)~~OG`Vc#d~wP-Z=kzHy{6mn8lG@yDz?Y_pT$A_)tg3Ks-Ls(J>VNqA_g9j3F@Q zzhc~z685V=D$10cO(H@9Q{)hT=V+QDzgo42iUaD4ssn>Sy-e*9pi&1;K# zRBTg{0*Jm`0-v*!zYSZ4O(jbw@D5WgrIMQG88be&7Mx!JV+Lo+;=JZg*6G0Pgolp< zy*a%Jf+Kp<=t&QM1`9Z2%VztXV9HtuD$#f$D7&maoVPaA%)S_m#e!pSLK7#Ibb}>k zjUza8@R18}BEJ&##avDwHcZ8;$NBM(?>O@9OMG-{=h*Up%IC;?aiWCnD~(Rp*N(GG z%4(?yY8PP!AknVi9rkuxvBVGs+81zHuRhN$dxOpHU)|zt3aEC+z3=o`econo^|?d# z7G}=|*hN=(n>{`oAj}LoK?~(En?UvCFfhnOXfauE# zv$vVZt05JSa)!^doXuen7v5z{#6wdh1n_K3P@}MO1Mzr(?Hb$GzOXLXpvaM6`AGLI z7x&YPfa8H+jJ56<^|}?D6`r(sJx8vq{sYiW@c?Z^81*R((54ig|4(hq|H;QpqYffY zH6`x`CtvhP5nFG0{=);+hb3a1MM`2LR|~iMe5?F|d8JnC4rS$M5=H$GPr@;|R!ldh zPq3^@IAg+KE6vXw^vRn;8H**Vj_k=~8r%h+D`mAf0)f78e4riMOw?qsdsJbeP`E+1 zjrG3LopRVLF267BaCjV<%DU=x6l0%`_B8_w+6;k(XGyLrh2?AUDWaAQ@;21AXy=;q z6Xu(E83!iIBzlXsIBSSTj>;?Y#rSKqYvLAML8E5J@N(36^#^>VPSV13h6B7m z11%CQNoG%f^>28!21Ob1Y>eqSu`-`~Ra==?wUv>j3i_;&BLe_RBQdT6aVDxmWiks~4y# z%4j65IA?dq;8@(PQJCA)acEohBq5l2>2LMlA%=iwZM>M%FT|X7y^J}@;E`o_YPGe0oRwY5LZhs~rJto(kAt|*l%O(Z`w%H&&~II{S`;6$87RwOBM_5f?{4yh$= zsQ0U>NVJoS;lk(wKMg$H)A*UNhp%!^+rdU6)s}O2XzRP9JRHgI@2&nFFb=HEV_erl z!nJV;M@bqQT&b1_=+ee7x zjvm-?DBF}A3fj^kzsKSp-jYj~yHfX9-+G+&aSHhBeY`*usdr6b_8Su>%Iu|{{c zGWd<-Z^fExqXdRu#-JhfmVTt+_eTaD?vj2XJ*d+mRHoQ-RU)ph(P6oc4o_%w_zTcI z@*tqYUkf_?pW4l0A+UjY;Coy!wLT$whi-(C4z#c3te2 z((px#Ca4XFLfV?0c}ei0_AHDCaao%GmtNE6|C%xX zZv3*0@rd)Cp{owTWNVs-j1h5auBz~s3vBe_=R0Fq{rYHlRZMMcWRot^m>!(pv19&0 z{;ykazWG)f)sd^;a+p5f{ktE14^~EdDn|C27}?jY0#8;N7EEpIN$WjE{j(@IxzcU#OrdV4v z>+n6{C@7BRAp3gz-L#Syq`TAAo`9F6m^KEC@r)Sb`;%gfNgAUpjbkhq0CRCv3_#DD zxDyyO>3N($nZT+#q&SP|dLHV7zq(J8A%aDlN%ad3eRm-43)SQklJ*Cm{DT9s|mM5h@)cF|HEA$CxsTv=fhKzAx#kpQ1?s=3}{|w&UMi}(r zj~^?Wl<3U!I-cM!Bj-F3#_{&x2_#aL&3cDj?mN~8Gs8{ zOxS#ZK%=#b{Wz4hT0@~~i!J)rV}C?T`bY2o3<@Tt?DC|XhrVi+=v{lL+C?!LZC~dO zc?mlgHR(&S6P?Cu8jExk`Epb&0FNXJ??)Uyq*>=sSTC!o?Td5!W4Wv|9`^cTj75X( z@zCg4>)16r-f=TYX!h{2E9a)$d!kk^V`?Dbc6nS)bJOdOjQrlc)vZEeYvTkC9Rh~~ z+XV$|Clt~drZ3A=m`5+2P!$4C)4N7d1EW|GzmjcK^9bIC?8f;OoD}%GMp0zJ-!=Mr z9eL?QM;lIQ) ze(BP=oA*Vsjm}_;$E!9C#6rU(Ehla~=hn*oZoefN2&#(BdDV@VUNtq^)Dp7#$nAAI zbL&T!uGxI&;zvIQy3*zhoKSHcwAikT1x_v&ILR#!v!~^K;0fDT5IF8@x008*!g*Aq zHuly)-d_C)XeE-hpLoCU8Xvyi9{f{#Ferb`*JO8u0@d%bVa->(tNPPm9yo7?obSW^ z8>PldI^ma*<|O4vwgMLf2oE%}44JE%5XhMxF6afmE76Q_-!@j?dRd3(}lZ-{cy_ZWV0Tm98vA*=4jHZ+urRsZoL*@V{#TxeqfF1(tIxNiAlnk@Vn z=Q3Fu2CcV2Mr5(0>31GRJjQV3aw}vRm58=bSlEIxON*swp?E&|b*pu3uJ5>NpZc4@ z>*ISgQEJI1!v+!CG|Qg>bX#Y_)pVUD#{TF3GWh_T6~PB024y=XdYEpd)F) zn6|^8aygVpAdpfVF7l@y664dJjqwG=_?|XfNU}5sE&r$R)+zGVU+EFsDy;PKD9sAz zi)(fYHCr5Rp|$|Egd*qcT6(dBrBFpUP60#T_0b1NPhNf1RacX|ec+?m6hQ#I?c?ru zvlz$fvxm<;_ptu&ci;UDOl_S1@MmfYbSp*+?@Lx8@a;;J;VjWr;7!Xnt^zM91?G`@ zpcDCZ;C|FQ_3&jn>mIef{9dc}-7UsJI+pHh?gM^r0A?=(|FlbcHM@yU+cMe3OFTr# zV;v~HuKVc_VI7=ev9wr(-9+yqAX5QSqMfyo-K3ie6hf%Ek*j)Xg;~J)357@C>vS4acu0y#l;)O$8T6%IERi; zKImHf9EwHl&S{k*146n&n@Wv$y zpPf&tnwPPq5>b_-HOm@lAO>2wcE*^>Wl@o!2hSd&;+f-ztu6-=dH48yk#PD#LMs)| zu-E!zOB|utjrMf-%y;?AXP7jF5w!vXdcev<7p{k zq3PArovgzc&jj|OXdW(KYUojcD4)fyg;lSQWk$|9e9p+m{r&s$%wr2gqit8sRxX+7 z+j-vNdLKJTV{C{G?%i0KoNXQ481XYpERgU-GX3X__wV04H8R|wjdv8QNaLN7wpF%@ z4Hr0h(_*#JsI}u5@jhSd)uLRheF1ec-%K7B5omZEr=II~_;$7+jVqHl^*` zg|sGTrB9dvWCy@gsdEHL@WB=!%nQ2+Qk>pXiw{@iouZ&iJWWO{;X58~z7L@<~b8}A-g zeGCFK=2o-k?dzK^oX2kg28cy|vnI*o|EV$JeIJ$O$rN)hOcGkOD0m%cHA zNx3XP+}&rh(1D}c;qHTjq=+yFhDnftqmvK4VwdHD>>-q^{0+UuXvC57hm+YkiuBB- zs*f-ilEL@n;!dp4``q4qyn0JK7>wP61C4BKKUfcOu~+0#P{uQsK-wRmz2whWp5E?`wqk*X&6fw&t!pliIf$=fE*iPz>^cczSz0$7E!w>} zugjI)**$uoXZNQ5Z3%n8lP=1gN<)NA5$#ofl5N~wo;xx$a-%CBxB3IYq&1jGjt@<2 zO8YI2#+1jyTrq4N3B~_57#}@6RXIEc#*v5`*Mk~M$hTnEV}FBeMPWBs8n1-`L0X73 zk#^N8d{?}Ll=5ReT`fbcL%BvOxqv;2yqK6QUV5h;`^opnNuHGLTR_!NFbo^VxMHM>kC#8QJRtq8K6}i1I?AOsuA5vIK;`! zsJG>>#)^oy(vbrS(lXgPR6Y4K6?M<5X43plJnO1H?FB7)JaPe8O=iGzXZ{$%TS2t) z6?qmoZG=o3mu4%|affULiBqx}m38m}Oz4DoS|WXf0{HH(T$YY5?;7tOZz*OwbDcpP z-=d$g%lG3W=OWO`lUn?w44;hslZMG3jjAhm507j;Jdxft)3qU9UYMRX=qaz0mTzL>K3Cvm*ue znL=Nzqf+UJ^%bh0?--4Cj%6}qozc+_q9r=VWVl949U(zWnox5vE4bUr*@k;`np7hn z2$LsTLj53UDU+s(RwyrnmWt-o_=H^M5{x7rL>(mY+ zp{3nKLRZacM0VAd(YX$ny|{IfXv&oexDy5mH4cwlx)CJA32fxHD`wd4(tz5#d!S{i zG`$D&EMuN~F;CLNy%ijyOL=AGD69-%VS$Vde!vb&3FzFxI$g{wk+_gvT^DcoO>{BN z%VR(0y0}~!&~z~r$esMq0urVY+t2ke=|61r!<+Za>KJ2rLv?)XZ>Wy(7|PpbfSpch zu+nGfW0Xq5Ou!2iB+0U0*U1(dQ=LlI$Mhyt@@4<0R5He#!;1Pb<|%1sW!oA$*)Caa zcJQvQoB3ixh;Y4(wO&;%i}n7msb$aq6}7xVFOPutxnAZQ`XHcCb_o>?vuZy+6m|%N zrBLSQ3efL4o8 z*A{8#n%Y_*mQK(4-_h2S|1Y#PEZr5_+DuPEYuA_v8XNL%4TY_#{B1>d(pHLhd#;yZRm;Cm6@H}c;{`S&Jdwx;=a7|Hk@bjcR^cjS}sy%pc* z*gJ9kgt#8xck|yTjo&x(-z)rk0l#nOzfbY+jr@8V&$L9AlQuroXvN;ZqM+(5HRy?X zV~ADY7-yT#1Y}RZ`GHYwc=ms^W&8Fmn|JKk+}_jEj%K}j@tmu!I%o0f;raFJ=jUc; z$$-#t0UlV>idd+(B9iflaOx3JrRT3|MVOqj%e{escdXN5vwA}6CYLK5>+=SK-hkH| zWX>p4f?n0xY=sZ=k3p|DKx5L@15vX#XG1jQ#rxxs^=dIj#7n%m^se)FeTrS6sxTjn zc1}-s7TO!TgEqS-;EPSSj&5ll9`AGi2@Npe&kuIAw#5?#uT$}RgASiM)0Z!Imhu5U zP!w_qIzfFf?1lk;c*0q}{2SX1bl_(`n@&Wq{mWsOM%ajxuc~e~MD?itD!zQ()NI<( zc_+7Z+FcC)iUZkmm?eWE{=ZVTA(lNujx+&tMDN%f{HwuHs!^aL5RdgAE` zOe~nlHALJF#qSBYyupc%mNti@vm-r_B}&ye0lA@^1REi@x{UxMm|PrgBfv1qik<#m z`0yE)v1=qNHoPMMr0q%3R)t*nQvcwqUiH3U!u@G`(BlZjn`j12p$Bibs@_>t`}uz4 z@Fs%ap=Fr$stYpunQJ^aD8`B!+qww)CK9$KQRliHU zw;|~B1}_QD4Bt*zE(&>qU4Jb!n+P^w zW~k06)6&?IKujNRrMJ=^K`|S0oq%nS6>yDt5R>qL1EC)Oj*1-8R{m;5F#+ zH|6?p>*#Z@3v{6})gtJkta8i>q6niP;O$|b^8=3(_WsqcIzQ^RW`e8`^!fnshN_Q8 z;c;v770+ozL>PM9kK%iNxcM9F@mw|%X43zv?oHt2xavFcdR5g`)pu3j$Mkgf^fi~} z&`eLyXs#YmG z;okiR2e2Iifh8pDa{NI(`~AJD>h788kz|fN{IRC1yRP?s@ArQ9Q7WK)NKY~zN{7?P zNXBsLph8W2)65=HS5sJ&Y->>4EeDRw?%1?xe)jPG*>tIxNf(Rh!qCQIapSOKx_@_D zq}nq+-cyaV?e3rcaeFkDO2wk>|GA^By;y8->%gj8T!F9p&g%9&R@M)vAy(Z|p>3v& zio&gVGR>nSLksS8!!U>i*G!<+NeOvJEd!v%F(k9n0U^PA+cu(&+{(q?0wj2ISB@`v zq1&-?wMTam1~5IBr$r~u*uw_dHR7Kk>v;_9X#^H*LHsxyF}*c7znhJ)QStLAr3}t% zo@dSHXK?-$zkeK&Ed2fz=ksiUZ5ICw_k%OHI3K|KkMZ;1)Ggj$#rf;R&tQC02;f=! z{BfK=$KO9Kgj?J{f%7N${Z$~z+WY%){y4vXM(~*DrRMn!;JgW+&4SV5`5Bzw&&Ll* zrN#Lx!LJDTZR7Vtl4&u%Ul)E|7~d}OGk`xNpBB$A;`{;ren>(s#!vU};P*o^YH@!K z=lAgYAt{;XSHLgL-%slg$!YcT5hQhf`MYed_!Yqrc0J*dtoYbGyrmwv1k7^%R2al8 zUWdF)5UGdg3`2a43t!lS_)WMAUQtwg!4@)@A;E9K!`r#FnWQYrr9STsJJ_QRzvc@$ zYNup97W8W_@dKJdpO+3JH-)f$`Mc7~Fq)Eu?IrODyB*_JVPPJGsnqv zDLPwRpRZqU?uN$mTU?LX%`IONJ}uk<%T=Np#k7Sbnl1N?m`yQguB1~D#Up-9{NbKx zHXC)(A1NDE=o5c131NEq2L7}J*;H+9O=L@Wa6dzoT)+wptEx2>YU8itDcd3=L zz1!$E2Si?s;7T~;ByMzW382OT^sE6@^B6DveQUT$1UKn^zV2zPHlmZc4;q#$Srru+ z41fXI42`p^nCZ{+ zC459=V+DM@=2osRIPZ_MV!>CKSpnY))uON%cNkHHR)Pvwl3u49EYKc_qykLWW4Rn8 z{M?hem(5=nX>X5QS9`*%|5+|>p1@ePA!_YYF!WId4eY&91Kwo#NT|VvB%Y~{X;9cr z+F5hf47nI-p)L7=H`ytZpNA?lU~k=Ty*wUi4=_X5brwjm*Yfe;^_Tt=2E*n_d#XKw zp%LCC5bf}JSS$*NE~-{1VI6^01o71>?sbG2B~(K z*DVxSfeNkwM(`$3CQL(38XIRzq?o& zEhdB3L_QJKhqeuMZ%7So(hV)9`vOWLa{ZBkYJYFJs7F851l7*vP3%h?s)NF0brYmG zNHq>5r=qupj1)lFUYa{1Sc2D%whF?0N{vZGNaiuWDj+w^z-rUt zW-#{AN-=3*UX@XMUPcu2I@q)be{2umh%_c==vvg^lOw7sJS%(}JuyI)5Ti*nV9}C~r(0kH_PXl5jrDxWM& z9u_mq46lrGhZIK@>@LKXQqUa`hI{j%S^(6gKC#3dRe$RaqF!%j zhm*OZa45Q&t7~AO%f;Mqdq>e8xT8~3SmD5^ZrRDfl>;iVGt9K~VhA1}8<%%gx z)&oIZR*{#escJGi)azojY3QnKQdQ|9Rn~(6U1kbhgd5v3=2f((@~}Eii*E*OjtD2J ziyNp|>O2t~5iUD;<{#7)v`j`%4+Q9)^SMNk$_!xVo%QH2igE6F zjSg?@=_(ee^Dt>%V1fXtffXap3a6+YP%_jwu=kv(4%PP`jybi0W?4V5M0a`y;2Xpf z-sO!j+2vgDg~Pt1G4mrX!X+Q1pYLlNuDQazk**lKFLs|J7e#gIdn2+$bdQQGW_6|KldP%9KO|ev)A&s#Hwhk*Xr>IN<(C!MRcQ# zZw_|KAChZ7Wnwgd1JvykqbGF_q)4ZXoGi~Tf6fo^JbN$u*5AuM=9QpTHSgsWQqr>> zaS5C*5vRDsq2=qD6QROMVbyp+g%RXsfx}eK?3KsL^5k7?>Ti3!>h`(0?NG7xm@+&w zGpxkk=F$#-_nv#ccSv(ZkT7}p>GS8GKJ4-s5$t2E!u5#0Z1Fz0k{j>i(H|iDc1;A+ z5`gy}t-l4Q88?U z>hWT!iJ%rS5n68~rx1CyOb0N@kUN;T7;pd(jc}0`YsI{s(*+S7R;%$EV{>I?&;Fpbb0ugO~e*`HD8U4$H!$H~vzM%8(H;n1}*oME?Lip+< zTxCiv)?xMspfO{5Ki4<>SC`IW3FegoF*LbbzMXG*Om9}cZEbOYV*1z*JWY_6+p z(>Xhw=hcBkB5)riH=j5`e;-H$BrTAj?C4AV7*hoAYFmD#@csI`OhD4Rcq|})7v*(8 zT4;I~X*a7g0IH4G+()l{Ac9pDzew*&1b+Fm0QCWz6Mh6c{|xfsY)*fKI6Z|KbN@P) z!^=Fhsfjw!TTBXm3ndhOl46j46gB9>h(bHGo(3<#ZP4xb)5WtdezoD4N1cpNauzO_P*y1@6XN%nvccX0qy3C2wI;U8FG)uMsM`P5V zUh@lkCL1N|fGDjU^~&G4&W;(}Y0aQ%6=?XTDhVsldaJ;7jMkw3byooiF)hp;t$qWI zz$yrz<#TASCW*m9emz4(l?*O6)XCst*%w+t{S{XUN1`Fqc;Bb_`x-VL0v8A@f2ED7 z_A4o@v<0TFwehr`HD)s+gxE6sC-9DbVd07HfMvs@21$Oiny&+LIG4MV)i8d+Fc*1M zh$VgkY!$h1@fZ^dxmbU^AA%M#HAxdMpjoLYCs^vB+Gq^g>UZ{EgU-iQw_APO88jl! z#~yP=zP;v`ko%$*^?0J%MR&yTyFc&&7jhd~{YDr#FNDNkeQxb$IY+ZM)UQ1^@S94b z7A2Q@Rh7IuEq`Y-dX#1q)iEO|NZRAh=hplZLNN>12R`6N0rch>t^JKKh1RW~&utRz zje(L71ZmO8@LKOWovb29lopKGCK(_3YQfZMt`c$1^;U^#R|k6<3*gMQSYx5srC)U{ zoQt=B>TOpCDy;Yf`vLUs??Wpp33Fy0F8HPhf7uct?Eocqu8YOwnM$WZrEtmAo(PLU ziJ({8`x@Fd*9q|x$s1hUpr2T;$1lnr)R1Zqh0?0aA^QK4esQa5`#bxA-xZnO(iTpo z!fjioBQF2y?|>x6FT973f5aR;+00FI1Rwf3%h^!&K!;Y3?fex7LTlK8TFM^~Un6*s zG3Id~V=P!CUolx0Fu$obE#t_B!@5>+#Mwnx;ng9(qNW26cwK;ck$sRA_`S#mzK9@Q zMWp+i9sokn^t4a8+;Y}|=1pF;;(eFfC1>~-ZNw2_7v-4$fl$DqW&#f+HU7nLDCr=* z32n7mjU|wWauqTPvPwusvFw4CWO$HrN8U-I7OPQ$2-Te+N>N#UllTUyQy4}B@ly3# z544E{;tR%l5K{|XL6vuHf~dQbLZTjofUU@qa)HNcJMKjsx(cU;)nAqO%T_6ipsa#L z3=VXa@;NHf84f`u9A?9H124xQlwUT{2u*bWYFKn~6uMn9U~FmI%#MqmRI z+3$Oe<8L@{;0?#gCp&er8||1_BLb>J0?ETP4J-8$LZI2jkMEZ%Of>4BMgMh;>NY5G3;SwmavYVw-dRPC%x2 z`9bzW@n*za%nGNgOL({#XDZ9X<6l5Eqftc!Fc>`HaF#O>z){fv%0YHT6?R1cM*(nD zm8+b*QJ6vrnPmmQsZNay_w{y_Ix;**gaR?J;kZy);jvs?go)O<2f>HL81NM|?P{1A z0U^-cl1k0JI-rC?_xzYgm$KCZ^RL+EOL$VKLhcunMw=VWC*1CyyWA0PX=B3e)+3?# zo^d0q=M?=8S(A?}_1=2n_KcYA1hoB|RZkAA<-?8fe za{!$jKxqe3c^KqV>0UU`@&CP0PI#=gdTS7=+8AD>H>@Ly!+e}WS^vzf_TBUh;O7u%+$3mRRoIT|x}b7xOm%E!in=g2 z9F#@uNKiZ^-=Hf80(xPF7B4{JRYmDuCkYO;iyceIzX5Vmv=P;#L=!|NOim1K+|XOd zXVU?M@xY%@WmN(qWviBfVH}D)Nh(^V09cT=6-1A3X}YWwHZ!A$+#yUN5=A99M%E^@ zqGlDZF@2^8gILhzY(G@#+A~uex^4&2z@Z~~w-F9v|7Lb{b?@KOId*QV@!{M=VbeU@ zU96TS_Ywh=lRE0P8*$kilfL6l^~?+m9o?jCBXT$=2E1}0;7>}-?Pou9C3@$E%ZG+# z&_eO%OjpA74Q;gcrc@#3{<;ITo~b|LOU0L=Z+aik65%j;_Ux=OZdSIwWp!2XmqQ_b=|<9EAbiEl0{7d+%yvSvpbs0#Pmr*?`86+wR`eQI6mOBNpB4+H(7L zSj-}tp}E2?vYk!ex-Em`nwX68ipS@|eqSU=XCr<+G=Gg#6Q!sT^JEaY@$~X()G7QY zpvt3Wt<`pv9!FLSfOb{@CIi4{sM`?F9U5@hF&qV?Wk`xcLK~jdSA(sa7b`$nln^wp zvxBIbuZO&8Y9#zM`(R& zeA=POA&(JNa^;5!aJ9#$cVvk3EWva2EyT+wg;C+(R9z^$ra5WblD~*fM%!o>u4Gr{mA!~XxH5!Xpwp_Ru z+?KdRS?V^PHCJ(`KmjX*9VFDYjuNy`P2gc(6gf-Tj6Z&q{yv&yTg<97t9$B+r-M9| z@fpfzto=`Z)m{wvm#|mO7Bu3XMnrQ@6SBcYa@)|FCc+bJtA0t+> z{ag=HKSOR;=b@p2y_p$8qoq(=*yueoX4L+*d}jO1_2a}%w3BbY?(93RvBYV)Gbsmr zdfX99L7W!j#zkOMtS$6hIIBh4xlH|6Tkn{6iAm>{JFu}RBllKBTa<;-YFUv*2su#m zM0Sqic>5L**kt)RHxBmomI@@Bkov$W5?b`sm))jFc9nu5+sD_~4Rz9l7|xLLSTHd{ z8)Ag0ahYWu0e2wg{?XTHFZ{!@JBF{0+80Z_0ui#E{is003l{v06%|)JV7UL8?+3RL zh`SV4u6-A6%P^l3C~+B-_$J|rogX$}gqW~*e`D7>8FLv3>R`fIM0TKBxStYwIl&kP z=kj=bOFHxU%0BFmE%xoOQ+V8<=2!U`q3J1$)h;HSK6Ub%V@LPzMXT-End$K{qVS!? zEJ8K|W?k8v*i8Xj-XqdpY*2X;RKWb|M8+iUoTl465h99x2(02w!c4Wqrt;8Bc$TDX z7y>%(B>10@T#k9Z5c1S5+k3X67fv)Nd&T&0W@R~Wp41YBiV9K05`Ry85<3|=0e!_nD(v+DOZ#OJ z)QxmK9tZp&d6{gMorf22sA@gz!OI*m2&;S(snB&04#`h*goJ2FM&<2&zsYJVO(sfvj}D8{79u{)^dxHqQB9&fv|JQu?~ z-n3ReL)cqb&>UWG(skq31x@A$wP!-FTnxn8LtAb?MERr@?8kdRwYmg!qsh1VRkS@o z#1YxdNQAI9V>TTPBjuV(by{?HIM6K0225sD9u`a3YP2`eKnA~^iABa=a)`*wp*zPT zPy&wbqv-SfN5hUx{1YtnnCCc2p~t9Zu~h*Oc;b3ck_puT`+ zNPVCgbCBM5L4H3VTwlFzD>QIKydZJ{HOM46pgYl7M3!ze{4NQKs+;W9>;~$|-M8Qg z*;M7g{=Iv4FYMYmzhnEh%`;QzNxX5OpD1icx;=?x6Tg>JnmINXwkBGqp^XEQ5wSa> zYXrqQ10rycUS6UUgJ5__9V+DON#^S`B}M{jdJ z@=wX+;^N18U(2$udE$v9Sm~z;#jEt^qV75)rE2*{TRhn%dR!L-7d0J#Az}>#@YEJB;C&jKAyGZ{f*&pD zy7godf6S2^5Y0)S!G0$|OAbfbv3n8!RR?FcPP#7j?KBvR2(5_z}t;FZ=og$$?Q!E>5$_i_uO-jJ^7k!Daj`1WOFb#^kDoIJa0Dw!K#F|&bY zo~b>Dtp>c4+5W-Oy`8gYktB2Jz zpvH5Z#*DJjpuI%4G_!`r*oy*bzb@s&)MApAEOf5ua48$kjyOn1$gZL-iQw}$-xb|P z^kjsI75dyBz3ZkYl1a8LG(YhtV(lI5v{-xF2RF@!YJW;>WTZ}APN0C@I8hYT_uyP} zeBnc&DmM(r+TLOKs{Yp`qtFUSn!63~8h|xmuDaRDWHcrvNFk&WMiQdHXlrkQ2l9^@ z!Zto;Hz;ia#{e6!J4!U5V8exQ)b6i~$=gsN;@UvwHM9S7Lc@_)oO$@OH1*FWlMn7X zm;)}p9#cJ5pDC6hSwbFHWoeR=&|@5}s@cqB7nfIS;s9niDU4N-gP}QL?uO)mIi7_f z15OV&aw3$^<%c)sw~V-ybWZ_Wglr1tPcbxvTp`KPG6xhWZ?N=} zHSAtY8I2DlmGnE|lvCDheXb9Yw9iMV)S4!(4S_i}X(Ew=ENUheaCbhwm4|aA*Rz|_NNfux-}_!NxZHPN z?V4bsExh~%PHVoJOk`Mr%ke+@53GkDeD%J&sdDwtqLEL%n|^rri)%R1EXyAk-e&U0 zjTBG>6aNJVLsJl#R7rwY1-DCeHz{mRFbEfHPcB#41qpu4z6k-e=yjxB{$^lK{a$pm zfpHduecK#$IV%sMxKF;lEgJEA5ma=X9rpo5wo`|r6iJPjmC}JmS0kJwnr*nm#q&Mx zKnt-vN(vB2a6O51zc!mAc^O~=`XhF=b;xYkKjUUv;=_7jp5k1 zb=3&Wu*iWPwW4Ps1y;DSq=p)rXPs0-<2J=W`+%uK4usN1@kHF1W0jnvlG{dm`E+;> zeT+^?D5ht`SwD;HWbWgo7rM| zs`eLm2jBDjn?pB$_3qGnYHum+X5TLD=GqaL89(V(g7J|4wXYcAu<@0z>7jT~aetCl zgp@P^{~V;fkKpt`BB}wI_sNclV&q&>|&e5*AFC4D=BTkOkbe>qjiE`KfuP{ z5lFsHhhO$}{O_svYpI|SR6qDZHKd2ywD+IVVK|_3_?uJ`!CO&O5t1|huz=SaPN4bZ z7g@hYPr&I@`(Z@a!&UlotEtyt5}su*y>g^IqH_zJ7IBq;lO|TKC!aKj+5>{Whlt|u zUO8^r%%dbjt8LRDN~~PG%DClD;hg9acOpNPDh82X4N3JPC>S`^SsomVI0Xd9BAyX- z!z|N^Rq%|@rM@CyQe-%4hIw3%K8}iX`s37)9`N#QWGCSBhc8d@Z78@xj~3InDloyQ(|vC`LSQT*$MZvTq4Fifqd^bxy_0tj2M0 zFycbYEe&KqqzC$Klg7F_x}w5oh8=6!h)VDZF6j}^JKyPv=zjX}8)5ng13vi3NB!on z{wRH2`3=C_fxyiB#0soCapcR)pxGR1ydiTIjc<@0E+Pl&EWE<9V-Y?i8SW!En)W3V zl*0o9S0Pyl8J@T|X6BiYBbelJ6Z#>AI3I}%Jm4Z{nS}WlcAEN*;a}}%4T$}#^&9&l zKZVmDvO)NH`xo&19jK0dAA1&SlcX#yfudP4ULXiOwMT#^B1$fPgquOJfiCH)CA zKI}}ZY#bX5luGU+XvY?me@PMrt4W%dA}#%*uv-fo)a}b&4I(3fgfkMg7e-J%NzoK zb5ujoIFIv2n)I9K&+mBsZjbYNg2bEX&+mCL{1IW3m=z?XB!wGPG4ip(q(5PKXP5WS-lK z2_;~dLLLU8s(^5dRhSw>Q}=XRG#|@h<5QvY`qHieh_#C>1b#^i@OVjHX73}Gd|P8! z^^x9Y3e^5E$OXhAKj<6~v5q4!i;N0;`*v`2xlANT64$s$hdDO22|cP1H;)WHw}b zS8@uH)UU)TRzjHdx8NJ!AV$LefcD87qxz%7LLQ|rj}i-cRFA%qexYN6@d4pp@c{cA z@N=7RfAzjJVUaEm#aRr1>k+tBJD9MIiPctycbe84NV z%D7F+DXHLG6vUo`@^-~5*jI~l)rnMlPE!Nu@Y}VYe@%60lF#KfM16Dj70$CtG!<=& z!Z+biPU0{b(L8iK*!L&vod8nK3x6$cV&{bpVT{MR_X*ffGSyMRNe&>`3lS*~a|rk- z)DL^=9jt@Wi7B$IuwrsFX+C{x{+K=cc<1I#m1KKXbp%~{Zc|6+7JN-aye`Ru8s?H` z?yu46pgk7UU73ka9Qu<1#pyF^>nNY&W?=6r73p0VEhO0n5e6SwMu& zz>Bu(#9|d%0I&8DU;#48b95!`(&D5Un{L`tpHxCMAmuKo z-r@~fBv?fFzzw1t(han{4i9v9_lFgDp5GPmIh^ueQ2fAO$T0Xv5Jr((nBB6FLk1%- zct$8o_p`r*j8TSt3bnL0cV~T&D=4=Tk!cQ@InWZ?DItYjUgQT@O9??gSj);tsfZ}+ z$&tCr9D?V|rE+^4592Pd0&ziFQ>&0Fd^_aZr-Vw_43YU%%K1bpqS`2Y8Ob)q`A|_+ zaSVmM0=@HNBm1UfQhaLPNaKg8xD=b-*V{ik;P(&A_IHmYlOyb_{G+>Xu3y*t=gOt2 zt?BeunE7V1*_rN@-xfBEhf(;}h3KvZsGvHM53fj%xw4j7@4#me-?4W5yY zwrBH``3I3c>(c&Hdp-c!a$w_hWpSjV-^0JeH)U{VzR&ZHi+X;%kYB>(fe!x@0m4hR zd<(l>N`Ml=B9+aEm@Ur`ml49WvWqfi%w^&BwnQ8Or|85?2P0RL| zl9L>1?AzU8mlvwKjPkf0;(#K3T(8sb8M_eTj)-uMgT(QT)Toyri__I9R-N zWCXFIkZ1(N3s6r*UMm}+eyB!^P!7!C2#-bMjTLz+)2hCT0Qr!)QUCAkt0*EGR1hDA zO)!Ma0pzDdNj8OKLh-R=Pa^^)oCIMKspx1Vj0okBS#!vomkDj?w_cBKrJW&FYzwE;;Y-h}A!oX@P2_f}{POF>C-Ht%Sg7_=@%fb$ zkSZ?l@`Y{aC7teuT!2|spp6K_=g`9OT0;vvLs^miUH5AoX1<9FbP zKcZv$cj+L%;E(7NFYa1?1l{WX6xaxDlZ16Hqaj-a8V_uQT$SLRqa*?b72HKPr5x)( z^qv{+3N4qJ=22@v*&rFaCF|R{M8T~wz4jx`T}ZG`P`X_0rN0OUf5Cp2j?Wemkm_PU zYgg2pC?;sYKMl9Fg=;^>V7Z4L9emN7>=U4wo2%0h$iy(V1-Wry+7l@NmG~bFoPzKG zEO#;=v3wGRxMd7Dn@+~yT2xWTAW!ln`9na*$*M!i4nz^KkhFbl9RWKh2X}u=xqVdB zP%1jMUv|nqT{-=6M>KfWt?TZ^&!N#tSZ9?869b-rD=Uf~qxKJCrx8VnuK&_I{jh$a zt^9IPY!fB)RC{&Rok1lCR>FWO;HDjZtQc(~gw0SBScv zTo9`BMy#8;V#5nQ=mg@D7rkLb1fpPhhg)3E+Y`_|5ManShfDd5T;!#Q^u=n=)MVd= zjx3dCncY0OeQNv2@P>)LiOyoSx1%>6)iXxMEC@kCfw0$*C`H&$0*)f_?Z7P72<-ud z!odek;K7)&;^OAQkzXip&*!(7&A;A|gT2KS@CVh}&9d(5?eFi!Kla(?YwRD-4D8#u zao>RXxAw-M4*`C!g*(;lzVvd{%|5(&U|=)-t8H(-aK`=_fCRkdTbtm$OE@Z=7A~4F z->5Sgh7W?dlc`>06{zlJsE0g3$>kE40-B*9%f^KKrj|FYguS1`-n?C*+d(fl{Kt_Sf4`E+Cj>zuj5s$mDJy~ zR<&!JzOYeiw4-zREvU5nY1H433z=#v9*aV;;asU+AObRbn1!gc zf}^8E_GYkT5O8p0;yg;O6hxGFIj4U~)4rtVH2XmQ+~+=bLmOK}JwP8@Y-_8%kB(~Z zYum-Pv+cEy6XhCQ{-AVN{4n&@Q^FrsJw18REiXnzmzxOpAP6^{h@vLKErg;WiU`G1 z0k3o_;*Ej^#Z-fX!^#*z1f|<;68Awj?Q8o+kUdpKPw{mh&~)2kHFxMB6RtUa@YJDG z3+M|!H8Crd+J> zhTW8>VT!~N_J+OppBUWol1Gj#yynJ|ad z>CI!;-Z`=Bp|j(qUFUbqp6pW`ZlACFj>*i#2B&URy1IAv&mI_Edgbilx7{^6bo{=B z-Xq(42NI?HnVq|D8O&7AKDPbE^M&!V|7O?7xkDS#*3awK)o|t~ z(aF(k0&Ruu<;hW6vu%jsdoyI!Dd@(?s@S5T9MI;8jRoX7k(^*PsGz`qPCmgtg(coP zyS$)**4bacsivV|%~$6)jrMl8x5c8mPncp;R@xKaV|Mxqqy}3xtn-*?6bcpxHyIFM znznRDtOQ7Ar9_~PMA*d9n+H2bf{EOQgPV%8N!1-f8Mt77+i)e+oByI)SCG0Ah&e)S zTQn^Uv42bFxw*lGwr>WCiOxCK)XBl&g&|L7bASKdfkXgg)*ErS{bRZI-u{k1Gt#K9 z84b8xJ*BGZbEBmj=Yz)By z&3Pb|!m10jMKJ^OEdS|&#x;`J5UCvz=Wq-mhegP;tlf2mgjAC#trk)q zDNj%cp*cemgqK9TSD>Etlt z3R7UbwS2U`R&ZneUuw(rR1S2fdn)_SMxu^@%ZSRN*S|HMO|*AS_Kl8tLz{Xgk0j+Va@^1^ zZfmR~nZk+6xHm{A(AvGTv!m1=P`f&_o$Zj(hn9Z|3iLUiH+n!g&uty2_aKHIkWo~p zsvsF~K=mhp>gPFBcOXyW z1`gM2M^K!K?NU4<%HgRpvWyxab!rahSug-q*3`4>LX-k}x6V#Y4EA;I=-TnCK(s_U zAS8KHVKEEVC|rc+Az={bDxA6_I^~K09rmHc^~(;-Z%D;9AZ;b2v=?p(g-&*ryDHbX znihgD$Z*q2Ow-DoMdzm3U~+D#IN;VcjVH59(ViV+lhU=~e}?up zL4N0sHjgAg6>!1-??hso@Q@0{2=>NB`ee#U5M-w8Axqa-1(^fg#fj2HrX4}geniDt zmM#dSHUt{Fn;o|b_79l=-yjyX(v{hlyg{VPc_Z?jcY@Ly=ojYm2G6@vDcAWx?dRUW zX^&xe7%Z`d=S%=y@4T#R#QpBtw^`clj~lh8y+Qn@)P5X~GjHwx_XY!AmNz_fJ=DN& zcmtUAF#8DG3hbepgtnCyn1W!3tLpt??XA^PVYA@<$-;C2{}-nUg{fk0@Ds#@cl z{VtRV;_qZP!}H!rFRlGoBYNp?o4;Y~x#jn=uZ!=7g??>p0ri^V4W@W(!Q@zZu$YgB z4Ijb)c32FvSdySL4vrKdMB1@$AVbjzOw;5ov=mB^AQ-Di6f$WPU0NzC(E+ejG@w*2 z!6HNj{Y1CcozqI;Y&Klda^0Gn>csdE(XYVi?pk@y1)sZH)UF99RCc?+vz=dz*hbVG zG%xLP!cdWLcF}`eD4XjubU!jc-CBF6zxJ@2;GVwF^1rYbi~kKZ>3f9n>S#I{)`$~| z67rNNHNe`VSSzqY{9<=!f}N}skHRg9qV$&K3-eV=b~Y$YSV8V5@v|tjXD$d@ir4pg zN8;teu~|fsZXHl{$5^~O)E3!t043{Er9dzo_va^acUOCE_?NwhX1W$0tU5#5$9APc zLy1oI?;IXS@3mc_bms`hHn992_PqEW;nl)B%*ts6IMC6;rS3b2B}IgD9o`gb2*_DE zy1KxkM5V(rtu6zz7q}S-B^{I1t9u?yOmN4)?9N+nId*ve?kzJT8~b`AXqn!TFx zd*Jir$WUp8Cj+LF;#bEZ)2T7o3cr9}WXxbLjzMd&OXB~n{rz%SXWp|G8|j{FLva(| zfVd*zB1hYFZk#5ODsyj=Wot8yxn^xWh{t@3r_mZZh)4>kk#QC$ z^KwI&11Pg$E}lhEw;@|D<~mgN;GX-A4-6c?Z_nAcAHDSao;wb{VyM6K$W67Mu?G*{ zcI#ea?94+8yB|C=dhNfz`Cs?!I@ng-Q(*6Yavv%TFySe&8+A6m35)wiE=iRjT_HGu z{)*((vC}H)THJu^qWQS&j5T}ZAa{fKnMO=bWByL{XbyKIlt_lc@%A=F?Dn`+4efga z@nEPe6-sA%LJB?c&Em9BlMq%f^zpan8rFVun{#VF+@%2nmPW)LH2VWdDX=VK5czrJ z&Ywrxdg7Yq^m>A^NHQf(rz6>(jedvM<<;ErP!dr)cxzeQg$nP#1Kx49Rms5dX?_;j zJV1Fg|HPANcGZ)I@!abWsq~!qB~&iY@Y$@WZV4lwRf*j6XQGgi2{Ox>`IOf==L+jy zT^SUw}X2C*$G*R;7v5sW|z zf>^y2&qGT|6|=%?P-OS&pGugr_NijF>9Kfj zV=X(XX@d2->!>8`Aik?z!%nb^E3cmt?+IRc?L=WloJKYOe}@RXs4&D=uhaB4t}58I zrmK+!Wzq>u%3%64>|@qu#nXM#`V^<_C_4KSaQOq!hhOlwH}BMyt7=B~*{f>pR1+Q7 zJep|EZ+Dme_HkVlZpVJwDSlDVVJotzcF2sOprv6Cn$@Z93K-Nb(#Qs~pq)C?NoFO) z=S$MOxkyR1oo;-$QC=-eIwEdgSnbjtYW^Ztd~SzyO!phQ$GZo+ujvaxx4}p7!buR1p$Rb-YhoW2bH*el z!vMmIBq8G9q&L8{S=bwjzMwj*A)?u>9yy|lBPeaHZPh#;{6Udxb$%Z1PkMU=Z~tuL z?Ew$fh2&u)SP0NL3TEL2q+=}F^md~D6!0E3;~pr;9isb1UjQ$+U+U&#QBg^!()3zu zAoTVzvC57hk|r)x_}qKL++z+TuwCXWWo2rK1U3Yrf?{_~HUtHL?@yT3xY38RIE>|~ zft`kAph&K}HXk3yS6q1S8301PZpM6nNj*8^J+};2=aLuB=zDM=P55 zZnIAPR0###=wB$63gMqvGQXB88~Atp256MTadxBl5$uU+4vpauhlU_Jpfk|MKxHI! zS>nnAtf;)-X9_{9l(r4dkTs2@7E}Ne5-m)a&`}fuEcOZHEmA3_oW4*ok=i(r)D2m3 z<3AQI#@jazB>VwIbc^F&SEx4~jrqKq*Xs=TwxcDwPbEI}+mbzAf_;z?zk}F?m(uKa ze%M9MY~tF2g!rzy-UK*c=1@H-r#{NLI-fymMYTp>NsbOFh?R9(Y^O`I0e zr7SX+Em44|2pJgxB2H22CPb<~|D=W{-l23V<#ZvE&gc%HIB`7cP{a|mHiO;A74)OQ zl}C0v(akAg1blva(~GdbUcn`YoK5M%Eht?O)e2L|KrWaw<%kuOZiO6S4Xo}CP!$$l zAzHj|#kbXh#wxLc@4*W8;Kjxs#GXfM33xgHKM2t9ZVU-z@~wqYwG@8Cl{xXxQ9kB7B%Un8&IO>!d2W+9jIR{V`G?JBE02ZP-#hS^%Bq= z1Q?;Y9}=Dr>_i@;9@azEi7jECOkI3^O;%=Fd5EiWz*H(jR(C(;PxXO>tU6tos*&=> zvSGg~qZlyYOF`|D8SloKw{Qak0srxnIT2odiT@4odc60ccwcY zi6i0(eE{5E+Dl{0^X$m-Qw}$)WYzdW+~35 zvts>`gm2dY($Aqbr6H{9sA1Vi_(QH>A9-$#edL4Ub8G{DD(Y%mTnJpp>;}i1mym^_ zKEP%LXq9#0xm9eQG_L2^PU#-5alu1yRoa#f^5z$DTGaf*-br))%IMJ-40)_5*}n-w4Wyh~cZJn$`$RezjKfYDF={AG9EupawUJ zUuH$=^_&`z?+DW8I^N7RT9-MBx=eIgjqA&;HLibTH%iwESpnHuFI?NIzyH_KwEpoj zn%2+QacLOb#HLs+IZ1sKEv&mgv)Kr3pqBuz)6$!u^&Bzx)T6mvWjLpWeZW(h+wU_yxz2mgsvi}0NfZT>Je$l z+&Q4uSE)1EtMx+krRUbum%b0*!$%--7pu7|`W>tnbIQoY4aiuneGcDm>2vt1_&7_8 zKfD@!Wo4Cdu21}e>I&$gkob65H$owUGO0x2yUQ-tv-}ah_eZ(*RnIquQvkV<zzZ?uoj*as9{eLKeRs5J)Uk0Wd7VN)6=VK+}H z6VT})N>hyw3i*XQb`c*)3-@Vg!lf$MCta&9L%TiAxhNn!Sb-ZD358A#g|alKhGf{D z!GQu=71L}g<$>|Rag;#lFZ8EVv0OYCG(1sn)HDeDTg=bIVpCcis_RQ|5;q+;tBLF$ zYwka@KF?a8J2_kefyY+E#s-c3d5wLb*#{sQw*Y4Eo04%v5OSi9U*y z;l3uZ9cT(qCKdEXIaPQITVBO0!4P;_WWcuo2_^7BYqBKh6_dZ;nq2LF=$fX#PFEED z*46V>ka*$oAo=2^run@Ro<|cWsQUdynjbVv6kC9V;wH2}Ek?m{8zu{1yC!qgK;#=R zgR*21=*H1v=Z6U-Ib7>_=n9uYSEZ|qSt7*S+b14cQX$6%roq6(T&r-3d6uvZhn`cVgtnik>XPu7K9uqO|P zspe7hJ;4SXnehDb&8(Z_$rWuJEk?~W5DXnJeRELPgY=JR#)r`1?3A@%Uywhi#T%Np z6PvN7cVYE3>xco&|Il)v{`Q=(h10Cj%ObtG)z@xs=M~1YVqI2`t;^cJb&_U}vA$iw zq5g3BCG7O_A6<<$YK_Hur?r=!tnZrF+M5JV{o`eky$DZD2nWr5Pa7fz(2$vyBz7*O zERp??%j{8{l1!0(#Tjl72nSJa!9fk09W94|3ehkIS-kr%>PXqAXoQoRQXg1i+(iiJ z8t0i^zj0m#E!TP`h+78Ah9o>&dzO88`6B0CIbjFKgsC;vJ=PMz7lIGXIM95|WD7?t z*5`5rEgq*t~x(Ku-g1sTw&IP2clgZH1ahu!#Bm=Bt!uoS3N_XZpL-mHeL&ygs z&zSDon=nDeR*jv4->XawFZo}{QRuuVYDXXY%-Jnc7Lq`XYY>DV^^Neq# z8N*p<&luYRbAdG!;q&&4&os@L&f_bi8RN#L8KWLJW(@Ht5(1TP%ouE zRMwyHUpd^$5GIQ$=S9imUT4CxQt|rzhTA(SJ5|-&YQpw>w?k_h6aL%9GR&+rU$QS} zP~r-5fOI>;;vmb2VAcv1I+V{)@^~LF4^K|2EWgenDHkqtA)!nswkY}dP^cddHgCYT zZSmmhpnWM`1!+q{QyD}dNeYq_>^o#xK@JhBN%Jwm<+WIiWiv>=K>h5lQf4eWX8FHd z@PBc9TG#irKBU+4ih0%n`Fg&x%fY@)NC_3;cdGE>i)@H#s+}DXM8Wggg_c(hd}fmfp?N8{*n)G=C{%Z?UQJ}Dwf&0?tRy>M zYeXhkK>{xA$PsM~-8p5T72GE3dAA8o;S6PN4v}`|9QRstJZ{dBQyz1UCS|c4J*($P zC&_z>IZ|MOJ;xA{8hehM&>-E0rr3hetTV;(N<#C^^`^Lr(zKeQIm6dUqrmnN;R_!d z?#mJ#wP+2jl@da7rP~$cpvmxO+Z3mn&``Gu6uy$=3+r7)z$!FI$EvF>%3(f|N`INu z2;_w*3?5F69PYKBjYTn|GiY@X5wPAEoe-a z!ynV*9!bFC?lv;PVs|R5D9^70*k zgjZEPL|F*nXz^ohn+%^jCJ2p;6BbYp^dL}}LV1{+vUDO>Sb=`Fg0M8MX3COz1BgnB zh>8uFl_Z4%o3BVxTBF}(D2i(xD77FduWb#XF_A38Pjbly^$|?b=E^clOM%5Udaa0L z_!R^e_dur5b2L=0Iqja9^<6)VIJ zGw1O?xE%8E3OQuJ-l!{Ofm?BtB|NMW1(Lst_^_Vv&}{g%?Y=7lXMPRgVHKcWi11K{ z*i&43`0`5Wfjr$WOfW!*0Lgq6&PR~k0DFi)ty&NjuJQy(Gbo-4Dv2_rkX3TU3zkE! zB#6|v6qNPff*`UI^0!=_AOe_^@9ZH?HF|`R>X0ppv=%d3$QYQ`Z$ZXbLn>M^U~BYy ztkqdn9lJ&<{(*QO9FSoy83 zIXO_Z<>l*g{%T9U54!N1 Date: Thu, 22 May 2025 15:21:36 +0200 Subject: [PATCH 058/136] feat(settings): add font and apply to relevant text fields --- src/app/globals.css | 35 ++++++++++++++++++++++------- src/app/settings/page.tsx | 2 +- src/components/custom-ui/button.tsx | 6 ++--- src/components/labeled-input.tsx | 2 +- src/components/logo.tsx | 12 ++++++++++ src/components/ui/input.tsx | 2 +- src/components/ui/label.tsx | 2 +- src/components/ui/select.tsx | 2 +- src/components/user/login-form.tsx | 4 ++-- 9 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 558d875..99e47a7 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -6,6 +6,9 @@ :root { /* Custom values */ + --font-heading: 'Comfortaa', sans-serif; + --font-label: 'Varela Round', sans-serif; + --transparent: transparent; --neutral-000: oklch(0 0 0); @@ -30,9 +33,9 @@ --radius: 0.688rem; --primary: oklch(0.7493 0.1551 74.95); - --hover-primary: oklch(0.6568 0.1358 74.86 / 0.8); - --active-primary: oklch(0.5911 0.1135 78.29); - --disabled-primary: oklch(0.6568 0.1358 74.86 / 0.5); + --hover-primary: oklch(0.7493 0.1551 74.95 / 0.8); + --active-primary: oklch(0.6191 0.1218 77.58); + --disabled-primary: oklch(0.7493 0.1551 74.95 / 0.5); --secondary: oklch(0.4937 0.1697 271.26); --hover-secondary: oklch(0.4937 0.1697 271.26 / 0.8); @@ -45,8 +48,6 @@ --foreground: oklch(0.13 0.028 261.692); - --card: oklch(1 0 0); - --card-foreground: oklch(0.13 0.028 261.692); --popover: oklch(1 0 0); @@ -100,7 +101,25 @@ --sidebar-ring: oklch(0.707 0.022 261.325); } +@font-face { + font-family: 'Comfortaa'; + font-style: normal; + font-weight: 300 700; + src: url('/Fonts/Comfortaa/Comfortaa-VariableFont_weight.ttf') + format('truetype'); +} + +@font-face { + font-family: 'Varela Round'; + font-style: normal; + font-weight: 400; + src: url('/Fonts/VarelaRound/VarelaRound-Regular.ttf') format('truetype'); +} + @theme inline { + --font-heading: var(--font-heading); + --font-label: var(--font-label); + --transparent: var(--transparent); --color-neutral-000: var(--neutral-000); @@ -132,7 +151,7 @@ --color-secondary: var(--secondary); --color-hover-secondary: var(--hover-secondary); --color-active-secondary: var(--active-secondary); - --disabled-secondary: var(--disabled-secondary); + --color-disabled-secondary: var(--disabled-secondary); /* Custom values */ @@ -152,7 +171,7 @@ --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); + --color-popover: var(--color-background); --color-popover-foreground: var(--popover-foreground); @@ -168,7 +187,7 @@ --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); + --color-accent: var(--color-neutral-750); --color-accent-foreground: var(--accent-foreground); diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 9afe7c6..70e198d 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -88,7 +88,7 @@ export default function SettingsPage() {

- +

Permanently delete your account and all associated data.

diff --git a/src/components/custom-ui/button.tsx b/src/components/custom-ui/button.tsx index 51f3b63..1910ea5 100644 --- a/src/components/custom-ui/button.tsx +++ b/src/components/custom-ui/button.tsx @@ -5,7 +5,7 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils'; const buttonVariants = cva( - "radius-lg inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "radius-lg inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-label transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { @@ -37,7 +37,7 @@ const buttonVariants = cva( ); function Button({ - className, + className = 'font-label', variant, size, asChild = false, @@ -51,7 +51,7 @@ function Button({ return ( ); diff --git a/src/components/labeled-input.tsx b/src/components/labeled-input.tsx index 250dd5f..a16f26a 100644 --- a/src/components/labeled-input.tsx +++ b/src/components/labeled-input.tsx @@ -15,7 +15,7 @@ export default function LabeledInput({ name?: string; }) { return ( -
+
+ Error: Logo asset not found. Check console. +
+ ); + } + return ( ) { type={type} data-slot='input' className={cn( - 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', + 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', className, diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index 6bc5f71..3364d98 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -13,7 +13,7 @@ function Label({
From 6350208c4d7645bcfb2ac88fd6bdfcbee5804a38 Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Thu, 22 May 2025 22:54:57 +0200 Subject: [PATCH 059/136] style(ui): update input and dropdown-menu colors for consistency Refine color variables and class names in input and dropdown-menu components to improve visual consistency and accessibility. Introduce new CSS variables for input text and muted input states. Adjust focus and selection styles to better align with the overall design system. --- src/app/globals.css | 22 +++++++++++++++++++--- src/components/ui/dropdown-menu.tsx | 4 ++-- src/components/ui/input.tsx | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 99e47a7..cd4c1c7 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -28,6 +28,9 @@ --base: var(--neutral-800); --text: var(--neutral-000); --text-alt: var(--neutral-900); + --text-input: var(--text); + --text-muted-input: var(--neutral-600); + --muted-input: var(--neutral-600); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); --radius: 0.688rem; @@ -56,6 +59,8 @@ --primary-foreground: oklch(0.985 0.002 247.839); + --popover-hover: var(--neutral-750); + --secondary-foreground: oklch(0.21 0.034 264.665); --muted: oklch(0.967 0.003 264.542); @@ -139,6 +144,10 @@ --color-base: var(--neutral-800); --color-text: var(--text); --color-text-alt: var(--text-alt); + --color-text-input: var(--text-input); + --color-text-muted-input: var(--text-muted-input); + --color-muted-input: var(--muted-input); + --color-background-disabled: var(--neutral-500); --color-text-disabled: var(--neutral-700); --radius: 0.688rem; @@ -175,6 +184,8 @@ --color-popover-foreground: var(--popover-foreground); + --color-popover-hover: var(--popover-hover); + --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); @@ -232,13 +243,13 @@ --transparent: transparent; --neutral-000: oklch(1 0 0); - --neutral-100: oklch(0.9128 0 0); - --neutral-150: oklch(0.9702 0 0); + --neutral-100: oklch(0.9702 0 0); + --neutral-150: oklch(0.9128 0 0); --neutral-200: oklch(0.8266 0 0); --neutral-300: oklch(0.738 0 0); --neutral-400: oklch(0.6434 0 0); - --neutral-600: oklch(0.4495 0 0); --neutral-500: oklch(0.5486 0 0); + --neutral-600: oklch(0.4495 0 0); --neutral-700: oklch(0.3407 0 0); --neutral-750: oklch(0.2972 0 0); --neutral-800: oklch(0.2264 0 0); @@ -248,6 +259,9 @@ --base: var(--neutral-750); --text: var(--neutral-000); --text-alt: var(--neutral-900); + --text-input: var(--text); + --text-muted-input: var(--neutral-600); + --muted-input: var(--neutral-500); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); @@ -275,6 +289,8 @@ --primary-foreground: oklch(0.21 0.034 264.665); + --popover-hover: var(--neutral-700); + --secondary-foreground: oklch(0.985 0.002 247.839); --muted: oklch(0.278 0.033 256.848); diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index 7a8804e..ca93e14 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -42,7 +42,7 @@ function DropdownMenuContent({ data-slot='dropdown-menu-content' sideOffset={sideOffset} className={cn( - 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', + 'bg-popover text-text data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className, )} {...props} @@ -74,7 +74,7 @@ function DropdownMenuItem({ data-inset={inset} data-variant={variant} className={cn( - "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "focus:bg-popover-hover focus:text-text data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index a751360..65fbc93 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<'input'>) { type={type} data-slot='input' className={cn( - 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', + 'file:text-destructive placeholder:text-text-muted-input selection:bg-muted-input selection:text-text dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-text-input shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', className, From 772c8f84e8b4fc4e6206d89c2b35e76252c04ee9 Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Thu, 22 May 2025 22:59:01 +0200 Subject: [PATCH 060/136] feat: finished creating login page Fixed Color Picker --- src/app/globals.css | 57 ++++++----------------------- src/components/ui/dropdown-menu.tsx | 4 +- src/components/ui/input.tsx | 2 +- src/components/ui/label.tsx | 2 +- src/components/ui/select.tsx | 2 +- 5 files changed, 16 insertions(+), 51 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index cd4c1c7..558d875 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -6,9 +6,6 @@ :root { /* Custom values */ - --font-heading: 'Comfortaa', sans-serif; - --font-label: 'Varela Round', sans-serif; - --transparent: transparent; --neutral-000: oklch(0 0 0); @@ -28,17 +25,14 @@ --base: var(--neutral-800); --text: var(--neutral-000); --text-alt: var(--neutral-900); - --text-input: var(--text); - --text-muted-input: var(--neutral-600); - --muted-input: var(--neutral-600); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); --radius: 0.688rem; --primary: oklch(0.7493 0.1551 74.95); - --hover-primary: oklch(0.7493 0.1551 74.95 / 0.8); - --active-primary: oklch(0.6191 0.1218 77.58); - --disabled-primary: oklch(0.7493 0.1551 74.95 / 0.5); + --hover-primary: oklch(0.6568 0.1358 74.86 / 0.8); + --active-primary: oklch(0.5911 0.1135 78.29); + --disabled-primary: oklch(0.6568 0.1358 74.86 / 0.5); --secondary: oklch(0.4937 0.1697 271.26); --hover-secondary: oklch(0.4937 0.1697 271.26 / 0.8); @@ -51,6 +45,8 @@ --foreground: oklch(0.13 0.028 261.692); + --card: oklch(1 0 0); + --card-foreground: oklch(0.13 0.028 261.692); --popover: oklch(1 0 0); @@ -59,8 +55,6 @@ --primary-foreground: oklch(0.985 0.002 247.839); - --popover-hover: var(--neutral-750); - --secondary-foreground: oklch(0.21 0.034 264.665); --muted: oklch(0.967 0.003 264.542); @@ -106,25 +100,7 @@ --sidebar-ring: oklch(0.707 0.022 261.325); } -@font-face { - font-family: 'Comfortaa'; - font-style: normal; - font-weight: 300 700; - src: url('/Fonts/Comfortaa/Comfortaa-VariableFont_weight.ttf') - format('truetype'); -} - -@font-face { - font-family: 'Varela Round'; - font-style: normal; - font-weight: 400; - src: url('/Fonts/VarelaRound/VarelaRound-Regular.ttf') format('truetype'); -} - @theme inline { - --font-heading: var(--font-heading); - --font-label: var(--font-label); - --transparent: var(--transparent); --color-neutral-000: var(--neutral-000); @@ -144,10 +120,6 @@ --color-base: var(--neutral-800); --color-text: var(--text); --color-text-alt: var(--text-alt); - --color-text-input: var(--text-input); - --color-text-muted-input: var(--text-muted-input); - --color-muted-input: var(--muted-input); - --color-background-disabled: var(--neutral-500); --color-text-disabled: var(--neutral-700); --radius: 0.688rem; @@ -160,7 +132,7 @@ --color-secondary: var(--secondary); --color-hover-secondary: var(--hover-secondary); --color-active-secondary: var(--active-secondary); - --color-disabled-secondary: var(--disabled-secondary); + --disabled-secondary: var(--disabled-secondary); /* Custom values */ @@ -180,12 +152,10 @@ --color-card-foreground: var(--card-foreground); - --color-popover: var(--color-background); + --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); - --color-popover-hover: var(--popover-hover); - --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); @@ -198,7 +168,7 @@ --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--color-neutral-750); + --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); @@ -243,13 +213,13 @@ --transparent: transparent; --neutral-000: oklch(1 0 0); - --neutral-100: oklch(0.9702 0 0); - --neutral-150: oklch(0.9128 0 0); + --neutral-100: oklch(0.9128 0 0); + --neutral-150: oklch(0.9702 0 0); --neutral-200: oklch(0.8266 0 0); --neutral-300: oklch(0.738 0 0); --neutral-400: oklch(0.6434 0 0); - --neutral-500: oklch(0.5486 0 0); --neutral-600: oklch(0.4495 0 0); + --neutral-500: oklch(0.5486 0 0); --neutral-700: oklch(0.3407 0 0); --neutral-750: oklch(0.2972 0 0); --neutral-800: oklch(0.2264 0 0); @@ -259,9 +229,6 @@ --base: var(--neutral-750); --text: var(--neutral-000); --text-alt: var(--neutral-900); - --text-input: var(--text); - --text-muted-input: var(--neutral-600); - --muted-input: var(--neutral-500); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); @@ -289,8 +256,6 @@ --primary-foreground: oklch(0.21 0.034 264.665); - --popover-hover: var(--neutral-700); - --secondary-foreground: oklch(0.985 0.002 247.839); --muted: oklch(0.278 0.033 256.848); diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index ca93e14..7a8804e 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -42,7 +42,7 @@ function DropdownMenuContent({ data-slot='dropdown-menu-content' sideOffset={sideOffset} className={cn( - 'bg-popover text-text data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', + 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className, )} {...props} @@ -74,7 +74,7 @@ function DropdownMenuItem({ data-inset={inset} data-variant={variant} className={cn( - "focus:bg-popover-hover focus:text-text data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 65fbc93..485626a 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<'input'>) { type={type} data-slot='input' className={cn( - 'file:text-destructive placeholder:text-text-muted-input selection:bg-muted-input selection:text-text dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-text-input shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', + 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', className, diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index 3364d98..6bc5f71 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -13,7 +13,7 @@ function Label({ Date: Fri, 23 May 2025 08:56:26 +0200 Subject: [PATCH 061/136] feat: add values to globals.css edited dropdown, input, label and select to reflect new values --- src/app/globals.css | 57 +++++++++++++++++++++++------ src/components/ui/dropdown-menu.tsx | 4 +- src/components/ui/input.tsx | 2 +- src/components/ui/label.tsx | 2 +- src/components/ui/select.tsx | 2 +- 5 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 558d875..969c457 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -6,6 +6,9 @@ :root { /* Custom values */ + --font-heading: 'Comfortaa', sans-serif; + --font-label: 'Varela Round', sans-serif; + --transparent: transparent; --neutral-000: oklch(0 0 0); @@ -25,14 +28,17 @@ --base: var(--neutral-800); --text: var(--neutral-000); --text-alt: var(--neutral-900); + --text-input: var(--text); + --text-muted-input: var(--neutral-600); + --muted-input: var(--neutral-600); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); --radius: 0.688rem; --primary: oklch(0.7493 0.1551 74.95); - --hover-primary: oklch(0.6568 0.1358 74.86 / 0.8); - --active-primary: oklch(0.5911 0.1135 78.29); - --disabled-primary: oklch(0.6568 0.1358 74.86 / 0.5); + --hover-primary: oklch(0.7493 0.1551 74.95 / 0.8); + --active-primary: oklch(0.6191 0.1218 77.58); + --disabled-primary: oklch(0.7493 0.1551 74.95 / 0.5); --secondary: oklch(0.4937 0.1697 271.26); --hover-secondary: oklch(0.4937 0.1697 271.26 / 0.8); @@ -45,8 +51,6 @@ --foreground: oklch(0.13 0.028 261.692); - --card: oklch(1 0 0); - --card-foreground: oklch(0.13 0.028 261.692); --popover: oklch(1 0 0); @@ -55,6 +59,8 @@ --primary-foreground: oklch(0.985 0.002 247.839); + --popover-hover: var(--neutral-750); + --secondary-foreground: oklch(0.21 0.034 264.665); --muted: oklch(0.967 0.003 264.542); @@ -100,7 +106,25 @@ --sidebar-ring: oklch(0.707 0.022 261.325); } +@font-face { + font-family: 'Comfortaa'; + font-style: normal; + font-weight: 300 700; + src: url('/fonts/Comfortaa/Comfortaa-VariableFont_weight.ttf') + format('truetype'); +} + +@font-face { + font-family: 'Varela Round'; + font-style: normal; + font-weight: 400; + src: url('/fonts/VarelaRound/VarelaRound-Regular.ttf') format('truetype'); +} + @theme inline { + --font-heading: var(--font-heading); + --font-label: var(--font-label); + --transparent: var(--transparent); --color-neutral-000: var(--neutral-000); @@ -120,6 +144,10 @@ --color-base: var(--neutral-800); --color-text: var(--text); --color-text-alt: var(--text-alt); + --color-text-input: var(--text-input); + --color-text-muted-input: var(--text-muted-input); + --color-muted-input: var(--muted-input); + --color-background-disabled: var(--neutral-500); --color-text-disabled: var(--neutral-700); --radius: 0.688rem; @@ -132,7 +160,7 @@ --color-secondary: var(--secondary); --color-hover-secondary: var(--hover-secondary); --color-active-secondary: var(--active-secondary); - --disabled-secondary: var(--disabled-secondary); + --color-disabled-secondary: var(--disabled-secondary); /* Custom values */ @@ -152,10 +180,12 @@ --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); + --color-popover: var(--color-background); --color-popover-foreground: var(--popover-foreground); + --color-popover-hover: var(--popover-hover); + --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); @@ -168,7 +198,7 @@ --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); + --color-accent: var(--color-neutral-750); --color-accent-foreground: var(--accent-foreground); @@ -213,13 +243,13 @@ --transparent: transparent; --neutral-000: oklch(1 0 0); - --neutral-100: oklch(0.9128 0 0); - --neutral-150: oklch(0.9702 0 0); + --neutral-100: oklch(0.9702 0 0); + --neutral-150: oklch(0.9128 0 0); --neutral-200: oklch(0.8266 0 0); --neutral-300: oklch(0.738 0 0); --neutral-400: oklch(0.6434 0 0); - --neutral-600: oklch(0.4495 0 0); --neutral-500: oklch(0.5486 0 0); + --neutral-600: oklch(0.4495 0 0); --neutral-700: oklch(0.3407 0 0); --neutral-750: oklch(0.2972 0 0); --neutral-800: oklch(0.2264 0 0); @@ -229,6 +259,9 @@ --base: var(--neutral-750); --text: var(--neutral-000); --text-alt: var(--neutral-900); + --text-input: var(--text); + --text-muted-input: var(--neutral-600); + --muted-input: var(--neutral-500); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); @@ -256,6 +289,8 @@ --primary-foreground: oklch(0.21 0.034 264.665); + --popover-hover: var(--neutral-700); + --secondary-foreground: oklch(0.985 0.002 247.839); --muted: oklch(0.278 0.033 256.848); diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index 7a8804e..ca93e14 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -42,7 +42,7 @@ function DropdownMenuContent({ data-slot='dropdown-menu-content' sideOffset={sideOffset} className={cn( - 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', + 'bg-popover text-text data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className, )} {...props} @@ -74,7 +74,7 @@ function DropdownMenuItem({ data-inset={inset} data-variant={variant} className={cn( - "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "focus:bg-popover-hover focus:text-text data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 485626a..65fbc93 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<'input'>) { type={type} data-slot='input' className={cn( - 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', + 'file:text-destructive placeholder:text-text-muted-input selection:bg-muted-input selection:text-text dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-text-input shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', className, diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index 6bc5f71..3364d98 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -13,7 +13,7 @@ function Label({ Date: Fri, 23 May 2025 10:38:45 +0200 Subject: [PATCH 062/136] feat(routing): exclude fonts from redirect --- src/middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index c3ab55c..b2f73cf 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -2,6 +2,6 @@ export { auth as middleware } from '@/auth'; export const config = { matcher: [ - '/((?!api|_next/static|_next/image|site\.webmanifest|web-app-manifest-(?:192x192|512x512)\.png|favicon(?:-(?:dark|light))?\.(?:png|svg|ico)).*)', + '/((?!api|_next/static|_next/image|site\.webmanifest|web-app-manifest-(?:192x192|512x512)\.png|favicon(?:-(?:dark|light))?\.(?:png|svg|ico)|fonts).*)', ], }; From d4d4421f362f344180ddf0a9868fb973102c83fa Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Fri, 23 May 2025 21:07:43 +0200 Subject: [PATCH 063/136] feat: add neutral-450 color variable and update muted input color for better contrast --- src/app/globals.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 969c457..79a25a9 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -17,6 +17,7 @@ --neutral-200: oklch(0.3407 0 0); --neutral-300: oklch(0.4495 0 0); --neutral-400: oklch(0.5486 0 0); + --neutral-450: oklch(0.6 0 0); --neutral-500: oklch(0.6434 0 0); --neutral-600: oklch(0.738 0 0); --neutral-700: oklch(0.8266 0 0); @@ -29,7 +30,7 @@ --text: var(--neutral-000); --text-alt: var(--neutral-900); --text-input: var(--text); - --text-muted-input: var(--neutral-600); + --text-muted-input: var(--neutral-450); --muted-input: var(--neutral-600); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); @@ -248,6 +249,7 @@ --neutral-200: oklch(0.8266 0 0); --neutral-300: oklch(0.738 0 0); --neutral-400: oklch(0.6434 0 0); + --neutral-450: oklch(0.6 0 0); --neutral-500: oklch(0.5486 0 0); --neutral-600: oklch(0.4495 0 0); --neutral-700: oklch(0.3407 0 0); @@ -260,7 +262,7 @@ --text: var(--neutral-000); --text-alt: var(--neutral-900); --text-input: var(--text); - --text-muted-input: var(--neutral-600); + --text-muted-input: var(--neutral-450); --muted-input: var(--neutral-500); --background-disabled: var(--neutral-500); --text-disabled: var(--neutral-700); From f0e23139a2e6ad8fa770128858fee2b3f86a1543 Mon Sep 17 00:00:00 2001 From: Micha Date: Wed, 28 May 2025 18:43:28 +0200 Subject: [PATCH 064/136] refactor: remove debug log and unused onError prop --- src/components/logo.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/logo.tsx b/src/components/logo.tsx index 80a3c6b..505665f 100644 --- a/src/components/logo.tsx +++ b/src/components/logo.tsx @@ -62,8 +62,6 @@ export default function Logo({ return null; } - console.log(colorType, logoType, theme); - if (!colorType || !logoType || !theme) { const errorMessage = 'Logo: colorType, logoType, and theme props are required.'; @@ -129,7 +127,6 @@ export default function Logo({ className={className} width={width} height={height} - // onError={handleImageError} {...imageProps} /> ); From 49b3869d7bfdb60879c692f5f70a46865e9fe7ab Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Thu, 5 Jun 2025 17:22:03 +0200 Subject: [PATCH 065/136] feat(logo): consolidate logo imports into a single export file --- src/assets/logo/logo-export.ts | 16 +++++++++++ src/components/custom-ui/button.tsx | 3 -- src/components/logo.tsx | 44 ++++------------------------- 3 files changed, 22 insertions(+), 41 deletions(-) create mode 100644 src/assets/logo/logo-export.ts diff --git a/src/assets/logo/logo-export.ts b/src/assets/logo/logo-export.ts new file mode 100644 index 0000000..44681d3 --- /dev/null +++ b/src/assets/logo/logo-export.ts @@ -0,0 +1,16 @@ +export { default as logo_colored_combo_light } from '@/assets/logo/logo_colored_combo_light.svg'; +export { default as logo_colored_combo_dark } from '@/assets/logo/logo_colored_combo_dark.svg'; +export { default as logo_colored_primary_light } from '@/assets/logo/logo_colored_primary_light.svg'; +export { default as logo_colored_primary_dark } from '@/assets/logo/logo_colored_primary_dark.svg'; +export { default as logo_colored_secondary_light } from '@/assets/logo/logo_colored_secondary_light.svg'; +export { default as logo_colored_secondary_dark } from '@/assets/logo/logo_colored_secondary_dark.svg'; +export { default as logo_mono_combo_light } from '@/assets/logo/logo_mono_combo_light.svg'; +export { default as logo_mono_combo_dark } from '@/assets/logo/logo_mono_combo_dark.svg'; +export { default as logo_mono_primary_light } from '@/assets/logo/logo_mono_primary_light.svg'; +export { default as logo_mono_primary_dark } from '@/assets/logo/logo_mono_primary_dark.svg'; +export { default as logo_mono_secondary_light } from '@/assets/logo/logo_mono_secondary_light.svg'; +export { default as logo_mono_secondary_dark } from '@/assets/logo/logo_mono_secondary_dark.svg'; +export { default as logo_mono_submark_light } from '@/assets/logo/logo_mono_submark_light.svg'; +export { default as logo_mono_submark_dark } from '@/assets/logo/logo_mono_submark_dark.svg'; +export { default as logo_colored_submark_light } from '@/assets/logo/logo_colored_submark_light.svg'; +export { default as logo_colored_submark_dark } from '@/assets/logo/logo_colored_submark_dark.svg'; diff --git a/src/components/custom-ui/button.tsx b/src/components/custom-ui/button.tsx index 1910ea5..f45fcd7 100644 --- a/src/components/custom-ui/button.tsx +++ b/src/components/custom-ui/button.tsx @@ -15,9 +15,6 @@ const buttonVariants = cva( 'bg-secondary text-text-alt shadow-xs hover:bg-hover-secondary active:bg-active-secondary', outline: 'border-2 border-primary bg-transparent text-text shadow-xs hover:bg-primary hover:border-neutral-000 hover:border-1.5 hover:text-neutral-000 active:bg-active-primary', - /*destructive: - 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', - */ ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', link: 'text-text underline-offset-4 hover:underline', diff --git a/src/components/logo.tsx b/src/components/logo.tsx index 505665f..129adef 100644 --- a/src/components/logo.tsx +++ b/src/components/logo.tsx @@ -3,22 +3,7 @@ import React, { useEffect, useState } from 'react'; import Image, { ImageProps } from 'next/image'; -import logo_colored_combo_light from '@/assets/logo/logo_colored_combo_light.svg'; -import logo_colored_combo_dark from '@/assets/logo/logo_colored_combo_dark.svg'; -import logo_colored_primary_light from '@/assets/logo/logo_colored_primary_light.svg'; -import logo_colored_primary_dark from '@/assets/logo/logo_colored_primary_dark.svg'; -import logo_colored_secondary_light from '@/assets/logo/logo_colored_secondary_light.svg'; -import logo_colored_secondary_dark from '@/assets/logo/logo_colored_secondary_dark.svg'; -import logo_mono_combo_light from '@/assets/logo/logo_mono_combo_light.svg'; -import logo_mono_combo_dark from '@/assets/logo/logo_mono_combo_dark.svg'; -import logo_mono_primary_light from '@/assets/logo/logo_mono_primary_light.svg'; -import logo_mono_primary_dark from '@/assets/logo/logo_mono_primary_dark.svg'; -import logo_mono_secondary_light from '@/assets/logo/logo_mono_secondary_light.svg'; -import logo_mono_secondary_dark from '@/assets/logo/logo_mono_secondary_dark.svg'; -import logo_mono_submark_light from '@/assets/logo/logo_mono_submark_light.svg'; -import logo_mono_submark_dark from '@/assets/logo/logo_mono_submark_dark.svg'; -import logo_colored_submark_light from '@/assets/logo/logo_colored_submark_light.svg'; -import logo_colored_submark_dark from '@/assets/logo/logo_colored_submark_dark.svg'; +import * as logoAssets from '@/assets/logo/logo-export'; import { useTheme } from 'next-themes'; type ColorType = 'colored' | 'monochrome'; @@ -47,7 +32,9 @@ export default function Logo({ ...imageProps }: LogoProps) { const [mounted, setMounted] = useState(false); - let { resolvedTheme: theme } = useTheme(); + let { resolvedTheme: theme } = useTheme() as { + resolvedTheme?: Theme; + }; useEffect(() => { setMounted(true); @@ -84,29 +71,10 @@ export default function Logo({ const colorTypeInFilename = colorType === 'monochrome' ? 'mono' : colorType; const defaultAltText = `Logo: ${colorType} ${logoType} ${theme}`; - const varName = `logo_${colorTypeInFilename}_${logoType}_${theme}`; - - const logoAssets = { - logo_colored_combo_light, - logo_colored_combo_dark, - logo_colored_primary_light, - logo_colored_primary_dark, - logo_colored_secondary_light, - logo_colored_secondary_dark, - logo_mono_combo_light, - logo_mono_combo_dark, - logo_mono_primary_light, - logo_mono_primary_dark, - logo_mono_secondary_light, - logo_mono_secondary_dark, - logo_mono_submark_light, - logo_mono_submark_dark, - logo_colored_submark_light, - logo_colored_submark_dark, - }; + const varName = `logo_${colorTypeInFilename}_${logoType}_${theme}` as const; // Match the varName with the Logo-Asset name and store it in "logoVar" - const logoVar = logoAssets[varName as keyof typeof logoAssets]; + const logoVar = logoAssets[varName]; if (!logoVar) { console.error(`Logo: Could not find logo asset for ${varName}`); From 9cb378f19736f41a5334a2f440d9bdbc43e01ea0 Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Thu, 22 May 2025 15:21:36 +0200 Subject: [PATCH 066/136] refactor: change className of input component --- src/components/ui/input.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 65fbc93..a751360 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<'input'>) { type={type} data-slot='input' className={cn( - 'file:text-destructive placeholder:text-text-muted-input selection:bg-muted-input selection:text-text dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-text-input shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', + 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', className, From 573c3053b63696c1c4dd1bbeed744b6463d4fc20 Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Fri, 30 May 2025 19:45:49 +0200 Subject: [PATCH 067/136] refactor(ui): enhance component className structure for better readability and maintainability --- src/components/custom-ui/login-card.tsx | 28 +++- src/components/ui/card.tsx | 55 ++++++- src/components/ui/dropdown-menu.tsx | 186 +++++++++++++++++++++++- src/components/ui/hover-card.tsx | 32 +++- src/components/ui/input.tsx | 29 +++- src/components/ui/label.tsx | 28 +++- src/components/ui/select.tsx | 101 ++++++++++++- src/components/ui/switch.tsx | 58 +++++++- src/components/ui/tabs.tsx | 60 +++++++- 9 files changed, 553 insertions(+), 24 deletions(-) diff --git a/src/components/custom-ui/login-card.tsx b/src/components/custom-ui/login-card.tsx index 616a45c..6544fba 100644 --- a/src/components/custom-ui/login-card.tsx +++ b/src/components/custom-ui/login-card.tsx @@ -7,7 +7,33 @@ function Card({ className, ...props }: React.ComponentProps<'div'>) {
) {
) {
) { type={type} data-slot='input' className={cn( - 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-label disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', - 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', - 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', + /* Text */ + 'text-text-input selection:text-text md:text-sm file:text-destructive file:text-sm placeholder:text-text-muted-input', + /* Background */ + 'bg-transparent selection:bg-muted-input file:bg-transparent', + /* Border */ + 'rounded-md border border-input focus-visible:border-ring aria-invalid:border-destructive file:border-0', + /* Font */ + 'file:font-label', + /* Cursor */ + 'disabled:pointer-events-none disabled:cursor-not-allowed', + /* Ring */ + 'focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40', + /* Outline */ + 'outline-none', + /* Shadow */ + 'shadow-md transition-[color,box-shadow] ', + /* Opacity */ + 'disabled:opacity-50 ', + /* Scaling */ + 'h-9 w-full min-w-0 file:h-7', + /* Spacing */ + 'px-3 py-1', + /* Alignment */ + 'flex file:inline-flex', + /* Miscellaneous */ + /* ////////// */ className, )} {...props} diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index 3364d98..16acf98 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -13,7 +13,33 @@ function Label({ {children} @@ -107,7 +171,34 @@ function SelectItem({ diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx index 4a9fbd0..76b16c3 100644 --- a/src/components/ui/tabs.tsx +++ b/src/components/ui/tabs.tsx @@ -26,8 +26,34 @@ function TabsList({ @@ -42,7 +68,35 @@ function TabsTrigger({ Date: Fri, 30 May 2025 19:46:43 +0200 Subject: [PATCH 068/136] feat: update button variants and styles for improved consistency and accessibility --- src/app/login/page.tsx | 2 +- src/components/custom-ui/button.tsx | 25 ++++++++++++++---------- src/components/labeled-input.tsx | 2 +- src/components/user/login-form.tsx | 2 +- src/components/user/sso-login-button.tsx | 2 +- src/components/user/theme-picker.tsx | 2 +- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index f49fb8f..074062c 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -57,7 +57,7 @@ export default async function LoginPage() {
- + diff --git a/src/components/custom-ui/button.tsx b/src/components/custom-ui/button.tsx index f45fcd7..5b53423 100644 --- a/src/components/custom-ui/button.tsx +++ b/src/components/custom-ui/button.tsx @@ -5,24 +5,29 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils'; const buttonVariants = cva( - "radius-lg inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-label transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "radius-lg inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-button transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { primary: - 'bg-primary text-text shadow-xs hover:bg-hover-primary active:bg-active-primary', + 'bg-primary text-text shadow-xs hover:bg-hover-primary active:bg-active-primary disabled:bg-disabled-primary', secondary: - 'bg-secondary text-text-alt shadow-xs hover:bg-hover-secondary active:bg-active-secondary', - outline: - 'border-2 border-primary bg-transparent text-text shadow-xs hover:bg-primary hover:border-neutral-000 hover:border-1.5 hover:text-neutral-000 active:bg-active-primary', - ghost: - 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + 'bg-secondary text-text-alt shadow-xs hover:bg-hover-secondary active:bg-active-secondary disabled:bg-disabled-secondary', + muted: + 'bg-muted text-text shadow-xs hover:bg-hover-muted active:bg-active-muted disabled:bg-disabled-muted', + outline_primary: + 'bg-background border-2 text-text shadow-xs hover:bg-primary border-primary hover:border-background-reversed active:bg-active-primary disabled:bg-disabled-primary', + outline_secondary: + 'bg-background border-2 text-text shadow-xs hover:bg-secondary border-secondary hover:border-background-reversed active:bg-active-secondary disabled:bg-disabled-secondary', + outline_muted: + 'bg-background border-2 text-text shadow-xs hover:bg-muted border-muted hover:border-background-reversed active:bg-active-muted disabled:bg-disabled-muted', + link: 'text-text underline-offset-4 hover:underline', }, size: { default: 'h-9 px-4 py-2 has-[>svg]:px-3', - sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', - lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + sm: 'h-8 gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 px-6 has-[>svg]:px-4', icon: 'size-9', }, }, @@ -34,7 +39,7 @@ const buttonVariants = cva( ); function Button({ - className = 'font-label', + className, variant, size, asChild = false, diff --git a/src/components/labeled-input.tsx b/src/components/labeled-input.tsx index a16f26a..250dd5f 100644 --- a/src/components/labeled-input.tsx +++ b/src/components/labeled-input.tsx @@ -15,7 +15,7 @@ export default function LabeledInput({ name?: string; }) { return ( -
+
Login -
diff --git a/src/components/user/sso-login-button.tsx b/src/components/user/sso-login-button.tsx index 76eac83..dc070b5 100644 --- a/src/components/user/sso-login-button.tsx +++ b/src/components/user/sso-login-button.tsx @@ -11,7 +11,7 @@ export default function SSOLogin({ }) { return (
{ 'use server'; await signIn(provider); diff --git a/src/components/user/theme-picker.tsx b/src/components/user/theme-picker.tsx index 37a2ceb..2a1649d 100644 --- a/src/components/user/theme-picker.tsx +++ b/src/components/user/theme-picker.tsx @@ -18,7 +18,7 @@ export function ThemePicker() { return ( -
@@ -302,10 +302,14 @@ export default function SettingsPage() {
- -
@@ -398,7 +402,9 @@ export default function SettingsPage() {
- +

Prevent specific users from seeing your calendar or booking time. From 24110a733dc203b2f056517e79bcc21635634698 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 19:00:43 +0000 Subject: [PATCH 072/136] chore(deps): update dependency @types/node to v22.15.30 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index fd521d6..5372ba9 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "devDependencies": { "@eslint/eslintrc": "3.3.1", "@tailwindcss/postcss": "4.1.8", - "@types/node": "22.15.29", + "@types/node": "22.15.30", "@types/react": "19.1.6", "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", diff --git a/yarn.lock b/yarn.lock index be8e365..8479a54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1634,12 +1634,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.29": - version: 22.15.29 - resolution: "@types/node@npm:22.15.29" +"@types/node@npm:22.15.30": + version: 22.15.30 + resolution: "@types/node@npm:22.15.30" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/602cc88c6150780cd9b5b44604754e0ce13983ae876a538861d6ecfb1511dff289e5576fffd26c841cde2142418d4bb76e2a72a382b81c04557ccb17cff29e1d + checksum: 10c0/ca330ac0e7fd502686d6df115fcc606aba46fd334220f749bbba2f639accdadcb23f7900603ceccdc8240be736739cad5c0b87c0fa92c9255a4dff245f07d664 languageName: node linkType: hard @@ -3819,7 +3819,7 @@ __metadata: "@radix-ui/react-switch": "npm:^1.2.4" "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.8" - "@types/node": "npm:22.15.29" + "@types/node": "npm:22.15.30" "@types/react": "npm:19.1.6" "@types/react-dom": "npm:19.1.6" class-variance-authority: "npm:^0.7.1" From c732b3138e9a88bd05009955f3140c9bf8589cec Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 7 Jun 2025 13:01:02 +0000 Subject: [PATCH 073/136] fix(deps): update prisma monorepo to v6.9.0 --- package.json | 4 +- yarn.lock | 627 +++++++++++++++++++++++++++------------------------ 2 files changed, 338 insertions(+), 293 deletions(-) diff --git a/package.json b/package.json index 5372ba9..cf0b1fa 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@fortawesome/free-regular-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", - "@prisma/client": "^6.8.2", + "@prisma/client": "^6.9.0", "@radix-ui/react-dropdown-menu": "^2.1.14", "@radix-ui/react-hover-card": "^1.1.13", "@radix-ui/react-label": "^2.1.6", @@ -53,7 +53,7 @@ "eslint-config-prettier": "10.1.5", "postcss": "8.5.4", "prettier": "3.5.3", - "prisma": "6.8.2", + "prisma": "6.9.0", "tailwindcss": "4.1.8", "tw-animate-css": "1.3.4", "typescript": "5.8.3" diff --git a/yarn.lock b/yarn.lock index 8479a54..4c79534 100644 --- a/yarn.lock +++ b/yarn.lock @@ -67,7 +67,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.4.3": +"@emnapi/runtime@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/runtime@npm:1.4.3" dependencies: @@ -171,34 +171,34 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.7.0": - version: 1.7.0 - resolution: "@floating-ui/core@npm:1.7.0" +"@floating-ui/core@npm:^1.7.1": + version: 1.7.1 + resolution: "@floating-ui/core@npm:1.7.1" dependencies: "@floating-ui/utils": "npm:^0.2.9" - checksum: 10c0/f7e66a650ad8c73765edb39a7530d81fa990c08c172f03b6129030234d32bccd4401c29ded9c8a4e4135e9beac349c5608d94962fa08c2a2ae2dab7a6530550c + checksum: 10c0/40df1e1dd8a2bad6f70c1ee163f0e151c456f52b9b98a38488d88720b2be72ccd631501a66f8369f96d2e8ad1c4250936b6fd4243e3a99833f2d008ee6afec18 languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.7.0 - resolution: "@floating-ui/dom@npm:1.7.0" + version: 1.7.1 + resolution: "@floating-ui/dom@npm:1.7.1" dependencies: - "@floating-ui/core": "npm:^1.7.0" + "@floating-ui/core": "npm:^1.7.1" "@floating-ui/utils": "npm:^0.2.9" - checksum: 10c0/49a7f0fbef82ba2c2f0bde7bb4812b276ae431b59e6a81427283a55cfb36c0af9cc459cbeb0bb1a5cc3efca1a332f584e123e7b1a8f0a9c94a21989b09b8c060 + checksum: 10c0/33b0e892f4c50ce568169cd58793ff5e3bc1e72ee007237d73b9458d4475e1e5f5a4b3f9e6752422d5f5ac902bc0c135ca7dc0a23c6df187fd9d28dc34cdceed languageName: node linkType: hard "@floating-ui/react-dom@npm:^2.0.0": - version: 2.1.2 - resolution: "@floating-ui/react-dom@npm:2.1.2" + version: 2.1.3 + resolution: "@floating-ui/react-dom@npm:2.1.3" dependencies: "@floating-ui/dom": "npm:^1.0.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60 + checksum: 10c0/e88750ea2fb352264d52d502d3979f94155ce2c8ab9a50862810d0cfc8c8e49cb6bbde466d668736cb38624d089360ef97451397b647408a0eb2c1870234c19a languageName: node linkType: hard @@ -302,9 +302,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-arm64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-darwin-arm64@npm:0.34.1" +"@img/sharp-darwin-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-darwin-arm64@npm:0.34.2" dependencies: "@img/sharp-libvips-darwin-arm64": "npm:1.1.0" dependenciesMeta: @@ -314,9 +314,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-darwin-x64@npm:0.34.1" +"@img/sharp-darwin-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-darwin-x64@npm:0.34.2" dependencies: "@img/sharp-libvips-darwin-x64": "npm:1.1.0" dependenciesMeta: @@ -389,9 +389,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-arm64@npm:0.34.1" +"@img/sharp-linux-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-arm64@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-arm64": "npm:1.1.0" dependenciesMeta: @@ -401,9 +401,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-arm@npm:0.34.1" +"@img/sharp-linux-arm@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-arm@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-arm": "npm:1.1.0" dependenciesMeta: @@ -413,9 +413,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-s390x@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-s390x@npm:0.34.1" +"@img/sharp-linux-s390x@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-s390x@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-s390x": "npm:1.1.0" dependenciesMeta: @@ -425,9 +425,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linux-x64@npm:0.34.1" +"@img/sharp-linux-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linux-x64@npm:0.34.2" dependencies: "@img/sharp-libvips-linux-x64": "npm:1.1.0" dependenciesMeta: @@ -437,9 +437,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-arm64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.1" +"@img/sharp-linuxmusl-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.2" dependencies: "@img/sharp-libvips-linuxmusl-arm64": "npm:1.1.0" dependenciesMeta: @@ -449,9 +449,9 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-linuxmusl-x64@npm:0.34.1" +"@img/sharp-linuxmusl-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.2" dependencies: "@img/sharp-libvips-linuxmusl-x64": "npm:1.1.0" dependenciesMeta: @@ -461,25 +461,32 @@ __metadata: languageName: node linkType: hard -"@img/sharp-wasm32@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-wasm32@npm:0.34.1" +"@img/sharp-wasm32@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-wasm32@npm:0.34.2" dependencies: - "@emnapi/runtime": "npm:^1.4.0" + "@emnapi/runtime": "npm:^1.4.3" conditions: cpu=wasm32 languageName: node linkType: hard -"@img/sharp-win32-ia32@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-win32-ia32@npm:0.34.1" +"@img/sharp-win32-arm64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-win32-arm64@npm:0.34.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-win32-ia32@npm:0.34.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@img/sharp-win32-x64@npm:0.34.1": - version: 0.34.1 - resolution: "@img/sharp-win32-x64@npm:0.34.1" +"@img/sharp-win32-x64@npm:0.34.2": + version: 0.34.2 + resolution: "@img/sharp-win32-x64@npm:0.34.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -535,7 +542,7 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.10, @napi-rs/wasm-runtime@npm:^0.2.9": +"@napi-rs/wasm-runtime@npm:^0.2.10": version: 0.2.10 resolution: "@napi-rs/wasm-runtime@npm:0.2.10" dependencies: @@ -659,9 +666,9 @@ __metadata: languageName: node linkType: hard -"@prisma/client@npm:^6.8.2": - version: 6.8.2 - resolution: "@prisma/client@npm:6.8.2" +"@prisma/client@npm:^6.9.0": + version: 6.9.0 + resolution: "@prisma/client@npm:6.9.0" peerDependencies: prisma: "*" typescript: ">=5.1.0" @@ -670,62 +677,62 @@ __metadata: optional: true typescript: optional: true - checksum: 10c0/5ce12e4a83ece542df80195f6642e24224de8f94c2f2fd26527ca6b3a2573ea9798b5d23eac8518d8f268be19f3856516ad4e08c9bc0a4df4356a5faab879db6 + checksum: 10c0/4877d9d0f93ca404c066ce0536f4c2180a8a16a2b0ade8f15df9dd5286c74db55c5a99f4632f13b32045b966cb5f01e010806edda865aa22bbb0aef65f8b6e9f languageName: node linkType: hard -"@prisma/config@npm:6.8.2": - version: 6.8.2 - resolution: "@prisma/config@npm:6.8.2" +"@prisma/config@npm:6.9.0": + version: 6.9.0 + resolution: "@prisma/config@npm:6.9.0" dependencies: jiti: "npm:2.4.2" - checksum: 10c0/2d25860c3b88e01fe6e353964d9ae07228003971894f2b5a671c6e126941a551c285b73b64c77c8e3819916a9a952a4366763204c93027b1964263908bbaa09f + checksum: 10c0/749c801e31d5284d78ce0df9a41b07a2a1d756d966b857472c2dcbfa1239da3cf8e60f3522d42d201fa08594b8ecbb88816f9381b521230ddac992a9bc566445 languageName: node linkType: hard -"@prisma/debug@npm:6.8.2": - version: 6.8.2 - resolution: "@prisma/debug@npm:6.8.2" - checksum: 10c0/5843db8a502aa379fe6f7e69d887a3bd35a13c379dd09e28ba93e506807eb2190a12c6a339232d0c64f94d064cd54de70365a92a597b62484bfdb1e37c03f85b +"@prisma/debug@npm:6.9.0": + version: 6.9.0 + resolution: "@prisma/debug@npm:6.9.0" + checksum: 10c0/abb6822299285d6847d7f86723ad4c222a828cb0cec0086bdf616c9d92e3c2c48b9f00d1b49655c489bbe6ad1a33cf4818c468ea8448b58a3233d67a967bb0ee languageName: node linkType: hard -"@prisma/engines-version@npm:6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e": - version: 6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e - resolution: "@prisma/engines-version@npm:6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e" - checksum: 10c0/3ae98f6028a1e7c2bca90d92ae60391d77d0b587f03a84818742c65ae7b4ca71d9ddd4fcff578ed9696c757061dd8ee78262e60a32d7ed804ced3e190c76bc6b +"@prisma/engines-version@npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e": + version: 6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e + resolution: "@prisma/engines-version@npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e" + checksum: 10c0/a81ba1a619d3945ef7840d28f4b6eb0ed345aac86011d03ec8b9388129273e70887a6ece8052195a8d909bfce8f469cdab2a3fe079fe89d432d5510f35ebfa0b languageName: node linkType: hard -"@prisma/engines@npm:6.8.2": - version: 6.8.2 - resolution: "@prisma/engines@npm:6.8.2" +"@prisma/engines@npm:6.9.0": + version: 6.9.0 + resolution: "@prisma/engines@npm:6.9.0" dependencies: - "@prisma/debug": "npm:6.8.2" - "@prisma/engines-version": "npm:6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e" - "@prisma/fetch-engine": "npm:6.8.2" - "@prisma/get-platform": "npm:6.8.2" - checksum: 10c0/6eed0481b42d00f20c4c875e6d1cdd5a2ad2c6b48f5d9e5e63ee91b236ebc943194fe47536fee2a2a2b803b238a96d5c003d1e8aacc461c1dbdacf07fe01bc78 + "@prisma/debug": "npm:6.9.0" + "@prisma/engines-version": "npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e" + "@prisma/fetch-engine": "npm:6.9.0" + "@prisma/get-platform": "npm:6.9.0" + checksum: 10c0/62fb62141f277376a3194637a1e6123c4eecdd54df89138d0694813dc5d3007b6cec0bcd15dceb76d383f9379f844dffd0a62de87a0c5c761c61d46c91a7c6ba languageName: node linkType: hard -"@prisma/fetch-engine@npm:6.8.2": - version: 6.8.2 - resolution: "@prisma/fetch-engine@npm:6.8.2" +"@prisma/fetch-engine@npm:6.9.0": + version: 6.9.0 + resolution: "@prisma/fetch-engine@npm:6.9.0" dependencies: - "@prisma/debug": "npm:6.8.2" - "@prisma/engines-version": "npm:6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e" - "@prisma/get-platform": "npm:6.8.2" - checksum: 10c0/9deb1be77bccd70531a9d1bab7f058655e6c02f4d277d2d23a2ec77e968ba8e252813ccef4e4a33c8ef94724bbbd0fa0fd1548dcf723b1e7ec760f9f599a6804 + "@prisma/debug": "npm:6.9.0" + "@prisma/engines-version": "npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e" + "@prisma/get-platform": "npm:6.9.0" + checksum: 10c0/cdab9a5e1e0b8f52cb32dfacb8fff4b50cccb64235a8fdc06ae1930089f6acf28cd6b4af4bb306aae25773db76db2d2d378244d23f7b491acf6f3f8d135e0ef6 languageName: node linkType: hard -"@prisma/get-platform@npm:6.8.2": - version: 6.8.2 - resolution: "@prisma/get-platform@npm:6.8.2" +"@prisma/get-platform@npm:6.9.0": + version: 6.9.0 + resolution: "@prisma/get-platform@npm:6.9.0" dependencies: - "@prisma/debug": "npm:6.8.2" - checksum: 10c0/3bab5b39d03c884bd23b69f7ee9092d060aa60bd737293529bb21282a6abdb690a208af49eb5644b509d402e863f09512a2ccf53bdde8860de8a2825d6f3d122 + "@prisma/debug": "npm:6.9.0" + checksum: 10c0/e70bd4e9733d959b7dd5614d4f6f7af6d9f135e1719ddcf91a6c8baa4235882674b46f1c965e63ecfb7251327e7e670b0396d11c0a9c28648fc430de843da806 languageName: node linkType: hard @@ -1614,9 +1621,9 @@ __metadata: linkType: hard "@types/estree@npm:^1.0.6": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 languageName: node linkType: hard @@ -1662,80 +1669,104 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.32.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.32.1" + version: 8.33.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.33.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/type-utils": "npm:8.32.1" - "@typescript-eslint/utils": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" + "@typescript-eslint/scope-manager": "npm:8.33.1" + "@typescript-eslint/type-utils": "npm:8.33.1" + "@typescript-eslint/utils": "npm:8.33.1" + "@typescript-eslint/visitor-keys": "npm:8.33.1" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + "@typescript-eslint/parser": ^8.33.1 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/29dbafc1f02e1167e6d1e92908de6bf7df1cc1fc9ae1de3f4d4abf5d2b537be16b173bcd05770270529eb2fd17a3ac63c2f40d308f7fbbf6d6f286ba564afd64 + checksum: 10c0/35544068f175ca25296b42d0905065b40653a92c62e55414be68f62ddab580d7d768ee3c1276195fd8b8dd49de738ab7b41b8685e6fe2cd341cfca7320569166 languageName: node linkType: hard "@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.32.1 - resolution: "@typescript-eslint/parser@npm:8.32.1" + version: 8.33.1 + resolution: "@typescript-eslint/parser@npm:8.33.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/typescript-estree": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" + "@typescript-eslint/scope-manager": "npm:8.33.1" + "@typescript-eslint/types": "npm:8.33.1" + "@typescript-eslint/typescript-estree": "npm:8.33.1" + "@typescript-eslint/visitor-keys": "npm:8.33.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/01095f5b6e0a2e0631623be3f44be0f2960ceb24de33b64cb790e24a1468018d2b4d6874d1fa08a4928c2a02f208dd66cbc49735c7e8b54d564e420daabf84d1 + checksum: 10c0/be1c1313c342d956f5adfbd56f79865894cc9cabf93992515a690559c3758538868270671b222f90e4cabc2dcab82256aeb3ccea7502de9cc69e47b9b17ed45f languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/scope-manager@npm:8.32.1" +"@typescript-eslint/project-service@npm:8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/project-service@npm:8.33.1" dependencies: - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - checksum: 10c0/d2cb1f7736388972137d6e510b2beae4bac033fcab274e04de90ebba3ce466c71fe47f1795357e032e4a6c8b2162016b51b58210916c37212242c82d35352e9f + "@typescript-eslint/tsconfig-utils": "npm:^8.33.1" + "@typescript-eslint/types": "npm:^8.33.1" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/b2ff7653aef4648bdff8aafc69b9de434184827216709f8a36427536ac7082a8adf1c5ac12a0a2bb023b46dfad8f6fee238028acc94af622956af7f22362de6f languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/type-utils@npm:8.32.1" +"@typescript-eslint/scope-manager@npm:8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/scope-manager@npm:8.33.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.32.1" - "@typescript-eslint/utils": "npm:8.32.1" + "@typescript-eslint/types": "npm:8.33.1" + "@typescript-eslint/visitor-keys": "npm:8.33.1" + checksum: 10c0/03a6fd2b0a8ebeb62083a8f51658f0c42391cbfb632411542569a3a227d53bdb0332026ef4d5adc4780e5350d1d8b89e5b19667ed899afd26506e60c70192692 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.33.1, @typescript-eslint/tsconfig-utils@npm:^8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.33.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/242e8f271d2e6e51446d337e1e59e8c91b66c0241da0fb861f536eb86cc3b53d1727c41e12e1ba070fa2451c8bc517c1ec50decaffa92a7c612b2aba29872777 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/type-utils@npm:8.33.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.33.1" + "@typescript-eslint/utils": "npm:8.33.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/f10186340ce194681804d9a57feb6d8d6c3adbd059c70df58f4656b0d9efd412fb0c2d80c182f9db83bad1a301754e0c24fe26f3354bef3a1795ab9c835cb763 + checksum: 10c0/59843eeb7c652306d130104d7cb0f7dea1cc95a6cf6345609efbae130f24e3c4a9472780332af4247337e152b7955540b15fd9b907c04a5d265b888139818266 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/types@npm:8.32.1" - checksum: 10c0/86f59b29c12e7e8abe45a1659b6fae5e7b0cfaf09ab86dd596ed9d468aa61082bbccd509d25f769b197fbfdf872bbef0b323a2ded6ceaca351f7c679f1ba3bd3 +"@typescript-eslint/types@npm:8.33.1, @typescript-eslint/types@npm:^8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/types@npm:8.33.1" + checksum: 10c0/3083c184c882475eed1f9d1a8961dad30ef834c662bc826ff9a959ff1eed49aad21a73b2b93c4062799feafff5f5f24aebb1df17e198808aa19d4c8de1e64095 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.32.1" +"@typescript-eslint/typescript-estree@npm:8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.33.1" dependencies: - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" + "@typescript-eslint/project-service": "npm:8.33.1" + "@typescript-eslint/tsconfig-utils": "npm:8.33.1" + "@typescript-eslint/types": "npm:8.33.1" + "@typescript-eslint/visitor-keys": "npm:8.33.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -1744,152 +1775,152 @@ __metadata: ts-api-utils: "npm:^2.1.0" peerDependencies: typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/b5ae0d91ef1b46c9f3852741e26b7a14c28bb58ee8a283b9530ac484332ca58a7216b9d22eda23c5449b5fd69c6e4601ef3ebbd68e746816ae78269036c08cda + checksum: 10c0/293a93d25046e05fdc3887232191c3f3ee771c0f5b1426d63deaf0541db1cb80b4307a80805c78b092206c9b267884a7e6b5905dc1b3c26f28bb4de47fd9ee8f languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/utils@npm:8.32.1" +"@typescript-eslint/utils@npm:8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/utils@npm:8.33.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/typescript-estree": "npm:8.32.1" + "@typescript-eslint/scope-manager": "npm:8.33.1" + "@typescript-eslint/types": "npm:8.33.1" + "@typescript-eslint/typescript-estree": "npm:8.33.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/a2b90c0417cd3a33c6e22f9cc28c356f251bb8928ef1d25e057feda007d522d281bdc37a9a0d05b70312f00a7b3f350ca06e724867025ea85bba5a4c766732e7 + checksum: 10c0/12263df6eb32e8175236ad899687c062b50cfe4a0e66307d25ad2bf85a3e911faacbfbea4df180a59ebb5913fe1cc1f53fe3914695c7d802dd318bbc846fea26 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.32.1" +"@typescript-eslint/visitor-keys@npm:8.33.1": + version: 8.33.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.33.1" dependencies: - "@typescript-eslint/types": "npm:8.32.1" + "@typescript-eslint/types": "npm:8.33.1" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/9c05053dfd048f681eb96e09ceefa8841a617b8b5950eea05e0844b38fe3510a284eb936324caa899c3ceb4bc23efe56ac01437fab378ac1beeb1c6c00404978 + checksum: 10c0/3eb99072e7c2741d5dfc38945d1e7617b15ed10d06b24658a6e919e4153983b3d3c5f5f775ce140f83a84dbde219948d187de97defb09c1a91f3cf0a96704a94 languageName: node linkType: hard -"@unrs/resolver-binding-darwin-arm64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.2" +"@unrs/resolver-binding-darwin-arm64@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.11" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-darwin-x64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.2" +"@unrs/resolver-binding-darwin-x64@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.11" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-freebsd-x64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.2" +"@unrs/resolver-binding-freebsd-x64@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.11" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2" +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.11" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2" +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.11" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.11" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.11" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.11" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.11" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.11" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.11" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.11" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-x64-musl@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.11" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-wasm32-wasi@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.2" +"@unrs/resolver-binding-wasm32-wasi@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.11" dependencies: - "@napi-rs/wasm-runtime": "npm:^0.2.9" + "@napi-rs/wasm-runtime": "npm:^0.2.10" conditions: cpu=wasm32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.11" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.11" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.11": + version: 1.7.11 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.11" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1967,16 +1998,18 @@ __metadata: linkType: hard "array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - is-string: "npm:^1.0.7" - checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 + es-abstract: "npm:^1.24.0" + es-object-atoms: "npm:^1.1.1" + get-intrinsic: "npm:^1.3.0" + is-string: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856 languageName: node linkType: hard @@ -2182,9 +2215,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001718 - resolution: "caniuse-lite@npm:1.0.30001718" - checksum: 10c0/67f9ad09bc16443e28d14f265d6e468480cd8dc1900d0d8b982222de80c699c4f2306599c3da8a3fa7139f110d4b30d49dbac78f215470f479abb6ffe141d5d3 + version: 1.0.30001721 + resolution: "caniuse-lite@npm:1.0.30001721" + checksum: 10c0/fa3a8926899824b385279f1f886fe34c5efb1321c9ece1b9df25c8d567a2706db8450cc5b4d969e769e641593e08ea644909324aba93636a43e4949a75f81c4c languageName: node linkType: hard @@ -2458,26 +2491,26 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": - version: 1.23.9 - resolution: "es-abstract@npm:1.23.9" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" dependencies: array-buffer-byte-length: "npm:^1.0.2" arraybuffer.prototype.slice: "npm:^1.0.4" available-typed-arrays: "npm:^1.0.7" call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" + call-bound: "npm:^1.0.4" data-view-buffer: "npm:^1.0.2" data-view-byte-length: "npm:^1.0.2" data-view-byte-offset: "npm:^1.0.1" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" + es-object-atoms: "npm:^1.1.1" es-set-tostringtag: "npm:^2.1.0" es-to-primitive: "npm:^1.3.0" function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.0" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" get-symbol-description: "npm:^1.1.0" globalthis: "npm:^1.0.4" gopd: "npm:^1.2.0" @@ -2489,21 +2522,24 @@ __metadata: is-array-buffer: "npm:^3.0.5" is-callable: "npm:^1.2.7" is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" is-shared-array-buffer: "npm:^1.0.4" is-string: "npm:^1.1.1" is-typed-array: "npm:^1.1.15" - is-weakref: "npm:^1.1.0" + is-weakref: "npm:^1.1.1" math-intrinsics: "npm:^1.1.0" - object-inspect: "npm:^1.13.3" + object-inspect: "npm:^1.13.4" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.7" own-keys: "npm:^1.0.1" - regexp.prototype.flags: "npm:^1.5.3" + regexp.prototype.flags: "npm:^1.5.4" safe-array-concat: "npm:^1.1.3" safe-push-apply: "npm:^1.0.0" safe-regex-test: "npm:^1.1.0" set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" string.prototype.trim: "npm:^1.2.10" string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" @@ -2512,8 +2548,8 @@ __metadata: typed-array-byte-offset: "npm:^1.0.4" typed-array-length: "npm:^1.0.7" unbox-primitive: "npm:^1.1.0" - which-typed-array: "npm:^1.1.18" - checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b + which-typed-array: "npm:^1.1.19" + checksum: 10c0/b256e897be32df5d382786ce8cce29a1dd8c97efbab77a26609bd70f2ed29fbcfc7a31758cb07488d532e7ccccdfca76c1118f2afe5a424cdc05ca007867c318 languageName: node linkType: hard @@ -2950,14 +2986,14 @@ __metadata: linkType: hard "fdir@npm:^6.4.4": - version: 6.4.4 - resolution: "fdir@npm:6.4.4" + version: 6.4.5 + resolution: "fdir@npm:6.4.5" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/6ccc33be16945ee7bc841e1b4178c0b4cf18d3804894cb482aa514651c962a162f96da7ffc6ebfaf0df311689fb70091b04dd6caffe28d56b9ebdc0e7ccadfdd + checksum: 10c0/5d63330a1b97165e9b0fb20369fafc7cf826bc4b3e374efcb650bc77d7145ac01193b5da1a7591eab89ae6fd6b15cdd414085910b2a2b42296b1480c9f2677af languageName: node linkType: hard @@ -3090,11 +3126,11 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.10.0": - version: 4.10.0 - resolution: "get-tsconfig@npm:4.10.0" + version: 4.10.1 + resolution: "get-tsconfig@npm:4.10.1" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/c9b5572c5118923c491c04285c73bd55b19e214992af957c502a3be0fc0043bb421386ffd45ca3433c0a7fba81221ca300479e8393960acf15d0ed4563f38a86 + checksum: 10c0/7f8e3dabc6a49b747920a800fb88e1952fef871cdf51b79e98db48275a5de6cdaf499c55ee67df5fa6fe7ce65f0063e26de0f2e53049b408c585aa74d39ffa21 languageName: node linkType: hard @@ -3219,9 +3255,9 @@ __metadata: linkType: hard "ignore@npm:^7.0.0": - version: 7.0.4 - resolution: "ignore@npm:7.0.4" - checksum: 10c0/90e1f69ce352b9555caecd9cbfd07abe7626d312a6f90efbbb52c7edca6ea8df065d66303863b30154ab1502afb2da8bc59d5b04e1719a52ef75bbf675c488eb + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d languageName: node linkType: hard @@ -3393,6 +3429,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + languageName: node + linkType: hard + "is-number-object@npm:^1.1.1": version: 1.1.1 resolution: "is-number-object@npm:1.1.1" @@ -3438,7 +3481,7 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.7, is-string@npm:^1.1.1": +"is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" dependencies: @@ -3475,7 +3518,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": version: 1.1.1 resolution: "is-weakref@npm:1.1.1" dependencies: @@ -3808,7 +3851,7 @@ __metadata: "@fortawesome/free-regular-svg-icons": "npm:^6.7.2" "@fortawesome/free-solid-svg-icons": "npm:^6.7.2" "@fortawesome/react-fontawesome": "npm:^0.2.2" - "@prisma/client": "npm:^6.8.2" + "@prisma/client": "npm:^6.9.0" "@radix-ui/react-dropdown-menu": "npm:^2.1.14" "@radix-ui/react-hover-card": "npm:^1.1.13" "@radix-ui/react-label": "npm:^2.1.6" @@ -3834,7 +3877,7 @@ __metadata: next-themes: "npm:^0.4.6" postcss: "npm:8.5.4" prettier: "npm:3.5.3" - prisma: "npm:6.8.2" + prisma: "npm:6.9.0" react: "npm:^19.0.0" react-dom: "npm:^19.0.0" tailwind-merge: "npm:^3.2.0" @@ -3918,7 +3961,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.11, nanoid@npm:^3.3.6, nanoid@npm:^3.3.8": +"nanoid@npm:^3.3.11, nanoid@npm:^3.3.6": version: 3.3.11 resolution: "nanoid@npm:3.3.11" bin: @@ -4050,7 +4093,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.3": +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 @@ -4237,7 +4280,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.4": +"postcss@npm:8.5.4, postcss@npm:^8.4.41": version: 8.5.4 resolution: "postcss@npm:8.5.4" dependencies: @@ -4248,17 +4291,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.41": - version: 8.5.3 - resolution: "postcss@npm:8.5.3" - dependencies: - nanoid: "npm:^3.3.8" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 - languageName: node - linkType: hard - "preact-render-to-string@npm:6.5.11": version: 6.5.11 resolution: "preact-render-to-string@npm:6.5.11" @@ -4291,12 +4323,12 @@ __metadata: languageName: node linkType: hard -"prisma@npm:6.8.2": - version: 6.8.2 - resolution: "prisma@npm:6.8.2" +"prisma@npm:6.9.0": + version: 6.9.0 + resolution: "prisma@npm:6.9.0" dependencies: - "@prisma/config": "npm:6.8.2" - "@prisma/engines": "npm:6.8.2" + "@prisma/config": "npm:6.9.0" + "@prisma/engines": "npm:6.9.0" peerDependencies: typescript: ">=5.1.0" peerDependenciesMeta: @@ -4304,7 +4336,7 @@ __metadata: optional: true bin: prisma: build/index.js - checksum: 10c0/0b7a889a8da8207a4957ff256bd5baf029260f067585527058a46ba4054a13b47ab90bd0ebae1cf74db6e99b3fa99f065a83384fe5cd9ad3ecf07228756eff79 + checksum: 10c0/58217bca255ba01ecc23722b9f25f37e3c68780d3801ddd3438fc7987cd6abad5759b87d9a851725516ef035330e58ab3d56362c426f19cd22d2dccdb5bccb41 languageName: node linkType: hard @@ -4368,8 +4400,8 @@ __metadata: linkType: hard "react-remove-scroll@npm:^2.6.3": - version: 2.7.0 - resolution: "react-remove-scroll@npm:2.7.0" + version: 2.7.1 + resolution: "react-remove-scroll@npm:2.7.1" dependencies: react-remove-scroll-bar: "npm:^2.3.7" react-style-singleton: "npm:^2.2.3" @@ -4382,7 +4414,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/cf8b9a1b0808cafe9f2b1fbb2ab56e3efff7f311fba847f26154b972a681c003c288af517cf48d0b68704c2be0d3d73152e7ec2cc8590fa495135b0aac07a871 + checksum: 10c0/7ad8f6ffd3e2aedf9b3d79f0c9088a9a3d7c5332d80c923427a6d97fe0626fb4cb33a6d9174d19fad57d860be69c96f68497a0619c3a8af0e8a5332e49bdde31 languageName: node linkType: hard @@ -4425,7 +4457,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.3": +"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -4571,7 +4603,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.0, semver@npm:^7.7.1": +"semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -4618,11 +4650,11 @@ __metadata: linkType: hard "sharp@npm:^0.34.1": - version: 0.34.1 - resolution: "sharp@npm:0.34.1" + version: 0.34.2 + resolution: "sharp@npm:0.34.2" dependencies: - "@img/sharp-darwin-arm64": "npm:0.34.1" - "@img/sharp-darwin-x64": "npm:0.34.1" + "@img/sharp-darwin-arm64": "npm:0.34.2" + "@img/sharp-darwin-x64": "npm:0.34.2" "@img/sharp-libvips-darwin-arm64": "npm:1.1.0" "@img/sharp-libvips-darwin-x64": "npm:1.1.0" "@img/sharp-libvips-linux-arm": "npm:1.1.0" @@ -4632,18 +4664,19 @@ __metadata: "@img/sharp-libvips-linux-x64": "npm:1.1.0" "@img/sharp-libvips-linuxmusl-arm64": "npm:1.1.0" "@img/sharp-libvips-linuxmusl-x64": "npm:1.1.0" - "@img/sharp-linux-arm": "npm:0.34.1" - "@img/sharp-linux-arm64": "npm:0.34.1" - "@img/sharp-linux-s390x": "npm:0.34.1" - "@img/sharp-linux-x64": "npm:0.34.1" - "@img/sharp-linuxmusl-arm64": "npm:0.34.1" - "@img/sharp-linuxmusl-x64": "npm:0.34.1" - "@img/sharp-wasm32": "npm:0.34.1" - "@img/sharp-win32-ia32": "npm:0.34.1" - "@img/sharp-win32-x64": "npm:0.34.1" + "@img/sharp-linux-arm": "npm:0.34.2" + "@img/sharp-linux-arm64": "npm:0.34.2" + "@img/sharp-linux-s390x": "npm:0.34.2" + "@img/sharp-linux-x64": "npm:0.34.2" + "@img/sharp-linuxmusl-arm64": "npm:0.34.2" + "@img/sharp-linuxmusl-x64": "npm:0.34.2" + "@img/sharp-wasm32": "npm:0.34.2" + "@img/sharp-win32-arm64": "npm:0.34.2" + "@img/sharp-win32-ia32": "npm:0.34.2" + "@img/sharp-win32-x64": "npm:0.34.2" color: "npm:^4.2.3" - detect-libc: "npm:^2.0.3" - semver: "npm:^7.7.1" + detect-libc: "npm:^2.0.4" + semver: "npm:^7.7.2" dependenciesMeta: "@img/sharp-darwin-arm64": optional: true @@ -4681,11 +4714,13 @@ __metadata: optional: true "@img/sharp-wasm32": optional: true + "@img/sharp-win32-arm64": + optional: true "@img/sharp-win32-ia32": optional: true "@img/sharp-win32-x64": optional: true - checksum: 10c0/50f5ffb18a775ec9f0d4d39bdc4356fdfa1fc97e69d8800d68e960b93b1c0cce7ee5242225d3b86ffae5801890fd7f93acfee00018f247e7df70fee2b4de7945 + checksum: 10c0/43967dbaaf1e1140a2f43b51d54762cc1bba01648392e355028568e4838833bf1abc2a96c09b893e6407b0c59a2c271d66e8d56a582aa6c951d476ab83a37fba languageName: node linkType: hard @@ -4776,6 +4811,16 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + internal-slot: "npm:^1.1.0" + checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 + languageName: node + linkType: hard + "streamsearch@npm:^1.1.0": version: 1.1.0 resolution: "streamsearch@npm:1.1.0" @@ -4924,9 +4969,9 @@ __metadata: linkType: hard "tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + version: 2.2.2 + resolution: "tapable@npm:2.2.2" + checksum: 10c0/8ad130aa705cab6486ad89e42233569a1fb1ff21af115f59cebe9f2b45e9e7995efceaa9cc5062510cdb4ec673b527924b2ab812e3579c55ad659ae92117011e languageName: node linkType: hard @@ -4945,12 +4990,12 @@ __metadata: linkType: hard "tinyglobby@npm:^0.2.13": - version: 0.2.13 - resolution: "tinyglobby@npm:0.2.13" + version: 0.2.14 + resolution: "tinyglobby@npm:0.2.14" dependencies: fdir: "npm:^6.4.4" picomatch: "npm:^4.0.2" - checksum: 10c0/ef07dfaa7b26936601d3f6d999f7928a4d1c6234c5eb36896bb88681947c0d459b7ebe797022400e555fe4b894db06e922b95d0ce60cb05fd827a0a66326b18c + checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6 languageName: node linkType: hard @@ -5100,26 +5145,26 @@ __metadata: linkType: hard "unrs-resolver@npm:^1.6.2": - version: 1.7.2 - resolution: "unrs-resolver@npm:1.7.2" + version: 1.7.11 + resolution: "unrs-resolver@npm:1.7.11" dependencies: - "@unrs/resolver-binding-darwin-arm64": "npm:1.7.2" - "@unrs/resolver-binding-darwin-x64": "npm:1.7.2" - "@unrs/resolver-binding-freebsd-x64": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm64-musl": "npm:1.7.2" - "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.7.2" - "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-x64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-x64-musl": "npm:1.7.2" - "@unrs/resolver-binding-wasm32-wasi": "npm:1.7.2" - "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.7.2" - "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.7.2" - "@unrs/resolver-binding-win32-x64-msvc": "npm:1.7.2" + "@unrs/resolver-binding-darwin-arm64": "npm:1.7.11" + "@unrs/resolver-binding-darwin-x64": "npm:1.7.11" + "@unrs/resolver-binding-freebsd-x64": "npm:1.7.11" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.7.11" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.7.11" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.7.11" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.7.11" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.7.11" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.7.11" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.7.11" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.7.11" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.7.11" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.7.11" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.7.11" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.7.11" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.7.11" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.7.11" napi-postinstall: "npm:^0.2.2" dependenciesMeta: "@unrs/resolver-binding-darwin-arm64": @@ -5156,7 +5201,7 @@ __metadata: optional: true "@unrs/resolver-binding-win32-x64-msvc": optional: true - checksum: 10c0/c293db95c59b08e33f3bfb00042120fb90fd5448bd1790cd2dc779a13eb6062dddf04a91b72c73d3635b0c539552435675ce816fa52e66bb0cd7b7e5a2f6399c + checksum: 10c0/37e6caf2884b7ce65f77fc5b945997b94523656d477ae0e67fb8df970939930b674091f3fac6beee93b0370fa64a925ad707edc76897aa8cb14866efbe4a6693 languageName: node linkType: hard @@ -5246,7 +5291,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": version: 1.1.19 resolution: "which-typed-array@npm:1.1.19" dependencies: From a2a5eee49e0a5fbfac44535babe81b6409d65052 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Wed, 21 May 2025 14:29:00 +0200 Subject: [PATCH 074/136] chore: add development docker environment adds a docker environment for development. can be started using: `docker compose -f docker-compose.dev.yml up --watch --build` --- Dockerfile.dev | 17 +++++++++++++++++ docker-compose.dev.yml | 27 +++++++++++++++++++++++++++ entrypoint.dev.sh | 10 ++++++++++ package.json | 3 ++- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.dev create mode 100644 docker-compose.dev.yml create mode 100644 entrypoint.dev.sh diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..e95e39a --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,17 @@ +FROM node:22-alpine@sha256:152270cd4bd094d216a84cbc3c5eb1791afb05af00b811e2f0f04bdc6c473602 + +WORKDIR /app + +RUN corepack enable +COPY package.json yarn.lock .yarnrc.yml ./ +RUN yarn install --frozen-lockfile + +COPY . . + +ENV NODE_ENV=development +ENV NEXT_TELEMETRY_DISABLED=1 + +EXPOSE 3000 +ENV HOSTNAME="0.0.0.0" + +CMD ["/bin/ash", "entrypoint.dev.sh"] \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..3aa4174 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,27 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - '3000:3000' + environment: + - AUTH_SECRET=secret + - AUTH_URL=http://localhost:3000 + - DATABASE_URL=file:/data/db.sqlite + env_file: + - .env.local + volumes: + - ./data:/data + develop: + watch: + - action: sync + path: ./src + target: /app/src + ignore: + - node_modules/ + - action: rebuild + path: package.json + - action: sync+restart + path: prisma + target: /app/prisma diff --git a/entrypoint.dev.sh b/entrypoint.dev.sh new file mode 100644 index 0000000..ec103bf --- /dev/null +++ b/entrypoint.dev.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +echo "Running start script with user $(whoami) and NODE_ENV $NODE_ENV" +if [ -d "prisma" ]; then + echo "Syncing Prisma database" + yarn prisma:generate + yarn prisma:db:push +fi + +exec yarn dev diff --git a/package.json b/package.json index cf0b1fa..bbd8516 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "prisma:generate": "dotenv -e .env.local -- prisma generate", "prisma:studio": "dotenv -e .env.local -- prisma studio", "prisma:db:push": "dotenv -e .env.local -- prisma db push", - "prisma:migrate:reset": "dotenv -e .env.local -- prisma migrate reset" + "prisma:migrate:reset": "dotenv -e .env.local -- prisma migrate reset", + "dev_container": "docker compose -f docker-compose.dev.yml up --watch --build" }, "dependencies": { "@auth/prisma-adapter": "^2.9.1", From 16cde64761582cdb69d25f474de3759d95bc3412 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Wed, 21 May 2025 14:32:20 +0200 Subject: [PATCH 075/136] docs: add note about docker development environment --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 1f474b5..e9319f3 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,14 @@ This project is built with a modern tech stack: password: password ``` +**Docker Development Environment:** + +- The docker development environment can be started with the following command: + +```bash +yarn dev_container +``` + **Self-Hosting with Docker (Planned):** - A Docker image and `docker-compose.yml` file will be provided in the future to allow for easy self-hosting of the MeetUP application. This setup will also include database services. Instructions will be updated here once available. From 0c93778c5a4bc3856da91f33ecf27d9b7b846d34 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Jun 2025 09:00:24 +0000 Subject: [PATCH 076/136] chore(deps): update node.js to 41e4389 --- Dockerfile.dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index e95e39a..4467c5f 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM node:22-alpine@sha256:152270cd4bd094d216a84cbc3c5eb1791afb05af00b811e2f0f04bdc6c473602 +FROM node:22-alpine@sha256:41e4389f3d988d2ed55392df4db1420ad048ae53324a8e2b7c6d19508288107e WORKDIR /app From d4de7876cc0df7936ee06f87bbe229774ed032f9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Jun 2025 21:01:08 +0000 Subject: [PATCH 077/136] chore(deps): update dependency @types/react to v19.1.7 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bbd8516..b21bc2c 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@eslint/eslintrc": "3.3.1", "@tailwindcss/postcss": "4.1.8", "@types/node": "22.15.30", - "@types/react": "19.1.6", + "@types/react": "19.1.7", "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", "eslint": "9.28.0", diff --git a/yarn.lock b/yarn.lock index 4c79534..b8999d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1659,12 +1659,12 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:19.1.6": - version: 19.1.6 - resolution: "@types/react@npm:19.1.6" +"@types/react@npm:19.1.7": + version: 19.1.7 + resolution: "@types/react@npm:19.1.7" dependencies: csstype: "npm:^3.0.2" - checksum: 10c0/8b10b198e28997b3c57559750f8bcf5ae7b33c554b16b6f4fe2ece1d4de6a2fc8cb53e7effe08ec9cb939d2f479eb97c5e08aac2cf83b10a90164fe451cc8ea2 + checksum: 10c0/3bb8fb865debad4328b0d623e1c669f2ee90e9302638a64e65a0a1c61efca4f4ef91f58b55ff94075358c190d80bb8472a5823c6901d8cdc9009dd436a1dcab1 languageName: node linkType: hard @@ -3863,7 +3863,7 @@ __metadata: "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.8" "@types/node": "npm:22.15.30" - "@types/react": "npm:19.1.6" + "@types/react": "npm:19.1.7" "@types/react-dom": "npm:19.1.6" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" From 3569ccc18e57063f403277378b4e337b3c1da258 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 10 Jun 2025 03:01:07 +0000 Subject: [PATCH 078/136] chore(deps): update dependency @types/node to v22.15.31 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b21bc2c..dd8c545 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@eslint/eslintrc": "3.3.1", "@tailwindcss/postcss": "4.1.8", - "@types/node": "22.15.30", + "@types/node": "22.15.31", "@types/react": "19.1.7", "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", diff --git a/yarn.lock b/yarn.lock index b8999d1..cbe92bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1641,12 +1641,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.30": - version: 22.15.30 - resolution: "@types/node@npm:22.15.30" +"@types/node@npm:22.15.31": + version: 22.15.31 + resolution: "@types/node@npm:22.15.31" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/ca330ac0e7fd502686d6df115fcc606aba46fd334220f749bbba2f639accdadcb23f7900603ceccdc8240be736739cad5c0b87c0fa92c9255a4dff245f07d664 + checksum: 10c0/ef7d5dc890da41cfd554d35ab8998bc18be9e3a0caa642e720599ac4410a94a4879766e52b3c9cafa06c66b7b8aebdc51f322cf67df23a6489927890196a316d languageName: node linkType: hard @@ -3862,7 +3862,7 @@ __metadata: "@radix-ui/react-switch": "npm:^1.2.4" "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.8" - "@types/node": "npm:22.15.30" + "@types/node": "npm:22.15.31" "@types/react": "npm:19.1.7" "@types/react-dom": "npm:19.1.6" class-variance-authority: "npm:^0.7.1" From abae5c74d50e0ef058dcd8589ac5704938bfaa01 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 10 Jun 2025 21:00:48 +0000 Subject: [PATCH 079/136] fix(deps): update dependency tailwind-merge to v3.3.1 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cbe92bd..0f17374 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4955,9 +4955,9 @@ __metadata: linkType: hard "tailwind-merge@npm:^3.2.0": - version: 3.3.0 - resolution: "tailwind-merge@npm:3.3.0" - checksum: 10c0/a50cd141100486f98541dfab3705712af5860556689b7496dc6b0284374f02d12d5471f0f40035f6bb8b1c749c422060a1f3e5f8900057d8a7786b111c8472e6 + version: 3.3.1 + resolution: "tailwind-merge@npm:3.3.1" + checksum: 10c0/b84c6a78d4669fa12bf5ab8f0cdc4400a3ce0a7c006511af4af4be70bb664a27466dbe13ee9e3b31f50ddf6c51d380e8192ce0ec9effce23ca729d71a9f63818 languageName: node linkType: hard From 6c479e80d6c585631f4c0bb053e8dad75f67e209 Mon Sep 17 00:00:00 2001 From: Micha Date: Sun, 8 Jun 2025 00:53:27 +0200 Subject: [PATCH 080/136] feat: enhance login form with sign-up input-fields and autocomplete attributes --- src/components/labeled-input.tsx | 3 + src/components/user/login-form.tsx | 88 ++++++++++++++++++++++++------ 2 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/components/labeled-input.tsx b/src/components/labeled-input.tsx index 250dd5f..94563dc 100644 --- a/src/components/labeled-input.tsx +++ b/src/components/labeled-input.tsx @@ -7,12 +7,14 @@ export default function LabeledInput({ placeholder, value, name, + autocomplete, }: { type: 'text' | 'email' | 'password'; label: string; placeholder?: string; value?: string; name?: string; + autocomplete?: string; }) { return (

@@ -24,6 +26,7 @@ export default function LabeledInput({ defaultValue={value} id={name} name={name} + autoComplete={autocomplete} />
); diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx index a8e6382..2ed61e4 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/user/login-form.tsx @@ -1,19 +1,27 @@ +'use client'; import { signIn } from '@/auth'; import LabeledInput from '@/components/labeled-input'; import { Button } from '@/components/custom-ui/button'; import { AuthError } from 'next-auth'; import { redirect } from 'next/navigation'; +import { useState } from 'react'; const SIGNIN_ERROR_URL = '/error'; export default function LoginForm() { + const [isSignUp, setIsSignUp] = useState(false); + return ( { - 'use server'; + 'use client'; try { - await signIn('credentials', formData); + if (isSignUp) { + // handle sign up logic here + } else { + await signIn('credentials', formData); + } } catch (error) { if (error instanceof AuthError) { return redirect(`${SIGNIN_ERROR_URL}?error=${error.type}`); @@ -22,24 +30,70 @@ export default function LoginForm() { } }} > - - + {isSignUp ? ( + <> + + + + + + + ) : ( + <> + + + + )}
-
From 386d72d9141f574b30506b87ed422941cdc178a4 Mon Sep 17 00:00:00 2001 From: Micha Date: Sun, 8 Jun 2025 00:56:37 +0200 Subject: [PATCH 081/136] fix: correct typo in Prisma command in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9319f3..d9ca71b 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ This project is built with a modern tech stack: yarn prisma:generate ``` ```bash - yarn prisa:db:push + yarn prisma:db:push ``` - Run the following command to apply migrations and generate Prisma Client: ```bash From 9183117a20c7921fc51016cd84695bcca1256660 Mon Sep 17 00:00:00 2001 From: Micha Date: Tue, 10 Jun 2025 09:23:09 +0200 Subject: [PATCH 082/136] feat: add form reset functionality and ref to login form --- src/components/user/login-form.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx index 2ed61e4..8a00749 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/user/login-form.tsx @@ -4,15 +4,18 @@ import LabeledInput from '@/components/labeled-input'; import { Button } from '@/components/custom-ui/button'; import { AuthError } from 'next-auth'; import { redirect } from 'next/navigation'; -import { useState } from 'react'; +import { useRef, useState } from 'react'; const SIGNIN_ERROR_URL = '/error'; export default function LoginForm() { const [isSignUp, setIsSignUp] = useState(false); + const formRef = useRef(null); + return (
{ 'use client'; @@ -91,7 +94,10 @@ export default function LoginForm() { From a351a9017dad6ac423945b339fe10616adde74c9 Mon Sep 17 00:00:00 2001 From: Micha Date: Sun, 8 Jun 2025 01:04:17 +0200 Subject: [PATCH 083/136] fix: add cursor pointer to button variants for improved interactivity --- src/components/custom-ui/button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/custom-ui/button.tsx b/src/components/custom-ui/button.tsx index 5b53423..2a25f66 100644 --- a/src/components/custom-ui/button.tsx +++ b/src/components/custom-ui/button.tsx @@ -5,7 +5,7 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils'; const buttonVariants = cva( - "radius-lg inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-button transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "radius-lg inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-button transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { From 171f0ae09914f973a4b55984643210e6d422a0a9 Mon Sep 17 00:00:00 2001 From: Micha Date: Mon, 9 Jun 2025 10:19:34 +0200 Subject: [PATCH 084/136] fix: simplify button styling by removing unnecessary hover classes --- src/app/logout/page.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/app/logout/page.tsx b/src/app/logout/page.tsx index c819a45..38311da 100644 --- a/src/app/logout/page.tsx +++ b/src/app/logout/page.tsx @@ -25,11 +25,7 @@ export default function SignOutPage() { - From de2e1c22ff6ca52a73d4a89d5ff2f92b8924b93d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 11 Jun 2025 14:00:48 +0000 Subject: [PATCH 085/136] chore(deps): update dependency @types/react to v19.1.8 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index dd8c545..66fb163 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@eslint/eslintrc": "3.3.1", "@tailwindcss/postcss": "4.1.8", "@types/node": "22.15.31", - "@types/react": "19.1.7", + "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", "eslint": "9.28.0", diff --git a/yarn.lock b/yarn.lock index 0f17374..4c0519c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1659,12 +1659,12 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:19.1.7": - version: 19.1.7 - resolution: "@types/react@npm:19.1.7" +"@types/react@npm:19.1.8": + version: 19.1.8 + resolution: "@types/react@npm:19.1.8" dependencies: csstype: "npm:^3.0.2" - checksum: 10c0/3bb8fb865debad4328b0d623e1c669f2ee90e9302638a64e65a0a1c61efca4f4ef91f58b55ff94075358c190d80bb8472a5823c6901d8cdc9009dd436a1dcab1 + checksum: 10c0/4908772be6dc941df276931efeb0e781777fa76e4d5d12ff9f75eb2dcc2db3065e0100efde16fde562c5bafa310cc8f50c1ee40a22640459e066e72cd342143e languageName: node linkType: hard @@ -3863,7 +3863,7 @@ __metadata: "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.8" "@types/node": "npm:22.15.31" - "@types/react": "npm:19.1.7" + "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" From 3f99449f2fd996237838b47c5586bbdaa4727492 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 11 Jun 2025 15:01:22 +0000 Subject: [PATCH 086/136] chore(deps): update tailwindcss monorepo to v4.1.9 --- package.json | 4 +- yarn.lock | 140 +++++++++++++++++++++++++-------------------------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 66fb163..a585326 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@tailwindcss/postcss": "4.1.8", + "@tailwindcss/postcss": "4.1.9", "@types/node": "22.15.31", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", @@ -55,7 +55,7 @@ "postcss": "8.5.4", "prettier": "3.5.3", "prisma": "6.9.0", - "tailwindcss": "4.1.8", + "tailwindcss": "4.1.9", "tw-animate-css": "1.3.4", "typescript": "5.8.3" }, diff --git a/yarn.lock b/yarn.lock index 4c0519c..bf094e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1445,9 +1445,9 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/node@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/node@npm:4.1.8" +"@tailwindcss/node@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/node@npm:4.1.9" dependencies: "@ampproject/remapping": "npm:^2.3.0" enhanced-resolve: "npm:^5.18.1" @@ -1455,77 +1455,77 @@ __metadata: lightningcss: "npm:1.30.1" magic-string: "npm:^0.30.17" source-map-js: "npm:^1.2.1" - tailwindcss: "npm:4.1.8" - checksum: 10c0/c6e3cfad831bce7f1ed6a218be11c8c722589499a85df698e815bb4274329cd0ef9e24846e6bf2fc72acd064b1e1ac92e8ec98a8f669ffc0935db2dc2a7f0436 + tailwindcss: "npm:4.1.9" + checksum: 10c0/eeb91ce489012780bf2eee4a02f439aa6337c59d4b6c29f41f159210e0cf3958863984988a02b0b618c04cb8437ae760a6fc3f0e764746c3a8d57197a62d7230 languageName: node linkType: hard -"@tailwindcss/oxide-android-arm64@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.8" +"@tailwindcss/oxide-android-arm64@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.9" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-arm64@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.8" +"@tailwindcss/oxide-darwin-arm64@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.9" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-x64@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.8" +"@tailwindcss/oxide-darwin-x64@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.9" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-freebsd-x64@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.8" +"@tailwindcss/oxide-freebsd-x64@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.9" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.8" +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.9" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.8" +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.9" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.8" +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.9" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.8" +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.9" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-musl@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.8" +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.9" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-wasm32-wasi@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.8" +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.9" dependencies: "@emnapi/core": "npm:^1.4.3" "@emnapi/runtime": "npm:^1.4.3" @@ -1537,36 +1537,36 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.8" +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.9" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.8" +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.9" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/oxide@npm:4.1.8" +"@tailwindcss/oxide@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/oxide@npm:4.1.9" dependencies: - "@tailwindcss/oxide-android-arm64": "npm:4.1.8" - "@tailwindcss/oxide-darwin-arm64": "npm:4.1.8" - "@tailwindcss/oxide-darwin-x64": "npm:4.1.8" - "@tailwindcss/oxide-freebsd-x64": "npm:4.1.8" - "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.8" - "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.8" - "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.8" - "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.8" - "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.8" - "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.8" - "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.8" - "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.8" + "@tailwindcss/oxide-android-arm64": "npm:4.1.9" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.9" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.9" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.9" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.9" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.9" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.9" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.9" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.9" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.9" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.9" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.9" detect-libc: "npm:^2.0.4" tar: "npm:^7.4.3" dependenciesMeta: @@ -1594,20 +1594,20 @@ __metadata: optional: true "@tailwindcss/oxide-win32-x64-msvc": optional: true - checksum: 10c0/806246b8a82d079ab50628a7a9d69f23a6b09280e55859f484d3a5250108e58c6188230aa203bfb352b6a6bbdb68a6871c37c9b1f94fe67a26eafe853973f08d + checksum: 10c0/f9a1a2753b36dc8479d07ca1b3718429bf952b5f898a9b3171653fbe7694486f33b3398c7fecf9b3bc031f703c8caa17f844a4dcec2c5ac1317c99975ac8e8a8 languageName: node linkType: hard -"@tailwindcss/postcss@npm:4.1.8": - version: 4.1.8 - resolution: "@tailwindcss/postcss@npm:4.1.8" +"@tailwindcss/postcss@npm:4.1.9": + version: 4.1.9 + resolution: "@tailwindcss/postcss@npm:4.1.9" dependencies: "@alloc/quick-lru": "npm:^5.2.0" - "@tailwindcss/node": "npm:4.1.8" - "@tailwindcss/oxide": "npm:4.1.8" + "@tailwindcss/node": "npm:4.1.9" + "@tailwindcss/oxide": "npm:4.1.9" postcss: "npm:^8.4.41" - tailwindcss: "npm:4.1.8" - checksum: 10c0/7f58d2a5c660037b1f01e22134574d892b51c668d5a781c2c8830fdd7558cc6f7876778f0afa01dc244232bf792750406126bc7e894214c78566400a0bd4627a + tailwindcss: "npm:4.1.9" + checksum: 10c0/bad8d8e318450118ed118883fbe1ccf919a4c55296098ea749f8e57fc308569c7c2936bc35c6a6d0f36c410112de7ca14ae3cf47de4c006d3ea86554a7e507ce languageName: node linkType: hard @@ -3861,7 +3861,7 @@ __metadata: "@radix-ui/react-slot": "npm:^1.2.2" "@radix-ui/react-switch": "npm:^1.2.4" "@radix-ui/react-tabs": "npm:^1.1.11" - "@tailwindcss/postcss": "npm:4.1.8" + "@tailwindcss/postcss": "npm:4.1.9" "@types/node": "npm:22.15.31" "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" @@ -3881,7 +3881,7 @@ __metadata: react: "npm:^19.0.0" react-dom: "npm:^19.0.0" tailwind-merge: "npm:^3.2.0" - tailwindcss: "npm:4.1.8" + tailwindcss: "npm:4.1.9" tw-animate-css: "npm:1.3.4" typescript: "npm:5.8.3" languageName: unknown @@ -4961,10 +4961,10 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:4.1.8": - version: 4.1.8 - resolution: "tailwindcss@npm:4.1.8" - checksum: 10c0/a566d049ee313f9c1638fd2a5fe95ae7e40bb35b58e92ed8d7c51880e71dff2a423dd430ff97444e2496c9c77b3f44ad4df48110b11484133019c1a8520d7bce +"tailwindcss@npm:4.1.9": + version: 4.1.9 + resolution: "tailwindcss@npm:4.1.9" + checksum: 10c0/31c720e08e1b8b6c7d68de7877988efe91f8609f23b864662161084231b173b51f47023fdfe13399c4bfb35e30c265642928cc12c2b7e526240ef76cb774ad56 languageName: node linkType: hard From dfbc092a7b40e97d0ba4c3543a3c01062e639a0f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 11 Jun 2025 18:00:44 +0000 Subject: [PATCH 087/136] chore(deps): update dependency postcss to v8.5.5 --- package.json | 2 +- yarn.lock | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a585326..d8388a4 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "eslint": "9.28.0", "eslint-config-next": "15.3.3", "eslint-config-prettier": "10.1.5", - "postcss": "8.5.4", + "postcss": "8.5.5", "prettier": "3.5.3", "prisma": "6.9.0", "tailwindcss": "4.1.9", diff --git a/yarn.lock b/yarn.lock index bf094e1..2a14a65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3875,7 +3875,7 @@ __metadata: next: "npm:15.3.3" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" - postcss: "npm:8.5.4" + postcss: "npm:8.5.5" prettier: "npm:3.5.3" prisma: "npm:6.9.0" react: "npm:^19.0.0" @@ -4280,7 +4280,18 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.4, postcss@npm:^8.4.41": +"postcss@npm:8.5.5": + version: 8.5.5 + resolution: "postcss@npm:8.5.5" + dependencies: + nanoid: "npm:^3.3.11" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/6415873fab84de05c2d8fd18f72ea6654bca437bb4b9f02ca819c438501e4b3a450023e575e17587c6eaa5bedddaaa4dad3af210f5cf166e30cec09cac58baf8 + languageName: node + linkType: hard + +"postcss@npm:^8.4.41": version: 8.5.4 resolution: "postcss@npm:8.5.4" dependencies: From de9216807cd8c9e01a2a9814578c0c194e9074af Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 11 Jun 2025 21:00:47 +0000 Subject: [PATCH 088/136] chore(deps): update tailwindcss monorepo to v4.1.10 --- package.json | 4 +- yarn.lock | 140 +++++++++++++++++++++++++-------------------------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index d8388a4..9d282dd 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@tailwindcss/postcss": "4.1.9", + "@tailwindcss/postcss": "4.1.10", "@types/node": "22.15.31", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", @@ -55,7 +55,7 @@ "postcss": "8.5.5", "prettier": "3.5.3", "prisma": "6.9.0", - "tailwindcss": "4.1.9", + "tailwindcss": "4.1.10", "tw-animate-css": "1.3.4", "typescript": "5.8.3" }, diff --git a/yarn.lock b/yarn.lock index 2a14a65..3cfc4ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1445,9 +1445,9 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/node@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/node@npm:4.1.9" +"@tailwindcss/node@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/node@npm:4.1.10" dependencies: "@ampproject/remapping": "npm:^2.3.0" enhanced-resolve: "npm:^5.18.1" @@ -1455,77 +1455,77 @@ __metadata: lightningcss: "npm:1.30.1" magic-string: "npm:^0.30.17" source-map-js: "npm:^1.2.1" - tailwindcss: "npm:4.1.9" - checksum: 10c0/eeb91ce489012780bf2eee4a02f439aa6337c59d4b6c29f41f159210e0cf3958863984988a02b0b618c04cb8437ae760a6fc3f0e764746c3a8d57197a62d7230 + tailwindcss: "npm:4.1.10" + checksum: 10c0/5cf900fe53ba08b5d9bfbd48925ea2c18eb8f89ae47738d95372152ed9b20c020bf3660ad04fa5dbb67f62ce01efd431cf4d3015d2d43e918fa89ce3c77b5170 languageName: node linkType: hard -"@tailwindcss/oxide-android-arm64@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.9" +"@tailwindcss/oxide-android-arm64@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.10" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-arm64@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.9" +"@tailwindcss/oxide-darwin-arm64@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.10" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-x64@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.9" +"@tailwindcss/oxide-darwin-x64@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.10" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-freebsd-x64@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.9" +"@tailwindcss/oxide-freebsd-x64@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.10" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.9" +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.10" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.9" +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.10" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.9" +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.10" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.9" +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.10" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-musl@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.9" +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.10" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-wasm32-wasi@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.9" +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.10" dependencies: "@emnapi/core": "npm:^1.4.3" "@emnapi/runtime": "npm:^1.4.3" @@ -1537,36 +1537,36 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.9" +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.10" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.9" +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.10" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/oxide@npm:4.1.9" +"@tailwindcss/oxide@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/oxide@npm:4.1.10" dependencies: - "@tailwindcss/oxide-android-arm64": "npm:4.1.9" - "@tailwindcss/oxide-darwin-arm64": "npm:4.1.9" - "@tailwindcss/oxide-darwin-x64": "npm:4.1.9" - "@tailwindcss/oxide-freebsd-x64": "npm:4.1.9" - "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.9" - "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.9" - "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.9" - "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.9" - "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.9" - "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.9" - "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.9" - "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.9" + "@tailwindcss/oxide-android-arm64": "npm:4.1.10" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.10" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.10" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.10" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.10" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.10" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.10" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.10" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.10" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.10" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.10" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.10" detect-libc: "npm:^2.0.4" tar: "npm:^7.4.3" dependenciesMeta: @@ -1594,20 +1594,20 @@ __metadata: optional: true "@tailwindcss/oxide-win32-x64-msvc": optional: true - checksum: 10c0/f9a1a2753b36dc8479d07ca1b3718429bf952b5f898a9b3171653fbe7694486f33b3398c7fecf9b3bc031f703c8caa17f844a4dcec2c5ac1317c99975ac8e8a8 + checksum: 10c0/38adecfedb1854acbf82538881b9caf475e656a3cb9b86d860c0bfac5f3f042da34c85d664506ab0feaff2d6106d29d74afc93ea8c4281e4eac35da690f6ca5c languageName: node linkType: hard -"@tailwindcss/postcss@npm:4.1.9": - version: 4.1.9 - resolution: "@tailwindcss/postcss@npm:4.1.9" +"@tailwindcss/postcss@npm:4.1.10": + version: 4.1.10 + resolution: "@tailwindcss/postcss@npm:4.1.10" dependencies: "@alloc/quick-lru": "npm:^5.2.0" - "@tailwindcss/node": "npm:4.1.9" - "@tailwindcss/oxide": "npm:4.1.9" + "@tailwindcss/node": "npm:4.1.10" + "@tailwindcss/oxide": "npm:4.1.10" postcss: "npm:^8.4.41" - tailwindcss: "npm:4.1.9" - checksum: 10c0/bad8d8e318450118ed118883fbe1ccf919a4c55296098ea749f8e57fc308569c7c2936bc35c6a6d0f36c410112de7ca14ae3cf47de4c006d3ea86554a7e507ce + tailwindcss: "npm:4.1.10" + checksum: 10c0/f320527b4e50e586e6bbe0e653f0c63ef0738a40737d1c80f47b074d42c0762d8dc20d40cbea9f13c7592f008e850b2f6eac61439ef9dc1c366d11dea52afda1 languageName: node linkType: hard @@ -3861,7 +3861,7 @@ __metadata: "@radix-ui/react-slot": "npm:^1.2.2" "@radix-ui/react-switch": "npm:^1.2.4" "@radix-ui/react-tabs": "npm:^1.1.11" - "@tailwindcss/postcss": "npm:4.1.9" + "@tailwindcss/postcss": "npm:4.1.10" "@types/node": "npm:22.15.31" "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" @@ -3881,7 +3881,7 @@ __metadata: react: "npm:^19.0.0" react-dom: "npm:^19.0.0" tailwind-merge: "npm:^3.2.0" - tailwindcss: "npm:4.1.9" + tailwindcss: "npm:4.1.10" tw-animate-css: "npm:1.3.4" typescript: "npm:5.8.3" languageName: unknown @@ -4972,10 +4972,10 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:4.1.9": - version: 4.1.9 - resolution: "tailwindcss@npm:4.1.9" - checksum: 10c0/31c720e08e1b8b6c7d68de7877988efe91f8609f23b864662161084231b173b51f47023fdfe13399c4bfb35e30c265642928cc12c2b7e526240ef76cb774ad56 +"tailwindcss@npm:4.1.10": + version: 4.1.10 + resolution: "tailwindcss@npm:4.1.10" + checksum: 10c0/9da74ee1f25d6065150f132a3eb18caad82cd9902b7c552278eb627266c68b12990a22bb4b6169d04ce775c058a8d2638a5051be905be99961889c572e2aeab8 languageName: node linkType: hard From 0e0c89fdd79e02fa9a922edb1c88f012e6e79018 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 12 Jun 2025 12:00:27 +0000 Subject: [PATCH 089/136] chore(deps): update ghcr.io/di0ik/forgejo_runner_container:main docker digest to c4667f2 --- .github/workflows/container-scan.yml | 2 +- .github/workflows/docker-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/container-scan.yml b/.github/workflows/container-scan.yml index 2a266dd..c87c433 100644 --- a/.github/workflows/container-scan.yml +++ b/.github/workflows/container-scan.yml @@ -9,7 +9,7 @@ jobs: name: Container Scan runs-on: docker container: - image: ghcr.io/di0ik/forgejo_runner_container:main@sha256:c66a37d9af18f8f0f34d16890082bc08d842d52ff2a2bc36d993e3d347b498ac + image: ghcr.io/di0ik/forgejo_runner_container:main@sha256:c4667f2702c32b91b4c92db2ff20739edd00409a44a691c0598cf4a09a47743a steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 5d8a383..07fe75e 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -13,7 +13,7 @@ jobs: docker: runs-on: docker container: - image: ghcr.io/di0ik/forgejo_runner_container:main@sha256:c66a37d9af18f8f0f34d16890082bc08d842d52ff2a2bc36d993e3d347b498ac + image: ghcr.io/di0ik/forgejo_runner_container:main@sha256:c4667f2702c32b91b4c92db2ff20739edd00409a44a691c0598cf4a09a47743a steps: - name: Login to Docker Hub uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 From 210bd132cc3e87cc188579534e6f7def78bac2f3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 13 Jun 2025 18:00:50 +0000 Subject: [PATCH 090/136] chore(deps): update dependency eslint to v9.29.0 --- package.json | 2 +- yarn.lock | 73 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 9d282dd..ab44a28 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", - "eslint": "9.28.0", + "eslint": "9.29.0", "eslint-config-next": "15.3.3", "eslint-config-prettier": "10.1.5", "postcss": "8.5.5", diff --git a/yarn.lock b/yarn.lock index 3cfc4ae..42a5d59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -103,14 +103,14 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.20.0": - version: 0.20.0 - resolution: "@eslint/config-array@npm:0.20.0" +"@eslint/config-array@npm:^0.20.1": + version: 0.20.1 + resolution: "@eslint/config-array@npm:0.20.1" dependencies: "@eslint/object-schema": "npm:^2.1.6" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10c0/94bc5d0abb96dc5295ff559925242ff75a54eacfb3576677e95917e42f7175e1c4b87bf039aa2a872f949b4852ad9724bf2f7529aaea6b98f28bb3fca7f1d659 + checksum: 10c0/709108c3925d83c2166024646829ab61ba5fa85c6568daefd32508899f46ed8dc36d7153042df6dcc7e58ad543bc93298b646575daecb5eb4e39a43d838dab42 languageName: node linkType: hard @@ -147,10 +147,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.28.0": - version: 9.28.0 - resolution: "@eslint/js@npm:9.28.0" - checksum: 10c0/5a6759542490dd9f778993edfbc8d2f55168fd0f7336ceed20fe3870c65499d72fc0bca8d1ae00ea246b0923ea4cba2e0758a8a5507a3506ddcf41c92282abb8 +"@eslint/js@npm:9.29.0": + version: 9.29.0 + resolution: "@eslint/js@npm:9.29.0" + checksum: 10c0/d0ccf37063fa27a3fae9347cb044f84ca10b5a2fa19ffb2b3fedf3b96843ac1ff359ea9f0ab0e80f2f16fda4cb0dc61ea0fed0375090f050fe0a029e7d6de3a3 languageName: node linkType: hard @@ -1943,6 +1943,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec + languageName: node + linkType: hard + "ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -2812,13 +2821,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^8.3.0": - version: 8.3.0 - resolution: "eslint-scope@npm:8.3.0" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b + checksum: 10c0/407f6c600204d0f3705bd557f81bd0189e69cd7996f408f8971ab5779c0af733d1af2f1412066b40ee1588b085874fc37a2333986c6521669cdbdd36ca5058e0 languageName: node linkType: hard @@ -2836,17 +2845,24 @@ __metadata: languageName: node linkType: hard -"eslint@npm:9.28.0": - version: 9.28.0 - resolution: "eslint@npm:9.28.0" +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 + languageName: node + linkType: hard + +"eslint@npm:9.29.0": + version: 9.29.0 + resolution: "eslint@npm:9.29.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.20.0" + "@eslint/config-array": "npm:^0.20.1" "@eslint/config-helpers": "npm:^0.2.1" "@eslint/core": "npm:^0.14.0" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.28.0" + "@eslint/js": "npm:9.29.0" "@eslint/plugin-kit": "npm:^0.3.1" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -2858,9 +2874,9 @@ __metadata: cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.3.0" - eslint-visitor-keys: "npm:^4.2.0" - espree: "npm:^10.3.0" + eslint-scope: "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.2.1" + espree: "npm:^10.4.0" esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" @@ -2882,11 +2898,11 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/513ea7e69d88a0905d4ed35cef3a8f31ebce7ca9f2cdbda3474495c63ad6831d52357aad65094be7a144d6e51850980ced7d25efb807e8ab06a427241f7cd730 + checksum: 10c0/75e3f841e0f8b0fa93dbb2ba6ae538bd8b611c3654117bc3dadf90bb009923dfd2c15ec2948dc6e6b8b571317cc125c5cceb9255da8cd644ee740020df645dd8 languageName: node linkType: hard -"espree@npm:^10.0.1, espree@npm:^10.3.0": +"espree@npm:^10.0.1": version: 10.3.0 resolution: "espree@npm:10.3.0" dependencies: @@ -2897,6 +2913,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" + dependencies: + acorn: "npm:^8.15.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b + languageName: node + linkType: hard + "esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" @@ -3868,7 +3895,7 @@ __metadata: class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" dotenv-cli: "npm:8.0.0" - eslint: "npm:9.28.0" + eslint: "npm:9.29.0" eslint-config-next: "npm:15.3.3" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" From 4e87c11ec35a303e60610ad871e0b97a0c7ea422 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Wed, 28 May 2025 13:08:07 +0200 Subject: [PATCH 091/136] feat: implement credentials login implements the credentials login functionality --- package.json | 6 +- src/app/login/page.tsx | 12 +- src/auth.ts | 83 +++++++- src/components/labeled-input.tsx | 7 +- src/components/user/login-form.tsx | 299 ++++++++++++++++++++--------- src/lib/auth/login.ts | 27 +++ src/lib/auth/register.ts | 75 ++++++++ src/lib/hooks/useZodForm.tsx | 14 ++ src/lib/validation/user.ts | 67 +++++++ yarn.lock | 47 +++++ 10 files changed, 522 insertions(+), 115 deletions(-) create mode 100644 src/lib/auth/login.ts create mode 100644 src/lib/auth/register.ts create mode 100644 src/lib/hooks/useZodForm.tsx create mode 100644 src/lib/validation/user.ts diff --git a/package.json b/package.json index ab44a28..f11d01e 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@fortawesome/free-regular-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", + "@hookform/resolvers": "^5.0.1", "@prisma/client": "^6.9.0", "@radix-ui/react-dropdown-menu": "^2.1.14", "@radix-ui/react-hover-card": "^1.1.13", @@ -32,6 +33,7 @@ "@radix-ui/react-slot": "^1.2.2", "@radix-ui/react-switch": "^1.2.4", "@radix-ui/react-tabs": "^1.1.11", + "bcryptjs": "^3.0.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", @@ -40,7 +42,9 @@ "next-themes": "^0.4.6", "react": "^19.0.0", "react-dom": "^19.0.0", - "tailwind-merge": "^3.2.0" + "react-hook-form": "^7.56.4", + "tailwind-merge": "^3.2.0", + "zod": "^3.25.60" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index adaa1c3..2933872 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -6,8 +6,6 @@ import { Button } from '@/components/custom-ui/button'; import Image from 'next/image'; import { Separator } from '@/components/custom-ui/separator'; import Logo from '@/components/logo'; - -import '@/app/globals.css'; import { Card, CardContent, @@ -28,12 +26,12 @@ export default async function LoginPage() { } return ( -
-
-
+
+
+
-
+
@@ -43,8 +41,6 @@ export default async function LoginPage() { - {providerMap.length > 0} - {providerMap.map((provider) => ( ) { return (
@@ -27,7 +30,9 @@ export default function LabeledInput({ id={name} name={name} autoComplete={autocomplete} + {...rest} /> + {error &&

{error}

}
); } diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx index 8a00749..a0167e2 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/user/login-form.tsx @@ -1,107 +1,214 @@ 'use client'; -import { signIn } from '@/auth'; + +import React, { useState, useRef } from 'react'; +import { useRouter } from 'next/navigation'; + import LabeledInput from '@/components/labeled-input'; import { Button } from '@/components/custom-ui/button'; -import { AuthError } from 'next-auth'; -import { redirect } from 'next/navigation'; -import { useRef, useState } from 'react'; +import useZodForm from '@/lib/hooks/useZodForm'; +import { loginSchema, registerSchema } from '@/lib/validation/user'; +import { loginAction } from '@/lib/auth/login'; +import { registerAction } from '@/lib/auth/register'; -const SIGNIN_ERROR_URL = '/error'; +function LoginFormElement({ + setIsSignUp, + formRef, +}: { + setIsSignUp: (value: boolean | ((prev: boolean) => boolean)) => void; + formRef?: React.RefObject; +}) { + const { handleSubmit, formState, register, setError } = + useZodForm(loginSchema); + const router = useRouter(); + + const onSubmit = handleSubmit(async (data) => { + try { + const { error } = await loginAction(data); + + if (error) { + setError('root', { + message: error, + }); + return; + } else { + router.push('/home'); + router.refresh(); + return; + } + } catch (error: unknown) { + if (error instanceof Error) + setError('root', { + message: error?.message, + }); + else + setError('root', { + message: 'An unknown error occurred.', + }); + } + }); + + return ( + + + +
+ + +
+
+ {formState.errors.root?.message && ( +

{formState.errors.root?.message}

+ )} +
+ + ); +} + +function RegisterFormElement({ + setIsSignUp, + formRef, +}: { + setIsSignUp: (value: boolean | ((prev: boolean) => boolean)) => void; + formRef?: React.RefObject; +}) { + const { handleSubmit, formState, register, setError } = + useZodForm(registerSchema); + + const onSubmit = handleSubmit(async (data) => { + try { + const { error } = await registerAction(data); + + if (error) { + setError('root', { + message: error, + }); + return; + } else { + formRef?.current?.reset(); + setIsSignUp(false); + // TODO: Show registration success message (reminder to verify email) + return; + } + } catch (error: unknown) { + if (error instanceof Error) + setError('root', { + message: error?.message, + }); + else + setError('root', { + message: 'An unknown error occurred.', + }); + } + }); + + return ( +
+ + + + + + +
+ + +
+
+ {formState.errors.root?.message && ( +

{formState.errors.root?.message}

+ )} +
+ + ); +} export default function LoginForm() { const [isSignUp, setIsSignUp] = useState(false); const formRef = useRef(null); - return ( -
{ - 'use client'; - try { - if (isSignUp) { - // handle sign up logic here - } else { - await signIn('credentials', formData); - } - } catch (error) { - if (error instanceof AuthError) { - return redirect(`${SIGNIN_ERROR_URL}?error=${error.type}`); - } - throw error; - } - }} - > - {isSignUp ? ( - <> - - - - - - - ) : ( - <> - - - - )} -
- - -
- - ); + if (isSignUp) { + return ; + } + return ; } diff --git a/src/lib/auth/login.ts b/src/lib/auth/login.ts new file mode 100644 index 0000000..0019ae0 --- /dev/null +++ b/src/lib/auth/login.ts @@ -0,0 +1,27 @@ +'use server'; + +import { z } from 'zod'; +import { loginSchema } from '@/lib/validation/user'; +import { signIn } from '@/auth'; + +export async function loginAction(data: z.infer) { + try { + await signIn('credentials', { + ...data, + redirect: false, + }); + + return { + error: undefined, + }; + } catch (error: unknown) { + if (error instanceof Error) { + return { + error: error.message.toString(), + }; + } + return { + error: 'An unknown error occurred.', + }; + } +} diff --git a/src/lib/auth/register.ts b/src/lib/auth/register.ts new file mode 100644 index 0000000..9eba8e9 --- /dev/null +++ b/src/lib/auth/register.ts @@ -0,0 +1,75 @@ +'use server'; + +import type { z } from 'zod'; +import bcrypt from 'bcryptjs'; +import { registerSchema } from '@/lib/validation/user'; +import { prisma } from '@/prisma'; + +export async function registerAction(data: z.infer) { + try { + const result = await registerSchema.safeParseAsync(data); + + if (!result.success) { + return { + error: result.error.errors[0].message, + }; + } + + const { email, password, firstName, lastName, username } = result.data; + + const user = await prisma.user.findUnique({ + where: { + email, + }, + }); + + if (user) { + return { + error: 'User already exist with this email', + }; + } + + const existingUsername = await prisma.user.findUnique({ + where: { + name: username, + }, + }); + + if (existingUsername) { + return { + error: 'Username already exists', + }; + } + + const passwordHash = await bcrypt.hash(password, 10); + + await prisma.$transaction(async (tx) => { + const { id } = await tx.user.create({ + data: { + email, + name: username, + password_hash: passwordHash, + first_name: firstName, + last_name: lastName, + emailVerified: new Date(), // TODO: handle email verification + }, + }); + + await tx.account.create({ + data: { + userId: id, + type: 'credentials', + provider: 'credentials', + providerAccountId: id, + }, + }); + }); + + return {}; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_error) { + return { + error: 'System error. Please contact support', + }; + } +} diff --git a/src/lib/hooks/useZodForm.tsx b/src/lib/hooks/useZodForm.tsx new file mode 100644 index 0000000..8b8eb62 --- /dev/null +++ b/src/lib/hooks/useZodForm.tsx @@ -0,0 +1,14 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +export default function useZodForm< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Schema extends z.ZodType, + Values extends z.infer, +>(schema: Schema, defaultValues?: Values) { + return useForm({ + resolver: zodResolver(schema), + defaultValues, + }); +} diff --git a/src/lib/validation/user.ts b/src/lib/validation/user.ts new file mode 100644 index 0000000..a2efa5e --- /dev/null +++ b/src/lib/validation/user.ts @@ -0,0 +1,67 @@ +import zod from 'zod'; + +export const loginSchema = zod.object({ + email: zod + .string() + .email('Invalid email address') + .min(3, 'Email is required') + .or( + zod + .string() + .min(3, 'Username is required') + .max(32, 'Username must be at most 32 characters long') + .regex( + /^[a-zA-Z0-9_]+$/, + 'Username can only contain letters, numbers, and underscores', + ), + ), + password: zod.string().min(1, 'Password is required'), +}); + +export const registerSchema = zod + .object({ + firstName: zod + .string() + .min(1, 'First name is required') + .max(32, 'First name must be at most 32 characters long'), + lastName: zod + .string() + .min(1, 'Last name is required') + .max(32, 'Last name must be at most 32 characters long'), + email: zod + .string() + .email('Invalid email address') + .min(3, 'Email is required'), + password: zod + .string() + .min(8, 'Password must be at least 8 characters long') + .max(128, 'Password must be at most 128 characters long'), + confirmPassword: zod + .string() + .min(8, 'Password must be at least 8 characters long') + .max(128, 'Password must be at most 128 characters long'), + username: zod + .string() + .min(3, 'Username is required') + .max(32, 'Username must be at most 32 characters long') + .regex( + /^[a-zA-Z0-9_]+$/, + 'Username can only contain letters, numbers, and underscores', + ), + }) + .refine((data) => data.password === data.confirmPassword, { + message: 'Passwords do not match', + path: ['confirmPassword'], + }) + .refine( + (data) => + !data.password.includes(data.firstName) && + !data.password.includes(data.lastName) && + !data.password.includes(data.email) && + !data.password.includes(data.username), + { + message: + 'Password cannot contain your first name, last name, email, or username', + path: ['password'], + }, + ); diff --git a/yarn.lock b/yarn.lock index 42a5d59..a05f6e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -264,6 +264,17 @@ __metadata: languageName: node linkType: hard +"@hookform/resolvers@npm:^5.0.1": + version: 5.1.0 + resolution: "@hookform/resolvers@npm:5.1.0" + dependencies: + "@standard-schema/utils": "npm:^0.3.0" + peerDependencies: + react-hook-form: ^7.55.0 + checksum: 10c0/5bd28ef58a182102f40b7fa2bc73a5e423c8bcf9cb25fee91cb8933026e7efba6f9adfda1ee637294de59c5467c938f4fb99c77a73bbb8c6180482c69d31cbbd + languageName: node + linkType: hard + "@humanfs/core@npm:^0.19.1": version: 0.19.1 resolution: "@humanfs/core@npm:0.19.1" @@ -1429,6 +1440,13 @@ __metadata: languageName: node linkType: hard +"@standard-schema/utils@npm:^0.3.0": + version: 0.3.0 + resolution: "@standard-schema/utils@npm:0.3.0" + checksum: 10c0/6eb74cd13e52d5fc74054df51e37d947ef53f3ab9e02c085665dcca3c38c60ece8d735cebbdf18fbb13c775fbcb9becb3f53109b0e092a63f0f7389ce0993fd0 + languageName: node + linkType: hard + "@swc/counter@npm:0.1.3": version: 0.1.3 resolution: "@swc/counter@npm:0.1.3" @@ -2147,6 +2165,15 @@ __metadata: languageName: node linkType: hard +"bcryptjs@npm:^3.0.2": + version: 3.0.2 + resolution: "bcryptjs@npm:3.0.2" + bin: + bcrypt: bin/bcrypt + checksum: 10c0/a0923cac99f83e913f8f4e4f42df6a27c6593b24d509900331d1280c4050b1544e602a0ac67b43f7bb5c969991c3ed77fd72f19b7dc873be8ee794da3d925c7e + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -3878,6 +3905,7 @@ __metadata: "@fortawesome/free-regular-svg-icons": "npm:^6.7.2" "@fortawesome/free-solid-svg-icons": "npm:^6.7.2" "@fortawesome/react-fontawesome": "npm:^0.2.2" + "@hookform/resolvers": "npm:^5.0.1" "@prisma/client": "npm:^6.9.0" "@radix-ui/react-dropdown-menu": "npm:^2.1.14" "@radix-ui/react-hover-card": "npm:^1.1.13" @@ -3892,6 +3920,7 @@ __metadata: "@types/node": "npm:22.15.31" "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" + bcryptjs: "npm:^3.0.2" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" dotenv-cli: "npm:8.0.0" @@ -3907,10 +3936,12 @@ __metadata: prisma: "npm:6.9.0" react: "npm:^19.0.0" react-dom: "npm:^19.0.0" + react-hook-form: "npm:^7.56.4" tailwind-merge: "npm:^3.2.0" tailwindcss: "npm:4.1.10" tw-animate-css: "npm:1.3.4" typescript: "npm:5.8.3" + zod: "npm:^3.25.60" languageName: unknown linkType: soft @@ -4414,6 +4445,15 @@ __metadata: languageName: node linkType: hard +"react-hook-form@npm:^7.56.4": + version: 7.57.0 + resolution: "react-hook-form@npm:7.57.0" + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + checksum: 10c0/6db0b44b2e88d4db541514e96557723e39381ce9f71b3787bf041635f829143dbd0ae46a1f6c16dee23afe3413fd25539484ba02bf2a35d90aaa1b7483193ea9 + languageName: node + linkType: hard + "react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -5375,3 +5415,10 @@ __metadata: checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard + +"zod@npm:^3.25.60": + version: 3.25.60 + resolution: "zod@npm:3.25.60" + checksum: 10c0/4b5c0fc9fc9020a1b41c9e4093e722181f9535dc4e917cd5a63ce764c405f49ff49d7f5ef4d8c92665d250d92c2216c4c0b0145175c755209762be4ec305c5d2 + languageName: node + linkType: hard From 378b88dbdbe856718717c9b8e465ecd59a2a1e5d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 14 Jun 2025 10:01:22 +0000 Subject: [PATCH 092/136] fix(deps): update dependency @hookform/resolvers to v5.1.1 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a05f6e9..121de32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -265,13 +265,13 @@ __metadata: linkType: hard "@hookform/resolvers@npm:^5.0.1": - version: 5.1.0 - resolution: "@hookform/resolvers@npm:5.1.0" + version: 5.1.1 + resolution: "@hookform/resolvers@npm:5.1.1" dependencies: "@standard-schema/utils": "npm:^0.3.0" peerDependencies: react-hook-form: ^7.55.0 - checksum: 10c0/5bd28ef58a182102f40b7fa2bc73a5e423c8bcf9cb25fee91cb8933026e7efba6f9adfda1ee637294de59c5467c938f4fb99c77a73bbb8c6180482c69d31cbbd + checksum: 10c0/74601ba4abb3159bbaa25175af9459a2c0337a28d8c0a5be95c7ae7b0a76ddafcf63c03eea8561fd099fe80b226194ad09e3824c53b9beda38393ff9fd264a03 languageName: node linkType: hard From b7d443e7a10f7666db29ee20c8c17a5bd76a5fa8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 14 Jun 2025 11:02:02 +0000 Subject: [PATCH 093/136] fix(deps): update dependency zod to v3.25.64 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 121de32..0785433 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5417,8 +5417,8 @@ __metadata: linkType: hard "zod@npm:^3.25.60": - version: 3.25.60 - resolution: "zod@npm:3.25.60" - checksum: 10c0/4b5c0fc9fc9020a1b41c9e4093e722181f9535dc4e917cd5a63ce764c405f49ff49d7f5ef4d8c92665d250d92c2216c4c0b0145175c755209762be4ec305c5d2 + version: 3.25.64 + resolution: "zod@npm:3.25.64" + checksum: 10c0/00d76093a999e377e4ffd037fa7185e861c35917e8c4272f514115c206a0654995168f57fb71708b11e0a9243206d988b7f63b543404e1796402e50d346a6bd7 languageName: node linkType: hard From cfe73652e24f2d7ff999e72b8ba5081d00298a7e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 15 Jun 2025 12:01:00 +0000 Subject: [PATCH 094/136] fix(deps): update dependency react-hook-form to v7.58.0 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0785433..d81c319 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4446,11 +4446,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.56.4": - version: 7.57.0 - resolution: "react-hook-form@npm:7.57.0" + version: 7.58.0 + resolution: "react-hook-form@npm:7.58.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10c0/6db0b44b2e88d4db541514e96557723e39381ce9f71b3787bf041635f829143dbd0ae46a1f6c16dee23afe3413fd25539484ba02bf2a35d90aaa1b7483193ea9 + checksum: 10c0/9e87bf1dfb43157ffec1b112092e8c5b2b9d0056c2a8bdea6c15e08d510b365915101f499f2e7698e16e94541ac82b26ab8e3b05af5b0cccfc82d29cf31c1b0b languageName: node linkType: hard From d769cdcd5cc283495b7601b8e67d444b473d1df1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jun 2025 09:00:52 +0000 Subject: [PATCH 095/136] chore(deps): update dependency @types/node to v22.15.32 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f11d01e..110e8e3 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "devDependencies": { "@eslint/eslintrc": "3.3.1", "@tailwindcss/postcss": "4.1.10", - "@types/node": "22.15.31", + "@types/node": "22.15.32", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", diff --git a/yarn.lock b/yarn.lock index d81c319..972e786 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1659,12 +1659,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.31": - version: 22.15.31 - resolution: "@types/node@npm:22.15.31" +"@types/node@npm:22.15.32": + version: 22.15.32 + resolution: "@types/node@npm:22.15.32" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/ef7d5dc890da41cfd554d35ab8998bc18be9e3a0caa642e720599ac4410a94a4879766e52b3c9cafa06c66b7b8aebdc51f322cf67df23a6489927890196a316d + checksum: 10c0/63a2fa52adf1134d1b3bee8b1862d4b8e4550fffc190551068d3d41a41d9e5c0c8f1cb81faa18767b260637360f662115c26c5e4e7718868ead40c4a57cbc0e3 languageName: node linkType: hard @@ -3917,7 +3917,7 @@ __metadata: "@radix-ui/react-switch": "npm:^1.2.4" "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.10" - "@types/node": "npm:22.15.31" + "@types/node": "npm:22.15.32" "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" bcryptjs: "npm:^3.0.2" From 882464e6cba501221f3122f967286c6400a14017 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jun 2025 14:00:55 +0000 Subject: [PATCH 096/136] chore(deps): update dependency postcss to v8.5.6 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 110e8e3..99b975d 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "eslint": "9.29.0", "eslint-config-next": "15.3.3", "eslint-config-prettier": "10.1.5", - "postcss": "8.5.5", + "postcss": "8.5.6", "prettier": "3.5.3", "prisma": "6.9.0", "tailwindcss": "4.1.10", diff --git a/yarn.lock b/yarn.lock index 972e786..8deaa5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3931,7 +3931,7 @@ __metadata: next: "npm:15.3.3" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" - postcss: "npm:8.5.5" + postcss: "npm:8.5.6" prettier: "npm:3.5.3" prisma: "npm:6.9.0" react: "npm:^19.0.0" @@ -4338,14 +4338,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.5": - version: 8.5.5 - resolution: "postcss@npm:8.5.5" +"postcss@npm:8.5.6": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/6415873fab84de05c2d8fd18f72ea6654bca437bb4b9f02ca819c438501e4b3a450023e575e17587c6eaa5bedddaaa4dad3af210f5cf166e30cec09cac58baf8 + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 languageName: node linkType: hard From 8d3aa9ec857b24abdd17a29643133882f5199270 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jun 2025 19:00:47 +0000 Subject: [PATCH 097/136] fix(deps): update dependency zod to v3.25.65 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8deaa5a..cff72ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5417,8 +5417,8 @@ __metadata: linkType: hard "zod@npm:^3.25.60": - version: 3.25.64 - resolution: "zod@npm:3.25.64" - checksum: 10c0/00d76093a999e377e4ffd037fa7185e861c35917e8c4272f514115c206a0654995168f57fb71708b11e0a9243206d988b7f63b543404e1796402e50d346a6bd7 + version: 3.25.65 + resolution: "zod@npm:3.25.65" + checksum: 10c0/32dd0671a445217ad4e5ec6bd5879f5c6aad4ac1537b226d9f2ba23ed9a3d975dc0e108f676d2eca2d2c6b29d037cede74ff38eface98d052f7ca959ed7523bf languageName: node linkType: hard From d054fe1079bfb207172af63230e51eb47afd6437 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jun 2025 20:01:09 +0000 Subject: [PATCH 098/136] chore(deps): update docker/setup-buildx-action digest to 18ce135 --- .github/workflows/docker-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 07fe75e..165105d 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -26,7 +26,7 @@ jobs: uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3 + uses: docker/setup-buildx-action@18ce135bb5112fa8ce4ed6c17ab05699d7f3a5e0 # v3 - name: Get the Ref id: get-ref From c49c654f9fde58fa57214b1c0e4fe5449654dafd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jun 2025 23:01:28 +0000 Subject: [PATCH 099/136] fix(deps): update dependency zod to v3.25.67 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cff72ca..cf5ab88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5417,8 +5417,8 @@ __metadata: linkType: hard "zod@npm:^3.25.60": - version: 3.25.65 - resolution: "zod@npm:3.25.65" - checksum: 10c0/32dd0671a445217ad4e5ec6bd5879f5c6aad4ac1537b226d9f2ba23ed9a3d975dc0e108f676d2eca2d2c6b29d037cede74ff38eface98d052f7ca959ed7523bf + version: 3.25.67 + resolution: "zod@npm:3.25.67" + checksum: 10c0/80a0cab3033272c4ab9312198081f0c4ea88e9673c059aa36dc32024906363729db54bdb78f3dc9d5529bd1601f74974d5a56c0a23e40c6f04a9270c9ff22336 languageName: node linkType: hard From 77653bcc69563c4176787c9d89cb9f268aca90da Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 17 Jun 2025 14:01:11 +0000 Subject: [PATCH 100/136] fix(deps): update dependency react-hook-form to v7.58.1 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cf5ab88..6bcca2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4446,11 +4446,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.56.4": - version: 7.58.0 - resolution: "react-hook-form@npm:7.58.0" + version: 7.58.1 + resolution: "react-hook-form@npm:7.58.1" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10c0/9e87bf1dfb43157ffec1b112092e8c5b2b9d0056c2a8bdea6c15e08d510b365915101f499f2e7698e16e94541ac82b26ab8e3b05af5b0cccfc82d29cf31c1b0b + checksum: 10c0/981b9982b7eb497c3afff86c219175fdd4d92a24e3533518035239545dda23f5ebc6ba647fb29a250f768bdf811ba413094ce0103fbf36b436737fc18aa1bb49 languageName: node linkType: hard From 138970f4c3c02412b7be49f1eeadb810905565af Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 18 Jun 2025 09:03:11 +0000 Subject: [PATCH 101/136] chore(deps): update docker/setup-buildx-action digest to e468171 --- .github/workflows/docker-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 165105d..bc3fe77 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -26,7 +26,7 @@ jobs: uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@18ce135bb5112fa8ce4ed6c17ab05699d7f3a5e0 # v3 + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3 - name: Get the Ref id: get-ref From 050a1d2bf5d52c9b4e8a074cf545296e56f92e25 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 18 Jun 2025 18:01:50 +0000 Subject: [PATCH 102/136] fix(deps): update nextjs monorepo to v15.3.4 --- package.json | 4 +- yarn.lock | 104 +++++++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 99b975d..47fb175 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.3.3", + "next": "15.3.4", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", @@ -54,7 +54,7 @@ "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", "eslint": "9.29.0", - "eslint-config-next": "15.3.3", + "eslint-config-next": "15.3.4", "eslint-config-prettier": "10.1.5", "postcss": "8.5.6", "prettier": "3.5.3", diff --git a/yarn.lock b/yarn.lock index 6bcca2b..8118aeb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -564,74 +564,74 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.3.3": - version: 15.3.3 - resolution: "@next/env@npm:15.3.3" - checksum: 10c0/b47ef78c4194900f52a274270932a633ba21f39377fc6ad478839c3c1e3fffccb8ad25b286a1beb11f91fe9d09a299087ccb9c205a4e610ad95af65f24e49e5a +"@next/env@npm:15.3.4": + version: 15.3.4 + resolution: "@next/env@npm:15.3.4" + checksum: 10c0/43d37896e1422c9c353d9ded1d1b01545aa30b2bb125bcc40ffd4474dbc6e0ba603a77fc2a598616964a925379bb5a39eb1a242f0c49fc933e39e099fb2f7d75 languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.3.3": - version: 15.3.3 - resolution: "@next/eslint-plugin-next@npm:15.3.3" +"@next/eslint-plugin-next@npm:15.3.4": + version: 15.3.4 + resolution: "@next/eslint-plugin-next@npm:15.3.4" dependencies: fast-glob: "npm:3.3.1" - checksum: 10c0/d6c95d07d46b9369f27eb716e2f6c8df6d97e077b055e26eff8f1931fc3cd7a6af73461d318917e60b68561ea90e0b5f43a2c6eaf641c1f740aadd1d2b12919a + checksum: 10c0/17792484ee19550bc04167a212426b7907daaf3920546976a002261779c905fcb75ac05964359d78ffe5e6f5173f85237a1bdb11d6c07e5f3c4d6bf0b8d4bc3f languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-darwin-arm64@npm:15.3.3" +"@next/swc-darwin-arm64@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-darwin-arm64@npm:15.3.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-darwin-x64@npm:15.3.3" +"@next/swc-darwin-x64@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-darwin-x64@npm:15.3.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-arm64-gnu@npm:15.3.3" +"@next/swc-linux-arm64-gnu@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-linux-arm64-gnu@npm:15.3.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-arm64-musl@npm:15.3.3" +"@next/swc-linux-arm64-musl@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-linux-arm64-musl@npm:15.3.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-x64-gnu@npm:15.3.3" +"@next/swc-linux-x64-gnu@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-linux-x64-gnu@npm:15.3.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-linux-x64-musl@npm:15.3.3" +"@next/swc-linux-x64-musl@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-linux-x64-musl@npm:15.3.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-win32-arm64-msvc@npm:15.3.3" +"@next/swc-win32-arm64-msvc@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-win32-arm64-msvc@npm:15.3.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.3.3": - version: 15.3.3 - resolution: "@next/swc-win32-x64-msvc@npm:15.3.3" +"@next/swc-win32-x64-msvc@npm:15.3.4": + version: 15.3.4 + resolution: "@next/swc-win32-x64-msvc@npm:15.3.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2675,11 +2675,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.3.3": - version: 15.3.3 - resolution: "eslint-config-next@npm:15.3.3" +"eslint-config-next@npm:15.3.4": + version: 15.3.4 + resolution: "eslint-config-next@npm:15.3.4" dependencies: - "@next/eslint-plugin-next": "npm:15.3.3" + "@next/eslint-plugin-next": "npm:15.3.4" "@rushstack/eslint-patch": "npm:^1.10.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -2695,7 +2695,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/908f0edce6ae1aeb1565e9b52739fe4086ba66da9926baa2fe2580e2f4c99619b033bfb0bbbbae4e02f28e411715ceb684e574a212774f47fa5b627f337fd1d7 + checksum: 10c0/f7ad0760e4a848ed0ce5543c4d9efea02cd70b49e123875cd87b7c791e72c2d8671988ed103f7468394e90c5361978aafae67bbbb60bd87acb1a83ccbd5f9636 languageName: node linkType: hard @@ -3925,10 +3925,10 @@ __metadata: clsx: "npm:^2.1.1" dotenv-cli: "npm:8.0.0" eslint: "npm:9.29.0" - eslint-config-next: "npm:15.3.3" + eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.3.3" + next: "npm:15.3.4" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" postcss: "npm:8.5.6" @@ -4076,19 +4076,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.3.3": - version: 15.3.3 - resolution: "next@npm:15.3.3" +"next@npm:15.3.4": + version: 15.3.4 + resolution: "next@npm:15.3.4" dependencies: - "@next/env": "npm:15.3.3" - "@next/swc-darwin-arm64": "npm:15.3.3" - "@next/swc-darwin-x64": "npm:15.3.3" - "@next/swc-linux-arm64-gnu": "npm:15.3.3" - "@next/swc-linux-arm64-musl": "npm:15.3.3" - "@next/swc-linux-x64-gnu": "npm:15.3.3" - "@next/swc-linux-x64-musl": "npm:15.3.3" - "@next/swc-win32-arm64-msvc": "npm:15.3.3" - "@next/swc-win32-x64-msvc": "npm:15.3.3" + "@next/env": "npm:15.3.4" + "@next/swc-darwin-arm64": "npm:15.3.4" + "@next/swc-darwin-x64": "npm:15.3.4" + "@next/swc-linux-arm64-gnu": "npm:15.3.4" + "@next/swc-linux-arm64-musl": "npm:15.3.4" + "@next/swc-linux-x64-gnu": "npm:15.3.4" + "@next/swc-linux-x64-musl": "npm:15.3.4" + "@next/swc-win32-arm64-msvc": "npm:15.3.4" + "@next/swc-win32-x64-msvc": "npm:15.3.4" "@swc/counter": "npm:0.1.3" "@swc/helpers": "npm:0.5.15" busboy: "npm:1.6.0" @@ -4133,7 +4133,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/b519d348efd905ac63b2e5cb1e5a3d8e5d11d992aba436f4eef28c66f4555f155bb2bd489d0d029867e926539b31a3f14dd81b0ebca54ce9f3d65a883fb94d4b + checksum: 10c0/52d3fba6f53d5d2a339cbde433ab360301e9a0a0d9b95a656bf29ce1af43f02e9cc32571d5d4095bcb8ab7a795207d6e75c64b33fc1f90d21f2f9b157cc9a503 languageName: node linkType: hard From a412d0710bd8bd63b89040d6bc4cc7eac018705e Mon Sep 17 00:00:00 2001 From: Maximilian Liebmann Date: Wed, 18 Jun 2025 22:25:27 +0200 Subject: [PATCH 103/136] refactor: organized component folder structure fix: scrolling in login page --- src/app/home/page.tsx | 4 +- src/app/layout.tsx | 2 +- src/app/login/page.tsx | 40 +++++++++---------- src/app/logout/page.tsx | 2 +- src/app/settings/page.tsx | 2 +- src/components/{ => buttons}/icon-button.tsx | 2 +- .../{user => buttons}/redirect-button.tsx | 2 +- .../{user => buttons}/sso-login-button.tsx | 2 +- .../{ => custom-ui}/labeled-input.tsx | 0 src/components/{user => forms}/login-form.tsx | 4 +- src/components/{ => misc}/logo.tsx | 0 .../{user => misc}/theme-picker.tsx | 2 +- src/components/{custom-ui => ui}/button.tsx | 0 .../{custom-ui => ui}/separator.tsx | 0 .../{ => wrappers}/theme-provider.tsx | 0 15 files changed, 31 insertions(+), 31 deletions(-) rename src/components/{ => buttons}/icon-button.tsx (88%) rename src/components/{user => buttons}/redirect-button.tsx (84%) rename src/components/{user => buttons}/sso-login-button.tsx (90%) rename src/components/{ => custom-ui}/labeled-input.tsx (100%) rename src/components/{user => forms}/login-form.tsx (98%) rename src/components/{ => misc}/logo.tsx (100%) rename src/components/{user => misc}/theme-picker.tsx (95%) rename src/components/{custom-ui => ui}/button.tsx (100%) rename src/components/{custom-ui => ui}/separator.tsx (100%) rename src/components/{ => wrappers}/theme-provider.tsx (100%) diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 4e6773b..b3294a0 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -1,5 +1,5 @@ -import { RedirectButton } from '@/components/user/redirect-button'; -import { ThemePicker } from '@/components/user/theme-picker'; +import { RedirectButton } from '@/components/buttons/redirect-button'; +import { ThemePicker } from '@/components/misc/theme-picker'; export default function Home() { return ( diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e30808f..55cdd2c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ -import { ThemeProvider } from '@/components/theme-provider'; +import { ThemeProvider } from '@/components/wrappers/theme-provider'; import type { Metadata } from 'next'; import './globals.css'; diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 2933872..76778ae 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,17 +1,17 @@ import { auth, providerMap } from '@/auth'; -import SSOLogin from '@/components/user/sso-login-button'; -import LoginForm from '@/components/user/login-form'; +import SSOLogin from '@/components/buttons/sso-login-button'; +import LoginForm from '@/components/forms/login-form'; import { redirect } from 'next/navigation'; -import { Button } from '@/components/custom-ui/button'; +import { Button } from '@/components/ui/button'; import Image from 'next/image'; -import { Separator } from '@/components/custom-ui/separator'; -import Logo from '@/components/logo'; +import { Separator } from '@/components/ui/separator'; +import Logo from '@/components/misc/logo'; import { Card, CardContent, CardHeader, } from '@/components/custom-ui/login-card'; -import { ThemePicker } from '@/components/user/theme-picker'; +import { ThemePicker } from '@/components/misc/theme-picker'; import { HoverCard, HoverCardTrigger, @@ -26,7 +26,7 @@ export default async function LoginPage() { } return ( -
+
@@ -51,20 +51,20 @@ export default async function LoginPage() {
+ + + + + + dancing penguin + +
- - - - - - dancing penguin - -
); } diff --git a/src/app/logout/page.tsx b/src/app/logout/page.tsx index 38311da..e3da2fd 100644 --- a/src/app/logout/page.tsx +++ b/src/app/logout/page.tsx @@ -1,5 +1,5 @@ import { signOut } from '@/auth'; -import { Button } from '@/components/custom-ui/button'; +import { Button } from '@/components/ui/button'; import { Card, CardContent, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 7c005aa..563ebab 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -1,4 +1,4 @@ -import { Button } from '@/components/custom-ui/button'; +import { Button } from '@/components/ui/button'; import { Card, CardContent, diff --git a/src/components/icon-button.tsx b/src/components/buttons/icon-button.tsx similarity index 88% rename from src/components/icon-button.tsx rename to src/components/buttons/icon-button.tsx index ad67eaa..17f9945 100644 --- a/src/components/icon-button.tsx +++ b/src/components/buttons/icon-button.tsx @@ -1,4 +1,4 @@ -import { Button } from '@/components/custom-ui/button'; +import { Button } from '@/components/ui/button'; import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; diff --git a/src/components/user/redirect-button.tsx b/src/components/buttons/redirect-button.tsx similarity index 84% rename from src/components/user/redirect-button.tsx rename to src/components/buttons/redirect-button.tsx index e4f8a62..c4bf997 100644 --- a/src/components/user/redirect-button.tsx +++ b/src/components/buttons/redirect-button.tsx @@ -1,4 +1,4 @@ -import { Button } from '../custom-ui/button'; +import { Button } from '../ui/button'; import Link from 'next/link'; export function RedirectButton({ diff --git a/src/components/user/sso-login-button.tsx b/src/components/buttons/sso-login-button.tsx similarity index 90% rename from src/components/user/sso-login-button.tsx rename to src/components/buttons/sso-login-button.tsx index dc070b5..644efce 100644 --- a/src/components/user/sso-login-button.tsx +++ b/src/components/buttons/sso-login-button.tsx @@ -1,5 +1,5 @@ import { signIn } from '@/auth'; -import { IconButton } from '@/components/icon-button'; +import { IconButton } from '@/components/buttons/icon-button'; import { faOpenid } from '@fortawesome/free-brands-svg-icons'; export default function SSOLogin({ diff --git a/src/components/labeled-input.tsx b/src/components/custom-ui/labeled-input.tsx similarity index 100% rename from src/components/labeled-input.tsx rename to src/components/custom-ui/labeled-input.tsx diff --git a/src/components/user/login-form.tsx b/src/components/forms/login-form.tsx similarity index 98% rename from src/components/user/login-form.tsx rename to src/components/forms/login-form.tsx index a0167e2..67d161c 100644 --- a/src/components/user/login-form.tsx +++ b/src/components/forms/login-form.tsx @@ -3,8 +3,8 @@ import React, { useState, useRef } from 'react'; import { useRouter } from 'next/navigation'; -import LabeledInput from '@/components/labeled-input'; -import { Button } from '@/components/custom-ui/button'; +import LabeledInput from '@/components/custom-ui/labeled-input'; +import { Button } from '@/components/ui/button'; import useZodForm from '@/lib/hooks/useZodForm'; import { loginSchema, registerSchema } from '@/lib/validation/user'; import { loginAction } from '@/lib/auth/login'; diff --git a/src/components/logo.tsx b/src/components/misc/logo.tsx similarity index 100% rename from src/components/logo.tsx rename to src/components/misc/logo.tsx diff --git a/src/components/user/theme-picker.tsx b/src/components/misc/theme-picker.tsx similarity index 95% rename from src/components/user/theme-picker.tsx rename to src/components/misc/theme-picker.tsx index 2a1649d..b3397ed 100644 --- a/src/components/user/theme-picker.tsx +++ b/src/components/misc/theme-picker.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { Moon, Sun } from 'lucide-react'; import { useTheme } from 'next-themes'; -import { Button } from '@/components/custom-ui/button'; +import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, diff --git a/src/components/custom-ui/button.tsx b/src/components/ui/button.tsx similarity index 100% rename from src/components/custom-ui/button.tsx rename to src/components/ui/button.tsx diff --git a/src/components/custom-ui/separator.tsx b/src/components/ui/separator.tsx similarity index 100% rename from src/components/custom-ui/separator.tsx rename to src/components/ui/separator.tsx diff --git a/src/components/theme-provider.tsx b/src/components/wrappers/theme-provider.tsx similarity index 100% rename from src/components/theme-provider.tsx rename to src/components/wrappers/theme-provider.tsx From 87dc6162f48cb6e00d3307cfe81f99c92368376c Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:23:52 +0200 Subject: [PATCH 104/136] feat(api): upgrade zod to v4 and implement api docs and client generation --- .gitignore | 2 +- Dockerfile | 2 + docker-compose.dev.yml | 5 + entrypoint.dev.sh | 3 + exportSwagger.ts | 62 + orval.config.js | 10 + package.json | 14 +- prisma/schema.prisma | 26 +- src/app/api-doc/page.tsx | 11 + src/app/api-doc/react-swagger.tsx | 14 + src/app/globals.css | 5 + src/app/layout.tsx | 3 +- src/auth.ts | 25 +- src/components/forms/login-form.tsx | 2 +- src/components/query-provider.tsx | 12 + src/lib/apiHelpers.ts | 38 + src/lib/auth/login.ts | 4 +- src/lib/auth/register.ts | 36 +- src/lib/auth/validation.ts | 53 + src/lib/defaultApiResponses.ts | 60 + src/lib/hooks/useZodForm.tsx | 5 +- src/lib/swagger.ts | 36 + src/lib/validation/user.ts | 67 - src/middleware.ts | 2 +- tsconfig.json | 5 + yarn.lock | 4744 +++++++++++++++++++++++++-- 26 files changed, 4827 insertions(+), 419 deletions(-) create mode 100644 exportSwagger.ts create mode 100644 orval.config.js create mode 100644 src/app/api-doc/page.tsx create mode 100644 src/app/api-doc/react-swagger.tsx create mode 100644 src/components/query-provider.tsx create mode 100644 src/lib/apiHelpers.ts create mode 100644 src/lib/auth/validation.ts create mode 100644 src/lib/defaultApiResponses.ts create mode 100644 src/lib/swagger.ts delete mode 100644 src/lib/validation/user.ts diff --git a/.gitignore b/.gitignore index 918f651..cda64ee 100644 --- a/.gitignore +++ b/.gitignore @@ -43,5 +43,5 @@ next-env.d.ts # database /prisma/*.db* -src/generated/prisma +src/generated/* data diff --git a/Dockerfile b/Dockerfile index ffd911a..b60e118 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,6 +16,8 @@ RUN corepack enable COPY --from=deps /app/node_modules ./node_modules COPY . . RUN yarn prisma:generate +RUN yarn swagger:generate +RUN yarn orval:generate RUN yarn build # ----- Runner ----- diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 3aa4174..feae683 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -13,6 +13,7 @@ services: - .env.local volumes: - ./data:/data + - ./src/generated:/app/src/generated develop: watch: - action: sync @@ -20,8 +21,12 @@ services: target: /app/src ignore: - node_modules/ + - generated/ - action: rebuild path: package.json - action: sync+restart path: prisma target: /app/prisma + - action: sync+restart + path: ./src/app/api + target: /app/src/app/api diff --git a/entrypoint.dev.sh b/entrypoint.dev.sh index ec103bf..64b45df 100644 --- a/entrypoint.dev.sh +++ b/entrypoint.dev.sh @@ -7,4 +7,7 @@ if [ -d "prisma" ]; then yarn prisma:db:push fi +yarn swagger:generate +yarn orval:generate + exec yarn dev diff --git a/exportSwagger.ts b/exportSwagger.ts new file mode 100644 index 0000000..1eb2837 --- /dev/null +++ b/exportSwagger.ts @@ -0,0 +1,62 @@ +import { registry } from '@/lib/swagger'; +import { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi'; +import fs from 'fs'; +import path from 'path'; + +function recursiveFileSearch(dir: string, fileList: string[] = []): string[] { + const files = fs.readdirSync(dir); + files.forEach((file) => { + const filePath = path.join(dir, file); + if (fs.statSync(filePath).isDirectory()) { + recursiveFileSearch(filePath, fileList); + } else if (file.match(/swagger\.ts$/)) { + fileList.push(filePath); + } + }); + return fileList; +} + +async function exportSwagger() { + const filesToImport = recursiveFileSearch( + path.join(process.cwd(), 'src', 'app', 'api'), + ); + + await Promise.all( + filesToImport.map((file) => { + return import(file) + .then((module) => { + if (module.default) { + module.default(registry); + } + }) + .catch((error) => { + console.error(`Error importing ${file}:`, error); + }); + }), + ); + + await import('./src/app/api/validation'); + + const generator = new OpenApiGeneratorV3(registry.definitions); + const spec = generator.generateDocument({ + openapi: '3.0.0', + info: { + version: '1.0.0', + title: 'MeetUP', + description: 'API documentation for MeetUP application', + }, + }); + + const outputPath = path.join( + process.cwd(), + 'src', + 'generated', + 'swagger.json', + ); + fs.writeFileSync(outputPath, JSON.stringify(spec, null, 2), 'utf8'); + console.log(`Swagger JSON generated at ${outputPath}`); +} + +exportSwagger().catch((error) => { + console.error('Error exporting Swagger:', error); +}); diff --git a/orval.config.js b/orval.config.js new file mode 100644 index 0000000..718a86a --- /dev/null +++ b/orval.config.js @@ -0,0 +1,10 @@ +module.exports = { + meetup: { + input: './src/generated/swagger.json', + output: { + mode: 'tags-split', + target: './src/generated/api/meetup.ts', + client: 'react-query', + }, + }, +}; diff --git a/package.json b/package.json index 47fb175..12d6e4e 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,12 @@ "prisma:studio": "dotenv -e .env.local -- prisma studio", "prisma:db:push": "dotenv -e .env.local -- prisma db push", "prisma:migrate:reset": "dotenv -e .env.local -- prisma migrate reset", - "dev_container": "docker compose -f docker-compose.dev.yml up --watch --build" + "dev_container": "docker compose -f docker-compose.dev.yml up --watch --build", + "swagger:generate": "ts-node -r tsconfig-paths/register exportSwagger.ts", + "orval:generate": "orval" }, "dependencies": { + "@asteasolutions/zod-to-openapi": "^8.0.0-beta.4", "@auth/prisma-adapter": "^2.9.1", "@fortawesome/fontawesome-svg-core": "^6.7.2", "@fortawesome/free-brands-svg-icons": "^6.7.2", @@ -33,16 +36,18 @@ "@radix-ui/react-slot": "^1.2.2", "@radix-ui/react-switch": "^1.2.4", "@radix-ui/react-tabs": "^1.1.11", + "@tanstack/react-query": "^5.80.7", "bcryptjs": "^3.0.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.3.4", + "next": "15.4.0-canary.85", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", "react-dom": "^19.0.0", "react-hook-form": "^7.56.4", + "swagger-ui-react": "^5.24.1", "tailwind-merge": "^3.2.0", "zod": "^3.25.60" }, @@ -52,14 +57,19 @@ "@types/node": "22.15.32", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", + "@types/swagger-ui-react": "5", + "@types/webpack-env": "1.18.8", "dotenv-cli": "8.0.0", "eslint": "9.29.0", "eslint-config-next": "15.3.4", "eslint-config-prettier": "10.1.5", + "orval": "7.10.0", "postcss": "8.5.6", "prettier": "3.5.3", "prisma": "6.9.0", "tailwindcss": "4.1.10", + "ts-node": "10.9.2", + "tsconfig-paths": "4.2.0", "tw-animate-css": "1.3.4", "typescript": "5.8.3" }, diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 712a068..ffa1c86 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -158,8 +158,8 @@ model Friendship { requested_at DateTime @default(now()) accepted_at DateTime? - user1 User @relation("FriendshipUser1", fields: [user_id_1], references: [id]) - user2 User @relation("FriendshipUser2", fields: [user_id_2], references: [id]) + user1 User @relation("FriendshipUser1", fields: [user_id_1], references: [id], onDelete: Cascade) + user2 User @relation("FriendshipUser2", fields: [user_id_2], references: [id], onDelete: Cascade) @@id([user_id_1, user_id_2]) @@index([user_id_2, status], name: "idx_friendships_user2_status") @@ -187,8 +187,8 @@ model GroupMember { role group_member_role @default(MEMBER) added_at DateTime @default(now()) - group Group @relation(fields: [group_id], references: [id]) - user User @relation(fields: [user_id], references: [id]) + group Group @relation(fields: [group_id], references: [id], onDelete: Cascade) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@id([group_id, user_id]) @@index([user_id]) @@ -207,7 +207,7 @@ model BlockedSlot { created_at DateTime @default(now()) updated_at DateTime @updatedAt - user User @relation(fields: [user_id], references: [id]) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@index([user_id, start_time, end_time]) @@index([user_id, is_recurring]) @@ -241,8 +241,8 @@ model MeetingParticipant { status participant_status @default(PENDING) added_at DateTime @default(now()) - meeting Meeting @relation(fields: [meeting_id], references: [id]) - user User @relation(fields: [user_id], references: [id]) + meeting Meeting @relation(fields: [meeting_id], references: [id], onDelete: Cascade) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@id([meeting_id, user_id]) @@index([user_id, status], name: "idx_participants_user_status") @@ -259,7 +259,7 @@ model Notification { is_read Boolean @default(false) created_at DateTime @default(now()) - user User @relation(fields: [user_id], references: [id]) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@index([user_id, is_read, created_at], name: "idx_notifications_user_read_time") @@map("notifications") @@ -271,7 +271,7 @@ model UserNotificationPreference { email_enabled Boolean @default(false) updated_at DateTime @default(now()) - user User @relation(fields: [user_id], references: [id]) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@id([user_id, notification_type]) @@map("user_notification_preferences") @@ -292,7 +292,7 @@ model EmailQueue { created_at DateTime @default(now()) updated_at DateTime @updatedAt - user User @relation(fields: [user_id], references: [id]) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@index([status, scheduled_at], name: "idx_email_queue_pending_jobs") @@index([user_id, created_at], name: "idx_email_queue_user_history") @@ -308,7 +308,7 @@ model CalendarExportToken { created_at DateTime @default(now()) last_accessed_at DateTime? - user User @relation(fields: [user_id], references: [id]) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@index([user_id]) @@map("calendar_export_tokens") @@ -327,7 +327,7 @@ model CalendarSubscription { created_at DateTime @default(now()) updated_at DateTime @updatedAt - user User @relation(fields: [user_id], references: [id]) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) externalEvents ExternalEvent[] @@index([user_id, is_enabled]) @@ -350,7 +350,7 @@ model ExternalEvent { show_as_free Boolean @default(false) last_fetched_at DateTime @default(now()) - subscription CalendarSubscription @relation(fields: [subscription_id], references: [id]) + subscription CalendarSubscription @relation(fields: [subscription_id], references: [id], onDelete: Cascade) @@unique([subscription_id, ical_uid], name: "uq_external_event_sub_uid") @@index([subscription_id, start_time, end_time]) diff --git a/src/app/api-doc/page.tsx b/src/app/api-doc/page.tsx new file mode 100644 index 0000000..c6e9694 --- /dev/null +++ b/src/app/api-doc/page.tsx @@ -0,0 +1,11 @@ +import { getApiDocs } from '@/lib/swagger'; +import ReactSwagger from './react-swagger'; + +export default async function IndexPage() { + const spec = await getApiDocs(); + return ( +
+ +
+ ); +} diff --git a/src/app/api-doc/react-swagger.tsx b/src/app/api-doc/react-swagger.tsx new file mode 100644 index 0000000..0dd3931 --- /dev/null +++ b/src/app/api-doc/react-swagger.tsx @@ -0,0 +1,14 @@ +'use client'; + +import SwaggerUI from 'swagger-ui-react'; +import 'swagger-ui-react/swagger-ui.css'; + +type Props = { + spec: object; +}; + +function ReactSwagger({ spec }: Props) { + return ; +} + +export default ReactSwagger; diff --git a/src/app/globals.css b/src/app/globals.css index ec97843..f85cb2f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -364,3 +364,8 @@ @apply bg-background text-foreground; } } + +/* Fix for swagger ui readability */ +body:has(.swagger-ui) { + @apply bg-white text-black; +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 55cdd2c..201a730 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,6 +2,7 @@ import { ThemeProvider } from '@/components/wrappers/theme-provider'; import type { Metadata } from 'next'; import './globals.css'; +import { QueryProvider } from '@/components/query-provider'; export const metadata: Metadata = { title: 'MeetUp', @@ -55,7 +56,7 @@ export default function RootLayout({ enableSystem disableTransitionOnChange > - {children} + {children} diff --git a/src/auth.ts b/src/auth.ts index 8ec5994..405b729 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -8,9 +8,8 @@ import Authentik from 'next-auth/providers/authentik'; import { PrismaAdapter } from '@auth/prisma-adapter'; import { prisma } from '@/prisma'; -import { loginSchema } from './lib/validation/user'; - -import { ZodError } from 'zod'; +import { loginSchema } from '@/lib/auth/validation'; +import { ZodError } from 'zod/v4'; class InvalidLoginError extends CredentialsSignin { constructor(code: string) { @@ -25,7 +24,11 @@ const providers: Provider[] = [ Credentials({ credentials: { password: { label: 'Password', type: 'password' } }, async authorize(c) { - if (process.env.NODE_ENV === 'development' && c.password === 'password') + if ( + process.env.NODE_ENV === 'development' && + process.env.DISABLE_AUTH_TEST_USER !== 'true' && + c.password === 'password' + ) return { id: 'test', name: 'Test User', @@ -37,7 +40,7 @@ const providers: Provider[] = [ const { email, password } = await loginSchema.parseAsync(c); const user = await prisma.user.findFirst({ - where: { email }, + where: { OR: [{ email }, { name: email }] }, include: { accounts: true }, }); @@ -113,6 +116,18 @@ export const { handlers, signIn, signOut, auth } = NextAuth({ authorized({ auth }) { return !!auth?.user; }, + session: async ({ session, token }) => { + if (session?.user) { + session.user.id = token.sub as string; + } + return session; + }, + jwt: async ({ user, token }) => { + if (user) { + token.uid = user.id; + } + return token; + }, }, debug: process.env.NODE_ENV === 'development', }); diff --git a/src/components/forms/login-form.tsx b/src/components/forms/login-form.tsx index 67d161c..8f6b709 100644 --- a/src/components/forms/login-form.tsx +++ b/src/components/forms/login-form.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/navigation'; import LabeledInput from '@/components/custom-ui/labeled-input'; import { Button } from '@/components/ui/button'; import useZodForm from '@/lib/hooks/useZodForm'; -import { loginSchema, registerSchema } from '@/lib/validation/user'; +import { loginSchema, registerSchema } from '@/lib/auth/validation'; import { loginAction } from '@/lib/auth/login'; import { registerAction } from '@/lib/auth/register'; diff --git a/src/components/query-provider.tsx b/src/components/query-provider.tsx new file mode 100644 index 0000000..4d05c6c --- /dev/null +++ b/src/components/query-provider.tsx @@ -0,0 +1,12 @@ +'use client'; + +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import * as React from 'react'; + +const queryClient = new QueryClient(); + +export function QueryProvider({ children }: { children: React.ReactNode }) { + return ( + {children} + ); +} diff --git a/src/lib/apiHelpers.ts b/src/lib/apiHelpers.ts new file mode 100644 index 0000000..7f5c28e --- /dev/null +++ b/src/lib/apiHelpers.ts @@ -0,0 +1,38 @@ +import { NextAuthRequest } from 'next-auth'; +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { NextResponse } from 'next/server'; + +extendZodWithOpenApi(zod); + +export function userAuthenticated(req: NextAuthRequest) { + if (!req.auth || !req.auth.user || !req.auth.user.id) + return { + continue: false, + response: { success: false, message: 'Not authenticated' }, + metadata: { status: 401 }, + } as const; + return { continue: true, user: req.auth.user } as const; +} + +export function returnZodTypeCheckedResponse< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Schema extends zod.ZodType, +>( + expectedType: Schema, + response: zod.input, + metadata?: { status: number }, +): NextResponse { + const result = expectedType.safeParse(response); + if (!result.success) { + return NextResponse.json( + { + success: false, + message: 'Invalid response format', + errors: result.error.issues, + }, + { status: 500 }, + ); + } + return NextResponse.json(result.data, { status: metadata?.status || 200 }); +} diff --git a/src/lib/auth/login.ts b/src/lib/auth/login.ts index 0019ae0..1c03356 100644 --- a/src/lib/auth/login.ts +++ b/src/lib/auth/login.ts @@ -1,7 +1,7 @@ 'use server'; -import { z } from 'zod'; -import { loginSchema } from '@/lib/validation/user'; +import { z } from 'zod/v4'; +import { loginSchema } from './validation'; import { signIn } from '@/auth'; export async function loginAction(data: z.infer) { diff --git a/src/lib/auth/register.ts b/src/lib/auth/register.ts index 9eba8e9..0ca8eb3 100644 --- a/src/lib/auth/register.ts +++ b/src/lib/auth/register.ts @@ -1,46 +1,24 @@ 'use server'; -import type { z } from 'zod'; +import type { z } from 'zod/v4'; import bcrypt from 'bcryptjs'; -import { registerSchema } from '@/lib/validation/user'; +import { registerServerSchema } from './validation'; import { prisma } from '@/prisma'; -export async function registerAction(data: z.infer) { +export async function registerAction( + data: z.infer, +) { try { - const result = await registerSchema.safeParseAsync(data); + const result = await registerServerSchema.safeParseAsync(data); if (!result.success) { return { - error: result.error.errors[0].message, + error: result.error.issues[0].message, }; } const { email, password, firstName, lastName, username } = result.data; - const user = await prisma.user.findUnique({ - where: { - email, - }, - }); - - if (user) { - return { - error: 'User already exist with this email', - }; - } - - const existingUsername = await prisma.user.findUnique({ - where: { - name: username, - }, - }); - - if (existingUsername) { - return { - error: 'Username already exists', - }; - } - const passwordHash = await bcrypt.hash(password, 10); await prisma.$transaction(async (tx) => { diff --git a/src/lib/auth/validation.ts b/src/lib/auth/validation.ts new file mode 100644 index 0000000..50a6b23 --- /dev/null +++ b/src/lib/auth/validation.ts @@ -0,0 +1,53 @@ +import zod from 'zod/v4'; +import { + emailSchema, + firstNameSchema, + lastNameSchema, + newUserEmailServerSchema, + newUserNameServerSchema, + passwordSchema, + userNameSchema, +} from '@/app/api/user/validation'; + +// ---------------------------------------- +// +// Login Validation +// +// ---------------------------------------- +export const loginSchema = zod.object({ + email: emailSchema.or(userNameSchema), + password: zod.string().min(1, 'Password is required'), +}); + +// ---------------------------------------- +// +// Register Validation +// +// ---------------------------------------- +export const registerServerSchema = zod + .object({ + firstName: firstNameSchema, + lastName: lastNameSchema, + email: newUserEmailServerSchema, + password: passwordSchema, + confirmPassword: passwordSchema, + username: newUserNameServerSchema, + }) + .refine((data) => data.password === data.confirmPassword, { + message: 'Passwords do not match', + path: ['confirmPassword'], + }); + +export const registerSchema = zod + .object({ + firstName: firstNameSchema, + lastName: lastNameSchema, + email: emailSchema, + password: passwordSchema, + confirmPassword: passwordSchema, + username: userNameSchema, + }) + .refine((data) => data.password === data.confirmPassword, { + message: 'Passwords do not match', + path: ['confirmPassword'], + }); diff --git a/src/lib/defaultApiResponses.ts b/src/lib/defaultApiResponses.ts new file mode 100644 index 0000000..3e8a314 --- /dev/null +++ b/src/lib/defaultApiResponses.ts @@ -0,0 +1,60 @@ +import { + ErrorResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; + +export const invalidRequestDataResponse = { + 400: { + description: 'Invalid request data', + content: { + 'application/json': { + schema: ZodErrorResponseSchema, + }, + }, + }, +}; + +export const notAuthenticatedResponse = { + 401: { + description: 'Not authenticated', + content: { + 'application/json': { + schema: ErrorResponseSchema, + example: { + success: false, + message: 'Not authenticated', + }, + }, + }, + }, +}; + +export const userNotFoundResponse = { + 404: { + description: 'User not found', + content: { + 'application/json': { + schema: ErrorResponseSchema, + example: { + success: false, + message: 'User not found', + }, + }, + }, + }, +}; + +export const serverReturnedDataValidationErrorResponse = { + 500: { + description: 'Server returned data validation error', + content: { + 'application/json': { + schema: ZodErrorResponseSchema, + example: { + success: false, + message: 'Server returned data validation error', + }, + }, + }, + }, +}; diff --git a/src/lib/hooks/useZodForm.tsx b/src/lib/hooks/useZodForm.tsx index 8b8eb62..13dbf1d 100644 --- a/src/lib/hooks/useZodForm.tsx +++ b/src/lib/hooks/useZodForm.tsx @@ -1,13 +1,14 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; -import { z } from 'zod'; +import { z } from 'zod/v4'; export default function useZodForm< // eslint-disable-next-line @typescript-eslint/no-explicit-any Schema extends z.ZodType, Values extends z.infer, >(schema: Schema, defaultValues?: Values) { - return useForm({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return useForm, any, z.output>({ resolver: zodResolver(schema), defaultValues, }); diff --git a/src/lib/swagger.ts b/src/lib/swagger.ts new file mode 100644 index 0000000..dc6436e --- /dev/null +++ b/src/lib/swagger.ts @@ -0,0 +1,36 @@ +import { + OpenAPIRegistry, + OpenApiGeneratorV3, +} from '@asteasolutions/zod-to-openapi'; + +export const registry = new OpenAPIRegistry(); + +export const getApiDocs = async () => { + const swaggerFiles = require.context('../app', true, /swagger\.ts$/); + + swaggerFiles + .keys() + .sort((a, b) => b.length - a.length) + .forEach((file) => { + console.log(`Registering Swagger file: ${file}`); + swaggerFiles(file).default?.(registry); + }); + // eslint-disable-next-line @typescript-eslint/no-require-imports + require('@/app/api/validation'); + + try { + const generator = new OpenApiGeneratorV3(registry.definitions); + const spec = generator.generateDocument({ + openapi: '3.0.0', + info: { + version: '1.0.0', + title: 'MeetUP', + description: 'API documentation for MeetUP application', + }, + }); + return spec; + } catch (error) { + console.error('Error generating API docs:', error); + throw new Error('Failed to generate API documentation'); + } +}; diff --git a/src/lib/validation/user.ts b/src/lib/validation/user.ts deleted file mode 100644 index a2efa5e..0000000 --- a/src/lib/validation/user.ts +++ /dev/null @@ -1,67 +0,0 @@ -import zod from 'zod'; - -export const loginSchema = zod.object({ - email: zod - .string() - .email('Invalid email address') - .min(3, 'Email is required') - .or( - zod - .string() - .min(3, 'Username is required') - .max(32, 'Username must be at most 32 characters long') - .regex( - /^[a-zA-Z0-9_]+$/, - 'Username can only contain letters, numbers, and underscores', - ), - ), - password: zod.string().min(1, 'Password is required'), -}); - -export const registerSchema = zod - .object({ - firstName: zod - .string() - .min(1, 'First name is required') - .max(32, 'First name must be at most 32 characters long'), - lastName: zod - .string() - .min(1, 'Last name is required') - .max(32, 'Last name must be at most 32 characters long'), - email: zod - .string() - .email('Invalid email address') - .min(3, 'Email is required'), - password: zod - .string() - .min(8, 'Password must be at least 8 characters long') - .max(128, 'Password must be at most 128 characters long'), - confirmPassword: zod - .string() - .min(8, 'Password must be at least 8 characters long') - .max(128, 'Password must be at most 128 characters long'), - username: zod - .string() - .min(3, 'Username is required') - .max(32, 'Username must be at most 32 characters long') - .regex( - /^[a-zA-Z0-9_]+$/, - 'Username can only contain letters, numbers, and underscores', - ), - }) - .refine((data) => data.password === data.confirmPassword, { - message: 'Passwords do not match', - path: ['confirmPassword'], - }) - .refine( - (data) => - !data.password.includes(data.firstName) && - !data.password.includes(data.lastName) && - !data.password.includes(data.email) && - !data.password.includes(data.username), - { - message: - 'Password cannot contain your first name, last name, email, or username', - path: ['password'], - }, - ); diff --git a/src/middleware.ts b/src/middleware.ts index b2f73cf..a1ae8e1 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -2,6 +2,6 @@ export { auth as middleware } from '@/auth'; export const config = { matcher: [ - '/((?!api|_next/static|_next/image|site\.webmanifest|web-app-manifest-(?:192x192|512x512)\.png|favicon(?:-(?:dark|light))?\.(?:png|svg|ico)|fonts).*)', + '/((?!api|_next/static|api-doc|_next/image|site\.webmanifest|web-app-manifest-(?:192x192|512x512)\.png|apple-touch-icon.png|favicon(?:-(?:dark|light))?\.(?:png|svg|ico)|fonts).*)', ], }; diff --git a/tsconfig.json b/tsconfig.json index c133409..251099e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,11 @@ "@/*": ["./src/*"] } }, + "ts-node": { + "compilerOptions": { + "module": "commonjs" + } + }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } diff --git a/yarn.lock b/yarn.lock index 8118aeb..d40bfd6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,68 @@ __metadata: languageName: node linkType: hard +"@apidevtools/json-schema-ref-parser@npm:11.7.2": + version: 11.7.2 + resolution: "@apidevtools/json-schema-ref-parser@npm:11.7.2" + dependencies: + "@jsdevtools/ono": "npm:^7.1.3" + "@types/json-schema": "npm:^7.0.15" + js-yaml: "npm:^4.1.0" + checksum: 10c0/90dd8e60e25ccfe5c7de2453de893d5f5bb7c6cabcce028edf0678a119f0e433f422d730aa14fd718542e80fa7b3acf40923d69dc8e9f6c25603842b76ad2f16 + languageName: node + linkType: hard + +"@apidevtools/openapi-schemas@npm:^2.1.0": + version: 2.1.0 + resolution: "@apidevtools/openapi-schemas@npm:2.1.0" + checksum: 10c0/f4aa0f9df32e474d166c84ef91bceb18fa1c4f44b5593879529154ef340846811ea57dc2921560f157f692262827d28d988dd6e19fb21f00320e9961964176b4 + languageName: node + linkType: hard + +"@apidevtools/swagger-methods@npm:^3.0.2": + version: 3.0.2 + resolution: "@apidevtools/swagger-methods@npm:3.0.2" + checksum: 10c0/8c390e8e50c0be7787ba0ba4c3758488bde7c66c2d995209b4b48c1f8bc988faf393cbb24a4bd1cd2d42ce5167c26538e8adea5c85eb922761b927e4dab9fa1c + languageName: node + linkType: hard + +"@apidevtools/swagger-parser@npm:^10.1.1": + version: 10.1.1 + resolution: "@apidevtools/swagger-parser@npm:10.1.1" + dependencies: + "@apidevtools/json-schema-ref-parser": "npm:11.7.2" + "@apidevtools/openapi-schemas": "npm:^2.1.0" + "@apidevtools/swagger-methods": "npm:^3.0.2" + "@jsdevtools/ono": "npm:^7.1.3" + ajv: "npm:^8.17.1" + ajv-draft-04: "npm:^1.0.0" + call-me-maybe: "npm:^1.0.2" + peerDependencies: + openapi-types: ">=7" + checksum: 10c0/21be668c64311d54579ef06e71b6d5640df032f4cdd959dfde93210f26128cbe3c84eb29ead1895c93af703cd4f2fd7efae31dd316549f1f9d29293c78b0ccd4 + languageName: node + linkType: hard + +"@asteasolutions/zod-to-openapi@npm:^8.0.0-beta.4": + version: 8.0.0-beta.4 + resolution: "@asteasolutions/zod-to-openapi@npm:8.0.0-beta.4" + dependencies: + openapi3-ts: "npm:^4.1.2" + peerDependencies: + zod: ~3.25.1 + checksum: 10c0/596a149bc1c132f640befc1a9c58ca31d651146ea83ee98861cf65bddca3be6dbb324d82179ef45717f49c4e73114e3f86213711671c9065eaf01d594b408ff2 + languageName: node + linkType: hard + +"@asyncapi/specs@npm:^6.8.0": + version: 6.8.1 + resolution: "@asyncapi/specs@npm:6.8.1" + dependencies: + "@types/json-schema": "npm:^7.0.11" + checksum: 10c0/a7bb241a7b3c5c5027a5a9d46ccf6920305d9bc7560112058a040c22c49a1d3725e736ff1742f9bf85a3f922f6d73fe84d1518566744ba8598f36d85f92affc2 + languageName: node + linkType: hard + "@auth/core@npm:0.39.1": version: 0.39.1 resolution: "@auth/core@npm:0.39.1" @@ -57,6 +119,31 @@ __metadata: languageName: node linkType: hard +"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.26.10, @babel/runtime-corejs3@npm:^7.27.1": + version: 7.27.6 + resolution: "@babel/runtime-corejs3@npm:7.27.6" + dependencies: + core-js-pure: "npm:^3.30.2" + checksum: 10c0/0ec7725824fdc3dd1e9580c1887ea60088d1cc3ec2fcfad9ccf54909262786b70e74f4b90513718d18f062a918b45add94c4dc243186f1423ed03cacf9935863 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.3.1": + version: 7.27.6 + resolution: "@babel/runtime@npm:7.27.6" + checksum: 10c0/89726be83f356f511dcdb74d3ea4d873a5f0cf0017d4530cb53aa27380c01ca102d573eff8b8b77815e624b1f8c24e7f0311834ad4fb632c90a770fda00bd4c8 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/core@npm:1.4.3" @@ -85,6 +172,181 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/aix-ppc64@npm:0.25.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/android-arm64@npm:0.25.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/android-arm@npm:0.25.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/android-x64@npm:0.25.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/darwin-arm64@npm:0.25.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/darwin-x64@npm:0.25.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/freebsd-arm64@npm:0.25.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/freebsd-x64@npm:0.25.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-arm64@npm:0.25.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-arm@npm:0.25.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-ia32@npm:0.25.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-loong64@npm:0.25.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-mips64el@npm:0.25.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-ppc64@npm:0.25.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-riscv64@npm:0.25.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-s390x@npm:0.25.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/linux-x64@npm:0.25.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/netbsd-arm64@npm:0.25.5" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/netbsd-x64@npm:0.25.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/openbsd-arm64@npm:0.25.5" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/openbsd-x64@npm:0.25.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/sunos-x64@npm:0.25.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/win32-arm64@npm:0.25.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/win32-ia32@npm:0.25.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.25.5": + version: 0.25.5 + resolution: "@esbuild/win32-x64@npm:0.25.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.7.0": version: 4.7.0 resolution: "@eslint-community/eslint-utils@npm:4.7.0" @@ -115,9 +377,9 @@ __metadata: linkType: hard "@eslint/config-helpers@npm:^0.2.1": - version: 0.2.2 - resolution: "@eslint/config-helpers@npm:0.2.2" - checksum: 10c0/98f7cefe484bb754674585d9e73cf1414a3ab4fd0783c385465288d13eb1a8d8e7d7b0611259fc52b76b396c11a13517be5036d1f48eeb877f6f0a6b9c4f03ad + version: 0.2.3 + resolution: "@eslint/config-helpers@npm:0.2.3" + checksum: 10c0/8fd36d7f33013628787947c81894807c7498b31eacf6648efa6d7c7a99aac6bf0d59a8a4d14f968ec2aeebefb76a1a7e4fd4cd556a296323d4711b3d7a7cda22 languageName: node linkType: hard @@ -130,6 +392,15 @@ __metadata: languageName: node linkType: hard +"@eslint/core@npm:^0.15.0": + version: 0.15.0 + resolution: "@eslint/core@npm:0.15.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/9882c69acfe29743ce473a619d5248589c6687561afaabe8ec8d7ffed07592db16edcca3af022f33ea92fe5f6cfbe3545ee53e89292579d22a944ebaeddcf72d + languageName: node + linkType: hard + "@eslint/eslintrc@npm:3.3.1, @eslint/eslintrc@npm:^3.3.1": version: 3.3.1 resolution: "@eslint/eslintrc@npm:3.3.1" @@ -162,12 +433,19 @@ __metadata: linkType: hard "@eslint/plugin-kit@npm:^0.3.1": - version: 0.3.1 - resolution: "@eslint/plugin-kit@npm:0.3.1" + version: 0.3.2 + resolution: "@eslint/plugin-kit@npm:0.3.2" dependencies: - "@eslint/core": "npm:^0.14.0" + "@eslint/core": "npm:^0.15.0" levn: "npm:^0.4.1" - checksum: 10c0/a75f0b5d38430318a551b83e27bee570747eb50beeb76b03f64b0e78c2c27ef3d284cfda3443134df028db3251719bc0850c105f778122f6ad762d5270ec8063 + checksum: 10c0/e069b0a46eb9fa595a1ac7dea4540a9daa493afba88875ee054e9117609c1c41555e779303cb4cff36cf88f603ba6eba2556a927e8ced77002828206ee17fc7e + languageName: node + linkType: hard + +"@exodus/schemasafe@npm:^1.0.0-rc.2": + version: 1.3.0 + resolution: "@exodus/schemasafe@npm:1.3.0" + checksum: 10c0/e19397c14db76342154c32a9088536149babfd9b18ecae815add0b2f911d9aa292aa51c6ab33b857b4b6bb371a74ebde845e6f17b2824e73b4e307230f23f86a languageName: node linkType: hard @@ -264,6 +542,19 @@ __metadata: languageName: node linkType: hard +"@gerrit0/mini-shiki@npm:^3.2.2": + version: 3.6.0 + resolution: "@gerrit0/mini-shiki@npm:3.6.0" + dependencies: + "@shikijs/engine-oniguruma": "npm:^3.6.0" + "@shikijs/langs": "npm:^3.6.0" + "@shikijs/themes": "npm:^3.6.0" + "@shikijs/types": "npm:^3.6.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/347456c9da8a1fadd3c1f63097da459a5f930ef4bca6431cce913a379012c551e061d0a94ff7a0f307215b87f2418b7c198a55fba888fc97fb02ab36247adf6b + languageName: node + linkType: hard + "@hookform/resolvers@npm:^5.0.1": version: 5.1.1 resolution: "@hookform/resolvers@npm:5.1.1" @@ -313,6 +604,32 @@ __metadata: languageName: node linkType: hard +"@ibm-cloud/openapi-ruleset-utilities@npm:1.9.0": + version: 1.9.0 + resolution: "@ibm-cloud/openapi-ruleset-utilities@npm:1.9.0" + checksum: 10c0/8a95857406e8ea4c9b6337ce790f0d24207d901db6d070d76fa87e26557c3a5ce833000cca6db598094d8e8cc60263ff39d95b6c505e6195493b3fa6b63bf047 + languageName: node + linkType: hard + +"@ibm-cloud/openapi-ruleset@npm:^1.29.4": + version: 1.31.1 + resolution: "@ibm-cloud/openapi-ruleset@npm:1.31.1" + dependencies: + "@ibm-cloud/openapi-ruleset-utilities": "npm:1.9.0" + "@stoplight/spectral-formats": "npm:^1.8.2" + "@stoplight/spectral-functions": "npm:^1.9.3" + "@stoplight/spectral-rulesets": "npm:^1.21.3" + chalk: "npm:^4.1.2" + jsonschema: "npm:^1.5.0" + lodash: "npm:^4.17.21" + loglevel: "npm:^1.9.2" + loglevel-plugin-prefix: "npm:0.8.4" + minimatch: "npm:^6.2.0" + validator: "npm:^13.11.0" + checksum: 10c0/b81180e87b22a9ecef135fc9d25c7796ebeb0de6fd569164033249a1e96f41191d0c91d453d8692ace54ee3aa8cbe5a3377ec435c727b3b1c8e0740460f16ddf + languageName: node + linkType: hard + "@img/sharp-darwin-arm64@npm:0.34.2": version: 0.34.2 resolution: "@img/sharp-darwin-arm64@npm:0.34.2" @@ -502,6 +819,20 @@ __metadata: languageName: node linkType: hard +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + "@isaacs/fs-minipass@npm:^4.0.0": version: 4.0.1 resolution: "@isaacs/fs-minipass@npm:4.0.1" @@ -522,7 +853,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e @@ -543,6 +874,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.24": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" @@ -553,21 +894,55 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.10": - version: 0.2.10 - resolution: "@napi-rs/wasm-runtime@npm:0.2.10" +"@jsdevtools/ono@npm:^7.1.3": + version: 7.1.3 + resolution: "@jsdevtools/ono@npm:7.1.3" + checksum: 10c0/a9f7e3e8e3bc315a34959934a5e2f874c423cf4eae64377d3fc9de0400ed9f36cb5fd5ebce3300d2e8f4085f557c4a8b591427a583729a87841fda46e6c216b9 + languageName: node + linkType: hard + +"@jsep-plugin/assignment@npm:^1.3.0": + version: 1.3.0 + resolution: "@jsep-plugin/assignment@npm:1.3.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/d749554dc691798116eb068eebe2d9bcb0b0d89ef6c7cc7c2a9f37d03da15fdbf8053407e97008090cd1bd6f256ea6c26abbada7399cf79f0b6b502e164b084b + languageName: node + linkType: hard + +"@jsep-plugin/regex@npm:^1.0.1, @jsep-plugin/regex@npm:^1.0.4": + version: 1.0.4 + resolution: "@jsep-plugin/regex@npm:1.0.4" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/bec7eb7ea6ab453a2672edc808644c5be3dc06b2a9d77182e18cd595b37deba6dcdb3760849d8684afc5779a86b7d2604dd525cb612a548f9ed9f31a8032ec24 + languageName: node + linkType: hard + +"@jsep-plugin/ternary@npm:^1.0.2": + version: 1.1.4 + resolution: "@jsep-plugin/ternary@npm:1.1.4" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/d50c9eb28d1872e333a5229b66ae6347aa4333a5fac4a8fff86c585a78acff6d8ed2184554b8dc888df70786a272deba530ccfdb216b6abff7f1ab48df3248e7 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^0.2.10, @napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.11 + resolution: "@napi-rs/wasm-runtime@npm:0.2.11" dependencies: "@emnapi/core": "npm:^1.4.3" "@emnapi/runtime": "npm:^1.4.3" "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10c0/4dce9bbb94a8969805574e1b55fdbeb7623348190265d77f6507ba32e535610deeb53a33ba0bb8b05a6520f379d418b92e8a01c5cd7b9486b136d2c0c26be0bd + checksum: 10c0/049bd14c58b99fbe0967b95e9921c5503df196b59be22948d2155f17652eb305cff6728efd8685338b855da7e476dd2551fbe3a313fc2d810938f0717478441e languageName: node linkType: hard -"@next/env@npm:15.3.4": - version: 15.3.4 - resolution: "@next/env@npm:15.3.4" - checksum: 10c0/43d37896e1422c9c353d9ded1d1b01545aa30b2bb125bcc40ffd4474dbc6e0ba603a77fc2a598616964a925379bb5a39eb1a242f0c49fc933e39e099fb2f7d75 +"@next/env@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/env@npm:15.4.0-canary.85" + checksum: 10c0/2a11c5530bd87edf993413044af5175f7e230d6db41145e3c56059a0cd1fc675b6150e1644b1e8731ff1c590927b4d6c27550ca1bafae3318fffd6483e75d1da languageName: node linkType: hard @@ -580,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-darwin-arm64@npm:15.3.4" +"@next/swc-darwin-arm64@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.85" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-darwin-x64@npm:15.3.4" +"@next/swc-darwin-x64@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.85" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-linux-arm64-gnu@npm:15.3.4" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.85" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-linux-arm64-musl@npm:15.3.4" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.85" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-linux-x64-gnu@npm:15.3.4" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.85" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-linux-x64-musl@npm:15.3.4" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.85" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-win32-arm64-msvc@npm:15.3.4" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.85" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.3.4": - version: 15.3.4 - resolution: "@next/swc-win32-x64-msvc@npm:15.3.4" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.85" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -670,6 +1045,143 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@orval/angular@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/angular@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + checksum: 10c0/9ffd4cd4cede6e112226b1e319fadf48075a1b7b591cdb5f55abb5f0734fa033413faa6fbee4d5daa8761c7c04b8cda099fb3f9d43f1ffad9324ddb6c71dc587 + languageName: node + linkType: hard + +"@orval/axios@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/axios@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + checksum: 10c0/4fc488b2f8d8bace5e6452ba76d37d0aa26e0c751d90969911acbba00b06037fe35f275b0e94a13ee106bff7bf93e0d751c4d25a0638745ce8d8b9e4681730b2 + languageName: node + linkType: hard + +"@orval/core@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/core@npm:7.10.0" + dependencies: + "@apidevtools/swagger-parser": "npm:^10.1.1" + "@ibm-cloud/openapi-ruleset": "npm:^1.29.4" + acorn: "npm:^8.14.1" + ajv: "npm:^8.17.1" + chalk: "npm:^4.1.2" + compare-versions: "npm:^6.1.1" + debug: "npm:^4.4.0" + esbuild: "npm:^0.25.1" + esutils: "npm:2.0.3" + fs-extra: "npm:^11.3.0" + globby: "npm:11.1.0" + lodash.isempty: "npm:^4.4.0" + lodash.uniq: "npm:^4.5.0" + lodash.uniqby: "npm:^4.7.0" + lodash.uniqwith: "npm:^4.5.0" + micromatch: "npm:^4.0.8" + openapi3-ts: "npm:4.4.0" + swagger2openapi: "npm:^7.0.8" + checksum: 10c0/fc0b8bd3b1ea45983460ca776558cc316c0d0d421fc321bae46ae00a8b56ef3caa86b4de9ad4367a03e82cbcb0223e8e45ea8d38624134ee20aee5100aadff36 + languageName: node + linkType: hard + +"@orval/fetch@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/fetch@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + checksum: 10c0/f79b51b6d8944966fc9cfd643c27abdd72d0a2b13a7bff05e59cb58b92d040480c5eb3cb8d727778a6cc87d26cd4f7f3cde85432b9b57d01322fd0330567c879 + languageName: node + linkType: hard + +"@orval/hono@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/hono@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + "@orval/zod": "npm:7.10.0" + lodash.uniq: "npm:^4.5.0" + checksum: 10c0/05997000025d68b9c274e447d4f450b702b145dd37acc234cc31814cb81eab9093470355807f5130bf854311b4cb7dc92c0486bb5f98ad30142480b419144c8a + languageName: node + linkType: hard + +"@orval/mcp@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/mcp@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + "@orval/zod": "npm:7.10.0" + checksum: 10c0/08b65ef2a7a389e9282e9790eac2b01024e275d460a459a0368858f40ed91a276921d545d486749a4b98f4962e37295f87b26aca0d404578ac595b2bcd68ba52 + languageName: node + linkType: hard + +"@orval/mock@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/mock@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + openapi3-ts: "npm:^4.2.2" + checksum: 10c0/6a6b24aa337a249a0600ccfae6f05ce6aa991e86945459dd203951eba83a2698ef41670058f75760370550b03e387b2a9fce8302ecc0059ca26f7b2660ff9f0b + languageName: node + linkType: hard + +"@orval/query@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/query@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + "@orval/fetch": "npm:7.10.0" + lodash.omitby: "npm:^4.6.0" + checksum: 10c0/6a343e4f5905cf3f6946e16fef0dc6d0ed30f01a4cde7072f6c717e5495cab8b5d7505486220fcd21c39a8fad195d2c120d5190226d1eaf368d7ea6dd9928292 + languageName: node + linkType: hard + +"@orval/swr@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/swr@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + "@orval/fetch": "npm:7.10.0" + checksum: 10c0/6beb2c75285897ce931d1ca5b4ac8eb5f285d44252ec30cab70d56b882d6bc7e3d875abb66955fbd4f138bf2e59e0bf597a287cde0119d890cfebffea0d9b369 + languageName: node + linkType: hard + +"@orval/zod@npm:7.10.0": + version: 7.10.0 + resolution: "@orval/zod@npm:7.10.0" + dependencies: + "@orval/core": "npm:7.10.0" + lodash.uniq: "npm:^4.5.0" + checksum: 10c0/e2e892b0fb586bd1e4e50ded4d3313c6d4ee760656fd6c089a5e4f2468a265ad92416dfd78eacbc0d32330878dc250b9665d847598ee6bb33f37820daa03fbfd + languageName: node + linkType: hard + "@panva/hkdf@npm:^1.2.1": version: 1.2.1 resolution: "@panva/hkdf@npm:1.2.1" @@ -677,9 +1189,16 @@ __metadata: languageName: node linkType: hard +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + "@prisma/client@npm:^6.9.0": - version: 6.9.0 - resolution: "@prisma/client@npm:6.9.0" + version: 6.10.1 + resolution: "@prisma/client@npm:6.10.1" peerDependencies: prisma: "*" typescript: ">=5.1.0" @@ -688,7 +1207,7 @@ __metadata: optional: true typescript: optional: true - checksum: 10c0/4877d9d0f93ca404c066ce0536f4c2180a8a16a2b0ade8f15df9dd5286c74db55c5a99f4632f13b32045b966cb5f01e010806edda865aa22bbb0aef65f8b6e9f + checksum: 10c0/f6f7b1c43c45d7c73a46b55df17a3c5de2ec30eeb7463fcd9b45e5d67036c5c9059e762aa99a536bc212f8aff836bfd0f674c995ab07a5cb3a92ac56dc82d173 languageName: node linkType: hard @@ -1440,6 +1959,58 @@ __metadata: languageName: node linkType: hard +"@scarf/scarf@npm:=1.4.0": + version: 1.4.0 + resolution: "@scarf/scarf@npm:1.4.0" + checksum: 10c0/332118bb488e7a70eaad068fb1a33f016d30442fb0498b37a80cb425c1e741853a5de1a04dce03526ed6265481ecf744aa6e13f072178d19e6b94b19f623ae1c + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:^3.6.0": + version: 3.7.0 + resolution: "@shikijs/engine-oniguruma@npm:3.7.0" + dependencies: + "@shikijs/types": "npm:3.7.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/e1ec52ec2255e3330812084d62bde8853d20162b1cd285dbb63440d63d0b16c03b6ce6983982e41ac2fc2eceb3e2f6b2bc1c627d093482c4c3836c4fbb9567b0 + languageName: node + linkType: hard + +"@shikijs/langs@npm:^3.6.0": + version: 3.7.0 + resolution: "@shikijs/langs@npm:3.7.0" + dependencies: + "@shikijs/types": "npm:3.7.0" + checksum: 10c0/326e8b014e74d25ce84a63bf7fdd47d5582f85c8404d4c48d6bdacf2f32ab92ddb39b41710ee7eff3daaecbbea7ee96a6c49d427344ee8375551597c74010a81 + languageName: node + linkType: hard + +"@shikijs/themes@npm:^3.6.0": + version: 3.7.0 + resolution: "@shikijs/themes@npm:3.7.0" + dependencies: + "@shikijs/types": "npm:3.7.0" + checksum: 10c0/6887eb99b55439988edab21a1af00302eaed6ba0dd7e2bea6c844ff4dfb8879a0c6c2178ba3fcfe2dbf3fd9f3ab6105572c57ae871e147aaceaf53bcc345d0cd + languageName: node + linkType: hard + +"@shikijs/types@npm:3.7.0, @shikijs/types@npm:^3.6.0": + version: 3.7.0 + resolution: "@shikijs/types@npm:3.7.0" + dependencies: + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/d7c4fcca358c0585602090e2b4ed0a3f6742b55bea340030c115cb7aa643eac79836baa095517a538d695415458bb48c08b7be7f3c8d1cf1c1c7749a58913a3f + languageName: node + linkType: hard + +"@shikijs/vscode-textmate@npm:^10.0.2": + version: 10.0.2 + resolution: "@shikijs/vscode-textmate@npm:10.0.2" + checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 + languageName: node + linkType: hard + "@standard-schema/utils@npm:^0.3.0": version: 0.3.0 resolution: "@standard-schema/utils@npm:0.3.0" @@ -1447,10 +2018,784 @@ __metadata: languageName: node linkType: hard -"@swc/counter@npm:0.1.3": - version: 0.1.3 - resolution: "@swc/counter@npm:0.1.3" - checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 +"@stoplight/better-ajv-errors@npm:1.0.3": + version: 1.0.3 + resolution: "@stoplight/better-ajv-errors@npm:1.0.3" + dependencies: + jsonpointer: "npm:^5.0.0" + leven: "npm:^3.1.0" + peerDependencies: + ajv: ">=8" + checksum: 10c0/0021c1a17fcc514d1922c0456bb976283c3282ebd63ca3d1816295d1fb3d8517442262fa7eafa83fb0a62c433abcac6c16c985258f6fb55116df8ce88b23cbed + languageName: node + linkType: hard + +"@stoplight/json-ref-readers@npm:1.2.2": + version: 1.2.2 + resolution: "@stoplight/json-ref-readers@npm:1.2.2" + dependencies: + node-fetch: "npm:^2.6.0" + tslib: "npm:^1.14.1" + checksum: 10c0/c7b9b18a842b4d4c1d39daf7280e1e7bdd1dbaf770d25f6cdff99cba3c857d3c22d608c0a1c00fbb3f3a0bfe0ca7d1ed4ec62e4130ac0346ad882e379a9c9a22 + languageName: node + linkType: hard + +"@stoplight/json-ref-resolver@npm:~3.1.6": + version: 3.1.6 + resolution: "@stoplight/json-ref-resolver@npm:3.1.6" + dependencies: + "@stoplight/json": "npm:^3.21.0" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^12.3.0 || ^13.0.0" + "@types/urijs": "npm:^1.19.19" + dependency-graph: "npm:~0.11.0" + fast-memoize: "npm:^2.5.2" + immer: "npm:^9.0.6" + lodash: "npm:^4.17.21" + tslib: "npm:^2.6.0" + urijs: "npm:^1.19.11" + checksum: 10c0/ebacb3cc3d1b7e6de9559b1ebc6c199aabb06311e81863829f1d2ea0be8d677b297fd32a016c81626cf733a256ad99a7bd8d24f7d9144d872e42db58c80eab9a + languageName: node + linkType: hard + +"@stoplight/json@npm:^3.17.0, @stoplight/json@npm:^3.17.1, @stoplight/json@npm:^3.20.1, @stoplight/json@npm:^3.21.0, @stoplight/json@npm:~3.21.0": + version: 3.21.7 + resolution: "@stoplight/json@npm:3.21.7" + dependencies: + "@stoplight/ordered-object-literal": "npm:^1.0.3" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^13.6.0" + jsonc-parser: "npm:~2.2.1" + lodash: "npm:^4.17.21" + safe-stable-stringify: "npm:^1.1" + checksum: 10c0/7a60acbbf8d2c34d8812d988bab4e4687da80d45e0a11e05731a6e83586548421d5901713dcbb17b749ef32128eca2029a66f1e2e417578e5a3504b89db5c807 + languageName: node + linkType: hard + +"@stoplight/ordered-object-literal@npm:^1.0.3, @stoplight/ordered-object-literal@npm:^1.0.5": + version: 1.0.5 + resolution: "@stoplight/ordered-object-literal@npm:1.0.5" + checksum: 10c0/e14402990f66f48478fb0871c14fd3c034f1bf9c56161921c354ccaa6dfb2639408fe9a8c77275119d6b734ee5513258f51a0ee2459d1cc6d9068b67eeb48862 + languageName: node + linkType: hard + +"@stoplight/path@npm:1.3.2, @stoplight/path@npm:^1.3.2": + version: 1.3.2 + resolution: "@stoplight/path@npm:1.3.2" + checksum: 10c0/c26ebbd123f1ad0a44485a63763802133080b0455578fa52d01a8ae85230497a561d0073344d00cc73494328489575fe9fadad3ad4d67b015866b6ef01aaad84 + languageName: node + linkType: hard + +"@stoplight/spectral-core@npm:^1.19.2, @stoplight/spectral-core@npm:^1.19.4": + version: 1.20.0 + resolution: "@stoplight/spectral-core@npm:1.20.0" + dependencies: + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:~3.21.0" + "@stoplight/path": "npm:1.3.2" + "@stoplight/spectral-parsers": "npm:^1.0.0" + "@stoplight/spectral-ref-resolver": "npm:^1.0.4" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:~13.6.0" + "@types/es-aggregate-error": "npm:^1.0.2" + "@types/json-schema": "npm:^7.0.11" + ajv: "npm:^8.17.1" + ajv-errors: "npm:~3.0.0" + ajv-formats: "npm:~2.1.1" + es-aggregate-error: "npm:^1.0.7" + jsonpath-plus: "npm:^10.3.0" + lodash: "npm:~4.17.21" + lodash.topath: "npm:^4.5.2" + minimatch: "npm:3.1.2" + nimma: "npm:0.2.3" + pony-cause: "npm:^1.1.1" + simple-eval: "npm:1.0.1" + tslib: "npm:^2.8.1" + checksum: 10c0/ebf6adeefded181b7c220a6cae70ebed37aa9e2ca73d9bd386d7e4c2bef965aea154fd6bb7613c822d37ae3440745fe1408c1369a11475e1050fcb986e64b63a + languageName: node + linkType: hard + +"@stoplight/spectral-formats@npm:^1.8.1, @stoplight/spectral-formats@npm:^1.8.2": + version: 1.8.2 + resolution: "@stoplight/spectral-formats@npm:1.8.2" + dependencies: + "@stoplight/json": "npm:^3.17.0" + "@stoplight/spectral-core": "npm:^1.19.2" + "@types/json-schema": "npm:^7.0.7" + tslib: "npm:^2.8.1" + checksum: 10c0/4401ebe05442e6f48d54d18c020a2dbc4b87b650dc3af2e278f41a569b16a957fab417dbb4dffb14f4c19a8b91f6e9df49defff2fabeaa97bbfb259a980c1d2e + languageName: node + linkType: hard + +"@stoplight/spectral-functions@npm:^1.9.1, @stoplight/spectral-functions@npm:^1.9.3": + version: 1.10.1 + resolution: "@stoplight/spectral-functions@npm:1.10.1" + dependencies: + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:^3.17.1" + "@stoplight/spectral-core": "npm:^1.19.4" + "@stoplight/spectral-formats": "npm:^1.8.1" + "@stoplight/spectral-runtime": "npm:^1.1.2" + ajv: "npm:^8.17.1" + ajv-draft-04: "npm:~1.0.0" + ajv-errors: "npm:~3.0.0" + ajv-formats: "npm:~2.1.1" + lodash: "npm:~4.17.21" + tslib: "npm:^2.8.1" + checksum: 10c0/f26af18a8ff107f5d49a86e4134f10d244fc9bc64833b92c487d1372740b2b3839a72bb76d2061320f33498e65c2704aba5062635ec4c24c16139a4cf83497ca + languageName: node + linkType: hard + +"@stoplight/spectral-parsers@npm:^1.0.0": + version: 1.0.5 + resolution: "@stoplight/spectral-parsers@npm:1.0.5" + dependencies: + "@stoplight/json": "npm:~3.21.0" + "@stoplight/types": "npm:^14.1.1" + "@stoplight/yaml": "npm:~4.3.0" + tslib: "npm:^2.8.1" + checksum: 10c0/3c6578226964d9207b8108d8026b95bbd979640361bb5b0b988da9dc3a2fcd94452f96f5cb41e972baf105fb7ab29b6e8921f21e976a39afc7d368a3a0bf1c0a + languageName: node + linkType: hard + +"@stoplight/spectral-ref-resolver@npm:^1.0.4": + version: 1.0.5 + resolution: "@stoplight/spectral-ref-resolver@npm:1.0.5" + dependencies: + "@stoplight/json-ref-readers": "npm:1.2.2" + "@stoplight/json-ref-resolver": "npm:~3.1.6" + "@stoplight/spectral-runtime": "npm:^1.1.2" + dependency-graph: "npm:0.11.0" + tslib: "npm:^2.8.1" + checksum: 10c0/db7f31d1679c3d6f1adb4b63a8a5288be3b1bfee4515a05fa7092b7eb3ee3d228a9bcd693df4b4e5e1f49323f8a7603ded0163cafd752ce5b4e50fe3b16e446b + languageName: node + linkType: hard + +"@stoplight/spectral-rulesets@npm:^1.21.3": + version: 1.22.0 + resolution: "@stoplight/spectral-rulesets@npm:1.22.0" + dependencies: + "@asyncapi/specs": "npm:^6.8.0" + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:^3.17.0" + "@stoplight/spectral-core": "npm:^1.19.4" + "@stoplight/spectral-formats": "npm:^1.8.1" + "@stoplight/spectral-functions": "npm:^1.9.1" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:^13.6.0" + "@types/json-schema": "npm:^7.0.7" + ajv: "npm:^8.17.1" + ajv-formats: "npm:~2.1.1" + json-schema-traverse: "npm:^1.0.0" + leven: "npm:3.1.0" + lodash: "npm:~4.17.21" + tslib: "npm:^2.8.1" + checksum: 10c0/9a19bc55ee4f800089f943ff0cb5f8c3902b689060c2b2b9de0c298cc5e8e9baa74767c218c3fa037483470fb10268c4d70d48ba7513b293ad184126459ebc71 + languageName: node + linkType: hard + +"@stoplight/spectral-runtime@npm:^1.1.2": + version: 1.1.4 + resolution: "@stoplight/spectral-runtime@npm:1.1.4" + dependencies: + "@stoplight/json": "npm:^3.20.1" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^13.6.0" + abort-controller: "npm:^3.0.0" + lodash: "npm:^4.17.21" + node-fetch: "npm:^2.7.0" + tslib: "npm:^2.8.1" + checksum: 10c0/5a12286fcea26899ba8a9a87f3f9859bb5d5697695bc8dc0c2a7cbc4f0dbfa314df39cbe36e516c9a502f1654bd8e5b56ecc730a6193e7dee74d01f52f320a9b + languageName: node + linkType: hard + +"@stoplight/types@npm:^12.3.0 || ^13.0.0, @stoplight/types@npm:^13.6.0": + version: 13.20.0 + resolution: "@stoplight/types@npm:13.20.0" + dependencies: + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10c0/11d741bd71c6a286cef946b10e003b9b13b031f512d576ed1274c194540f0ee928332108d2b4d1bc87a8e5ba9703d1266951e6a53b8eb0a8db4dc68b1a798cab + languageName: node + linkType: hard + +"@stoplight/types@npm:^14.1.1": + version: 14.1.1 + resolution: "@stoplight/types@npm:14.1.1" + dependencies: + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10c0/1573d842fee99a7f1eea1f2b17c28dcbfb1be51b72f2ef794e07d265b2fb8900654b5848f608952cd1e3dedf6c7ec157c82c65d4d95728d6309f4b1722a11450 + languageName: node + linkType: hard + +"@stoplight/types@npm:~13.6.0": + version: 13.6.0 + resolution: "@stoplight/types@npm:13.6.0" + dependencies: + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10c0/64de299a1d1fbe819b601d72192e44f63c665f13e7a39a9c80930a2bdd54a6361ce9e7d60992ccc42ac8e4ac3b9c9d88a026deea59fe3f6e96a791c169c7a458 + languageName: node + linkType: hard + +"@stoplight/yaml-ast-parser@npm:0.0.50": + version: 0.0.50 + resolution: "@stoplight/yaml-ast-parser@npm:0.0.50" + checksum: 10c0/44d83c7081888402bee88ad0c1e90cd191478005773d8f9767015e109f8499c17da57eb790cca30ba1c02d2f1b74f82992f01ca8ffa272085d17b5f4b5a618cf + languageName: node + linkType: hard + +"@stoplight/yaml@npm:~4.3.0": + version: 4.3.0 + resolution: "@stoplight/yaml@npm:4.3.0" + dependencies: + "@stoplight/ordered-object-literal": "npm:^1.0.5" + "@stoplight/types": "npm:^14.1.1" + "@stoplight/yaml-ast-parser": "npm:0.0.50" + tslib: "npm:^2.2.0" + checksum: 10c0/d72b26e05a9cf96cb8321ea14bd03ba85aae023d48484d038e1f231ebdd7b8abcda496f55676944c5d138b177294991c25a3ae49cb5182f16c7eaa4660bc9928 + languageName: node + linkType: hard + +"@swagger-api/apidom-ast@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ast@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + unraw: "npm:^3.0.0" + checksum: 10c0/ccb8b32f05b35f53637c1d704428383a5bfc3173928b41183e6b611ef17250cc1587f6db8a20717684cf13644432b8f187b75818cd21cdc262983389ca421744 + languageName: node + linkType: hard + +"@swagger-api/apidom-core@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-core@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-core@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + minim: "npm:~0.23.8" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + short-unique-id: "npm:^5.3.2" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/3409541bee4a6b576b2d9042b51fc72f8167493a95e35a9672a88a05912dd134bc20676373bc5c73c42d20ac0c72c6353c19912c04aea391a6bb4a7a24f1575d + languageName: node + linkType: hard + +"@swagger-api/apidom-error@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-error@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-error@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.20.7" + checksum: 10c0/8680952816170aed8d00726bf5a7b19cc77c1f008bdc14abb30c707eeae5777a1187668faa001ace947728f02272de85317cd51dd16d428b78af3f0a3919db03 + languageName: node + linkType: hard + +"@swagger-api/apidom-json-pointer@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-json-pointer@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swaggerexpert/json-pointer": "npm:^2.10.1" + checksum: 10c0/983a4db04d9e35b2f901e735303d15b72b4a6a0eb30a6ae8e9f15dbe14e9f177142512eeccf2260b1266dc2bbe5c2ddbfe5ae2f3d315aff452c3cc576653672d + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-api-design-systems@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/fef4fac684d69865fe6b033584615ca25ba1ce86fa38ce7a7f8f53d86d29aebf7b3e14ee26bc633b05d10948591334cbd3730b59c4d28f77a1c254c4d9fbb7c8 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-arazzo-1@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/a8b12d9247f79ff3a2022eb140c088f5d6dca5360c87a7e5b135ef477930bb0b45c41e8def169676197f0b4a53437b5efb095eacad2775ac70f0bbf468eec61b + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/1519adcf2a23355166f82c2e7e862bcd5e2c838210b0e60d3bf10e497e57bd6e69e2a3e9840e81e628f939718c956ba81e6eedbeab4e55381ea4550d12414e74 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-2019-09@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-json-schema-2019-09@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.4" + checksum: 10c0/4a704f9f810a2682a418c63b6876c1058247bedee1ee06b6dd146ccdafee25ed47ef14829097306bac970cee503537b5c8fc2bc76dfd4c47ddf0b44730686673 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-2020-12@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-json-schema-2020-12@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-2019-09": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.4" + checksum: 10c0/69ce2dd5c861f8fd7fe55edb0c5efad7d83529b4d2879f2999aea950c764237c22ebd976b16591e29dc073780e85fb48db1c6091bedb9c49dd8cc1f8ed6ccd6b + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.4" + checksum: 10c0/86b454cadcb1785947808c6aae0b04052b1d3f0a15140e97e92ccb9b546e55475b7845189144304a86ecf7d8445d9fef417024ccbe85c74a1736e39d553dfc45 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.4" + checksum: 10c0/da9ae7e1a25c1906ba4f572aa2ebe666703b55f0ba389d2b99c22ed50e8605c0ae6eb0340548d2d0f523f8356135c1b09fbd5daeb3f466bb09c4ac9a9e6b099b + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-draft-6": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.4" + checksum: 10c0/5afe3969063204eabf0777fec0cba424b057e375f06a0eee3349f45a65a4f9e5d2c98311d68cd4dc2241f407499b924ed956b2c69f67b02d10b69a66f4b4bf07 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-openapi-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/a805cfc37f5d185faa6d3659f01434c6838473cb1387238987d9013628334b17c2c25f70963df09b89a67a27e5c9b97c50e4e0a6ba80683642b7ceba6bdf8e9c + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/9f4ca7451ec07018971d21d87c1b688ef7ca1bd423a9de661a9c1d24410f3d587e7d4878a55983b2e98f3b092afa6126a64166c76badfbe855448cbd86302b8a + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-openapi-3-1@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10c0/f8d1e7e57b178ff9efbe7658281d6400666d9153c46c2dc39695be1e62397341c67b6cd9dbebcbe19a015ad4ed07116011510d123f297caa30f149a04ea67290 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/86717c996ec748f25fbb8e46ac77fba80240516b3adefdf02c932018a36d7c5657c394bedd2651afc5edd6ec2a4cc169e91e8ef3c89001f48ec446f3a2d40b06 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/e1e574d8dfa5720cedb9624def0f8caf59a052d9ad5e937c30d85507e228f6ff4195eefde4b7a2683731a7aa5a1e94a5563384d8da13e7d85c99ab71f4eb53d9 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/bbc14d4206966c87e916818c1b4608668c489f0d694bbfebeb74490474296b2ef63fae91758a7bc6958ec90d4b0a06730d30b216489e1221c8f3763ea046e447 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/7fb20f15928137919e454c257fd578859c7acc69f28c83fee32d5a355e9f4b307d911d05abebc1bb4bd0c511592d6978f0b8c5647bcddc575461b07f097bdb45 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/05bf86fc41ebf238a7e56cb51427e1ed721c01335c29cc037876fde7662e5a13327f4f8ab4bc7828a85017b036910b1d9ca2c6cc9d61c1dd7aabb321216a0fda + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/7b245997cfa4f7a241543dcbdffeb52faf88868008bbe69ecf5500fcad5f80eb56212b8b11fe302938c84292329fba1aa4eb5a3e91b5c59ab5dc899a6a540b66 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + node-gyp: "npm:latest" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + tree-sitter: "npm:=0.21.1" + tree-sitter-json: "npm:=0.24.8" + web-tree-sitter: "npm:=0.24.5" + checksum: 10c0/9b3c39510106fbaad56e31db168b80312405b229eab91f7bd0842d80ab4a145f52234c25ced737c3788cc7e23accb46c98d86fbb219a133137a5718ba659fc09 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/75279386ef2072d970a50508ba12478ef55cfd6024f7d240185736e81d73cd1703f20a5bff2a282ab394ee4514781ae9b8d173315058cb760af56a788940701b + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/ab2d5fc05041b4feb0ba75903aaacd744dfa203b087286da7912ee0b220856bcdf3c6232a0293bb39d9b2f43ed45ed2791885bab327c8538d97380adbb15b971 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/cbbcb3a66bd5b6c22eee9be1f6417c38bd99955727ad913888bfedabdc528696bbc462ee00b94b7c1b52d53c6f801e1d2a6cdcd1a2ca9c98e714691de56c9645 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/7dd0025849af6c5fa5bc1011d964de997c4e3505d3b7b51cd3cab450c5a2bde10a13a904b9c21f06e205dcaf0da6ae1b5aa56382c90c795634516c883e1ed834 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/5ce9603bc156629d0095ef40a2308b85fab62680236c594cf758a03bc552b641236c6addd20a5ce72adeb4c7ad73845e7c9482a46a6992abb1674f297cdacdfd + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.43" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10c0/a3631ac62606b0574119614c12c93de5aad799bf913f4d15a9098352882c7da551f940b0858e537a4b78749305744d80c05fc9b517c82722deeb46c09048bc9f + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@tree-sitter-grammars/tree-sitter-yaml": "npm:=0.7.1" + "@types/ramda": "npm:~0.30.0" + node-gyp: "npm:latest" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + tree-sitter: "npm:=0.22.4" + web-tree-sitter: "npm:=0.24.5" + checksum: 10c0/5fda71d63d0c1d36971f6a6931335c1b315450e3cfec1494f1592d59b8e4297cd8a5fdfa2e8dfac06fe9d71060425e1d06b6f6dc3ef6be2ddd75101d0bd96b3d + languageName: node + linkType: hard + +"@swagger-api/apidom-reference@npm:>=1.0.0-beta.41 <1.0.0-rc.0": + version: 1.0.0-beta.43 + resolution: "@swagger-api/apidom-reference@npm:1.0.0-beta.43" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.43" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@types/ramda": "npm:~0.30.0" + axios: "npm:^1.9.0" + minimatch: "npm:^7.4.3" + process: "npm:^0.11.10" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + dependenciesMeta: + "@swagger-api/apidom-json-pointer": + optional: true + "@swagger-api/apidom-ns-arazzo-1": + optional: true + "@swagger-api/apidom-ns-asyncapi-2": + optional: true + "@swagger-api/apidom-ns-openapi-2": + optional: true + "@swagger-api/apidom-ns-openapi-3-0": + optional: true + "@swagger-api/apidom-ns-openapi-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-api-design-systems-json": + optional: true + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": + optional: true + "@swagger-api/apidom-parser-adapter-arazzo-json-1": + optional: true + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": + optional: true + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": + optional: true + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": + optional: true + "@swagger-api/apidom-parser-adapter-json": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-2": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-yaml-1-2": + optional: true + checksum: 10c0/0e670482dbba811674ea5ecbacd6ea86307f0712ad0a7caec257bcefee9056ec751b2d16619d1cd02191938f3cc165f89dfc8bd6f4fd1e4da0b5fdc4681ffdf3 + languageName: node + linkType: hard + +"@swaggerexpert/cookie@npm:^2.0.2": + version: 2.0.2 + resolution: "@swaggerexpert/cookie@npm:2.0.2" + dependencies: + apg-lite: "npm:^1.0.3" + checksum: 10c0/50b9e57e6a35d802d408541e95d8dac8506b3ad82658f5af5beaefdf7b8f405b04eafa1beeaf4fa27b5bd24ac94189edc70841bb1ecf6bc8222dcb8efd62a4f9 + languageName: node + linkType: hard + +"@swaggerexpert/json-pointer@npm:^2.10.1": + version: 2.10.2 + resolution: "@swaggerexpert/json-pointer@npm:2.10.2" + dependencies: + apg-lite: "npm:^1.0.4" + checksum: 10c0/9033a0f1d786c071fda6410aaa0a5986b3e9c1cc5b94706969644cdcb1792c815c8e1e68a12c453813e990c2d4dc5f22add04a196555bdb3cffd82cb1303e2c4 languageName: node linkType: hard @@ -1629,6 +2974,68 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:5.80.10": + version: 5.80.10 + resolution: "@tanstack/query-core@npm:5.80.10" + checksum: 10c0/6391f4439f1f4676f5efeb07271e6b0b1418bd1192779f55cac537f0b35ec31c729eb43a30e0269534328c259c3ed6dd2f31555c42c68b6dd0c9ede410d46eb1 + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.80.7": + version: 5.80.10 + resolution: "@tanstack/react-query@npm:5.80.10" + dependencies: + "@tanstack/query-core": "npm:5.80.10" + peerDependencies: + react: ^18 || ^19 + checksum: 10c0/1a759b264cc94b389f802f1183183a3fbe1669ec1bb354951cfab6b6cf175276885c5f5c9b3fc00340a87140fdff4b9cf0c688fb7af103d34fb3b209d33a0a95 + languageName: node + linkType: hard + +"@tree-sitter-grammars/tree-sitter-yaml@npm:=0.7.1": + version: 0.7.1 + resolution: "@tree-sitter-grammars/tree-sitter-yaml@npm:0.7.1" + dependencies: + node-addon-api: "npm:^8.3.1" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.8.4" + peerDependencies: + tree-sitter: ^0.22.4 + peerDependenciesMeta: + tree-sitter: + optional: true + checksum: 10c0/29191c5f7acd6d0ba9f2f6aa2a3b83b6c9f60d70286399be37ec3f2eed78152e3777632855dfcb9e988d934bae10817bb4c4ba38ad0786f2303fbb4806f7bcae + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + "@tybys/wasm-util@npm:^0.9.0": version: 0.9.0 resolution: "@tybys/wasm-util@npm:0.9.0" @@ -1638,6 +3045,15 @@ __metadata: languageName: node linkType: hard +"@types/es-aggregate-error@npm:^1.0.2": + version: 1.0.6 + resolution: "@types/es-aggregate-error@npm:1.0.6" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2a86724ba34495b3a86329b86f71ac83695086be9407afc60d104af5ce2b9ae549f6d19aa48741357ab03c6fe605c1653fdd35ac743541fb0419f8d7188f4b4f + languageName: node + linkType: hard + "@types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" @@ -1645,7 +3061,25 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.15": +"@types/hast@npm:^2.0.0": + version: 2.3.10 + resolution: "@types/hast@npm:2.3.10" + dependencies: + "@types/unist": "npm:^2" + checksum: 10c0/16daac35d032e656defe1f103f9c09c341a6dc553c7ec17b388274076fa26e904a71ea5ea41fd368a6d5f1e9e53be275c80af7942b9c466d8511d261c9529c7e + languageName: node + linkType: hard + +"@types/hast@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.7": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -1659,6 +3093,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:*": + version: 24.0.3 + resolution: "@types/node@npm:24.0.3" + dependencies: + undici-types: "npm:~7.8.0" + checksum: 10c0/9c3c4e87600d1cf11e291c2fd4bfd806a615455463c30a0ef6dc9c801b3423344d9b82b8084e3ccabce485a7421ebb61a66e9676181bd7d9aea4759998a120d5 + languageName: node + linkType: hard + "@types/node@npm:22.15.32": version: 22.15.32 resolution: "@types/node@npm:22.15.32" @@ -1668,6 +3111,15 @@ __metadata: languageName: node linkType: hard +"@types/ramda@npm:~0.30.0": + version: 0.30.2 + resolution: "@types/ramda@npm:0.30.2" + dependencies: + types-ramda: "npm:^0.30.1" + checksum: 10c0/dda95008860f594eb7b4fd9819adeb2dcd4d4e2baca6cb33f692f6f8ea76d04a7fd81f9a057c5c67555612769e5592cb15f91de6c9f8b619b8b1d806d19dc9ea + languageName: node + linkType: hard + "@types/react-dom@npm:19.1.6": version: 19.1.6 resolution: "@types/react-dom@npm:19.1.6" @@ -1677,7 +3129,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:19.1.8": +"@types/react@npm:*, @types/react@npm:19.1.8": version: 19.1.8 resolution: "@types/react@npm:19.1.8" dependencies: @@ -1686,105 +3138,156 @@ __metadata: languageName: node linkType: hard +"@types/swagger-ui-react@npm:5": + version: 5.18.0 + resolution: "@types/swagger-ui-react@npm:5.18.0" + dependencies: + "@types/react": "npm:*" + checksum: 10c0/948cdd763e7f247a5a620ccef109b2f3baa967e44ec0e02e11492543bcd39793b65dfa5399600d6e7233ffd21917cab403d63c6d614109b83e11017384b8a023 + languageName: node + linkType: hard + +"@types/trusted-types@npm:^2.0.7": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c + languageName: node + linkType: hard + +"@types/unist@npm:*": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 + languageName: node + linkType: hard + +"@types/unist@npm:^2": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d + languageName: node + linkType: hard + +"@types/urijs@npm:^1.19.19": + version: 1.19.25 + resolution: "@types/urijs@npm:1.19.25" + checksum: 10c0/462464294f0cd5f2271e1ab760a45abe252a946559444188a4ad0edba39b1a8bff41b140b79596a5e3c44a5d0d29f78c9ab97b5e82efb1e8617093a549c22bf6 + languageName: node + linkType: hard + +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: 10c0/77c045a98f57488201f678b181cccd042279aff3da34540ad242f893acc52b358bd0a8207a321b8ac09adbcef36e3236944390e2df4fcedb556ce7bb2a88f2a8 + languageName: node + linkType: hard + +"@types/webpack-env@npm:1.18.8": + version: 1.18.8 + resolution: "@types/webpack-env@npm:1.18.8" + checksum: 10c0/527a5d1eb75c5243e4f3665d956c7c340f899955dd25d16c9fd9750406f32e95a3a17d207640295038e8235c0c2a2daf084f420e088e58b965d82fc74f6012d7 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.33.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.33.1" + version: 8.34.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.34.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.33.1" - "@typescript-eslint/type-utils": "npm:8.33.1" - "@typescript-eslint/utils": "npm:8.33.1" - "@typescript-eslint/visitor-keys": "npm:8.33.1" + "@typescript-eslint/scope-manager": "npm:8.34.1" + "@typescript-eslint/type-utils": "npm:8.34.1" + "@typescript-eslint/utils": "npm:8.34.1" + "@typescript-eslint/visitor-keys": "npm:8.34.1" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.33.1 + "@typescript-eslint/parser": ^8.34.1 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/35544068f175ca25296b42d0905065b40653a92c62e55414be68f62ddab580d7d768ee3c1276195fd8b8dd49de738ab7b41b8685e6fe2cd341cfca7320569166 + checksum: 10c0/f1c9f25e4fe4b59622312dfa0ca1e80fa7945296ba5c04362a5fda084a17e23a6b98dac331f5a13bcb1ba34a2b598a3f5c41aa288f0c51fe60196e912954e56a languageName: node linkType: hard "@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.33.1 - resolution: "@typescript-eslint/parser@npm:8.33.1" + version: 8.34.1 + resolution: "@typescript-eslint/parser@npm:8.34.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.33.1" - "@typescript-eslint/types": "npm:8.33.1" - "@typescript-eslint/typescript-estree": "npm:8.33.1" - "@typescript-eslint/visitor-keys": "npm:8.33.1" + "@typescript-eslint/scope-manager": "npm:8.34.1" + "@typescript-eslint/types": "npm:8.34.1" + "@typescript-eslint/typescript-estree": "npm:8.34.1" + "@typescript-eslint/visitor-keys": "npm:8.34.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/be1c1313c342d956f5adfbd56f79865894cc9cabf93992515a690559c3758538868270671b222f90e4cabc2dcab82256aeb3ccea7502de9cc69e47b9b17ed45f + checksum: 10c0/bf8070245d53ef6926ff6630bb72f245923f545304e2a61508fb944802a83fed8eab961d9010956d07999d51afdfbbec82aea9d6185295551a7c17c00d759183 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/project-service@npm:8.33.1" +"@typescript-eslint/project-service@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/project-service@npm:8.34.1" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.33.1" - "@typescript-eslint/types": "npm:^8.33.1" + "@typescript-eslint/tsconfig-utils": "npm:^8.34.1" + "@typescript-eslint/types": "npm:^8.34.1" debug: "npm:^4.3.4" peerDependencies: typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/b2ff7653aef4648bdff8aafc69b9de434184827216709f8a36427536ac7082a8adf1c5ac12a0a2bb023b46dfad8f6fee238028acc94af622956af7f22362de6f + checksum: 10c0/9333a890625f6777054db17a6b299281ae7502bb7615261d15b885a75b8cf65fc91591389c93b37ecd14b651d8e94851dac8718e5dcc8ed0600533535dae855c languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/scope-manager@npm:8.33.1" +"@typescript-eslint/scope-manager@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/scope-manager@npm:8.34.1" dependencies: - "@typescript-eslint/types": "npm:8.33.1" - "@typescript-eslint/visitor-keys": "npm:8.33.1" - checksum: 10c0/03a6fd2b0a8ebeb62083a8f51658f0c42391cbfb632411542569a3a227d53bdb0332026ef4d5adc4780e5350d1d8b89e5b19667ed899afd26506e60c70192692 + "@typescript-eslint/types": "npm:8.34.1" + "@typescript-eslint/visitor-keys": "npm:8.34.1" + checksum: 10c0/2af608fa3900f4726322e33bf4f3a376fdace3ac0f310cf7d9256bbc2905c3896138176a47dd195d2c2229f27fe43f5deb4bc7729db2eb18389926dedea78077 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.33.1, @typescript-eslint/tsconfig-utils@npm:^8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.33.1" +"@typescript-eslint/tsconfig-utils@npm:8.34.1, @typescript-eslint/tsconfig-utils@npm:^8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.34.1" peerDependencies: typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/242e8f271d2e6e51446d337e1e59e8c91b66c0241da0fb861f536eb86cc3b53d1727c41e12e1ba070fa2451c8bc517c1ec50decaffa92a7c612b2aba29872777 + checksum: 10c0/8d1ead8b7c279b48e2ed96f083ec119a9aeea1ca9cdd40576ec271b996b9fd8cfa0ddb0aafbb4e14bc27fc62c69c5be66d39b1de68eab9ddd7f1861da267423d languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/type-utils@npm:8.33.1" +"@typescript-eslint/type-utils@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/type-utils@npm:8.34.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.33.1" - "@typescript-eslint/utils": "npm:8.33.1" + "@typescript-eslint/typescript-estree": "npm:8.34.1" + "@typescript-eslint/utils": "npm:8.34.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/59843eeb7c652306d130104d7cb0f7dea1cc95a6cf6345609efbae130f24e3c4a9472780332af4247337e152b7955540b15fd9b907c04a5d265b888139818266 + checksum: 10c0/502a2cdfe47f1f34206c747b5a70e0242dd99f570511db3dda9c5f999d9abadfbbb1dfa82a1fa437a1689d232715412e61c97d95f19c9314ba5ad23196b4096d languageName: node linkType: hard -"@typescript-eslint/types@npm:8.33.1, @typescript-eslint/types@npm:^8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/types@npm:8.33.1" - checksum: 10c0/3083c184c882475eed1f9d1a8961dad30ef834c662bc826ff9a959ff1eed49aad21a73b2b93c4062799feafff5f5f24aebb1df17e198808aa19d4c8de1e64095 +"@typescript-eslint/types@npm:8.34.1, @typescript-eslint/types@npm:^8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/types@npm:8.34.1" + checksum: 10c0/db1b3dce6a70b28ddb13c76fbb5983240d9395656df5f7cbd99bfd9905e39c0dab2132870f01dbc406b48739c437f7d344a879a824cedaba81b91a53110dc23a languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.33.1" +"@typescript-eslint/typescript-estree@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.34.1" dependencies: - "@typescript-eslint/project-service": "npm:8.33.1" - "@typescript-eslint/tsconfig-utils": "npm:8.33.1" - "@typescript-eslint/types": "npm:8.33.1" - "@typescript-eslint/visitor-keys": "npm:8.33.1" + "@typescript-eslint/project-service": "npm:8.34.1" + "@typescript-eslint/tsconfig-utils": "npm:8.34.1" + "@typescript-eslint/types": "npm:8.34.1" + "@typescript-eslint/visitor-keys": "npm:8.34.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -1793,156 +3296,186 @@ __metadata: ts-api-utils: "npm:^2.1.0" peerDependencies: typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/293a93d25046e05fdc3887232191c3f3ee771c0f5b1426d63deaf0541db1cb80b4307a80805c78b092206c9b267884a7e6b5905dc1b3c26f28bb4de47fd9ee8f + checksum: 10c0/4ee7249db91b9840361f34f80b7b6d646a3af159c7298d79a33d8a11c98792fd3a395343e5e17e0fa29529e8f0113bac8baadcef90d1e140bd736a48f0485042 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/utils@npm:8.33.1" +"@typescript-eslint/utils@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/utils@npm:8.34.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.33.1" - "@typescript-eslint/types": "npm:8.33.1" - "@typescript-eslint/typescript-estree": "npm:8.33.1" + "@typescript-eslint/scope-manager": "npm:8.34.1" + "@typescript-eslint/types": "npm:8.34.1" + "@typescript-eslint/typescript-estree": "npm:8.34.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/12263df6eb32e8175236ad899687c062b50cfe4a0e66307d25ad2bf85a3e911faacbfbea4df180a59ebb5913fe1cc1f53fe3914695c7d802dd318bbc846fea26 + checksum: 10c0/e3085877f7940c02a37653e6bc52ac6cde115e755b1f788fe4331202f371b3421cc4d0878c7d3eb054e14e9b3a064496a707a73eac471cb2b73593b9e9d4b998 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.33.1": - version: 8.33.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.33.1" +"@typescript-eslint/visitor-keys@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.34.1" dependencies: - "@typescript-eslint/types": "npm:8.33.1" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/3eb99072e7c2741d5dfc38945d1e7617b15ed10d06b24658a6e919e4153983b3d3c5f5f775ce140f83a84dbde219948d187de97defb09c1a91f3cf0a96704a94 + "@typescript-eslint/types": "npm:8.34.1" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/0e5a9b3d93905d16d3cf8cb5fb346dcc6f760482eb7d0ac209aefc09a32f78ef28a687634df6ad08e81fb3e1083e8805f34472de6bbc501c0105ad654d518f40 languageName: node linkType: hard -"@unrs/resolver-binding-darwin-arm64@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.11" +"@unrs/resolver-binding-android-arm-eabi@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.9.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.9.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.9.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-darwin-x64@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.11" +"@unrs/resolver-binding-darwin-x64@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.9.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-freebsd-x64@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.11" +"@unrs/resolver-binding-freebsd-x64@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.9.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.11" +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.9.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.11" +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.9.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.11" +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.9.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.11" +"@unrs/resolver-binding-linux-arm64-musl@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.9.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.11" +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.9.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.11" +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.9.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.11" +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.9.1" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.11" +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.9.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.11" +"@unrs/resolver-binding-linux-x64-gnu@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.9.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-musl@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.11" +"@unrs/resolver-binding-linux-x64-musl@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.9.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-wasm32-wasi@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.11" +"@unrs/resolver-binding-wasm32-wasi@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.9.1" dependencies: - "@napi-rs/wasm-runtime": "npm:^0.2.10" + "@napi-rs/wasm-runtime": "npm:^0.2.11" conditions: cpu=wasm32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.11" +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.9.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.11" +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.9.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.11": - version: 1.7.11 - resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.11" +"@unrs/resolver-binding-win32-x64-msvc@npm:1.9.1": + version: 1.9.1 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.9.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard +"abbrev@npm:^3.0.0": + version: 3.0.1 + resolution: "abbrev@npm:3.0.1" + checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -1952,16 +3485,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.14.0": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" - bin: - acorn: bin/acorn - checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 +"acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 languageName: node linkType: hard -"acorn@npm:^8.15.0": +"acorn@npm:^8.11.0, acorn@npm:^8.14.1, acorn@npm:^8.15.0, acorn@npm:^8.4.1": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -1970,6 +3503,48 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + +"ajv-draft-04@npm:^1.0.0, ajv-draft-04@npm:~1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271 + languageName: node + linkType: hard + +"ajv-errors@npm:~3.0.0": + version: 3.0.0 + resolution: "ajv-errors@npm:3.0.0" + peerDependencies: + ajv: ^8.0.1 + checksum: 10c0/f3d864ebd4bc0b51ad622b5a889cc8903000295eaa058d59c2102f293fe126c3d901419da143eaa817b863cac2e92ae2ef6f55e6c31d07bf272099afe73961ae + languageName: node + linkType: hard + +"ajv-formats@npm:~2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + "ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -1982,7 +3557,40 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.1.0": +"ajv@npm:^8.0.0, ajv@npm:^8.17.1": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -1991,6 +3599,36 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"apg-lite@npm:^1.0.3, apg-lite@npm:^1.0.4": + version: 1.0.5 + resolution: "apg-lite@npm:1.0.5" + checksum: 10c0/60060daf71743539df845382bdfa0bffe2268bd02f0285d4714a4ed8ce610b5810eb157b831cf2b3133d248e6de338c83c48ab9164a5f6069bb0e9c146531b53 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"argparse@npm:^1.0.10": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -2040,6 +3678,13 @@ __metadata: languageName: node linkType: hard +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + "array.prototype.findlast@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlast@npm:1.2.5" @@ -2128,6 +3773,15 @@ __metadata: languageName: node linkType: hard +"astring@npm:^1.8.1": + version: 1.9.0 + resolution: "astring@npm:1.9.0" + bin: + astring: bin/astring + checksum: 10c0/e7519544d9824494e80ef0e722bb3a0c543a31440d59691c13aeaceb75b14502af536b23f08db50aa6c632dafaade54caa25f0788aa7550b6b2d6e2df89e0830 + languageName: node + linkType: hard + "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -2135,6 +3789,22 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"autolinker@npm:^3.11.0": + version: 3.16.2 + resolution: "autolinker@npm:3.16.2" + dependencies: + tslib: "npm:^2.3.0" + checksum: 10c0/91e083bfa4393fdcd29f595e1db657d852fd74cbd1fec719f30f3d57c910e72d5e0a0b10f2b17e1e6297b52b2f5c12eb6d0cbe024c0d92671e81d8ab906fe981 + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -2151,6 +3821,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.9.0": + version: 1.10.0 + resolution: "axios@npm:1.10.0" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/2239cb269cc789eac22f5d1aabd58e1a83f8f364c92c2caa97b6f5cbb4ab2903d2e557d9dc670b5813e9bcdebfb149e783fb8ab3e45098635cd2f559b06bd5d8 + languageName: node + linkType: hard + "axobject-query@npm:^4.1.0": version: 4.1.0 resolution: "axobject-query@npm:4.1.0" @@ -2165,6 +3846,13 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.5.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + "bcryptjs@npm:^3.0.2": version: 3.0.2 resolution: "bcryptjs@npm:3.0.2" @@ -2175,21 +3863,21 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + checksum: 10c0/975fecac2bb7758c062c20d0b3b6288c7cc895219ee25f0a64a9de662dbac981ff0b6e89909c3897c1f84fa353113a721923afdec5f8b2350255b097f12b1f73 languageName: node linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf languageName: node linkType: hard @@ -2202,12 +3890,30 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0": - version: 1.6.0 - resolution: "busboy@npm:1.6.0" +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - streamsearch: "npm:^1.1.0" - checksum: 10c0/fa7e836a2b82699b6e074393428b91ae579d4f9e21f5ac468e1b459a244341d722d2d22d10920cdd849743dbece6dca11d72de939fb75a7448825cf2babfba1f + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c languageName: node linkType: hard @@ -2243,6 +3949,13 @@ __metadata: languageName: node linkType: hard +"call-me-maybe@npm:^1.0.1, call-me-maybe@npm:^1.0.2": + version: 1.0.2 + resolution: "call-me-maybe@npm:1.0.2" + checksum: 10c0/8eff5dbb61141ebb236ed71b4e9549e488bcb5451c48c11e5667d5c75b0532303788a1101e6978cafa2d0c8c1a727805599c2741e3e0982855c9f1d78cd06c9f + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -2251,13 +3964,13 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001721 - resolution: "caniuse-lite@npm:1.0.30001721" - checksum: 10c0/fa3a8926899824b385279f1f886fe34c5efb1321c9ece1b9df25c8d567a2706db8450cc5b4d969e769e641593e08ea644909324aba93636a43e4949a75f81c4c + version: 1.0.30001724 + resolution: "caniuse-lite@npm:1.0.30001724" + checksum: 10c0/ed9ec0bcf619f0e7ef2d33aac74d2346d1faf52060dfded1fb9c32d87854de5c2988b3ba338c281034c88bf797d6b55468a804ce8396a7e16a48cb0d481d4bfe languageName: node linkType: hard -"chalk@npm:^4.0.0": +"chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -2267,6 +3980,36 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^1.0.0": + version: 1.1.4 + resolution: "character-entities-legacy@npm:1.1.4" + checksum: 10c0/ea4ca9c29887335eed86d78fc67a640168342b1274da84c097abb0575a253d1265281a5052f9a863979e952bcc267b4ecaaf4fe233a7e1e0d8a47806c65b96c7 + languageName: node + linkType: hard + +"character-entities@npm:^1.0.0": + version: 1.2.4 + resolution: "character-entities@npm:1.2.4" + checksum: 10c0/ad015c3d7163563b8a0ee1f587fb0ef305ef344e9fd937f79ca51cccc233786a01d591d989d5bf7b2e66b528ac9efba47f3b1897358324e69932f6d4b25adfe1 + languageName: node + linkType: hard + +"character-reference-invalid@npm:^1.0.0": + version: 1.1.4 + resolution: "character-reference-invalid@npm:1.1.4" + checksum: 10c0/29f05081c5817bd1e975b0bf61e77b60a40f62ad371d0f0ce0fdb48ab922278bc744d1fbe33771dced751887a8403f265ff634542675c8d7375f6ff4811efd0e + languageName: node + linkType: hard + +"chokidar@npm:^4.0.3": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad + languageName: node + linkType: hard + "chownr@npm:^3.0.0": version: 3.0.0 resolution: "chownr@npm:3.0.0" @@ -2283,6 +4026,13 @@ __metadata: languageName: node linkType: hard +"classnames@npm:^2.5.1": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: 10c0/afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69 + languageName: node + linkType: hard + "client-only@npm:0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" @@ -2290,6 +4040,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + "clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" @@ -2333,6 +4094,29 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"comma-separated-tokens@npm:^1.0.0": + version: 1.0.8 + resolution: "comma-separated-tokens@npm:1.0.8" + checksum: 10c0/c3bcfeaa6d50313528a006a40bcc0f9576086665c9b48d4b3a76ddd63e7d6174734386c98be1881cbf6ecfc25e1db61cd775a7b896d2ea7a65de28f83a0f9b17 + languageName: node + linkType: hard + +"compare-versions@npm:^6.1.1": + version: 6.1.1 + resolution: "compare-versions@npm:6.1.1" + checksum: 10c0/415205c7627f9e4f358f571266422980c9fe2d99086be0c9a48008ef7c771f32b0fbe8e97a441ffedc3910872f917a0675fe0fe3c3b6d331cda6d8690be06338 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -2340,7 +4124,30 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.6": +"copy-to-clipboard@npm:^3.3.1": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: "npm:^1.0.6" + checksum: 10c0/3ebf5e8ee00601f8c440b83ec08d838e8eabb068c1fae94a9cda6b42f288f7e1b552f3463635f419af44bf7675afc8d0390d30876cf5c2d5d35f86d9c56a3e5f + languageName: node + linkType: hard + +"core-js-pure@npm:^3.30.2": + version: 3.43.0 + resolution: "core-js-pure@npm:3.43.0" + checksum: 10c0/b888513800543af7aac13b8e33eb5153d5a8304f11fe0ec7a331878df830dcb428c723ebd5266ae52b047ffb4a86750b384aed24de731b23bc5ebdbcf05aeec5 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -2351,6 +4158,13 @@ __metadata: languageName: node linkType: hard +"css.escape@npm:1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: 10c0/5e09035e5bf6c2c422b40c6df2eb1529657a17df37fda5d0433d722609527ab98090baf25b13970ca754079a0f3161dd3dfc0e743563ded8cfa0749d861c1525 + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -2398,16 +4212,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -2419,6 +4224,22 @@ __metadata: languageName: node linkType: hard +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"deep-extend@npm:0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -2426,6 +4247,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:~4.3.0": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -2448,6 +4276,20 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"dependency-graph@npm:0.11.0, dependency-graph@npm:~0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 10c0/9e6968d1534fdb502f7f3a25a3819b499f9d60f8389193950ed0b4d1618f1341b36b5d039f2cee256cfe10c9e8198ace16b271e370df06a93fac206e81602e7c + languageName: node + linkType: hard + "detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": version: 2.0.4 resolution: "detect-libc@npm:2.0.4" @@ -2462,6 +4304,22 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -2471,6 +4329,18 @@ __metadata: languageName: node linkType: hard +"dompurify@npm:=3.2.4": + version: 3.2.4 + resolution: "dompurify@npm:3.2.4" + dependencies: + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: 10c0/6be56810fb7ad2776155c8fc2967af5056783c030094362c7d0cf1ad13f2129cf922d8eefab528a34bdebfb98e2f44b306a983ab93aefb9d6f24c18a3d027a05 + languageName: node + linkType: hard + "dotenv-cli@npm:8.0.0": version: 8.0.0 resolution: "dotenv-cli@npm:8.0.0" @@ -2499,6 +4369,13 @@ __metadata: languageName: node linkType: hard +"drange@npm:^1.0.2": + version: 1.1.1 + resolution: "drange@npm:1.1.1" + checksum: 10c0/d63f364467be64d766d2dae10ee7e4f305fa50375f910c7525fb5983cab326ad0f1a4a3abdf2379e7d7949c0011a291114d5c6c238970a940a08a6ccba02f7b3 + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -2510,6 +4387,20 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + "emoji-regex@npm:^9.2.2": version: 9.2.2 resolution: "emoji-regex@npm:9.2.2" @@ -2517,6 +4408,15 @@ __metadata: languageName: node linkType: hard +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.18.1": version: 5.18.1 resolution: "enhanced-resolve@npm:5.18.1" @@ -2527,6 +4427,37 @@ __metadata: languageName: node linkType: hard +"enquirer@npm:^2.4.1": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: "npm:^4.1.1" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 + languageName: node + linkType: hard + +"entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + "es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0": version: 1.24.0 resolution: "es-abstract@npm:1.24.0" @@ -2589,6 +4520,22 @@ __metadata: languageName: node linkType: hard +"es-aggregate-error@npm:^1.0.7": + version: 1.0.14 + resolution: "es-aggregate-error@npm:1.0.14" + dependencies: + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + globalthis: "npm:^1.0.4" + has-property-descriptors: "npm:^1.0.2" + set-function-name: "npm:^2.0.2" + checksum: 10c0/65922e6183c970a08e60eb1452c7695807fd761b0de90a93b6682446b07f2fa8272204f5c219295a26c99849fbff987c8c8112afe5f6efda1a0bc19d1e3a15ca + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -2668,6 +4615,106 @@ __metadata: languageName: node linkType: hard +"es6-promise@npm:^3.2.1": + version: 3.3.1 + resolution: "es6-promise@npm:3.3.1" + checksum: 10c0/b4fc87cb8509c001f62f860f97b05d1fd3f87220c8b832578e6a483c719ca272b73a77f2231cb26395fa865e1cab2fd4298ab67786b69e97b8d757b938f4fc1f + languageName: node + linkType: hard + +"esbuild@npm:^0.25.1": + version: 0.25.5 + resolution: "esbuild@npm:0.25.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.5" + "@esbuild/android-arm": "npm:0.25.5" + "@esbuild/android-arm64": "npm:0.25.5" + "@esbuild/android-x64": "npm:0.25.5" + "@esbuild/darwin-arm64": "npm:0.25.5" + "@esbuild/darwin-x64": "npm:0.25.5" + "@esbuild/freebsd-arm64": "npm:0.25.5" + "@esbuild/freebsd-x64": "npm:0.25.5" + "@esbuild/linux-arm": "npm:0.25.5" + "@esbuild/linux-arm64": "npm:0.25.5" + "@esbuild/linux-ia32": "npm:0.25.5" + "@esbuild/linux-loong64": "npm:0.25.5" + "@esbuild/linux-mips64el": "npm:0.25.5" + "@esbuild/linux-ppc64": "npm:0.25.5" + "@esbuild/linux-riscv64": "npm:0.25.5" + "@esbuild/linux-s390x": "npm:0.25.5" + "@esbuild/linux-x64": "npm:0.25.5" + "@esbuild/netbsd-arm64": "npm:0.25.5" + "@esbuild/netbsd-x64": "npm:0.25.5" + "@esbuild/openbsd-arm64": "npm:0.25.5" + "@esbuild/openbsd-x64": "npm:0.25.5" + "@esbuild/sunos-x64": "npm:0.25.5" + "@esbuild/win32-arm64": "npm:0.25.5" + "@esbuild/win32-ia32": "npm:0.25.5" + "@esbuild/win32-x64": "npm:0.25.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/aba8cbc11927fa77562722ed5e95541ce2853f67ad7bdc40382b558abc2e0ec57d92ffb820f082ba2047b4ef9f3bc3da068cdebe30dfd3850cfa3827a78d604e + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -2746,14 +4793,14 @@ __metadata: linkType: hard "eslint-module-utils@npm:^2.12.0": - version: 2.12.0 - resolution: "eslint-module-utils@npm:2.12.0" + version: 2.12.1 + resolution: "eslint-module-utils@npm:2.12.1" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 + checksum: 10c0/6f4efbe7a91ae49bf67b4ab3644cb60bc5bd7db4cb5521de1b65be0847ffd3fb6bce0dd68f0995e1b312d137f768e2a1f842ee26fe73621afa05f850628fdc40 languageName: node linkType: hard @@ -2865,13 +4912,6 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^4.2.1": version: 4.2.1 resolution: "eslint-visitor-keys@npm:4.2.1" @@ -2929,18 +4969,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^10.0.1": - version: 10.3.0 - resolution: "espree@npm:10.3.0" - dependencies: - acorn: "npm:^8.14.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 - languageName: node - linkType: hard - -"espree@npm:^10.4.0": +"espree@npm:^10.0.1, espree@npm:^10.4.0": version: 10.4.0 resolution: "espree@npm:10.4.0" dependencies: @@ -2976,13 +5005,44 @@ __metadata: languageName: node linkType: hard -"esutils@npm:^2.0.2": +"esutils@npm:2.0.3, esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b + languageName: node + linkType: hard + +"execa@npm:^5.1.1": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -3003,7 +5063,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -3016,6 +5076,13 @@ __metadata: languageName: node linkType: hard +"fast-json-patch@npm:^3.0.0-1": + version: 3.1.1 + resolution: "fast-json-patch@npm:3.1.1" + checksum: 10c0/8a0438b4818bb53153275fe5b38033610e8c9d9eb11869e6a7dc05eb92fa70f3caa57015e344eb3ae1e71c7a75ad4cc6bc2dc9e0ff281d6ed8ecd44505210ca8 + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -3030,6 +5097,27 @@ __metadata: languageName: node linkType: hard +"fast-memoize@npm:^2.5.2": + version: 2.5.2 + resolution: "fast-memoize@npm:2.5.2" + checksum: 10c0/6f658f182f6eaf25a8ecdaf49affee4cac20df4e61e7ef3f04145fb86e887e7a0bd9975740ce88a9015da99459d7386eaf1342ac15be820f72f4be1ecf934d95 + languageName: node + linkType: hard + +"fast-safe-stringify@npm:^2.0.7": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: 10c0/d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 10c0/74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.19.1 resolution: "fastq@npm:1.19.1" @@ -3039,15 +5127,24 @@ __metadata: languageName: node linkType: hard +"fault@npm:^1.0.0": + version: 1.0.4 + resolution: "fault@npm:1.0.4" + dependencies: + format: "npm:^0.2.0" + checksum: 10c0/c86c11500c1b676787296f31ade8473adcc6784f118f07c1a9429730b6288d0412f96e069ce010aa57e4f65a9cccb5abee8868bbe3c5f10de63b20482c9baebd + languageName: node + linkType: hard + "fdir@npm:^6.4.4": - version: 6.4.5 - resolution: "fdir@npm:6.4.5" + version: 6.4.6 + resolution: "fdir@npm:6.4.6" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/5d63330a1b97165e9b0fb20369fafc7cf826bc4b3e374efcb650bc77d7145ac01193b5da1a7591eab89ae6fd6b15cdd414085910b2a2b42296b1480c9f2677af + checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 languageName: node linkType: hard @@ -3069,7 +5166,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^5.0.0": +"find-up@npm:5.0.0, find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" dependencies: @@ -3096,6 +5193,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + "for-each@npm:^0.3.3, for-each@npm:^0.3.5": version: 0.3.5 resolution: "for-each@npm:0.3.5" @@ -3105,6 +5212,56 @@ __metadata: languageName: node linkType: hard +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.3 + resolution: "form-data@npm:4.0.3" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10c0/f0cf45873d600110b5fadf5804478377694f73a1ed97aaa370a74c90cebd7fe6e845a081171668a5476477d0d55a73a4e03d6682968fa8661eac2a81d651fcdb + languageName: node + linkType: hard + +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 10c0/6032ba747541a43abf3e37b402b2f72ee08ebcb58bf84d816443dd228959837f1cddf1e8775b29fa27ff133f4bd146d041bfca5f9cf27f048edf3d493cf8fee6 + languageName: node + linkType: hard + +"fs-extra@npm:^11.3.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f95e996186ff45463059feb115a22fb048bdaf7e487ecee8a8646c78ed8fdca63630e3077d4c16ce677051f5e60d3355a06f3cd61f3ca43f48cc58822a44d0a + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -3133,6 +5290,13 @@ __metadata: languageName: node linkType: hard +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + "get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" @@ -3168,6 +5332,13 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + "get-symbol-description@npm:^1.1.0": version: 1.1.0 resolution: "get-symbol-description@npm:1.1.0" @@ -3206,6 +5377,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -3223,6 +5410,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + languageName: node + linkType: hard + "gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -3230,7 +5431,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.4": +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -3301,6 +5502,97 @@ __metadata: languageName: node linkType: hard +"hast-util-parse-selector@npm:^2.0.0": + version: 2.2.5 + resolution: "hast-util-parse-selector@npm:2.2.5" + checksum: 10c0/29b7ee77960ded6a99d30c287d922243071cc07b39f2006f203bd08ee54eb8f66bdaa86ef6527477c766e2382d520b60ee4e4087f189888c35d8bcc020173648 + languageName: node + linkType: hard + +"hastscript@npm:^6.0.0": + version: 6.0.0 + resolution: "hastscript@npm:6.0.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^1.0.0" + hast-util-parse-selector: "npm:^2.0.0" + property-information: "npm:^5.0.0" + space-separated-tokens: "npm:^1.0.0" + checksum: 10c0/f76d9cf373cb075c8523c8ad52709f09f7e02b7c9d3152b8d35c65c265b9f1878bed6023f215a7d16523921036d40a7da292cb6f4399af9b5eccac2a5a5eb330 + languageName: node + linkType: hard + +"highlight.js@npm:^10.4.1, highlight.js@npm:~10.7.0": + version: 10.7.3 + resolution: "highlight.js@npm:10.7.3" + checksum: 10c0/073837eaf816922427a9005c56c42ad8786473dc042332dfe7901aa065e92bc3d94ebf704975257526482066abb2c8677cc0326559bb8621e046c21c5991c434 + languageName: node + linkType: hard + +"highlightjs-vue@npm:^1.0.0": + version: 1.0.0 + resolution: "highlightjs-vue@npm:1.0.0" + checksum: 10c0/9be378c70b864ca5eee87b07859222e31c946a8ad176227e54f7006a498223974ebe19fcce6e38ad5eb3c1ed0e16a580c4edefdf2cb882b6dfab1c3866cc047a + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http2-client@npm:^1.2.5": + version: 1.3.5 + resolution: "http2-client@npm:1.3.5" + checksum: 10c0/4974f10f5c8b5b7b9e23771190471d02690e9a22c22e028d84715b7ecdcda05017fc9e565476558da3bdf0ba642d24186a94818d0b9afee706ccf9874034be73 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -3315,6 +5607,20 @@ __metadata: languageName: node linkType: hard +"immer@npm:^9.0.6": + version: 9.0.21 + resolution: "immer@npm:9.0.21" + checksum: 10c0/03ea3ed5d4d72e8bd428df4a38ad7e483ea8308e9a113d3b42e0ea2cc0cc38340eb0a6aca69592abbbf047c685dbda04e3d34bf2ff438ab57339ed0a34cc0a05 + languageName: node + linkType: hard + +"immutable@npm:^3.x.x": + version: 3.8.2 + resolution: "immutable@npm:3.8.2" + checksum: 10c0/fb6a2999ad3bda9e51741721e42547076dd492635ee4df9241224055fe953ec843583a700088cc4915f23dc326e5084f4e17f1bbd7388c3e872ef5a242e0ac5e + languageName: node + linkType: hard + "import-fresh@npm:^3.2.1": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" @@ -3332,6 +5638,13 @@ __metadata: languageName: node linkType: hard +"inherits@npm:^2.0.1": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -3343,6 +5656,42 @@ __metadata: languageName: node linkType: hard +"invariant@npm:^2.2.2": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"is-alphabetical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphabetical@npm:1.0.4" + checksum: 10c0/1505b1de5a1fd74022c05fb21b0e683a8f5229366bac8dc4d34cf6935bcfd104d1125a5e6b083fb778847629f76e5bdac538de5367bdf2b927a1356164e23985 + languageName: node + linkType: hard + +"is-alphanumerical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphanumerical@npm:1.0.4" + dependencies: + is-alphabetical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + checksum: 10c0/d623abae7130a7015c6bf33d99151d4e7005572fd170b86568ff4de5ae86ac7096608b87dd4a1d4dbbd497e392b6396930ba76c9297a69455909cebb68005905 + languageName: node + linkType: hard + "is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": version: 3.0.5 resolution: "is-array-buffer@npm:3.0.5" @@ -3439,6 +5788,13 @@ __metadata: languageName: node linkType: hard +"is-decimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-decimal@npm:1.0.4" + checksum: 10c0/a4ad53c4c5c4f5a12214e7053b10326711f6a71f0c63ba1314a77bd71df566b778e4ebd29f9fb6815f07a4dc50c3767fb19bd6fc9fa05e601410f1d64ffeac48 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -3455,6 +5811,13 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + "is-generator-function@npm:^1.0.10": version: 1.1.0 resolution: "is-generator-function@npm:1.1.0" @@ -3476,6 +5839,13 @@ __metadata: languageName: node linkType: hard +"is-hexadecimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-hexadecimal@npm:1.0.4" + checksum: 10c0/ec4c64e5624c0f240922324bc697e166554f09d3ddc7633fc526084502626445d0a871fbd8cae52a9844e83bd0bb414193cc5a66806d7b2867907003fc70c5ea + languageName: node + linkType: hard + "is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" @@ -3535,6 +5905,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + "is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" @@ -3605,6 +5982,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + "iterator.prototype@npm:^1.1.4": version: 1.1.5 resolution: "iterator.prototype@npm:1.1.5" @@ -3619,6 +6003,19 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + "jiti@npm:2.4.2, jiti@npm:^2.4.2": version: 2.4.2 resolution: "jiti@npm:2.4.2" @@ -3635,6 +6032,13 @@ __metadata: languageName: node linkType: hard +"js-file-download@npm:^0.4.12": + version: 0.4.12 + resolution: "js-file-download@npm:0.4.12" + checksum: 10c0/3caec1491fa744214409e0bcb1fb18d76e3d56715c477ee033cb7d8becb5cf777803409dc1995c913bf1a2270dac98d78f07d83bba319b8e800bc7bf2a7266a7 + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -3642,7 +6046,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.1.0": +"js-yaml@npm:=4.1.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -3653,6 +6057,20 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsep@npm:^1.2.0, jsep@npm:^1.3.6, jsep@npm:^1.4.0": + version: 1.4.0 + resolution: "jsep@npm:1.4.0" + checksum: 10c0/fe60adf47e050e22eadced42514a51a15a3cf0e2d147896584486acd8ee670fc16641101b9aeb81f4aaba382043d29744b7aac41171e8106515b14f27e0c7116 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -3667,6 +6085,13 @@ __metadata: languageName: node linkType: hard +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -3685,6 +6110,63 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.2": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonc-parser@npm:~2.2.1": + version: 2.2.1 + resolution: "jsonc-parser@npm:2.2.1" + checksum: 10c0/cfb4e9d0050355f6c30602ed2330e5a6d5bac9b1bc98426cf83f624d43e6306c069db0ab1532c49383337303188e9db2f28625d1b147d6927594071dc605e792 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsonpath-plus@npm:^10.3.0, jsonpath-plus@npm:^6.0.1 || ^10.1.0": + version: 10.3.0 + resolution: "jsonpath-plus@npm:10.3.0" + dependencies: + "@jsep-plugin/assignment": "npm:^1.3.0" + "@jsep-plugin/regex": "npm:^1.0.4" + jsep: "npm:^1.4.0" + bin: + jsonpath: bin/jsonpath-cli.js + jsonpath-plus: bin/jsonpath-cli.js + checksum: 10c0/f5ff53078ecab98e8afd1dcdb4488e528653fa5a03a32d671f52db1ae9c3236e6e072d75e1949a80929fd21b07603924a586f829b40ad35993fa0247fa4f7506 + languageName: node + linkType: hard + +"jsonpointer@npm:^5.0.0": + version: 5.0.1 + resolution: "jsonpointer@npm:5.0.1" + checksum: 10c0/89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 + languageName: node + linkType: hard + +"jsonschema@npm:^1.5.0": + version: 1.5.0 + resolution: "jsonschema@npm:1.5.0" + checksum: 10c0/c24ddb8d741f02efc0da3ad9b597a275f6b595062903d3edbfaa535c3f9c4c98613df68da5cb6635ed9aeab30d658986fea61d7662fc5b2b92840d5a1e21235e + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -3722,6 +6204,13 @@ __metadata: languageName: node linkType: hard +"leven@npm:3.1.0, leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -3842,6 +6331,15 @@ __metadata: languageName: node linkType: hard +"linkify-it@npm:^5.0.0": + version: 5.0.0 + resolution: "linkify-it@npm:5.0.0" + dependencies: + uc.micro: "npm:^2.0.0" + checksum: 10c0/ff4abbcdfa2003472fc3eb4b8e60905ec97718e11e33cca52059919a4c80cc0e0c2a14d23e23d8c00e5402bc5a885cdba8ca053a11483ab3cc8b3c7a52f88e2d + languageName: node + linkType: hard + "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -3851,6 +6349,20 @@ __metadata: languageName: node linkType: hard +"lodash.debounce@npm:^4": + version: 4.0.8 + resolution: "lodash.debounce@npm:4.0.8" + checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 + languageName: node + linkType: hard + +"lodash.isempty@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.isempty@npm:4.4.0" + checksum: 10c0/6c7eaa0802398736809b9e8aed8b8ac1abca9be71788fd719ba9d7f5b4c23e8dc63b7f049df4131713dda30a2fdedc2f655268e9deb8cd5a985dfc934afca194 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -3858,7 +6370,63 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.4.0": +"lodash.omitby@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.omitby@npm:4.6.0" + checksum: 10c0/4608b1d8c4063b63349a3462852465fbe74781d737fbb26a0a7f00b0e65f6ccbc13fa490a38f9380103d93fc398e3873983038efadfafc67ccafbb25d9bc7bf4 + languageName: node + linkType: hard + +"lodash.topath@npm:^4.5.2": + version: 4.5.2 + resolution: "lodash.topath@npm:4.5.2" + checksum: 10c0/f555a1459c11c807517be6c3a3e8030a9e92a291b2d6b598511e0bddbe99297e870b20e097019b613a3035d061bac63cb42621386c0b9dc22fd3d85e58459653 + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e + languageName: node + linkType: hard + +"lodash.uniqby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.uniqby@npm:4.7.0" + checksum: 10c0/c505c0de20ca759599a2ba38710e8fb95ff2d2028e24d86c901ef2c74be8056518571b9b754bfb75053b2818d30dd02243e4a4621a6940c206bbb3f7626db656 + languageName: node + linkType: hard + +"lodash.uniqwith@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniqwith@npm:4.5.0" + checksum: 10c0/3db1748302f5903cd2e4c361eb084bcfc48fe4062e37be4860363a0be643bf6617c1f115d61189b69623056a55acbcd451a52b3042b4864d5acc86a3b0ac83df + languageName: node + linkType: hard + +"lodash@npm:^4.15.0, lodash@npm:^4.17.21, lodash@npm:~4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"loglevel-plugin-prefix@npm:0.8.4": + version: 0.8.4 + resolution: "loglevel-plugin-prefix@npm:0.8.4" + checksum: 10c0/357524eec4c165ff823b5bbf72e8373ff529e5cb95c1f4b20749847bd5b5b16ab328d6d33d1a9019f1a2dc52e28fca5d595e52f2ee20e24986182a6f9552a9ec + languageName: node + linkType: hard + +"loglevel@npm:^1.9.2": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -3869,6 +6437,23 @@ __metadata: languageName: node linkType: hard +"lowlight@npm:^1.17.0": + version: 1.20.0 + resolution: "lowlight@npm:1.20.0" + dependencies: + fault: "npm:^1.0.0" + highlight.js: "npm:~10.7.0" + checksum: 10c0/728bce6f6fe8b157f48d3324e597f452ce0eed2ccff1c0f41a9047380f944e971eb45bceb31f08fbb64d8f338dabb166f10049b35b92c7ec5cf0241d6adb3dea + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + "lucide-react@npm:^0.511.0": version: 0.511.0 resolution: "lucide-react@npm:0.511.0" @@ -3878,6 +6463,13 @@ __metadata: languageName: node linkType: hard +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b + languageName: node + linkType: hard + "magic-string@npm:^0.30.17": version: 0.30.17 resolution: "magic-string@npm:0.30.17" @@ -3887,6 +6479,48 @@ __metadata: languageName: node linkType: hard +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + +"markdown-it@npm:^14.1.0": + version: 14.1.0 + resolution: "markdown-it@npm:14.1.0" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:^4.4.0" + linkify-it: "npm:^5.0.0" + mdurl: "npm:^2.0.0" + punycode.js: "npm:^2.3.1" + uc.micro: "npm:^2.1.0" + bin: + markdown-it: bin/markdown-it.mjs + checksum: 10c0/9a6bb444181d2db7016a4173ae56a95a62c84d4cbfb6916a399b11d3e6581bf1cc2e4e1d07a2f022ae72c25f56db90fbe1e529fca16fbf9541659dc53480d4b4 + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -3894,10 +6528,18 @@ __metadata: languageName: node linkType: hard +"mdurl@npm:^2.0.0": + version: 2.0.0 + resolution: "mdurl@npm:2.0.0" + checksum: 10c0/633db522272f75ce4788440669137c77540d74a83e9015666a9557a152c02e245b192edc20bc90ae953bbab727503994a53b236b4d9c99bdaee594d0e7dd2ce0 + languageName: node + linkType: hard + "meetup@workspace:.": version: 0.0.0-use.local resolution: "meetup@workspace:." dependencies: + "@asteasolutions/zod-to-openapi": "npm:^8.0.0-beta.4" "@auth/prisma-adapter": "npm:^2.9.1" "@eslint/eslintrc": "npm:3.3.1" "@fortawesome/fontawesome-svg-core": "npm:^6.7.2" @@ -3917,9 +6559,12 @@ __metadata: "@radix-ui/react-switch": "npm:^1.2.4" "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.10" + "@tanstack/react-query": "npm:^5.80.7" "@types/node": "npm:22.15.32" "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" + "@types/swagger-ui-react": "npm:5" + "@types/webpack-env": "npm:1.18.8" bcryptjs: "npm:^3.0.2" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" @@ -3928,24 +6573,35 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.3.4" + next: "npm:15.4.0-canary.85" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" + orval: "npm:7.10.0" postcss: "npm:8.5.6" prettier: "npm:3.5.3" prisma: "npm:6.9.0" react: "npm:^19.0.0" react-dom: "npm:^19.0.0" react-hook-form: "npm:^7.56.4" + swagger-ui-react: "npm:^5.24.1" tailwind-merge: "npm:^3.2.0" tailwindcss: "npm:4.1.10" + ts-node: "npm:10.9.2" + tsconfig-paths: "npm:4.2.0" tw-animate-css: "npm:1.3.4" typescript: "npm:5.8.3" zod: "npm:^3.25.60" languageName: unknown linkType: soft -"merge2@npm:^1.3.0": +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": version: 1.4.1 resolution: "merge2@npm:1.4.1" checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb @@ -3962,7 +6618,39 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.1.2": +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"minim@npm:~0.23.8": + version: 0.23.8 + resolution: "minim@npm:0.23.8" + dependencies: + lodash: "npm:^4.15.0" + checksum: 10c0/51563ef7481a262ae9bda18ae927b339977f77f1a11adfba0d7bef0096dbd9303ca9d6cb5d7ffea68c16b47fc124358670bc0bee136289f61d6ae3632256577f + languageName: node + linkType: hard + +"minimatch@npm:3.1.2, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -3971,7 +6659,25 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:^6.2.0": + version: 6.2.0 + resolution: "minimatch@npm:6.2.0" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/0884fcf2dd6d3cb5b76e21c33e1797f32c6d4bdd3cefe693ea4f8bb829734b2ca0eee94f0a4f622e9f9fa305f838d2b4f5251df38fcbf98bf1a03a0d07d4ce2d + languageName: node + linkType: hard + +"minimatch@npm:^7.4.3": + version: 7.4.6 + resolution: "minimatch@npm:7.4.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/e587bf3d90542555a3d58aca94c549b72d58b0a66545dd00eef808d0d66e5d9a163d3084da7f874e83ca8cc47e91c670e6c6f6593a3e7bb27fcc0e6512e87c67 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -3987,7 +6693,67 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^7.0.4, minipass@npm:^7.1.2": +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 @@ -4044,6 +6810,20 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"neotraverse@npm:=0.6.18": + version: 0.6.18 + resolution: "neotraverse@npm:0.6.18" + checksum: 10c0/46f4c53cbbdc53671150916b544a9f46e27781f8003985237507542190173bec131168d89b846535f9c34c0a2a7debb1ab3a4f7a93d08218e2c194a363708ffa + languageName: node + linkType: hard + "next-auth@npm:^5.0.0-beta.25": version: 5.0.0-beta.28 resolution: "next-auth@npm:5.0.0-beta.28" @@ -4076,29 +6856,27 @@ __metadata: languageName: node linkType: hard -"next@npm:15.3.4": - version: 15.3.4 - resolution: "next@npm:15.3.4" +"next@npm:15.4.0-canary.85": + version: 15.4.0-canary.85 + resolution: "next@npm:15.4.0-canary.85" dependencies: - "@next/env": "npm:15.3.4" - "@next/swc-darwin-arm64": "npm:15.3.4" - "@next/swc-darwin-x64": "npm:15.3.4" - "@next/swc-linux-arm64-gnu": "npm:15.3.4" - "@next/swc-linux-arm64-musl": "npm:15.3.4" - "@next/swc-linux-x64-gnu": "npm:15.3.4" - "@next/swc-linux-x64-musl": "npm:15.3.4" - "@next/swc-win32-arm64-msvc": "npm:15.3.4" - "@next/swc-win32-x64-msvc": "npm:15.3.4" - "@swc/counter": "npm:0.1.3" + "@next/env": "npm:15.4.0-canary.85" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.85" + "@next/swc-darwin-x64": "npm:15.4.0-canary.85" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.85" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.85" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.85" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.85" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.85" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.85" "@swc/helpers": "npm:0.5.15" - busboy: "npm:1.6.0" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" sharp: "npm:^0.34.1" styled-jsx: "npm:5.1.6" peerDependencies: "@opentelemetry/api": ^1.1.0 - "@playwright/test": ^1.41.2 + "@playwright/test": ^1.51.1 babel-plugin-react-compiler: "*" react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -4133,14 +6911,207 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/52d3fba6f53d5d2a339cbde433ab360301e9a0a0d9b95a656bf29ce1af43f02e9cc32571d5d4095bcb8ab7a795207d6e75c64b33fc1f90d21f2f9b157cc9a503 + checksum: 10c0/756f84e1412b690b7c4687f3da4984ed3134c571a5d1568dcf7e764e4328ed7789f1898b43490682021a3b27f38975804bc9770495ae495925aeb50cd706dfdb + languageName: node + linkType: hard + +"nimma@npm:0.2.3": + version: 0.2.3 + resolution: "nimma@npm:0.2.3" + dependencies: + "@jsep-plugin/regex": "npm:^1.0.1" + "@jsep-plugin/ternary": "npm:^1.0.2" + astring: "npm:^1.8.1" + jsep: "npm:^1.2.0" + jsonpath-plus: "npm:^6.0.1 || ^10.1.0" + lodash.topath: "npm:^4.5.2" + dependenciesMeta: + jsonpath-plus: + optional: true + lodash.topath: + optional: true + checksum: 10c0/7e31b03e84b1c9ce0aeacce5a026629e3bc8ed7be1989ec098de416d071227506b290069e88bb54e2005642c6a6012696f5c427b52a0a9bbe1a9d193f4a9efb5 + languageName: node + linkType: hard + +"node-abort-controller@npm:^3.1.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 10c0/f7ad0e7a8e33809d4f3a0d1d65036a711c39e9d23e0319d80ebe076b9a3b4432b4d6b86a7fab65521de3f6872ffed36fc35d1327487c48eb88c517803403eda3 + languageName: node + linkType: hard + +"node-addon-api@npm:^8.0.0, node-addon-api@npm:^8.2.2, node-addon-api@npm:^8.3.0, node-addon-api@npm:^8.3.1": + version: 8.4.0 + resolution: "node-addon-api@npm:8.4.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/d51be099e1b9a6ac4a72f1a60787004d44c8ffe4be1efa38755d54b2a9f4f66647cc6913070e0ed20256d0e6eacceabfff90175fba2ef71153c2d06f8db8e7a9 + languageName: node + linkType: hard + +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: 10c0/5e5d63cda29856402df9472335af4bb13875e1927ad3be861dc5ebde38917aecbf9ae337923777af52a48c426b70148815e890a5d72760f1b4d758cc671b1a2b + languageName: node + linkType: hard + +"node-fetch-commonjs@npm:^3.3.2": + version: 3.3.2 + resolution: "node-fetch-commonjs@npm:3.3.2" + dependencies: + node-domexception: "npm:^1.0.0" + web-streams-polyfill: "npm:^3.0.3" + checksum: 10c0/87d36ed3e6dcb9dea96783700bc0becf0fdbcdc26c975e16b01a0d3a6e2f420c7e589e765bbfad461ae5377d4c5bd5f6937969a9dd34a0d736a81ac898f5c26a + languageName: node + linkType: hard + +"node-fetch-h2@npm:^2.3.0": + version: 2.3.0 + resolution: "node-fetch-h2@npm:2.3.0" + dependencies: + http2-client: "npm:^1.2.5" + checksum: 10c0/10f117c5aa1d475fff05028dddd617a61606083e4d6c4195dd5f5b03c973182e0d125e804771e6888d04f7d92b5c9c27a6149d1beedd6af1e0744f163e8a02d9 + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.8.0, node-gyp-build@npm:^4.8.2, node-gyp-build@npm:^4.8.4": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.2.0 + resolution: "node-gyp@npm:11.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + tinyglobby: "npm:^0.2.12" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 + languageName: node + linkType: hard + +"node-readfiles@npm:^0.2.0": + version: 0.2.0 + resolution: "node-readfiles@npm:0.2.0" + dependencies: + es6-promise: "npm:^3.2.1" + checksum: 10c0/9de2f741baae29f2422b22ef4399b5f7cb6c20372d4e88447a98d00a92cf1a35efdf942d24eee153a87d885aa7e7442b4bc6de33d4b91c47ba9da501780c76a1 + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" + dependencies: + abbrev: "npm:^3.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"oas-kit-common@npm:^1.0.8": + version: 1.0.8 + resolution: "oas-kit-common@npm:1.0.8" + dependencies: + fast-safe-stringify: "npm:^2.0.7" + checksum: 10c0/5619a0bd19a07b52af1afeff26e44601002c0fd558d0020fdb720cb3723b60c83b80efede3a62110ce315f15b971751fb46396760e0e507fb8fd412cdc3808dd + languageName: node + linkType: hard + +"oas-linter@npm:^3.2.2": + version: 3.2.2 + resolution: "oas-linter@npm:3.2.2" + dependencies: + "@exodus/schemasafe": "npm:^1.0.0-rc.2" + should: "npm:^13.2.1" + yaml: "npm:^1.10.0" + checksum: 10c0/5a8ea3d8a0bf185b676659d1e1c0b9b50695aeff53ccd5c264c8e99b4a7c0021f802b937913d76f0bc1a6a2b8ae151df764d95302b0829063b9b26f8c436871c + languageName: node + linkType: hard + +"oas-resolver@npm:^2.5.6": + version: 2.5.6 + resolution: "oas-resolver@npm:2.5.6" + dependencies: + node-fetch-h2: "npm:^2.3.0" + oas-kit-common: "npm:^1.0.8" + reftools: "npm:^1.1.9" + yaml: "npm:^1.10.0" + yargs: "npm:^17.0.1" + bin: + resolve: resolve.js + checksum: 10c0/cfba5ba3f7ea6673a840836cf194a80ba7f77e6d1ee005aa35cc838cad56d7e455fa53753ae7cc38810c96405b8606e675098ea7023639cf546cb10343f180f9 + languageName: node + linkType: hard + +"oas-schema-walker@npm:^1.1.5": + version: 1.1.5 + resolution: "oas-schema-walker@npm:1.1.5" + checksum: 10c0/8ba6bd2a9a8ede2c5574f217653a9e2b889a7c5be69c664a57e293591c58952e8510f4f9e2a82fd5f52491c859ce5c2b68342e9b971e9667f6b811e7fb56fd54 + languageName: node + linkType: hard + +"oas-validator@npm:^5.0.8": + version: 5.0.8 + resolution: "oas-validator@npm:5.0.8" + dependencies: + call-me-maybe: "npm:^1.0.1" + oas-kit-common: "npm:^1.0.8" + oas-linter: "npm:^3.2.2" + oas-resolver: "npm:^2.5.6" + oas-schema-walker: "npm:^1.1.5" + reftools: "npm:^1.1.9" + should: "npm:^13.2.1" + yaml: "npm:^1.10.0" + checksum: 10c0/16bb722042dcba93892c50db2201df6aeea9c3dd60e2f7bc18b36f23c610d136f52a5946908817f6fdd4139219fa4b177f952b9831039078b4c8730fa026b180 languageName: node linkType: hard "oauth4webapi@npm:^3.3.0": - version: 3.5.1 - resolution: "oauth4webapi@npm:3.5.1" - checksum: 10c0/5d57ba4299d61173b28ff0612fdfcc550b02c2ce4afcd1641103960c02af18268b55a70f26d47bbfc956680967c307546284b4a0b1f13845589e247f798ff395 + version: 3.5.3 + resolution: "oauth4webapi@npm:3.5.3" + checksum: 10c0/3c8b6854c68067481b4934386354e39824201dc4eade50b02448330a0eca3f4a68038548861e2a193eb12c55d934097c8c4b7e556036813da60646e556f61056 languageName: node linkType: hard @@ -4226,6 +7197,51 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"openapi-path-templating@npm:^2.2.1": + version: 2.2.1 + resolution: "openapi-path-templating@npm:2.2.1" + dependencies: + apg-lite: "npm:^1.0.4" + checksum: 10c0/5b42e2d6c1f709272e227502b94aea072d7157cd9bc1f3e7f9c74ea81ed51138fd23de096991fff8cefcdd73ab6f5292fe495804ba9c7ae9071b9d30c0c50575 + languageName: node + linkType: hard + +"openapi-server-url-templating@npm:^1.3.0": + version: 1.3.0 + resolution: "openapi-server-url-templating@npm:1.3.0" + dependencies: + apg-lite: "npm:^1.0.4" + checksum: 10c0/8018822c2932d675457f3d1ad632d308e1d5c3becbda9eed27518a9e0117a792e320354f4b5ccbc4db89980899e82f0de420e36ecf71ba5d47d5b5c51e703ac0 + languageName: node + linkType: hard + +"openapi3-ts@npm:4.2.2": + version: 4.2.2 + resolution: "openapi3-ts@npm:4.2.2" + dependencies: + yaml: "npm:^2.3.4" + checksum: 10c0/8569c0cecf12353d57d7cebe28d495a2b33a06f6f9ebb1b9c808490f9ea87e7e480c62ffb9c3632f78647b09ca722bbc39b36804e73cea1f8fc7626785a23b99 + languageName: node + linkType: hard + +"openapi3-ts@npm:4.4.0, openapi3-ts@npm:^4.1.2, openapi3-ts@npm:^4.2.2": + version: 4.4.0 + resolution: "openapi3-ts@npm:4.4.0" + dependencies: + yaml: "npm:^2.5.0" + checksum: 10c0/900b834279fc8a43c545728ad75ec7c26934ec5344225b60d1e1c0df44d742d7e7379aea18d9034e03031f079d3308ba5a68600682eece3ed41cdbdd10346a9e + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -4240,6 +7256,42 @@ __metadata: languageName: node linkType: hard +"orval@npm:7.10.0": + version: 7.10.0 + resolution: "orval@npm:7.10.0" + dependencies: + "@apidevtools/swagger-parser": "npm:^10.1.1" + "@orval/angular": "npm:7.10.0" + "@orval/axios": "npm:7.10.0" + "@orval/core": "npm:7.10.0" + "@orval/fetch": "npm:7.10.0" + "@orval/hono": "npm:7.10.0" + "@orval/mcp": "npm:7.10.0" + "@orval/mock": "npm:7.10.0" + "@orval/query": "npm:7.10.0" + "@orval/swr": "npm:7.10.0" + "@orval/zod": "npm:7.10.0" + ajv: "npm:^8.17.1" + cac: "npm:^6.7.14" + chalk: "npm:^4.1.2" + chokidar: "npm:^4.0.3" + enquirer: "npm:^2.4.1" + execa: "npm:^5.1.1" + find-up: "npm:5.0.0" + fs-extra: "npm:^11.3.0" + lodash.uniq: "npm:^4.5.0" + openapi3-ts: "npm:4.2.2" + string-argv: "npm:^0.3.2" + tsconfck: "npm:^2.0.1" + typedoc: "npm:^0.28.0" + typedoc-plugin-markdown: "npm:^4.4.2" + typescript: "npm:^5.6.3" + bin: + orval: dist/bin/orval.js + checksum: 10c0/ed789c0ee3ba26777fbf8fac9d77d682ac507c4733e9123784af3e457e290285b966f97050b0257ffacdd0b721239d26b1847c6231264f80a964b1ca8189bf01 + languageName: node + linkType: hard + "own-keys@npm:^1.0.1": version: 1.0.1 resolution: "own-keys@npm:1.0.1" @@ -4269,6 +7321,20 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -4278,6 +7344,20 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^2.0.0": + version: 2.0.0 + resolution: "parse-entities@npm:2.0.0" + dependencies: + character-entities: "npm:^1.0.0" + character-entities-legacy: "npm:^1.0.0" + character-reference-invalid: "npm:^1.0.0" + is-alphanumerical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + is-hexadecimal: "npm:^1.0.0" + checksum: 10c0/f85a22c0ea406ff26b53fdc28641f01cc36fa49eb2e3135f02693286c89ef0bcefc2262d99b3688e20aac2a14fd10b75c518583e875c1b9fe3d1f937795e0854 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -4285,7 +7365,7 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.1.0": +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c @@ -4299,6 +7379,23 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -4320,6 +7417,13 @@ __metadata: languageName: node linkType: hard +"pony-cause@npm:^1.1.1": + version: 1.1.1 + resolution: "pony-cause@npm:1.1.1" + checksum: 10c0/63ee3e22c3a9ddda3aca17c2368657934b6c713a1af5b44b48aa6d06a1afc0f0c1f49e20b641be94f33f6c5bd2877977c4b6ca8de2514756b9351318ec4f14a5 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -4338,7 +7442,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.6": +"postcss@npm:8.5.6, postcss@npm:^8.4.41": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -4349,17 +7453,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.41": - version: 8.5.4 - resolution: "postcss@npm:8.5.4" - dependencies: - nanoid: "npm:^3.3.11" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/0feff648614a834f7cd5396ea6b05b658ca0507e10a4eaad03b56c348f6aec93f42a885fc1b30522630c6a7e49ae53b38a061e3cba526f2d9857afbe095a22bb - languageName: node - linkType: hard - "preact-render-to-string@npm:6.5.11": version: 6.5.11 resolution: "preact-render-to-string@npm:6.5.11" @@ -4409,6 +7502,44 @@ __metadata: languageName: node linkType: hard +"prismjs@npm:^1.27.0": + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: 10c0/f56205bfd58ef71ccfcbcb691fd0eb84adc96c6ff21b0b69fc6fdcf02be42d6ef972ba4aed60466310de3d67733f6a746f89f2fb79c00bf217406d465b3e8f23 + languageName: node + linkType: hard + +"prismjs@npm:~1.27.0": + version: 1.27.0 + resolution: "prismjs@npm:1.27.0" + checksum: 10c0/841cbf53e837a42df9155c5ce1be52c4a0a8967ac916b52a27d066181a3578186c634e52d06d0547fb62b65c486b99b95f826dd54966619f9721b884f486b498 + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + "prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -4420,6 +7551,29 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^5.0.0": + version: 5.6.0 + resolution: "property-information@npm:5.6.0" + dependencies: + xtend: "npm:^4.0.0" + checksum: 10c0/d54b77c31dc13bb6819559080b2c67d37d94be7dc271f404f139a16a57aa96fcc0b3ad806d4a5baef9e031744853e4afe3df2e37275aacb1f78079bbb652c5af + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: 10c0/1d12c1c0e06127fa5db56bd7fdf698daf9a78104456a6b67326877afc21feaa821257b171539caedd2f0524027fa38e67b13dd094159c8d70b6d26d2bea4dfdb + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -4427,6 +7581,13 @@ __metadata: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 10c0/3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -4434,6 +7595,65 @@ __metadata: languageName: node linkType: hard +"ramda-adjunct@npm:^5.0.0, ramda-adjunct@npm:^5.1.0": + version: 5.1.0 + resolution: "ramda-adjunct@npm:5.1.0" + peerDependencies: + ramda: ">= 0.30.0" + checksum: 10c0/8d8e74648439b3b68f3d6e8d094e9a4f3a9e95db115b8d7b0b96510ac6b9724e80e7917890bdfeade4f6e44c299e4a629e8fb6048778115c2c21001cabed6544 + languageName: node + linkType: hard + +"ramda@npm:^0.30.1, ramda@npm:~0.30.0": + version: 0.30.1 + resolution: "ramda@npm:0.30.1" + checksum: 10c0/3ea3e35c80e1a1b78c23de0c72d3382c3446f42052b113b851f1b7fc421e33a45ce92e7aef3c705cc6de3812a209d03417af5c264f67126cda539fd66c8bea71 + languageName: node + linkType: hard + +"randexp@npm:^0.5.3": + version: 0.5.3 + resolution: "randexp@npm:0.5.3" + dependencies: + drange: "npm:^1.0.2" + ret: "npm:^0.2.0" + checksum: 10c0/44ad4e6e7661c090939e062916ccf1477de27eb2b91dfa8c113de9f3116ddf2016ac090323d5d2fa0947c3ff8e9b24798ee5e25cb2c37f22df2e72cda56232b6 + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"react-copy-to-clipboard@npm:5.1.0": + version: 5.1.0 + resolution: "react-copy-to-clipboard@npm:5.1.0" + dependencies: + copy-to-clipboard: "npm:^3.3.1" + prop-types: "npm:^15.8.1" + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + checksum: 10c0/de70d9f9c2d17cee207888ed791d4a042c300e5ca732503434d49e6745cff56c0d5ebcc82ab86237e9c2248e636d1d031b9f9cf9913ecec61d82a0e5ebc93881 + languageName: node + linkType: hard + +"react-debounce-input@npm:=3.3.0": + version: 3.3.0 + resolution: "react-debounce-input@npm:3.3.0" + dependencies: + lodash.debounce: "npm:^4" + prop-types: "npm:^15.8.1" + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + checksum: 10c0/a015dc31ebb2777bdcc14b2b466994ff670f823c978bd5d3ee0bfd7955ccf4de48fadeac39a0a97bd8d628502c0808f384e48bf650d6a141b2f04c43275f0e29 + languageName: node + linkType: hard + "react-dom@npm:^19.0.0": version: 19.1.0 resolution: "react-dom@npm:19.1.0" @@ -4454,6 +7674,37 @@ __metadata: languageName: node linkType: hard +"react-immutable-proptypes@npm:2.2.0": + version: 2.2.0 + resolution: "react-immutable-proptypes@npm:2.2.0" + dependencies: + invariant: "npm:^2.2.2" + peerDependencies: + immutable: ">=3.6.2" + checksum: 10c0/4f3e147303be418d157a00246c9988068df0d21cb92e40f9d78a09538da71b967f5ddbd7f7facf54f05b5ddb011cc717afa82c8c490b0188bf90a6251acc9fb9 + languageName: node + linkType: hard + +"react-immutable-pure-component@npm:^2.2.0": + version: 2.2.2 + resolution: "react-immutable-pure-component@npm:2.2.2" + peerDependencies: + immutable: ">= 2 || >= 4.0.0-rc" + react: ">= 16.6" + react-dom: ">= 16.6" + checksum: 10c0/d13dc10069bd13059ab91741169c6adaa2a44efb425fc3cf7506925f8cfcde40ef8c7d88f0ac5977a9b1eb5b6456f7fe530a1c670df727424dd72a1642163675 + languageName: node + linkType: hard + +"react-inspector@npm:^6.0.1": + version: 6.0.2 + resolution: "react-inspector@npm:6.0.2" + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + checksum: 10c0/8f9b23c21b4d95722e28c9455c2bf00fd9437347714382594461f98e5b9954d60864d0f4e74e881639b065e752a97ba52a65e39930c234072e5bff291bb02b5e + languageName: node + linkType: hard + "react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -4461,6 +7712,25 @@ __metadata: languageName: node linkType: hard +"react-redux@npm:^9.2.0": + version: 9.2.0 + resolution: "react-redux@npm:9.2.0" + dependencies: + "@types/use-sync-external-store": "npm:^0.0.6" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + redux: + optional: true + checksum: 10c0/00d485f9d9219ca1507b4d30dde5f6ff8fb68ba642458f742e0ec83af052f89e65cd668249b99299e1053cc6ad3d2d8ac6cb89e2f70d2ac5585ae0d7fa0ef259 + languageName: node + linkType: hard + "react-remove-scroll-bar@npm:^2.3.7": version: 2.3.8 resolution: "react-remove-scroll-bar@npm:2.3.8" @@ -4512,6 +7782,22 @@ __metadata: languageName: node linkType: hard +"react-syntax-highlighter@npm:^15.6.1": + version: 15.6.1 + resolution: "react-syntax-highlighter@npm:15.6.1" + dependencies: + "@babel/runtime": "npm:^7.3.1" + highlight.js: "npm:^10.4.1" + highlightjs-vue: "npm:^1.0.0" + lowlight: "npm:^1.17.0" + prismjs: "npm:^1.27.0" + refractor: "npm:^3.6.0" + peerDependencies: + react: ">= 0.14.0" + checksum: 10c0/4a4cf4695c45d7a6b25078970fb79ae5a85edeba5be0a2508766ee18e8aee1c0c4cdd97bf54f5055e4af671fe7e5e71348e81cafe09a0eb07a763ae876b7f073 + languageName: node + linkType: hard + "react@npm:^19.0.0": version: 19.1.0 resolution: "react@npm:19.1.0" @@ -4519,6 +7805,29 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 + languageName: node + linkType: hard + +"redux-immutable@npm:^4.0.0": + version: 4.0.0 + resolution: "redux-immutable@npm:4.0.0" + peerDependencies: + immutable: ^3.8.1 || ^4.0.0-rc.1 + checksum: 10c0/c706c9f72a1fbce92d54ab9117ab641b6d7ee69f2860ec6de827dbed5bed918d4677a0895e6564bb59011202bb5e639cf69f4e2d2d14086053b32e5c4e35f512 + languageName: node + linkType: hard + +"redux@npm:^5.0.1": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: 10c0/b10c28357194f38e7d53b760ed5e64faa317cc63de1fb95bc5d9e127fab956392344368c357b8e7a9bedb0c35b111e7efa522210cfdc3b3c75e5074718e9069c + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": version: 1.0.10 resolution: "reflect.getprototypeof@npm:1.0.10" @@ -4535,6 +7844,24 @@ __metadata: languageName: node linkType: hard +"refractor@npm:^3.6.0": + version: 3.6.0 + resolution: "refractor@npm:3.6.0" + dependencies: + hastscript: "npm:^6.0.0" + parse-entities: "npm:^2.0.0" + prismjs: "npm:~1.27.0" + checksum: 10c0/63ab62393c8c2fd7108c2ea1eff721c0ad2a1a6eee60fdd1b47f4bb25cf298667dc97d041405b3e718b0817da12b37a86ed07ebee5bd2ca6405611f1bae456db + languageName: node + linkType: hard + +"reftools@npm:^1.1.9": + version: 1.1.9 + resolution: "reftools@npm:1.1.9" + checksum: 10c0/4b44c9e75d6e5328b43b974de08776ee1718a0b48f24e033b2699f872cc9a698234a4aa0553b9e1a766b828aeb9834e4aa988410f0279e86179edb33b270da6c + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -4549,6 +7876,53 @@ __metadata: languageName: node linkType: hard +"remarkable@npm:^2.0.1": + version: 2.0.1 + resolution: "remarkable@npm:2.0.1" + dependencies: + argparse: "npm:^1.0.10" + autolinker: "npm:^3.11.0" + bin: + remarkable: bin/remarkable.js + checksum: 10c0/e2c23bfd2e45234110bc3220e44fcac5e4a8199691ff6959d9cd0bac34ffca2f123d3913946cbef517018bc8e5ab00beafc527a04782b7afbe5e9706d1c0c77a + languageName: node + linkType: hard + +"repeat-string@npm:^1.5.2": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 10c0/87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 + languageName: node + linkType: hard + +"reselect@npm:^5.1.1": + version: 5.1.1 + resolution: "reselect@npm:5.1.1" + checksum: 10c0/219c30da122980f61853db3aebd173524a2accd4b3baec770e3d51941426c87648a125ca08d8c57daa6b8b086f2fdd2703cb035dd6231db98cdbe1176a71f489 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -4615,6 +7989,20 @@ __metadata: languageName: node linkType: hard +"ret@npm:^0.2.0": + version: 0.2.2 + resolution: "ret@npm:0.2.2" + checksum: 10c0/1a41e543913cda851abb1dae4852efa97bb693ce58fde3b51cc1cae94e2599dd70b91ad6268a4a07fc238305be06fed91723ef6d08863c48a0d02e0a74b943cd + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.1.0 resolution: "reusify@npm:1.1.0" @@ -4644,6 +8032,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + "safe-push-apply@npm:^1.0.0": version: 1.0.0 resolution: "safe-push-apply@npm:1.0.0" @@ -4665,6 +8060,20 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^1.1": + version: 1.1.1 + resolution: "safe-stable-stringify@npm:1.1.1" + checksum: 10c0/03e36df1444fc52eacb069b1ca1289061b6ffe75b184ac7df22bc962ee7e7226a4371491be21574bc8df81e33fa5a11eb54a85b6a68bf25394ee4453fe0d9d81 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + "scheduler@npm:^0.26.0": version: 0.26.0 resolution: "scheduler@npm:0.26.0" @@ -4681,7 +8090,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2": +"semver@npm:^7.3.5, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -4690,6 +8099,15 @@ __metadata: languageName: node linkType: hard +"serialize-error@npm:^8.1.0": + version: 8.1.0 + resolution: "serialize-error@npm:8.1.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/8cfd89f43ca93e283c5f1d16178a536bdfac9bc6029f4a9df988610cc399bc4f2478d1f10ce40b9dff66b863a5158a19b438fbec929045c96d92174f6bca1e88 + languageName: node + linkType: hard + "set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" @@ -4727,6 +8145,18 @@ __metadata: languageName: node linkType: hard +"sha.js@npm:^2.4.11": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + bin: + sha.js: ./bin.js + checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 + languageName: node + linkType: hard + "sharp@npm:^0.34.1": version: 0.34.2 resolution: "sharp@npm:0.34.2" @@ -4818,6 +8248,72 @@ __metadata: languageName: node linkType: hard +"short-unique-id@npm:^5.3.2": + version: 5.3.2 + resolution: "short-unique-id@npm:5.3.2" + bin: + short-unique-id: bin/short-unique-id + suid: bin/short-unique-id + checksum: 10c0/d411ca922731f5e9dbce0820616fa3a62b2a42692094a7d99d32b230fcae556284a3b89f86ca17e449b2bc7efee08f185abc63000570a4e0d451f5e883b55a8d + languageName: node + linkType: hard + +"should-equal@npm:^2.0.0": + version: 2.0.0 + resolution: "should-equal@npm:2.0.0" + dependencies: + should-type: "npm:^1.4.0" + checksum: 10c0/b375e1da2586671e2b9442ac5b700af508f56438af9923f69123b1fe4e02ccddc9a8a3eb803447a6df91e616cec236c41d6f28fdaa100467f9fdb81651089538 + languageName: node + linkType: hard + +"should-format@npm:^3.0.3": + version: 3.0.3 + resolution: "should-format@npm:3.0.3" + dependencies: + should-type: "npm:^1.3.0" + should-type-adaptors: "npm:^1.0.1" + checksum: 10c0/ef2a31148d79a3fabd0dc6c1c1b10f90d9e071ad8e1f99452bd01e8aceaca62985b43974cf8103185fa1a3ade85947c6f664e44ca9af253afd1ce93c223bd8e4 + languageName: node + linkType: hard + +"should-type-adaptors@npm:^1.0.1": + version: 1.1.0 + resolution: "should-type-adaptors@npm:1.1.0" + dependencies: + should-type: "npm:^1.3.0" + should-util: "npm:^1.0.0" + checksum: 10c0/cf127f8807f69ace9db04dbec3f274330a854405feef9821b5fa525748961da65747869cca36c813132b98757bd3e42d53541579cb16630ccf3c0dd9c0082320 + languageName: node + linkType: hard + +"should-type@npm:^1.3.0, should-type@npm:^1.4.0": + version: 1.4.0 + resolution: "should-type@npm:1.4.0" + checksum: 10c0/50cb50d776ee117b151068367c09ec12ac8e6f5fe2bd4d167413972813f06e930fe8624232a56c335846d3afcb784455f9a9690baa4350b3919bd001f0c4c94b + languageName: node + linkType: hard + +"should-util@npm:^1.0.0": + version: 1.0.1 + resolution: "should-util@npm:1.0.1" + checksum: 10c0/1790719e05eae9edae86e44cbbad98529bd333df3f7cdfd63ea80acb6af718990e70abbc173aa9ccb93fff5ab6ee08d38412d707ff4003840be2256a278a61f3 + languageName: node + linkType: hard + +"should@npm:^13.2.1": + version: 13.2.3 + resolution: "should@npm:13.2.3" + dependencies: + should-equal: "npm:^2.0.0" + should-format: "npm:^3.0.3" + should-type: "npm:^1.4.0" + should-type-adaptors: "npm:^1.0.1" + should-util: "npm:^1.0.0" + checksum: 10c0/99581d8615f6fb27cd23c9f431cfacef58d118a90d0cccf58775b90631a47441397cfbdcbe6379e2718e9e60f293e3dfc0e87857f4b5a36fe962814e46ab05fa + languageName: node + linkType: hard + "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -4866,6 +8362,29 @@ __metadata: languageName: node linkType: hard +"signal-exit@npm:^3.0.3": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"simple-eval@npm:1.0.1": + version: 1.0.1 + resolution: "simple-eval@npm:1.0.1" + dependencies: + jsep: "npm:^1.3.6" + checksum: 10c0/0fc9f84e3bca0c87c78d12dac7dd04bcb448d4060b95101ea7bfdf8aec941cdbbb924230bd0b0a40a319e335c92abd439760be65c06bab04b2d829688c6fcd2a + languageName: node + linkType: hard + "simple-swizzle@npm:^0.2.2": version: 0.2.2 resolution: "simple-swizzle@npm:0.2.2" @@ -4875,6 +8394,41 @@ __metadata: languageName: node linkType: hard +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.5 + resolution: "socks@npm:2.8.5" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/e427d0eb0451cfd04e20b9156ea8c0e9b5e38a8d70f21e55c30fbe4214eda37cfc25d782c63f9adc5fbdad6d062a0f127ef2cefc9a44b6fee2b9ea5d1ed10827 + languageName: node + linkType: hard + "source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -4882,6 +8436,36 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^1.0.0": + version: 1.1.5 + resolution: "space-separated-tokens@npm:1.1.5" + checksum: 10c0/3ee0a6905f89e1ffdfe474124b1ade9fe97276a377a0b01350bc079b6ec566eb5b219e26064cc5b7f3899c05bde51ffbc9154290b96eaf82916a1e2c2c13ead9 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + "stable-hash@npm:^0.0.5": version: 0.0.5 resolution: "stable-hash@npm:0.0.5" @@ -4899,10 +8483,32 @@ __metadata: languageName: node linkType: hard -"streamsearch@npm:^1.1.0": - version: 1.1.0 - resolution: "streamsearch@npm:1.1.0" - checksum: 10c0/fbd9aecc2621364384d157f7e59426f4bfd385e8b424b5aaa79c83a6f5a1c8fd2e4e3289e95de1eb3511cb96bb333d6281a9919fafce760e4edb35b2cd2facab +"string-argv@npm:^0.3.2": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca languageName: node linkType: hard @@ -4986,6 +8592,24 @@ __metadata: languageName: node linkType: hard +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -4993,6 +8617,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -5032,6 +8663,99 @@ __metadata: languageName: node linkType: hard +"swagger-client@npm:^3.35.5": + version: 3.35.5 + resolution: "swagger-client@npm:3.35.5" + dependencies: + "@babel/runtime-corejs3": "npm:^7.22.15" + "@scarf/scarf": "npm:=1.4.0" + "@swagger-api/apidom-core": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-error": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-json-pointer": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-1": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-reference": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swaggerexpert/cookie": "npm:^2.0.2" + deepmerge: "npm:~4.3.0" + fast-json-patch: "npm:^3.0.0-1" + js-yaml: "npm:^4.1.0" + neotraverse: "npm:=0.6.18" + node-abort-controller: "npm:^3.1.1" + node-fetch-commonjs: "npm:^3.3.2" + openapi-path-templating: "npm:^2.2.1" + openapi-server-url-templating: "npm:^1.3.0" + ramda: "npm:^0.30.1" + ramda-adjunct: "npm:^5.1.0" + checksum: 10c0/7179807ac977c1b7ee4f121d16a8f9f902467dfc026f4cff7fadb4d02e3b4f6a21f54612614435b3d43efbbce1376871aedb34f2c186de9391625f1c1674d948 + languageName: node + linkType: hard + +"swagger-ui-react@npm:^5.24.1": + version: 5.25.2 + resolution: "swagger-ui-react@npm:5.25.2" + dependencies: + "@babel/runtime-corejs3": "npm:^7.27.1" + "@scarf/scarf": "npm:=1.4.0" + base64-js: "npm:^1.5.1" + classnames: "npm:^2.5.1" + css.escape: "npm:1.5.1" + deep-extend: "npm:0.6.0" + dompurify: "npm:=3.2.4" + ieee754: "npm:^1.2.1" + immutable: "npm:^3.x.x" + js-file-download: "npm:^0.4.12" + js-yaml: "npm:=4.1.0" + lodash: "npm:^4.17.21" + prop-types: "npm:^15.8.1" + randexp: "npm:^0.5.3" + randombytes: "npm:^2.1.0" + react-copy-to-clipboard: "npm:5.1.0" + react-debounce-input: "npm:=3.3.0" + react-immutable-proptypes: "npm:2.2.0" + react-immutable-pure-component: "npm:^2.2.0" + react-inspector: "npm:^6.0.1" + react-redux: "npm:^9.2.0" + react-syntax-highlighter: "npm:^15.6.1" + redux: "npm:^5.0.1" + redux-immutable: "npm:^4.0.0" + remarkable: "npm:^2.0.1" + reselect: "npm:^5.1.1" + serialize-error: "npm:^8.1.0" + sha.js: "npm:^2.4.11" + swagger-client: "npm:^3.35.5" + url-parse: "npm:^1.5.10" + xml: "npm:=1.0.1" + xml-but-prettier: "npm:^1.0.1" + zenscroll: "npm:^4.0.2" + peerDependencies: + react: ">=16.8.0 <19" + react-dom: ">=16.8.0 <19" + checksum: 10c0/036fe857782ecba1410be7789a23be185a2af369274aaafa853b4b17c5216df2f39e7470149487de55fab8be7ca3f0e9174c752f4ffcb97f0e7909a8b002d2fa + languageName: node + linkType: hard + +"swagger2openapi@npm:^7.0.8": + version: 7.0.8 + resolution: "swagger2openapi@npm:7.0.8" + dependencies: + call-me-maybe: "npm:^1.0.1" + node-fetch: "npm:^2.6.1" + node-fetch-h2: "npm:^2.3.0" + node-readfiles: "npm:^0.2.0" + oas-kit-common: "npm:^1.0.8" + oas-resolver: "npm:^2.5.6" + oas-schema-walker: "npm:^1.1.5" + oas-validator: "npm:^5.0.8" + reftools: "npm:^1.1.9" + yaml: "npm:^1.10.0" + yargs: "npm:^17.0.1" + bin: + boast: boast.js + oas-validate: oas-validate.js + swagger2openapi: swagger2openapi.js + checksum: 10c0/441a4d3a7d353f99395b14a0c8d6124be6390f2f8aa53336905e7314a7f80b66f5f2a40ac0dc2dbe2f7bc01f52a223a94f54a2ece345095fd3ad8ae8b03d688b + languageName: node + linkType: hard + "tailwind-merge@npm:^3.2.0": version: 3.3.1 resolution: "tailwind-merge@npm:3.3.1" @@ -5067,7 +8791,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.13": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" dependencies: @@ -5086,6 +8810,58 @@ __metadata: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: 10c0/f2cf1f2c70f374fd87b0cdc8007453ba9e981c4305a8bf4eac10a30e62ecdfd28bca7d18f8f15b15a506bf8a7bfb20dbe3539f0fcf2a2c8396c1a78d53e1f179 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + +"tree-sitter-json@npm:=0.24.8": + version: 0.24.8 + resolution: "tree-sitter-json@npm:0.24.8" + dependencies: + node-addon-api: "npm:^8.2.2" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.8.2" + peerDependencies: + tree-sitter: ^0.21.1 + peerDependenciesMeta: + tree-sitter: + optional: true + checksum: 10c0/cc528770947d4b24e2a389b8c9f9ac103841a4447278903700cbb893414d21564366a9d9c0fc1c6b7c2d4bbe311b8622e95f3b4df3886ee3c8e2e44c839261c1 + languageName: node + linkType: hard + +"tree-sitter@npm:=0.21.1": + version: 0.21.1 + resolution: "tree-sitter@npm:0.21.1" + dependencies: + node-addon-api: "npm:^8.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.8.0" + checksum: 10c0/c144830c28ce588f5c5cf060390286ffece760636bfff03cf9110a7910504be3da6873d3bdc4faa9d5424433401122adbba605c9754bfd6fca63500265738ffb + languageName: node + linkType: hard + +"tree-sitter@npm:=0.22.4": + version: 0.22.4 + resolution: "tree-sitter@npm:0.22.4" + dependencies: + node-addon-api: "npm:^8.3.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.8.4" + checksum: 10c0/28d03778bdd8b4910aa064a9f3478c3e0ee697948282556b11452f6987a721535f4a9a8c528d9c04e0a0e8b759b8372a2118b9f21f5e200b48438a57a18e9977 + languageName: node + linkType: hard + "ts-api-utils@npm:^2.1.0": version: 2.1.0 resolution: "ts-api-utils@npm:2.1.0" @@ -5095,6 +8871,83 @@ __metadata: languageName: node linkType: hard +"ts-mixer@npm:^6.0.3, ts-mixer@npm:^6.0.4": + version: 6.0.4 + resolution: "ts-mixer@npm:6.0.4" + checksum: 10c0/4c442fc99cdffd4a3f0ce55c624fb703f4ded5cab6912f97705489565c4a74d3e4213f10c33499ec5150900a628d38537a9a6a9e35b5045b65129a84b4db21ae + languageName: node + linkType: hard + +"ts-node@npm:10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + +"ts-toolbelt@npm:^9.6.0": + version: 9.6.0 + resolution: "ts-toolbelt@npm:9.6.0" + checksum: 10c0/838f9a2f0fe881d5065257a23b402c41315b33ff987b73db3e2b39fcb70640c4c7220e1ef118ed5676763543724fdbf4eda7b0e2c17acb667ed1401336af9f8c + languageName: node + linkType: hard + +"tsconfck@npm:^2.0.1": + version: 2.1.2 + resolution: "tsconfck@npm:2.1.2" + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + bin: + tsconfck: bin/tsconfck.js + checksum: 10c0/6efc9cbbccdbbcafc86a744a1804fcd8438097c2beaac370444cc413fa1582a019a74002a111e3005b89ca0b0169ace730161864628fc751754e29b335c3c79f + languageName: node + linkType: hard + +"tsconfig-paths@npm:4.2.0": + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" + dependencies: + json5: "npm:^2.2.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -5107,7 +8960,14 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^1.14.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 + languageName: node + linkType: hard + +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.8.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -5130,6 +8990,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -5183,7 +9050,42 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.8.3": +"typedoc-plugin-markdown@npm:^4.4.2": + version: 4.7.0 + resolution: "typedoc-plugin-markdown@npm:4.7.0" + peerDependencies: + typedoc: 0.28.x + checksum: 10c0/066cb8a0f96bb24c22069830d189904d624204b7ceaaeab78c72008ebb2c2bddb55170ae39fac31352caf20516a1a2360300cf384c9683f7b42465dc2c354bd1 + languageName: node + linkType: hard + +"typedoc@npm:^0.28.0": + version: 0.28.5 + resolution: "typedoc@npm:0.28.5" + dependencies: + "@gerrit0/mini-shiki": "npm:^3.2.2" + lunr: "npm:^2.3.9" + markdown-it: "npm:^14.1.0" + minimatch: "npm:^9.0.5" + yaml: "npm:^2.7.1" + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x + bin: + typedoc: bin/typedoc + checksum: 10c0/fc8235dbe8f14da24fdb088467b01887b3f1375b27d5caf0276ae405f03aa1f523e94aea52fe8ce1a3d477ae9e3f4f69fdc28614275445a828a77db88784e6ce + languageName: node + linkType: hard + +"types-ramda@npm:^0.30.1": + version: 0.30.1 + resolution: "types-ramda@npm:0.30.1" + dependencies: + ts-toolbelt: "npm:^9.6.0" + checksum: 10c0/4a8b230ae9772e6534f65b1a154dd5604bcd1d74e27b49686337a215e83aa8fc93e49f8c49af395418d2950cb9fb9b900662077c1d4b73ff6fe4f4bcb83ab2d6 + languageName: node + linkType: hard + +"typescript@npm:5.8.3, typescript@npm:^5.6.3": version: 5.8.3 resolution: "typescript@npm:5.8.3" bin: @@ -5193,7 +9095,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.8.3#optional!builtin": +"typescript@patch:typescript@npm%3A5.8.3#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": version: 5.8.3 resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" bin: @@ -5203,6 +9105,13 @@ __metadata: languageName: node linkType: hard +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 10c0/8862eddb412dda76f15db8ad1c640ccc2f47cdf8252a4a30be908d535602c8d33f9855dfcccb8b8837855c1ce1eaa563f7fa7ebe3c98fd0794351aab9b9c55fa + languageName: node + linkType: hard + "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" @@ -5222,29 +9131,74 @@ __metadata: languageName: node linkType: hard -"unrs-resolver@npm:^1.6.2": - version: 1.7.11 - resolution: "unrs-resolver@npm:1.7.11" +"undici-types@npm:~7.8.0": + version: 7.8.0 + resolution: "undici-types@npm:7.8.0" + checksum: 10c0/9d9d246d1dc32f318d46116efe3cfca5a72d4f16828febc1918d94e58f6ffcf39c158aa28bf5b4fc52f410446bc7858f35151367bd7a49f21746cab6497b709b + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - "@unrs/resolver-binding-darwin-arm64": "npm:1.7.11" - "@unrs/resolver-binding-darwin-x64": "npm:1.7.11" - "@unrs/resolver-binding-freebsd-x64": "npm:1.7.11" - "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.7.11" - "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.7.11" - "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.7.11" - "@unrs/resolver-binding-linux-arm64-musl": "npm:1.7.11" - "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.7.11" - "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.7.11" - "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.7.11" - "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.7.11" - "@unrs/resolver-binding-linux-x64-gnu": "npm:1.7.11" - "@unrs/resolver-binding-linux-x64-musl": "npm:1.7.11" - "@unrs/resolver-binding-wasm32-wasi": "npm:1.7.11" - "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.7.11" - "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.7.11" - "@unrs/resolver-binding-win32-x64-msvc": "npm:1.7.11" + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + +"unraw@npm:^3.0.0": + version: 3.0.0 + resolution: "unraw@npm:3.0.0" + checksum: 10c0/cd1e7a961c8dc075bdf07300bc046da6bc8c4f1b88c68191c392520f0c64914fa783d48f2431c668f79b1afbd4bab16e864c7aca3cc06ddc94567c1fec114b43 + languageName: node + linkType: hard + +"unrs-resolver@npm:^1.6.2": + version: 1.9.1 + resolution: "unrs-resolver@npm:1.9.1" + dependencies: + "@unrs/resolver-binding-android-arm-eabi": "npm:1.9.1" + "@unrs/resolver-binding-android-arm64": "npm:1.9.1" + "@unrs/resolver-binding-darwin-arm64": "npm:1.9.1" + "@unrs/resolver-binding-darwin-x64": "npm:1.9.1" + "@unrs/resolver-binding-freebsd-x64": "npm:1.9.1" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.9.1" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.9.1" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.9.1" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.9.1" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.9.1" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.9.1" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.9.1" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.9.1" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.9.1" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.9.1" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.9.1" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.9.1" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.9.1" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.9.1" napi-postinstall: "npm:^0.2.2" dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true "@unrs/resolver-binding-darwin-arm64": optional: true "@unrs/resolver-binding-darwin-x64": @@ -5279,7 +9233,7 @@ __metadata: optional: true "@unrs/resolver-binding-win32-x64-msvc": optional: true - checksum: 10c0/37e6caf2884b7ce65f77fc5b945997b94523656d477ae0e67fb8df970939930b674091f3fac6beee93b0370fa64a925ad707edc76897aa8cb14866efbe4a6693 + checksum: 10c0/fded9251b6c180c92c0510abe63e4fa9a5a4adcdcf3c9f7920507dc9f1ec756de5e71d1258f12bf4a32f7042e1fe142b6dc1003d8a6fb4d0bf1234226c879b01 languageName: node linkType: hard @@ -5292,6 +9246,23 @@ __metadata: languageName: node linkType: hard +"urijs@npm:^1.19.11": + version: 1.19.11 + resolution: "urijs@npm:1.19.11" + checksum: 10c0/96e15eea5b41a99361d506e4d8fcc64dc43f334bd5fd34e08261467b6954b97a6b45929a8d6c79e2dc76aadfd6ca950e0f4bd7f3c0757a08978429634d07eda1 + languageName: node + linkType: hard + +"url-parse@npm:^1.5.10": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: "npm:^2.1.1" + requires-port: "npm:^1.0.0" + checksum: 10c0/bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 + languageName: node + linkType: hard + "use-callback-ref@npm:^1.3.3": version: 1.3.3 resolution: "use-callback-ref@npm:1.3.3" @@ -5323,6 +9294,67 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.4.0": + version: 1.5.0 + resolution: "use-sync-external-store@npm:1.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 + languageName: node + linkType: hard + +"utility-types@npm:^3.10.0": + version: 3.11.0 + resolution: "utility-types@npm:3.11.0" + checksum: 10c0/2f1580137b0c3e6cf5405f37aaa8f5249961a76d26f1ca8efc0ff49a2fc0e0b2db56de8e521a174d075758e0c7eb3e590edec0832eb44478b958f09914920f19 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"validator@npm:^13.11.0": + version: 13.15.15 + resolution: "validator@npm:13.15.15" + checksum: 10c0/f5349d1fbb9cc36f9f6c5dab1880764ddad1d0d2b084e2a71e5964f7de1635d20e406611559df9a3db24828ce775cbee5e3b6dd52f0d555a61939ed7ea5990bd + languageName: node + linkType: hard + +"web-streams-polyfill@npm:^3.0.3": + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 10c0/64e855c47f6c8330b5436147db1c75cb7e7474d924166800e8e2aab5eb6c76aac4981a84261dd2982b3e754490900b99791c80ae1407a9fa0dcff74f82ea3a7f + languageName: node + linkType: hard + +"web-tree-sitter@npm:=0.24.5": + version: 0.24.5 + resolution: "web-tree-sitter@npm:0.24.5" + checksum: 10c0/e6b88e4967227ab4272fb20a063882fe877c6a948a0367e6fae324807a31f082151f5110f1f2beeddba98714af20bc13cb6b62aac6aad986e24da31796ba1ce1 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" @@ -5395,6 +9427,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -5402,6 +9445,65 @@ __metadata: languageName: node linkType: hard +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"xml-but-prettier@npm:^1.0.1": + version: 1.0.1 + resolution: "xml-but-prettier@npm:1.0.1" + dependencies: + repeat-string: "npm:^1.5.2" + checksum: 10c0/d493d7bf0f9f94faa9e6e142355045cbab10593770fa1a5e502369169f4abb1ab7ff134194f7de501ccebfe0f440a72b97363b1ad55172d3cd21fc2eab0b7ce9 + languageName: node + linkType: hard + +"xml@npm:=1.0.1": + version: 1.0.1 + resolution: "xml@npm:1.0.1" + checksum: 10c0/04bcc9b8b5e7b49392072fbd9c6b0f0958bd8e8f8606fee460318e43991349a68cbc5384038d179ff15aef7d222285f69ca0f067f53d071084eb14c7fdb30411 + languageName: node + linkType: hard + +"xtend@npm:^4.0.0": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + "yallist@npm:^5.0.0": version: 5.0.0 resolution: "yallist@npm:5.0.0" @@ -5409,6 +9511,51 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^1.10.0": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + +"yaml@npm:^2.3.4, yaml@npm:^2.5.0, yaml@npm:^2.7.1": + version: 2.8.0 + resolution: "yaml@npm:2.8.0" + bin: + yaml: bin.mjs + checksum: 10c0/f6f7310cf7264a8107e72c1376f4de37389945d2fb4656f8060eca83f01d2d703f9d1b925dd8f39852a57034fafefde6225409ddd9f22aebfda16c6141b71858 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.0.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -5416,6 +9563,13 @@ __metadata: languageName: node linkType: hard +"zenscroll@npm:^4.0.2": + version: 4.0.2 + resolution: "zenscroll@npm:4.0.2" + checksum: 10c0/419e87ebe3a22a3b2ac22cd02aeccb900c9c330f539efdb1efc382090157d466373ee615812caef5bbe2da140e3c7df222236c8cfd8e697e97d4d91cf3f81c63 + languageName: node + linkType: hard + "zod@npm:^3.25.60": version: 3.25.67 resolution: "zod@npm:3.25.67" From 3e890d4363310bd3404c4710d10b4e0f3b0bbf83 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:28:33 +0200 Subject: [PATCH 105/136] feat(api): implement /api/user/me endpoint --- src/app/api/user/me/route.ts | 119 ++++++++++++++++++++++++ src/app/api/user/me/swagger.ts | 63 +++++++++++++ src/app/api/user/me/validation.ts | 21 +++++ src/app/api/user/validation.ts | 149 ++++++++++++++++++++++++++++++ src/app/api/validation.ts | 87 +++++++++++++++++ 5 files changed, 439 insertions(+) create mode 100644 src/app/api/user/me/route.ts create mode 100644 src/app/api/user/me/swagger.ts create mode 100644 src/app/api/user/me/validation.ts create mode 100644 src/app/api/user/validation.ts create mode 100644 src/app/api/validation.ts diff --git a/src/app/api/user/me/route.ts b/src/app/api/user/me/route.ts new file mode 100644 index 0000000..5ba9792 --- /dev/null +++ b/src/app/api/user/me/route.ts @@ -0,0 +1,119 @@ +import { auth } from '@/auth'; +import { prisma } from '@/prisma'; +import { updateUserServerSchema } from './validation'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { FullUserResponseSchema } from '../validation'; +import { + ErrorResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; + +export const GET = auth(async function GET(req) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + select: { + id: true, + name: true, + first_name: true, + last_name: true, + email: true, + image: true, + timezone: true, + created_at: true, + updated_at: true, + }, + }); + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User not found', + }, + { status: 404 }, + ); + + return returnZodTypeCheckedResponse(FullUserResponseSchema, { + success: true, + user: dbUser, + }); +}); + +export const PATCH = auth(async function PATCH(req) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dataRaw = await req.json(); + const data = await updateUserServerSchema.safeParseAsync(dataRaw); + if (!data.success) { + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request data', + errors: data.error.issues, + }, + { status: 400 }, + ); + } + if (Object.keys(data.data).length === 0) { + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'No data to update' }, + { status: 400 }, + ); + } + + const updatedUser = await prisma.user.update({ + where: { + id: authCheck.user.id, + }, + data: data.data, + select: { + id: true, + name: true, + first_name: true, + last_name: true, + email: true, + image: true, + timezone: true, + created_at: true, + updated_at: true, + }, + }); + if (!updatedUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User not found', + }, + { status: 404 }, + ); + return returnZodTypeCheckedResponse( + FullUserResponseSchema, + { + success: true, + user: updatedUser, + }, + { status: 200 }, + ); +}); diff --git a/src/app/api/user/me/swagger.ts b/src/app/api/user/me/swagger.ts new file mode 100644 index 0000000..e0a36a1 --- /dev/null +++ b/src/app/api/user/me/swagger.ts @@ -0,0 +1,63 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import { FullUserResponseSchema } from '../validation'; +import { updateUserServerSchema } from './validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/user/me', + description: 'Get the currently authenticated user', + responses: { + 200: { + description: 'User information retrieved successfully', + content: { + 'application/json': { + schema: FullUserResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['User'], + }); + + registry.registerPath({ + method: 'patch', + path: '/api/user/me', + description: 'Update the currently authenticated user', + request: { + body: { + description: 'User information to update', + required: true, + content: { + 'application/json': { + schema: updateUserServerSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'User information updated successfully', + content: { + 'application/json': { + schema: FullUserResponseSchema, + }, + }, + }, + ...invalidRequestDataResponse, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['User'], + }); +} diff --git a/src/app/api/user/me/validation.ts b/src/app/api/user/me/validation.ts new file mode 100644 index 0000000..49c6219 --- /dev/null +++ b/src/app/api/user/me/validation.ts @@ -0,0 +1,21 @@ +import zod from 'zod/v4'; +import { + firstNameSchema, + lastNameSchema, + newUserEmailServerSchema, + newUserNameServerSchema, +} from '@/app/api/user/validation'; + +// ---------------------------------------- +// +// Update User Validation +// +// ---------------------------------------- +export const updateUserServerSchema = zod.object({ + name: newUserNameServerSchema.optional(), + first_name: firstNameSchema.optional(), + last_name: lastNameSchema.optional(), + email: newUserEmailServerSchema.optional(), + image: zod.string().optional(), + timezone: zod.string().optional(), +}); diff --git a/src/app/api/user/validation.ts b/src/app/api/user/validation.ts new file mode 100644 index 0000000..79b1e7e --- /dev/null +++ b/src/app/api/user/validation.ts @@ -0,0 +1,149 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { prisma } from '@/prisma'; +import zod from 'zod/v4'; + +extendZodWithOpenApi(zod); + +// ---------------------------------------- +// +// Email Validation +// +// ---------------------------------------- +export const emailSchema = zod + .email('Invalid email address') + .min(3, 'Email is required'); + +export const newUserEmailServerSchema = emailSchema.refine(async (val) => { + const existingUser = await prisma.user.findUnique({ + where: { email: val }, + }); + return !existingUser; +}, 'Email in use by another account'); + +export const existingUserEmailServerSchema = emailSchema.refine(async (val) => { + const existingUser = await prisma.user.findUnique({ + where: { email: val }, + }); + return !!existingUser; +}, 'Email not found'); + +// ---------------------------------------- +// +// First Name Validation +// +// ---------------------------------------- +export const firstNameSchema = zod + .string() + .min(1, 'First name is required') + .max(32, 'First name must be at most 32 characters long'); + +// ---------------------------------------- +// +// Last Name Validation +// +// ---------------------------------------- +export const lastNameSchema = zod + .string() + .min(1, 'Last name is required') + .max(32, 'Last name must be at most 32 characters long'); + +// ---------------------------------------- +// +// Username Validation +// +// ---------------------------------------- +export const userNameSchema = zod + .string() + .min(3, 'Username is required') + .max(32, 'Username must be at most 32 characters long') + .regex( + /^[a-zA-Z0-9_]+$/, + 'Username can only contain letters, numbers, and underscores', + ); + +export const newUserNameServerSchema = userNameSchema.refine(async (val) => { + const existingUser = await prisma.user.findUnique({ + where: { name: val }, + }); + return !existingUser; +}, 'Username in use by another account'); + +export const existingUserNameServerSchema = userNameSchema.refine( + async (val) => { + const existingUser = await prisma.user.findUnique({ + where: { name: val }, + }); + return !!existingUser; + }, + 'Username not found', +); + +// ---------------------------------------- +// +// User ID Validation +// +// ---------------------------------------- +export const existingUserIdServerSchema = zod + .string() + .min(1, 'User ID is required') + .refine(async (val) => { + const user = await prisma.user.findUnique({ + where: { id: val }, + }); + return !!user; + }, 'User not found'); + +// ---------------------------------------- +// +// Password Validation +// +// ---------------------------------------- +export const passwordSchema = zod + .string() + .min(8, 'Password must be at least 8 characters long') + .max(128, 'Password must be at most 128 characters long') + .regex( + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+={}\[\]:;"'<>,.?\/\\-]).{8,}$/, + 'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character', + ); + +// ---------------------------------------- +// +// User Schema Validation (for API responses) +// +// ---------------------------------------- +export const FullUserSchema = zod + .object({ + id: zod.string(), + name: zod.string(), + first_name: zod.string().nullish(), + last_name: zod.string().nullish(), + email: zod.email(), + image: zod.string().nullish(), + timezone: zod.string(), + created_at: zod.date(), + updated_at: zod.date(), + }) + .openapi('FullUser', { + description: 'Full user information including all fields', + }); + +export const PublicUserSchema = FullUserSchema.pick({ + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, +}).openapi('PublicUser', { + description: 'Public user information excluding sensitive data', +}); + +export const FullUserResponseSchema = zod.object({ + success: zod.boolean(), + user: FullUserSchema, +}); +export const PublicUserResponseSchema = zod.object({ + success: zod.boolean(), + user: PublicUserSchema, +}); diff --git a/src/app/api/validation.ts b/src/app/api/validation.ts new file mode 100644 index 0000000..38b95bd --- /dev/null +++ b/src/app/api/validation.ts @@ -0,0 +1,87 @@ +import { registry } from '@/lib/swagger'; +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; + +extendZodWithOpenApi(zod); + +export const ErrorResponseSchema = zod + .object({ + success: zod.boolean(), + message: zod.string(), + }) + .openapi('ErrorResponseSchema', { + description: 'Error response schema', + example: { + success: false, + message: 'An error occurred', + }, + }); + +export const ZodErrorResponseSchema = ErrorResponseSchema.extend({ + errors: zod.array( + zod.object({ + expected: zod.string().optional(), + code: zod.string(), + path: zod.array( + zod + .string() + .or(zod.number()) + .or( + zod.symbol().openapi({ + type: 'string', + }), + ), + ), + message: zod.string(), + }), + ), +}).openapi('ZodErrorResponseSchema', { + description: 'Zod error response schema', + example: { + success: false, + message: 'Invalid request data', + errors: [ + { + expected: 'string', + code: 'invalid_type', + path: ['first_name'], + message: 'Invalid input: expected string, received number', + }, + ], + }, +}); + +export const SuccessResponseSchema = zod + .object({ + success: zod.boolean(), + message: zod.string().optional(), + }) + .openapi('SuccessResponseSchema', { + description: 'Success response schema', + example: { + success: true, + message: 'Operation completed successfully', + }, + }); + +export const UserIdParamSchema = registry.registerParameter( + 'UserIdOrNameParam', + zod.string().openapi({ + param: { + name: 'user', + in: 'path', + }, + example: '12345', + }), +); + +export const EventIdParamSchema = registry.registerParameter( + 'EventIdParam', + zod.string().openapi({ + param: { + name: 'eventID', + in: 'path', + }, + example: '67890', + }), +); From eb04c276abee719963ad90a7eb090a021adfcb7e Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:28:59 +0200 Subject: [PATCH 106/136] feat(api): implement /api/user/[user] endpoint --- src/app/api/user/[user]/route.ts | 55 ++++++++++++++++++++++++++++++ src/app/api/user/[user]/swagger.ts | 33 ++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/app/api/user/[user]/route.ts create mode 100644 src/app/api/user/[user]/swagger.ts diff --git a/src/app/api/user/[user]/route.ts b/src/app/api/user/[user]/route.ts new file mode 100644 index 0000000..b90b1f8 --- /dev/null +++ b/src/app/api/user/[user]/route.ts @@ -0,0 +1,55 @@ +import { auth } from '@/auth'; +import { prisma } from '@/prisma'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { PublicUserResponseSchema } from '../validation'; +import { ErrorResponseSchema } from '@/app/api/validation'; + +export const GET = auth(async function GET(req, { params }) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const requestedUser = (await params).user; + const dbUser = await prisma.user.findFirst({ + where: { + OR: [{ id: requestedUser }, { name: requestedUser }], + }, + select: { + id: true, + name: true, + first_name: true, + last_name: true, + email: true, + created_at: true, + updated_at: true, + image: true, + timezone: true, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User not found', + }, + { status: 404 }, + ); + + return returnZodTypeCheckedResponse( + PublicUserResponseSchema, + { + success: true, + user: dbUser, + }, + { status: 200 }, + ); +}); diff --git a/src/app/api/user/[user]/swagger.ts b/src/app/api/user/[user]/swagger.ts new file mode 100644 index 0000000..741cbf9 --- /dev/null +++ b/src/app/api/user/[user]/swagger.ts @@ -0,0 +1,33 @@ +import { PublicUserResponseSchema } from '../validation'; +import { + notAuthenticatedResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { UserIdParamSchema } from '../../validation'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/user/{user}', + request: { + params: zod.object({ + user: UserIdParamSchema, + }), + }, + responses: { + 200: { + description: 'User information retrieved successfully.', + content: { + 'application/json': { + schema: PublicUserResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + }, + tags: ['User'], + }); +} From c71de4a14cd241623cf66007d5966af5a462b46b Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:29:22 +0200 Subject: [PATCH 107/136] feat(api): implement /api/user/[user]/calendar endpoint --- src/app/api/user/[user]/calendar/route.ts | 212 ++++++++++++++++++ src/app/api/user/[user]/calendar/swagger.ts | 37 +++ .../api/user/[user]/calendar/validation.ts | 99 ++++++++ 3 files changed, 348 insertions(+) create mode 100644 src/app/api/user/[user]/calendar/route.ts create mode 100644 src/app/api/user/[user]/calendar/swagger.ts create mode 100644 src/app/api/user/[user]/calendar/validation.ts diff --git a/src/app/api/user/[user]/calendar/route.ts b/src/app/api/user/[user]/calendar/route.ts new file mode 100644 index 0000000..f6b6098 --- /dev/null +++ b/src/app/api/user/[user]/calendar/route.ts @@ -0,0 +1,212 @@ +import { auth } from '@/auth'; +import { prisma } from '@/prisma'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { + userCalendarQuerySchema, + UserCalendarResponseSchema, + UserCalendarSchema, +} from './validation'; +import { + ErrorResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; +import { z } from 'zod/v4'; + +export const GET = auth(async function GET(req, { params }) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dataRaw = Object.fromEntries(new URL(req.url).searchParams); + const data = await userCalendarQuerySchema.safeParseAsync(dataRaw); + if (!data.success) + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request data', + errors: data.error.issues, + }, + { status: 400 }, + ); + const { end, start } = data.data; + + const requestUserId = authCheck.user.id; + + const requestedUserId = (await params).user; + + const requestedUser = await prisma.user.findFirst({ + where: { + id: requestedUserId, + }, + select: { + meetingParts: { + where: { + meeting: { + start_time: { + lte: end, + }, + end_time: { + gte: start, + }, + }, + }, + orderBy: { + meeting: { + start_time: 'asc', + }, + }, + select: { + meeting: { + select: { + id: true, + title: true, + description: true, + start_time: true, + end_time: true, + status: true, + location: true, + created_at: true, + updated_at: true, + organizer_id: true, + participants: { + select: { + user: { + select: { + id: true, + }, + }, + }, + }, + }, + }, + }, + }, + meetingsOrg: { + where: { + start_time: { + lte: end, + }, + end_time: { + gte: start, + }, + }, + orderBy: { + start_time: 'asc', + }, + select: { + id: true, + title: true, + description: true, + start_time: true, + end_time: true, + status: true, + location: true, + created_at: true, + updated_at: true, + organizer_id: true, + participants: { + select: { + user: { + select: { + id: true, + }, + }, + }, + }, + }, + }, + blockedSlots: { + where: { + start_time: { + lte: end, + }, + end_time: { + gte: start, + }, + }, + orderBy: { + start_time: 'asc', + }, + select: { + id: requestUserId === requestedUserId ? true : false, + reason: requestUserId === requestedUserId ? true : false, + start_time: true, + end_time: true, + is_recurring: requestUserId === requestedUserId ? true : false, + recurrence_end_date: requestUserId === requestedUserId ? true : false, + rrule: requestUserId === requestedUserId ? true : false, + created_at: requestUserId === requestedUserId ? true : false, + updated_at: requestUserId === requestedUserId ? true : false, + }, + }, + }, + }); + + if (!requestedUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const calendar: z.input = []; + + for (const event of requestedUser.meetingParts) { + if ( + event.meeting.participants.some((p) => p.user.id === requestUserId) || + event.meeting.organizer_id === requestUserId + ) { + calendar.push({ ...event.meeting, type: 'event' }); + } else { + calendar.push({ + start_time: event.meeting.start_time, + end_time: event.meeting.end_time, + type: 'blocked_private', + }); + } + } + + for (const event of requestedUser.meetingsOrg) { + if ( + event.participants.some((p) => p.user.id === requestUserId) || + event.organizer_id === requestUserId + ) { + calendar.push({ ...event, type: 'event' }); + } else { + calendar.push({ + start_time: event.start_time, + end_time: event.end_time, + type: 'blocked_private', + }); + } + } + + for (const slot of requestedUser.blockedSlots) { + calendar.push({ + start_time: slot.start_time, + end_time: slot.end_time, + id: slot.id, + reason: slot.reason, + is_recurring: slot.is_recurring, + recurrence_end_date: slot.recurrence_end_date, + rrule: slot.rrule, + created_at: slot.created_at, + updated_at: slot.updated_at, + type: + requestUserId === requestedUserId ? 'blocked_owned' : 'blocked_private', + }); + } + + return returnZodTypeCheckedResponse(UserCalendarResponseSchema, { + success: true, + calendar, + }); +}); diff --git a/src/app/api/user/[user]/calendar/swagger.ts b/src/app/api/user/[user]/calendar/swagger.ts new file mode 100644 index 0000000..fb48629 --- /dev/null +++ b/src/app/api/user/[user]/calendar/swagger.ts @@ -0,0 +1,37 @@ +import { + userCalendarQuerySchema, + UserCalendarResponseSchema, +} from './validation'; +import { + notAuthenticatedResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { UserIdParamSchema } from '@/app/api/validation'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/user/{user}/calendar', + request: { + params: zod.object({ + user: UserIdParamSchema, + }), + query: userCalendarQuerySchema, + }, + responses: { + 200: { + description: 'User calendar retrieved successfully.', + content: { + 'application/json': { + schema: UserCalendarResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + }, + tags: ['User'], + }); +} diff --git a/src/app/api/user/[user]/calendar/validation.ts b/src/app/api/user/[user]/calendar/validation.ts new file mode 100644 index 0000000..a0d179f --- /dev/null +++ b/src/app/api/user/[user]/calendar/validation.ts @@ -0,0 +1,99 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { + eventEndTimeSchema, + EventSchema, + eventStartTimeSchema, +} from '@/app/api/event/validation'; + +extendZodWithOpenApi(zod); + +export const BlockedSlotSchema = zod + .object({ + start_time: eventStartTimeSchema, + end_time: eventEndTimeSchema, + type: zod.literal('blocked_private'), + }) + .openapi('BlockedSlotSchema', { + description: 'Blocked time slot in the user calendar', + }); + +export const OwnedBlockedSlotSchema = BlockedSlotSchema.extend({ + id: zod.string(), + reason: zod.string().nullish(), + is_recurring: zod.boolean().default(false), + recurrence_end_date: zod.date().nullish(), + rrule: zod.string().nullish(), + created_at: zod.date().nullish(), + updated_at: zod.date().nullish(), + type: zod.literal('blocked_owned'), +}).openapi('OwnedBlockedSlotSchema', { + description: 'Blocked slot owned by the user', +}); + +export const VisibleSlotSchema = EventSchema.omit({ + organizer: true, + participants: true, +}) + .extend({ + type: zod.literal('event'), + }) + .openapi('VisibleSlotSchema', { + description: 'Visible time slot in the user calendar', + }); + +export const UserCalendarSchema = zod + .array(VisibleSlotSchema.or(BlockedSlotSchema).or(OwnedBlockedSlotSchema)) + .openapi('UserCalendarSchema', { + description: 'Array of events in the user calendar', + }); + +export const UserCalendarResponseSchema = zod.object({ + success: zod.boolean().default(true), + calendar: UserCalendarSchema, +}); + +export const userCalendarQuerySchema = zod + .object({ + start: zod.iso + .datetime() + .optional() + .transform((val) => { + if (val) return new Date(val); + const now = new Date(); + const startOfWeek = new Date( + now.getFullYear(), + now.getMonth(), + now.getDate() - now.getDay(), + ); + return startOfWeek; + }), + end: zod.iso + .datetime() + .optional() + .transform((val) => { + if (val) return new Date(val); + const now = new Date(); + const endOfWeek = new Date( + now.getFullYear(), + now.getMonth(), + now.getDate() + (6 - now.getDay()), + ); + return endOfWeek; + }), + }) + .openapi('UserCalendarQuerySchema', { + description: 'Query parameters for filtering the user calendar', + properties: { + start: { + type: 'string', + format: 'date-time', + description: 'Start date for filtering the calendar events', + }, + end: { + type: 'string', + format: 'date-time', + description: 'End date for filtering the calendar events', + }, + }, + }); From b10b374b841bb56664f74198ce249688f6271594 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:29:41 +0200 Subject: [PATCH 108/136] feat(api): implement /api/search/user endpoint --- src/app/api/search/user/route.ts | 79 +++++++++++++++++++++++++++ src/app/api/search/user/swagger.ts | 33 +++++++++++ src/app/api/search/user/validation.ts | 20 +++++++ 3 files changed, 132 insertions(+) create mode 100644 src/app/api/search/user/route.ts create mode 100644 src/app/api/search/user/swagger.ts create mode 100644 src/app/api/search/user/validation.ts diff --git a/src/app/api/search/user/route.ts b/src/app/api/search/user/route.ts new file mode 100644 index 0000000..a8b6414 --- /dev/null +++ b/src/app/api/search/user/route.ts @@ -0,0 +1,79 @@ +import { auth } from '@/auth'; +import { prisma } from '@/prisma'; +import { searchUserSchema, searchUserResponseSchema } from './validation'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { + ErrorResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; + +export const GET = auth(async function GET(req) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dataRaw = Object.fromEntries(new URL(req.url).searchParams); + const data = await searchUserSchema.safeParseAsync(dataRaw); + if (!data.success) + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request data', + errors: data.error.issues, + }, + { status: 400 }, + ); + const { query, count, page, sort_by, sort_order } = data.data; + + const dbUsers = await prisma.user.findMany({ + where: { + OR: [ + { name: { contains: query } }, + { first_name: { contains: query } }, + { last_name: { contains: query } }, + ], + }, + orderBy: { + [sort_by]: sort_order, + }, + skip: (page - 1) * count, + take: count, + select: { + id: true, + name: true, + first_name: true, + last_name: true, + timezone: true, + image: true, + }, + }); + + const userCount = await prisma.user.count({ + where: { + OR: [ + { name: { contains: query } }, + { first_name: { contains: query } }, + { last_name: { contains: query } }, + ], + }, + }); + + return returnZodTypeCheckedResponse( + searchUserResponseSchema, + { + success: true, + users: dbUsers, + total_count: userCount, + total_pages: Math.ceil(userCount / count), + }, + { status: 200 }, + ); +}); diff --git a/src/app/api/search/user/swagger.ts b/src/app/api/search/user/swagger.ts new file mode 100644 index 0000000..90ca54e --- /dev/null +++ b/src/app/api/search/user/swagger.ts @@ -0,0 +1,33 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import { searchUserResponseSchema, searchUserSchema } from './validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/search/user', + request: { + query: searchUserSchema, + }, + responses: { + 200: { + description: 'User search results', + content: { + 'application/json': { + schema: searchUserResponseSchema, + }, + }, + }, + ...invalidRequestDataResponse, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Search'], + }); +} diff --git a/src/app/api/search/user/validation.ts b/src/app/api/search/user/validation.ts new file mode 100644 index 0000000..c1662b0 --- /dev/null +++ b/src/app/api/search/user/validation.ts @@ -0,0 +1,20 @@ +import zod from 'zod/v4'; +import { PublicUserSchema } from '../../user/validation'; + +export const searchUserSchema = zod.object({ + query: zod.string().optional().default(''), + count: zod.coerce.number().min(1).max(100).default(10), + page: zod.coerce.number().min(1).default(1), + sort_by: zod + .enum(['created_at', 'name', 'first_name', 'last_name', 'id']) + .optional() + .default('created_at'), + sort_order: zod.enum(['asc', 'desc']).optional().default('desc'), +}); + +export const searchUserResponseSchema = zod.object({ + success: zod.boolean(), + users: zod.array(PublicUserSchema), + total_count: zod.number(), + total_pages: zod.number(), +}); From 50d915854f23541269271579281f3a3e1fa6c291 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:30:04 +0200 Subject: [PATCH 109/136] feat(api): implement /api/event endpoint --- src/app/api/event/route.ts | 178 ++++++++++++++++++++++++++++++++ src/app/api/event/swagger.ts | 62 +++++++++++ src/app/api/event/validation.ts | 167 ++++++++++++++++++++++++++++++ 3 files changed, 407 insertions(+) create mode 100644 src/app/api/event/route.ts create mode 100644 src/app/api/event/swagger.ts create mode 100644 src/app/api/event/validation.ts diff --git a/src/app/api/event/route.ts b/src/app/api/event/route.ts new file mode 100644 index 0000000..fb734b1 --- /dev/null +++ b/src/app/api/event/route.ts @@ -0,0 +1,178 @@ +import { prisma } from '@/prisma'; +import { auth } from '@/auth'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { ErrorResponseSchema, ZodErrorResponseSchema } from '../validation'; +import { + createEventSchema, + EventResponseSchema, + EventsResponseSchema, +} from './validation'; + +export const GET = auth(async (req) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const userEvents = await prisma.meeting.findMany({ + where: { + OR: [ + { organizer_id: dbUser.id }, + { participants: { some: { user_id: dbUser.id } } }, + ], + }, + select: { + id: true, + title: true, + description: true, + start_time: true, + end_time: true, + status: true, + location: true, + created_at: true, + updated_at: true, + organizer: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + participants: { + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }, + }, + }); + + return returnZodTypeCheckedResponse( + EventsResponseSchema, + { + success: true, + events: userEvents, + }, + { status: 200 }, + ); +}); + +export const POST = auth(async (req) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dataRaw = await req.json(); + const data = await createEventSchema.safeParseAsync(dataRaw); + if (!data.success) { + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request data', + errors: data.error.issues, + }, + { status: 400 }, + ); + } + const { title, description, start_time, end_time, location, participants } = + data.data; + + const newEvent = await prisma.meeting.create({ + data: { + title, + description, + start_time, + end_time, + location, + organizer_id: authCheck.user.id!, + participants: participants + ? { + create: participants.map((userId) => ({ + user: { connect: { id: userId } }, + })), + } + : undefined, + }, + select: { + id: true, + title: true, + description: true, + start_time: true, + end_time: true, + status: true, + location: true, + created_at: true, + updated_at: true, + organizer: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + participants: { + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }, + }, + }); + + return returnZodTypeCheckedResponse( + EventResponseSchema, + { + success: true, + event: newEvent, + }, + { status: 201 }, + ); +}); diff --git a/src/app/api/event/swagger.ts b/src/app/api/event/swagger.ts new file mode 100644 index 0000000..b78afef --- /dev/null +++ b/src/app/api/event/swagger.ts @@ -0,0 +1,62 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import { + EventResponseSchema, + EventsResponseSchema, + createEventSchema, +} from './validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/event', + responses: { + 200: { + description: 'List of events for the authenticated user', + content: { + 'application/json': { + schema: EventsResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event'], + }); + + registry.registerPath({ + method: 'post', + path: '/api/event', + request: { + body: { + content: { + 'application/json': { + schema: createEventSchema, + }, + }, + }, + }, + responses: { + 201: { + description: 'Event created successfully.', + content: { + 'application/json': { + schema: EventResponseSchema, + }, + }, + }, + ...invalidRequestDataResponse, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event'], + }); +} diff --git a/src/app/api/event/validation.ts b/src/app/api/event/validation.ts new file mode 100644 index 0000000..b8e176b --- /dev/null +++ b/src/app/api/event/validation.ts @@ -0,0 +1,167 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { + existingUserIdServerSchema, + PublicUserSchema, +} from '../user/validation'; +import { ParticipantSchema } from './[eventID]/participant/validation'; + +extendZodWithOpenApi(zod); + +// ---------------------------------------- +// +// Event ID Validation +// +// ---------------------------------------- +export const eventIdSchema = zod.string().min(1, 'Event ID is required'); + +// ---------------------------------------- +// +// Event Title Validation +// +// ---------------------------------------- +export const eventTitleSchema = zod + .string() + .min(1, 'Title is required') + .max(100, 'Title must be at most 100 characters long'); + +// ---------------------------------------- +// +// Event Description Validation +// +// ---------------------------------------- +export const eventDescriptionSchema = zod + .string() + .max(500, 'Description must be at most 500 characters long'); + +// ---------------------------------------- +// +// Event start time Validation +// +// ---------------------------------------- +export const eventStartTimeSchema = zod.iso + .datetime() + .or(zod.date().transform((date) => date.toISOString())) + .refine((date) => !isNaN(new Date(date).getTime()), { + message: 'Invalid start time', + }); + +// ---------------------------------------- +// +// Event end time Validation +// +// ---------------------------------------- +export const eventEndTimeSchema = zod.iso.datetime().or( + zod + .date() + .transform((date) => date.toISOString()) + .refine((date) => !isNaN(new Date(date).getTime()), { + message: 'Invalid end time', + }), +); + +// ---------------------------------------- +// +// Event Location Validation +// +// ---------------------------------------- +export const eventLocationSchema = zod + .string() + .max(200, 'Location must be at most 200 characters long'); + +// ---------------------------------------- +// +// Event Participants Validation +// +// ---------------------------------------- +export const eventParticipantsSchema = zod.array(existingUserIdServerSchema); + +// ---------------------------------------- +// +// Event Status Validation +// +// ---------------------------------------- +export const eventStatusSchema = zod.enum([ + 'TENTATIVE', + 'CONFIRMED', + 'CANCELLED', +]); + +// ---------------------------------------- +// +// Create Event Schema +// +// ---------------------------------------- +export const createEventSchema = zod + .object({ + title: eventTitleSchema, + description: eventDescriptionSchema.optional(), + start_time: eventStartTimeSchema, + end_time: eventEndTimeSchema, + location: eventLocationSchema.optional().default(''), + participants: eventParticipantsSchema.optional(), + status: eventStatusSchema.optional().default('TENTATIVE'), + }) + .refine((data) => new Date(data.start_time) < new Date(data.end_time), { + message: 'Start time must be before end time', + }); + +// ---------------------------------------- +// +// Update Event Schema +// +// ---------------------------------------- +export const updateEventSchema = zod + .object({ + title: eventTitleSchema.optional(), + description: eventDescriptionSchema.optional(), + start_time: eventStartTimeSchema.optional(), + end_time: eventEndTimeSchema.optional(), + location: eventLocationSchema.optional().default(''), + participants: eventParticipantsSchema.optional(), + status: eventStatusSchema.optional(), + }) + .refine( + (data) => { + if (data.start_time && data.end_time) { + return new Date(data.start_time) < new Date(data.end_time); + } + return true; + }, + { + message: 'Start time must be before end time', + }, + ); + +// ---------------------------------------- +// +// Event Schema Validation (for API responses) +// +// ---------------------------------------- +export const EventSchema = zod + .object({ + id: eventIdSchema, + title: eventTitleSchema, + description: eventDescriptionSchema.nullish(), + start_time: eventStartTimeSchema, + end_time: eventEndTimeSchema, + location: eventLocationSchema.nullish(), + status: eventStatusSchema, + created_at: zod.date(), + updated_at: zod.date(), + organizer: PublicUserSchema, + participants: zod.array(ParticipantSchema).nullish(), + }) + .openapi('Event', { + description: 'Event information including all fields', + }); + +export const EventResponseSchema = zod.object({ + success: zod.boolean(), + event: EventSchema, +}); + +export const EventsResponseSchema = zod.object({ + success: zod.boolean(), + events: zod.array(EventSchema), +}); From f5a5704be315979dd8f4a23141207b477c881042 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:30:27 +0200 Subject: [PATCH 110/136] feat(api): implement /api/event/[eventID] endpoint --- src/app/api/event/[eventID]/route.ts | 318 +++++++++++++++++++++++++ src/app/api/event/[eventID]/swagger.ts | 94 ++++++++ 2 files changed, 412 insertions(+) create mode 100644 src/app/api/event/[eventID]/route.ts create mode 100644 src/app/api/event/[eventID]/swagger.ts diff --git a/src/app/api/event/[eventID]/route.ts b/src/app/api/event/[eventID]/route.ts new file mode 100644 index 0000000..8c06b64 --- /dev/null +++ b/src/app/api/event/[eventID]/route.ts @@ -0,0 +1,318 @@ +import { prisma } from '@/prisma'; +import { auth } from '@/auth'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { + ErrorResponseSchema, + SuccessResponseSchema, + ZodErrorResponseSchema, +} from '../../validation'; +import { EventResponseSchema } from '../validation'; +import { updateEventSchema } from '../validation'; + +export const GET = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + + const event = await prisma.meeting.findUnique({ + where: { + id: eventID, + OR: [ + { organizer_id: dbUser.id }, + { participants: { some: { user_id: dbUser.id } } }, + ], + }, + select: { + id: true, + title: true, + description: true, + start_time: true, + end_time: true, + status: true, + location: true, + organizer_id: true, + created_at: true, + updated_at: true, + organizer: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + participants: { + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }, + }, + }); + + if (!event) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Event not found' }, + { status: 404 }, + ); + + return returnZodTypeCheckedResponse( + EventResponseSchema, + { success: true, event }, + { status: 200 }, + ); +}); + +export const DELETE = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + + const event = await prisma.meeting.findUnique({ + where: { + id: eventID, + OR: [ + { organizer_id: dbUser.id }, + { participants: { some: { user_id: dbUser.id } } }, + ], + }, + }); + + if (!event) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Event not found' }, + { status: 404 }, + ); + + if (event.organizer_id !== dbUser.id) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'You are not the organizer of this event' }, + { status: 403 }, + ); + + await prisma.meeting.delete({ + where: { + id: eventID, + }, + }); + + return returnZodTypeCheckedResponse( + SuccessResponseSchema, + { success: true, message: 'Event deleted successfully' }, + { status: 200 }, + ); +}); + +export const PATCH = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + + const event = await prisma.meeting.findUnique({ + where: { + id: eventID, + OR: [ + { organizer_id: dbUser.id }, + { participants: { some: { user_id: dbUser.id } } }, + ], + }, + }); + + if (!event) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Event not found' }, + { status: 404 }, + ); + + if (event.organizer_id !== dbUser.id) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'You are not the organizer of this event' }, + { status: 403 }, + ); + + const dataRaw = await req.json(); + const data = await updateEventSchema.safeParseAsync(dataRaw); + if (!data.success) { + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid input data', + errors: data.error.issues, + }, + { status: 400 }, + ); + } + const { + title, + description, + start_time, + end_time, + location, + status, + participants, + } = data.data; + + if (participants !== undefined) + for (const participant of participants) { + await prisma.meetingParticipant.upsert({ + where: { + meeting_id_user_id: { + user_id: participant, + meeting_id: eventID, + }, + }, + create: { + user_id: participant, + meeting_id: eventID, + }, + update: {}, + }); + } + + const updatedEvent = await prisma.meeting.update({ + where: { + id: eventID, + }, + data: { + title, + description, + start_time, + end_time, + location, + status, + participants: + participants !== undefined + ? { + deleteMany: { + user_id: { + notIn: participants || [], + }, + }, + } + : {}, + }, + select: { + id: true, + title: true, + description: true, + start_time: true, + end_time: true, + status: true, + location: true, + organizer_id: true, + created_at: true, + updated_at: true, + organizer: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + participants: { + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }, + }, + }); + + return returnZodTypeCheckedResponse( + EventResponseSchema, + { + success: true, + event: updatedEvent, + }, + { status: 200 }, + ); +}); diff --git a/src/app/api/event/[eventID]/swagger.ts b/src/app/api/event/[eventID]/swagger.ts new file mode 100644 index 0000000..4703556 --- /dev/null +++ b/src/app/api/event/[eventID]/swagger.ts @@ -0,0 +1,94 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import { EventResponseSchema, updateEventSchema } from '../validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; +import { + EventIdParamSchema, + SuccessResponseSchema, +} from '@/app/api/validation'; +import zod from 'zod/v4'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/event/{eventID}', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + }), + }, + responses: { + 200: { + description: 'Event retrieved successfully', + content: { + 'application/json': { + schema: EventResponseSchema, + }, + }, + }, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event'], + }); + + registry.registerPath({ + method: 'delete', + path: '/api/event/{eventID}', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + }), + }, + responses: { + 200: { + description: 'Event deleted successfully', + content: { + 'application/json': { + schema: SuccessResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event'], + }); + + registry.registerPath({ + method: 'patch', + path: '/api/event/{eventID}', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + }), + body: { + content: { + 'application/json': { + schema: updateEventSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'Event updated successfully', + content: { + 'application/json': { + schema: EventResponseSchema, + }, + }, + }, + ...invalidRequestDataResponse, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event'], + }); +} From 68cafccec7ed59bd801e92aed7c8817776e4f21e Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:30:49 +0200 Subject: [PATCH 111/136] feat(api): implement /api/event/[eventID]/participant endpoint --- .../api/event/[eventID]/participant/route.ts | 200 ++++++++++++++++++ .../event/[eventID]/participant/swagger.ts | 72 +++++++ .../event/[eventID]/participant/validation.ts | 50 +++++ 3 files changed, 322 insertions(+) create mode 100644 src/app/api/event/[eventID]/participant/route.ts create mode 100644 src/app/api/event/[eventID]/participant/swagger.ts create mode 100644 src/app/api/event/[eventID]/participant/validation.ts diff --git a/src/app/api/event/[eventID]/participant/route.ts b/src/app/api/event/[eventID]/participant/route.ts new file mode 100644 index 0000000..91ce965 --- /dev/null +++ b/src/app/api/event/[eventID]/participant/route.ts @@ -0,0 +1,200 @@ +import { prisma } from '@/prisma'; +import { auth } from '@/auth'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { + ErrorResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; +import { + inviteParticipantSchema, + ParticipantResponseSchema, + ParticipantsResponseSchema, +} from './validation'; + +export const GET = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + + const isParticipant = await prisma.meetingParticipant.findFirst({ + where: { + meeting_id: eventID, + user_id: dbUser.id, + }, + select: { + status: true, + }, + }); + + const isOrganizer = await prisma.meeting.findFirst({ + where: { + id: eventID, + organizer_id: dbUser.id, + }, + select: { + id: true, + }, + }); + + if (!isParticipant && !isOrganizer) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User is not a participant or organizer of this event', + }, + { status: 403 }, + ); + + const participants = await prisma.meetingParticipant.findMany({ + where: { + meeting_id: eventID, + }, + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }); + + return returnZodTypeCheckedResponse(ParticipantsResponseSchema, { + success: true, + participants, + }); +}); + +export const POST = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + + const isOrganizer = await prisma.meeting.findFirst({ + where: { + id: eventID, + organizer_id: dbUser.id, + }, + }); + + if (!isOrganizer) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Only organizers can add participants' }, + { status: 403 }, + ); + + const dataRaw = await req.json(); + const data = await inviteParticipantSchema.safeParseAsync(dataRaw); + if (!data.success) { + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request data', + errors: data.error.issues, + }, + { status: 400 }, + ); + } + const { user_id } = data.data; + + const participantExists = await prisma.meetingParticipant.findFirst({ + where: { + meeting_id: eventID, + user_id, + }, + }); + + if (participantExists) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User is already a participant of this event', + }, + { status: 409 }, + ); + + const newParticipant = await prisma.meetingParticipant.create({ + data: { + meeting_id: eventID, + user_id, + }, + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }); + + return returnZodTypeCheckedResponse(ParticipantResponseSchema, { + success: true, + participant: { + user: { + id: newParticipant.user.id, + name: newParticipant.user.name, + first_name: newParticipant.user.first_name, + last_name: newParticipant.user.last_name, + image: newParticipant.user.image, + timezone: newParticipant.user.timezone, + }, + status: newParticipant.status, + }, + }); +}); diff --git a/src/app/api/event/[eventID]/participant/swagger.ts b/src/app/api/event/[eventID]/participant/swagger.ts new file mode 100644 index 0000000..38dfd58 --- /dev/null +++ b/src/app/api/event/[eventID]/participant/swagger.ts @@ -0,0 +1,72 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { + ParticipantsResponseSchema, + ParticipantResponseSchema, + inviteParticipantSchema, +} from './validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; +import { EventIdParamSchema } from '@/app/api/validation'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/event/{eventID}/participant', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + }), + }, + responses: { + 200: { + description: 'List participants for the event', + content: { + 'application/json': { + schema: ParticipantsResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event Participant'], + }); + + registry.registerPath({ + method: 'post', + path: '/api/event/{eventID}/participant', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + }), + body: { + content: { + 'application/json': { + schema: inviteParticipantSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'Participant invited successfully', + content: { + 'application/json': { + schema: ParticipantResponseSchema, + }, + }, + }, + ...invalidRequestDataResponse, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event Participant'], + }); +} diff --git a/src/app/api/event/[eventID]/participant/validation.ts b/src/app/api/event/[eventID]/participant/validation.ts new file mode 100644 index 0000000..bacb9ac --- /dev/null +++ b/src/app/api/event/[eventID]/participant/validation.ts @@ -0,0 +1,50 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { + existingUserIdServerSchema, + PublicUserSchema, +} from '@/app/api/user/validation'; + +extendZodWithOpenApi(zod); + +export const participantStatusSchema = zod.enum([ + 'ACCEPTED', + 'DECLINED', + 'TENTATIVE', + 'PENDING', +]); + +export const inviteParticipantSchema = zod + .object({ + user_id: existingUserIdServerSchema, + }) + .openapi('InviteParticipant', { + description: 'Schema for inviting a participant to an event', + }); + +export const updateParticipantSchema = zod + .object({ + status: participantStatusSchema, + }) + .openapi('UpdateParticipant', { + description: 'Schema for updating participant status in an event', + }); + +export const ParticipantSchema = zod + .object({ + user: PublicUserSchema, + status: participantStatusSchema, + }) + .openapi('Participant', { + description: 'Participant information including user and status', + }); + +export const ParticipantResponseSchema = zod.object({ + success: zod.boolean(), + participant: ParticipantSchema, +}); + +export const ParticipantsResponseSchema = zod.object({ + success: zod.boolean(), + participants: zod.array(ParticipantSchema), +}); From 40d13101a3c8dfd7a1616c8b130a9d333000c23f Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:31:08 +0200 Subject: [PATCH 112/136] feat(api): implement /api/event/[eventID]/participant/[user] endpoint --- .../[eventID]/participant/[user]/route.ts | 276 ++++++++++++++++++ .../[eventID]/participant/[user]/swagger.ts | 102 +++++++ 2 files changed, 378 insertions(+) create mode 100644 src/app/api/event/[eventID]/participant/[user]/route.ts create mode 100644 src/app/api/event/[eventID]/participant/[user]/swagger.ts diff --git a/src/app/api/event/[eventID]/participant/[user]/route.ts b/src/app/api/event/[eventID]/participant/[user]/route.ts new file mode 100644 index 0000000..890308c --- /dev/null +++ b/src/app/api/event/[eventID]/participant/[user]/route.ts @@ -0,0 +1,276 @@ +import { prisma } from '@/prisma'; +import { auth } from '@/auth'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { + ErrorResponseSchema, + SuccessResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; +import { + ParticipantResponseSchema, + updateParticipantSchema, +} from '../validation'; + +export const GET = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + const user = (await params).user; + + const isParticipant = await prisma.meetingParticipant.findFirst({ + where: { + meeting_id: eventID, + user_id: dbUser.id, + }, + }); + + const isOrganizer = await prisma.meeting.findFirst({ + where: { + id: eventID, + organizer_id: dbUser.id, + }, + }); + + if (!isParticipant && !isOrganizer) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User is not a participant or organizer of this event', + }, + { status: 403 }, + ); + + const participant = await prisma.meetingParticipant.findUnique({ + where: { + meeting_id_user_id: { + meeting_id: eventID, + user_id: user, + }, + }, + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }); + + if (!participant) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Participant not found' }, + { status: 404 }, + ); + + return returnZodTypeCheckedResponse(ParticipantResponseSchema, { + success: true, + participant, + }); +}); + +export const DELETE = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + const user = (await params).user; + + const isOrganizer = await prisma.meeting.findFirst({ + where: { + id: eventID, + organizer_id: dbUser.id, + }, + }); + + if (!isOrganizer) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Only organizer can remove participants' }, + { status: 403 }, + ); + + const participant = await prisma.meetingParticipant.findUnique({ + where: { + meeting_id_user_id: { + meeting_id: eventID, + user_id: user, + }, + }, + }); + + if (!participant) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Participant not found' }, + { status: 404 }, + ); + + await prisma.meetingParticipant.delete({ + where: { + meeting_id_user_id: { + meeting_id: eventID, + user_id: user, + }, + }, + }); + + return returnZodTypeCheckedResponse( + SuccessResponseSchema, + { success: true, message: 'Participant removed successfully' }, + { status: 200 }, + ); +}); + +export const PATCH = auth(async (req, { params }) => { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'User not found' }, + { status: 404 }, + ); + + const eventID = (await params).eventID; + const user = (await params).user; + + if (dbUser.id !== user && dbUser.name !== user) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'You can only update your own participation' }, + { status: 403 }, + ); + + const participant = await prisma.meetingParticipant.findUnique({ + where: { + meeting_id_user_id: { + meeting_id: eventID, + user_id: dbUser.id, + }, + }, + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }); + + if (!participant) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { success: false, message: 'Participant not found' }, + { status: 404 }, + ); + + const body = await req.json(); + const parsedBody = await updateParticipantSchema.safeParseAsync(body); + if (!parsedBody.success) + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request body', + errors: parsedBody.error.issues, + }, + { status: 400 }, + ); + const { status } = parsedBody.data; + + const updatedParticipant = await prisma.meetingParticipant.update({ + where: { + meeting_id_user_id: { + meeting_id: eventID, + user_id: dbUser.id, + }, + }, + data: { + status, + }, + select: { + user: { + select: { + id: true, + name: true, + first_name: true, + last_name: true, + image: true, + timezone: true, + }, + }, + status: true, + }, + }); + + return returnZodTypeCheckedResponse(ParticipantResponseSchema, { + success: true, + participant: updatedParticipant, + }); +}); diff --git a/src/app/api/event/[eventID]/participant/[user]/swagger.ts b/src/app/api/event/[eventID]/participant/[user]/swagger.ts new file mode 100644 index 0000000..b08bd74 --- /dev/null +++ b/src/app/api/event/[eventID]/participant/[user]/swagger.ts @@ -0,0 +1,102 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { + ParticipantResponseSchema, + updateParticipantSchema, +} from '../validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; +import { + EventIdParamSchema, + UserIdParamSchema, + SuccessResponseSchema, +} from '@/app/api/validation'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/event/{eventID}/participant/{user}', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + user: UserIdParamSchema, + }), + }, + responses: { + 200: { + description: 'Get a participant for the event', + content: { + 'application/json': { + schema: ParticipantResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event Participant'], + }); + + registry.registerPath({ + method: 'delete', + path: '/api/event/{eventID}/participant/{user}', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + user: UserIdParamSchema, + }), + }, + responses: { + 200: { + description: 'Participant removed successfully', + content: { + 'application/json': { + schema: SuccessResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['Event Participant'], + }); + + registry.registerPath({ + method: 'patch', + path: '/api/event/{eventID}/participant/{user}', + request: { + params: zod.object({ + eventID: EventIdParamSchema, + user: UserIdParamSchema, + }), + body: { + content: { + 'application/json': { + schema: updateParticipantSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'Participant updated successfully', + content: { + 'application/json': { + schema: ParticipantResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + ...invalidRequestDataResponse, + }, + tags: ['Event Participant'], + }); +} From 445a15ccc7f0d07a33f0a580e9d4544a5bee5c61 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Fri, 20 Jun 2025 13:32:04 +0200 Subject: [PATCH 113/136] feat(api): add username to homepage example for the api usage --- src/app/home/page.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index b3294a0..77f3cf8 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -1,12 +1,20 @@ +'use client'; + import { RedirectButton } from '@/components/buttons/redirect-button'; import { ThemePicker } from '@/components/misc/theme-picker'; +import { useGetApiUserMe } from '@/generated/api/user/user'; export default function Home() { + const { data, isLoading } = useGetApiUserMe(); + return (
{}
-

Home

+

+ Hello{' '} + {isLoading ? 'Loading...' : data?.data.user?.name || 'Unknown User'} +

From 58cf178968f63924255d2503021d0f340c24b1c0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 20 Jun 2025 23:01:56 +0000 Subject: [PATCH 114/136] fix(deps): update dependency next to v15.4.0-canary.89 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 12d6e4e..5e1494a 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.85", + "next": "15.4.0-canary.89", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index d40bfd6..2ffe07b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/env@npm:15.4.0-canary.85" - checksum: 10c0/2a11c5530bd87edf993413044af5175f7e230d6db41145e3c56059a0cd1fc675b6150e1644b1e8731ff1c590927b4d6c27550ca1bafae3318fffd6483e75d1da +"@next/env@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/env@npm:15.4.0-canary.89" + checksum: 10c0/5809605b66cc4762b3792cafca0ad36e1add73b85821b12751eddd34097c41d9d5bd29ce789eceb573020bd2ce7af65f7bc9250f6d1aa36088f29997e5278cb5 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.85" +"@next/swc-darwin-arm64@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.89" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.85" +"@next/swc-darwin-x64@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.89" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.85" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.89" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.85" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.89" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.85" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.89" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.85" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.89" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.85" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.89" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.85" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.89" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.85" + next: "npm:15.4.0-canary.89" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.85": - version: 15.4.0-canary.85 - resolution: "next@npm:15.4.0-canary.85" +"next@npm:15.4.0-canary.89": + version: 15.4.0-canary.89 + resolution: "next@npm:15.4.0-canary.89" dependencies: - "@next/env": "npm:15.4.0-canary.85" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.85" - "@next/swc-darwin-x64": "npm:15.4.0-canary.85" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.85" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.85" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.85" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.85" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.85" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.85" + "@next/env": "npm:15.4.0-canary.89" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.89" + "@next/swc-darwin-x64": "npm:15.4.0-canary.89" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.89" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.89" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.89" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.89" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.89" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.89" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/756f84e1412b690b7c4687f3da4984ed3134c571a5d1568dcf7e764e4328ed7789f1898b43490682021a3b27f38975804bc9770495ae495925aeb50cd706dfdb + checksum: 10c0/2920d0f60fe0796727c663f3b7c21bc8a644b353fcbc8d0e7955694225762877dde0f3984971dc379bc864e7ab839b186f4ea099d10c0c5ca1fc598e66c17b4c languageName: node linkType: hard From 96ff00f120670646e535c922e26770c74f16fcf4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 21 Jun 2025 00:01:44 +0000 Subject: [PATCH 115/136] chore(deps): update dependency prisma to v6.10.1 --- package.json | 2 +- yarn.lock | 78 ++++++++++++++++++++++++++-------------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index 5e1494a..d62313e 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "orval": "7.10.0", "postcss": "8.5.6", "prettier": "3.5.3", - "prisma": "6.9.0", + "prisma": "6.10.1", "tailwindcss": "4.1.10", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", diff --git a/yarn.lock b/yarn.lock index 2ffe07b..ebc9295 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1211,58 +1211,58 @@ __metadata: languageName: node linkType: hard -"@prisma/config@npm:6.9.0": - version: 6.9.0 - resolution: "@prisma/config@npm:6.9.0" +"@prisma/config@npm:6.10.1": + version: 6.10.1 + resolution: "@prisma/config@npm:6.10.1" dependencies: jiti: "npm:2.4.2" - checksum: 10c0/749c801e31d5284d78ce0df9a41b07a2a1d756d966b857472c2dcbfa1239da3cf8e60f3522d42d201fa08594b8ecbb88816f9381b521230ddac992a9bc566445 + checksum: 10c0/49d99474ba086d1141340b8b54f109597cc485e4a35cfab8b43cff35c19fe4f9ffa0d424ef4dbf76a8880c955ecd8a233206d4e7ee436116fc319506b46e46fb languageName: node linkType: hard -"@prisma/debug@npm:6.9.0": - version: 6.9.0 - resolution: "@prisma/debug@npm:6.9.0" - checksum: 10c0/abb6822299285d6847d7f86723ad4c222a828cb0cec0086bdf616c9d92e3c2c48b9f00d1b49655c489bbe6ad1a33cf4818c468ea8448b58a3233d67a967bb0ee +"@prisma/debug@npm:6.10.1": + version: 6.10.1 + resolution: "@prisma/debug@npm:6.10.1" + checksum: 10c0/a5f76ace213da5ab3180fc179383637df6923363a6a08c5958788ecf4dbade3761b07445bc06f7fa044880221a66b824b105bee3aa19eb155c48f6c3f730051b languageName: node linkType: hard -"@prisma/engines-version@npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e": - version: 6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e - resolution: "@prisma/engines-version@npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e" - checksum: 10c0/a81ba1a619d3945ef7840d28f4b6eb0ed345aac86011d03ec8b9388129273e70887a6ece8052195a8d909bfce8f469cdab2a3fe079fe89d432d5510f35ebfa0b +"@prisma/engines-version@npm:6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c": + version: 6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c + resolution: "@prisma/engines-version@npm:6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c" + checksum: 10c0/478feafd1bebea1edc1b93c5117c0b3b85c7a4a89bf2f0e7f1b3ab425ed3f3df5a56a6bdda8debf16ba096ef1618399a4912f581e1a543bfbf6ea5e8b6a19cdf languageName: node linkType: hard -"@prisma/engines@npm:6.9.0": - version: 6.9.0 - resolution: "@prisma/engines@npm:6.9.0" +"@prisma/engines@npm:6.10.1": + version: 6.10.1 + resolution: "@prisma/engines@npm:6.10.1" dependencies: - "@prisma/debug": "npm:6.9.0" - "@prisma/engines-version": "npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e" - "@prisma/fetch-engine": "npm:6.9.0" - "@prisma/get-platform": "npm:6.9.0" - checksum: 10c0/62fb62141f277376a3194637a1e6123c4eecdd54df89138d0694813dc5d3007b6cec0bcd15dceb76d383f9379f844dffd0a62de87a0c5c761c61d46c91a7c6ba + "@prisma/debug": "npm:6.10.1" + "@prisma/engines-version": "npm:6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c" + "@prisma/fetch-engine": "npm:6.10.1" + "@prisma/get-platform": "npm:6.10.1" + checksum: 10c0/fa1fe15a46b8f1342919d7c84a64b8b9c2522c408ee33203c7df6c39cf87c1dffdf9b8a9af5a90214ebdfcaf5fd4f640f75f869a1e7eccadcc816065b35aa318 languageName: node linkType: hard -"@prisma/fetch-engine@npm:6.9.0": - version: 6.9.0 - resolution: "@prisma/fetch-engine@npm:6.9.0" +"@prisma/fetch-engine@npm:6.10.1": + version: 6.10.1 + resolution: "@prisma/fetch-engine@npm:6.10.1" dependencies: - "@prisma/debug": "npm:6.9.0" - "@prisma/engines-version": "npm:6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e" - "@prisma/get-platform": "npm:6.9.0" - checksum: 10c0/cdab9a5e1e0b8f52cb32dfacb8fff4b50cccb64235a8fdc06ae1930089f6acf28cd6b4af4bb306aae25773db76db2d2d378244d23f7b491acf6f3f8d135e0ef6 + "@prisma/debug": "npm:6.10.1" + "@prisma/engines-version": "npm:6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c" + "@prisma/get-platform": "npm:6.10.1" + checksum: 10c0/46a47eac79f53ef7a5ff513e237a95c6b2f7509317c49f4df6b4151002a768715eccf7eb6e0bf9ca4c64d5703fc6ba3af33bfb105c9d37decd225a2bab9fc4cf languageName: node linkType: hard -"@prisma/get-platform@npm:6.9.0": - version: 6.9.0 - resolution: "@prisma/get-platform@npm:6.9.0" +"@prisma/get-platform@npm:6.10.1": + version: 6.10.1 + resolution: "@prisma/get-platform@npm:6.10.1" dependencies: - "@prisma/debug": "npm:6.9.0" - checksum: 10c0/e70bd4e9733d959b7dd5614d4f6f7af6d9f135e1719ddcf91a6c8baa4235882674b46f1c965e63ecfb7251327e7e670b0396d11c0a9c28648fc430de843da806 + "@prisma/debug": "npm:6.10.1" + checksum: 10c0/fbaaad070301a54a08022b7c23ef290007bc7eb94cda8b1ed97aedbd9eaeb20dbf26266e309a5cc155c7636a04e8736eff1554f4a3ffe07013f1f68134c6efea languageName: node linkType: hard @@ -6579,7 +6579,7 @@ __metadata: orval: "npm:7.10.0" postcss: "npm:8.5.6" prettier: "npm:3.5.3" - prisma: "npm:6.9.0" + prisma: "npm:6.10.1" react: "npm:^19.0.0" react-dom: "npm:^19.0.0" react-hook-form: "npm:^7.56.4" @@ -7485,12 +7485,12 @@ __metadata: languageName: node linkType: hard -"prisma@npm:6.9.0": - version: 6.9.0 - resolution: "prisma@npm:6.9.0" +"prisma@npm:6.10.1": + version: 6.10.1 + resolution: "prisma@npm:6.10.1" dependencies: - "@prisma/config": "npm:6.9.0" - "@prisma/engines": "npm:6.9.0" + "@prisma/config": "npm:6.10.1" + "@prisma/engines": "npm:6.10.1" peerDependencies: typescript: ">=5.1.0" peerDependenciesMeta: @@ -7498,7 +7498,7 @@ __metadata: optional: true bin: prisma: build/index.js - checksum: 10c0/58217bca255ba01ecc23722b9f25f37e3c68780d3801ddd3438fc7987cd6abad5759b87d9a851725516ef035330e58ab3d56362c426f19cd22d2dccdb5bccb41 + checksum: 10c0/7708736147fae3d0d537782f74ba18e574a72ae0e4c90c2f1ba9f5f8a994d1596ce206540241f18282407f846a6d0c904d6d67c0c959fe51bab4d7d402516185 languageName: node linkType: hard From b652499788c0cb11d499a1aa18c09971c9de1e19 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 21 Jun 2025 02:01:51 +0000 Subject: [PATCH 116/136] fix(deps): update dependency next to v15.4.0-canary.90 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index d62313e..f6eea55 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.89", + "next": "15.4.0-canary.90", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index ebc9295..896418d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/env@npm:15.4.0-canary.89" - checksum: 10c0/5809605b66cc4762b3792cafca0ad36e1add73b85821b12751eddd34097c41d9d5bd29ce789eceb573020bd2ce7af65f7bc9250f6d1aa36088f29997e5278cb5 +"@next/env@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/env@npm:15.4.0-canary.90" + checksum: 10c0/35f21edabef17cbf6329e844e12d897e77091a2ce8fda2b9ab30fc1a52703ab2ed77cc5fbd3c9cefefbbc00b00108755dced544ffb91c632fca793739f5b8f28 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.89" +"@next/swc-darwin-arm64@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.90" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.89" +"@next/swc-darwin-x64@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.90" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.89" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.90" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.89" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.90" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.89" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.90" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.89" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.90" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.89" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.90" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.89" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.90" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.89" + next: "npm:15.4.0-canary.90" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.89": - version: 15.4.0-canary.89 - resolution: "next@npm:15.4.0-canary.89" +"next@npm:15.4.0-canary.90": + version: 15.4.0-canary.90 + resolution: "next@npm:15.4.0-canary.90" dependencies: - "@next/env": "npm:15.4.0-canary.89" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.89" - "@next/swc-darwin-x64": "npm:15.4.0-canary.89" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.89" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.89" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.89" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.89" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.89" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.89" + "@next/env": "npm:15.4.0-canary.90" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.90" + "@next/swc-darwin-x64": "npm:15.4.0-canary.90" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.90" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.90" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.90" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.90" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.90" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.90" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/2920d0f60fe0796727c663f3b7c21bc8a644b353fcbc8d0e7955694225762877dde0f3984971dc379bc864e7ab839b186f4ea099d10c0c5ca1fc598e66c17b4c + checksum: 10c0/77be3c261ae6a6ee63207ff8ee4988b38b5507652067a59606d87dd5adb647deb1bb6da7fc7f00a6ae10c48b7d2ff479b86388d4dd38e0f8ac7f02c78cc006cf languageName: node linkType: hard From 5e6feb39ebfd2acaa6a162b70aef3940821131de Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 21 Jun 2025 13:00:48 +0000 Subject: [PATCH 117/136] fix(deps): update dependency @tanstack/react-query to v5.81.0 --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 896418d..c6c2813 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2974,21 +2974,21 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.80.10": - version: 5.80.10 - resolution: "@tanstack/query-core@npm:5.80.10" - checksum: 10c0/6391f4439f1f4676f5efeb07271e6b0b1418bd1192779f55cac537f0b35ec31c729eb43a30e0269534328c259c3ed6dd2f31555c42c68b6dd0c9ede410d46eb1 +"@tanstack/query-core@npm:5.81.0": + version: 5.81.0 + resolution: "@tanstack/query-core@npm:5.81.0" + checksum: 10c0/518119d4cad7f552e6a5614d0d71178f1f06508bfd6b5730dc7c9f23e07cc8408042a4d895808819872f1f5592860b3fccc2eb252e81ea9d45672c210607dbe0 languageName: node linkType: hard "@tanstack/react-query@npm:^5.80.7": - version: 5.80.10 - resolution: "@tanstack/react-query@npm:5.80.10" + version: 5.81.0 + resolution: "@tanstack/react-query@npm:5.81.0" dependencies: - "@tanstack/query-core": "npm:5.80.10" + "@tanstack/query-core": "npm:5.81.0" peerDependencies: react: ^18 || ^19 - checksum: 10c0/1a759b264cc94b389f802f1183183a3fbe1669ec1bb354951cfab6b6cf175276885c5f5c9b3fc00340a87140fdff4b9cf0c688fb7af103d34fb3b209d33a0a95 + checksum: 10c0/a9f37efd7c8fe9c35da94608b1c8f1a3d18b597d9a411669f7449ca4f32b13b211e0b4c34cc04c36fdc445bd9bf7819b1015f85e603609fe321f894fbcfc2d43 languageName: node linkType: hard From 5fbd7ac09196ecdc77c07a512e58ae34b591c1db Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 21 Jun 2025 20:01:54 +0000 Subject: [PATCH 118/136] fix(deps): update dependency @tanstack/react-query to v5.81.1 --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index c6c2813..8be8b20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2974,21 +2974,21 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.81.0": - version: 5.81.0 - resolution: "@tanstack/query-core@npm:5.81.0" - checksum: 10c0/518119d4cad7f552e6a5614d0d71178f1f06508bfd6b5730dc7c9f23e07cc8408042a4d895808819872f1f5592860b3fccc2eb252e81ea9d45672c210607dbe0 +"@tanstack/query-core@npm:5.81.1": + version: 5.81.1 + resolution: "@tanstack/query-core@npm:5.81.1" + checksum: 10c0/df3ad000c4497868bfc2cab6c36604931038ad583210a04b0cbc2b70a92035aa0257795e4a7309c5a12872e8f2c44c55b95066c68338655009b6bcb57d6383db languageName: node linkType: hard "@tanstack/react-query@npm:^5.80.7": - version: 5.81.0 - resolution: "@tanstack/react-query@npm:5.81.0" + version: 5.81.1 + resolution: "@tanstack/react-query@npm:5.81.1" dependencies: - "@tanstack/query-core": "npm:5.81.0" + "@tanstack/query-core": "npm:5.81.1" peerDependencies: react: ^18 || ^19 - checksum: 10c0/a9f37efd7c8fe9c35da94608b1c8f1a3d18b597d9a411669f7449ca4f32b13b211e0b4c34cc04c36fdc445bd9bf7819b1015f85e603609fe321f894fbcfc2d43 + checksum: 10c0/8369904f9076f5f15c9af73ba93d7f0c73dc236107e7f772385031eb3fcddb921bd8b8686aaab14a3228f095fe6a8e7139384eda184152eb06a12c7d97f5009a languageName: node linkType: hard From cd1ad5dbc4778498b5236e7c57e50189547390c0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 21 Jun 2025 23:00:48 +0000 Subject: [PATCH 119/136] fix(deps): update dependency @tanstack/react-query to v5.81.2 --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8be8b20..eed029f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2974,21 +2974,21 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.81.1": - version: 5.81.1 - resolution: "@tanstack/query-core@npm:5.81.1" - checksum: 10c0/df3ad000c4497868bfc2cab6c36604931038ad583210a04b0cbc2b70a92035aa0257795e4a7309c5a12872e8f2c44c55b95066c68338655009b6bcb57d6383db +"@tanstack/query-core@npm:5.81.2": + version: 5.81.2 + resolution: "@tanstack/query-core@npm:5.81.2" + checksum: 10c0/36a6bddec2e7512015bcfbb0d7b0876fab418de9e0ef21ad403598276960e0b7d53efd62832ce462738ad22d9883e31cb5403eafc65dfd9b2f6744c22a9d8e42 languageName: node linkType: hard "@tanstack/react-query@npm:^5.80.7": - version: 5.81.1 - resolution: "@tanstack/react-query@npm:5.81.1" + version: 5.81.2 + resolution: "@tanstack/react-query@npm:5.81.2" dependencies: - "@tanstack/query-core": "npm:5.81.1" + "@tanstack/query-core": "npm:5.81.2" peerDependencies: react: ^18 || ^19 - checksum: 10c0/8369904f9076f5f15c9af73ba93d7f0c73dc236107e7f772385031eb3fcddb921bd8b8686aaab14a3228f095fe6a8e7139384eda184152eb06a12c7d97f5009a + checksum: 10c0/a80a2e7401a02bfc8d7a926c9e48b0a108cae21a2c47691632e754de44ca08838c105fb0c30804f4ccbf173bee04ad9a3e45a8bebdfc1d1a32468bbb9d960e19 languageName: node linkType: hard From 0da8e35b9b0fd4b7ea64b4cbd91868841589d57d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 22 Jun 2025 00:03:20 +0000 Subject: [PATCH 120/136] fix(deps): update dependency next to v15.4.0-canary.91 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index f6eea55..cc7da00 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.90", + "next": "15.4.0-canary.91", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index eed029f..a28f3b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/env@npm:15.4.0-canary.90" - checksum: 10c0/35f21edabef17cbf6329e844e12d897e77091a2ce8fda2b9ab30fc1a52703ab2ed77cc5fbd3c9cefefbbc00b00108755dced544ffb91c632fca793739f5b8f28 +"@next/env@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/env@npm:15.4.0-canary.91" + checksum: 10c0/197c09cffff66a8055aaaee351a0c18743a6586b6e8a84dd6494badd0143601a4068f332ca89c0e6ffa9375671ec13803577c91690a4007e3bf2bbd5b9731bb0 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.90" +"@next/swc-darwin-arm64@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.91" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.90" +"@next/swc-darwin-x64@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.91" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.90" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.91" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.90" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.91" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.90" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.91" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.90" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.91" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.90" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.91" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.90" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.91" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.90" + next: "npm:15.4.0-canary.91" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.90": - version: 15.4.0-canary.90 - resolution: "next@npm:15.4.0-canary.90" +"next@npm:15.4.0-canary.91": + version: 15.4.0-canary.91 + resolution: "next@npm:15.4.0-canary.91" dependencies: - "@next/env": "npm:15.4.0-canary.90" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.90" - "@next/swc-darwin-x64": "npm:15.4.0-canary.90" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.90" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.90" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.90" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.90" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.90" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.90" + "@next/env": "npm:15.4.0-canary.91" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.91" + "@next/swc-darwin-x64": "npm:15.4.0-canary.91" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.91" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.91" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.91" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.91" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.91" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.91" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/77be3c261ae6a6ee63207ff8ee4988b38b5507652067a59606d87dd5adb647deb1bb6da7fc7f00a6ae10c48b7d2ff479b86388d4dd38e0f8ac7f02c78cc006cf + checksum: 10c0/5d08e5365d52f9f941dcbb02e7a5c56cf68f931be1a60b1386ce042a12722938e657d6c3a4bcd8c573a88b214a1bb2a0a757b1a339aa751483fecf3b987e66e5 languageName: node linkType: hard From 525b8597f211ebbb4a0107b430c1f721e8771393 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 22 Jun 2025 13:01:47 +0000 Subject: [PATCH 121/136] fix(deps): update dependency next-auth to v5.0.0-beta.29 --- yarn.lock | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index a28f3b9..c09e949 100644 --- a/yarn.lock +++ b/yarn.lock @@ -108,6 +108,30 @@ __metadata: languageName: node linkType: hard +"@auth/core@npm:0.40.0": + version: 0.40.0 + resolution: "@auth/core@npm:0.40.0" + dependencies: + "@panva/hkdf": "npm:^1.2.1" + jose: "npm:^6.0.6" + oauth4webapi: "npm:^3.3.0" + preact: "npm:10.24.3" + preact-render-to-string: "npm:6.5.11" + peerDependencies: + "@simplewebauthn/browser": ^9.0.1 + "@simplewebauthn/server": ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + "@simplewebauthn/browser": + optional: true + "@simplewebauthn/server": + optional: true + nodemailer: + optional: true + checksum: 10c0/25cd12f22611eedc21c17dc1908fa9428ae5f0e32eb32c1ab009642276c37099cce58f49ffbb7f8e8d6d6488d5101a24fb9808ec662eee5aca19d520750acaa3 + languageName: node + linkType: hard + "@auth/prisma-adapter@npm:^2.9.1": version: 2.9.1 resolution: "@auth/prisma-adapter@npm:2.9.1" @@ -6825,10 +6849,10 @@ __metadata: linkType: hard "next-auth@npm:^5.0.0-beta.25": - version: 5.0.0-beta.28 - resolution: "next-auth@npm:5.0.0-beta.28" + version: 5.0.0-beta.29 + resolution: "next-auth@npm:5.0.0-beta.29" dependencies: - "@auth/core": "npm:0.39.1" + "@auth/core": "npm:0.40.0" peerDependencies: "@simplewebauthn/browser": ^9.0.1 "@simplewebauthn/server": ^9.0.2 @@ -6842,7 +6866,7 @@ __metadata: optional: true nodemailer: optional: true - checksum: 10c0/56ab8c5e9bdbffe65191a1afa1d18b95df9f61686f9d2faca3f53098eb59491df5929540d8bdb3258a0ab8d26ff2707e6256e34212c329c624f3014652cb8701 + checksum: 10c0/2c6bada9a5f28a9a172d3ad295bfb05b648a4fced01f9988154df1ebca712cf460fb49173ada4c26de4c7ab180256f40ac19d16e2147c1c68f2a7475ab5d5ea8 languageName: node linkType: hard From f240bf525d24ed5101c74f70164960ca01fc353b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 22 Jun 2025 14:02:45 +0000 Subject: [PATCH 122/136] fix(deps): update dependency @auth/prisma-adapter to v2.10.0 --- yarn.lock | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/yarn.lock b/yarn.lock index c09e949..786729a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,30 +84,6 @@ __metadata: languageName: node linkType: hard -"@auth/core@npm:0.39.1": - version: 0.39.1 - resolution: "@auth/core@npm:0.39.1" - dependencies: - "@panva/hkdf": "npm:^1.2.1" - jose: "npm:^6.0.6" - oauth4webapi: "npm:^3.3.0" - preact: "npm:10.24.3" - preact-render-to-string: "npm:6.5.11" - peerDependencies: - "@simplewebauthn/browser": ^9.0.1 - "@simplewebauthn/server": ^9.0.2 - nodemailer: ^6.8.0 - peerDependenciesMeta: - "@simplewebauthn/browser": - optional: true - "@simplewebauthn/server": - optional: true - nodemailer: - optional: true - checksum: 10c0/ba2703656c266ce42f10a1e5ac90c2bcbc829bff651cc930ad95a4734aafaa249551d0af589a0c970fbd7f7aa6324c329439183bfb46ba1bee3f8cfa90128275 - languageName: node - linkType: hard - "@auth/core@npm:0.40.0": version: 0.40.0 resolution: "@auth/core@npm:0.40.0" @@ -133,13 +109,13 @@ __metadata: linkType: hard "@auth/prisma-adapter@npm:^2.9.1": - version: 2.9.1 - resolution: "@auth/prisma-adapter@npm:2.9.1" + version: 2.10.0 + resolution: "@auth/prisma-adapter@npm:2.10.0" dependencies: - "@auth/core": "npm:0.39.1" + "@auth/core": "npm:0.40.0" peerDependencies: "@prisma/client": ">=2.26.0 || >=3 || >=4 || >=5 || >=6" - checksum: 10c0/615ee7c02f690e35ccac8206607a4345ca6455c322a741ddd4dbd52e7a068ace9e5c46c4d8a50fe471ca2c2fb6a5b4bb9924cbd2e911613f671fe929c33278d4 + checksum: 10c0/f6c95f144958c678e8cbc691b205c937cbc456beab3da035ab3e00d55e91b8b39be6ff8529dbe3c72d0f95365988db09bc5862445f70c2438061dbe69bca34f5 languageName: node linkType: hard From be1502a4ac1620844a815406bf30cc8ac5454fc4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Jun 2025 00:00:52 +0000 Subject: [PATCH 123/136] fix(deps): update dependency next to v15.4.0-canary.92 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index cc7da00..c5c77fb 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.91", + "next": "15.4.0-canary.92", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index 786729a..56de1d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/env@npm:15.4.0-canary.91" - checksum: 10c0/197c09cffff66a8055aaaee351a0c18743a6586b6e8a84dd6494badd0143601a4068f332ca89c0e6ffa9375671ec13803577c91690a4007e3bf2bbd5b9731bb0 +"@next/env@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/env@npm:15.4.0-canary.92" + checksum: 10c0/5d3df767dab8227aa64058b5082977b069ee7c22038b13b1da1471a4b312bca7b0163cf50f130f22a850b479aca8b9fea649d02720fc24f49528fd70751554c9 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.91" +"@next/swc-darwin-arm64@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.92" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.91" +"@next/swc-darwin-x64@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.92" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.91" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.92" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.91" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.92" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.91" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.92" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.91" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.92" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.91" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.92" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.91" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.92" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.91" + next: "npm:15.4.0-canary.92" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.91": - version: 15.4.0-canary.91 - resolution: "next@npm:15.4.0-canary.91" +"next@npm:15.4.0-canary.92": + version: 15.4.0-canary.92 + resolution: "next@npm:15.4.0-canary.92" dependencies: - "@next/env": "npm:15.4.0-canary.91" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.91" - "@next/swc-darwin-x64": "npm:15.4.0-canary.91" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.91" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.91" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.91" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.91" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.91" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.91" + "@next/env": "npm:15.4.0-canary.92" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.92" + "@next/swc-darwin-x64": "npm:15.4.0-canary.92" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.92" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.92" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.92" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.92" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.92" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.92" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/5d08e5365d52f9f941dcbb02e7a5c56cf68f931be1a60b1386ce042a12722938e657d6c3a4bcd8c573a88b214a1bb2a0a757b1a339aa751483fecf3b987e66e5 + checksum: 10c0/78b76ba1af4e0c11a1839142f774b9572814f524798d6a27c64180bfe3679ad93af6d3947260b66d02d1fa407a5da3523ca688bcff7fbc939e63559c9587069e languageName: node linkType: hard From 280fa57e4594ccdef989c5fa22a629925b93e992 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 23 Jun 2025 09:51:06 +0200 Subject: [PATCH 124/136] feat(api): implement /api/user/me/password endpoint add an endpoint to allow the user to change his password --- src/app/api/user/me/password/route.ts | 119 ++++++++++++++++++++++++ src/app/api/user/me/password/swagger.ts | 43 +++++++++ src/app/api/user/me/validation.ts | 9 ++ 3 files changed, 171 insertions(+) create mode 100644 src/app/api/user/me/password/route.ts create mode 100644 src/app/api/user/me/password/swagger.ts diff --git a/src/app/api/user/me/password/route.ts b/src/app/api/user/me/password/route.ts new file mode 100644 index 0000000..03fb426 --- /dev/null +++ b/src/app/api/user/me/password/route.ts @@ -0,0 +1,119 @@ +import { auth } from '@/auth'; +import { prisma } from '@/prisma'; +import { updateUserPasswordServerSchema } from '../validation'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { FullUserResponseSchema } from '../../validation'; +import { + ErrorResponseSchema, + ZodErrorResponseSchema, +} from '@/app/api/validation'; +import bcrypt from 'bcryptjs'; + +export const PATCH = auth(async function PATCH(req) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const body = await req.json(); + const parsedBody = updateUserPasswordServerSchema.safeParse(body); + if (!parsedBody.success) + return returnZodTypeCheckedResponse( + ZodErrorResponseSchema, + { + success: false, + message: 'Invalid request data', + errors: parsedBody.error.issues, + }, + { status: 400 }, + ); + + const { current_password, new_password } = parsedBody.data; + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + include: { + accounts: true, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User not found', + }, + { status: 404 }, + ); + + if (!dbUser.password_hash) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User does not have a password set', + }, + { status: 400 }, + ); + + if (dbUser.accounts.length === 0 || dbUser.accounts[0].provider !== 'credentials') + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'Credentials login is not enabled for this user', + }, + { status: 400 }, + ); + + const isCurrentPasswordValid = await bcrypt.compare( + current_password, + dbUser.password_hash || '', + ); + + if (!isCurrentPasswordValid) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'Current password is incorrect', + }, + { status: 401 }, + ); + + const hashedNewPassword = await bcrypt.hash(new_password, 10); + + const updatedUser = await prisma.user.update({ + where: { + id: dbUser.id, + }, + data: { + password_hash: hashedNewPassword, + }, + select: { + id: true, + name: true, + first_name: true, + last_name: true, + email: true, + image: true, + timezone: true, + created_at: true, + updated_at: true, + }, + }); + + return returnZodTypeCheckedResponse(FullUserResponseSchema, { + success: true, + user: updatedUser, + }); +}); diff --git a/src/app/api/user/me/password/swagger.ts b/src/app/api/user/me/password/swagger.ts new file mode 100644 index 0000000..0bc62f0 --- /dev/null +++ b/src/app/api/user/me/password/swagger.ts @@ -0,0 +1,43 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import { FullUserResponseSchema } from '../../validation'; +import { updateUserPasswordServerSchema } from '../validation'; +import { + invalidRequestDataResponse, + notAuthenticatedResponse, + serverReturnedDataValidationErrorResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'patch', + path: '/api/user/me/password', + description: 'Update the password of the currently authenticated user', + request: { + body: { + description: 'User password update request body', + required: true, + content: { + 'application/json': { + schema: updateUserPasswordServerSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'User information updated successfully', + content: { + 'application/json': { + schema: FullUserResponseSchema, + }, + }, + }, + ...invalidRequestDataResponse, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['User'], + }); +} diff --git a/src/app/api/user/me/validation.ts b/src/app/api/user/me/validation.ts index 49c6219..7fe04f6 100644 --- a/src/app/api/user/me/validation.ts +++ b/src/app/api/user/me/validation.ts @@ -4,6 +4,7 @@ import { lastNameSchema, newUserEmailServerSchema, newUserNameServerSchema, + passwordSchema, } from '@/app/api/user/validation'; // ---------------------------------------- @@ -19,3 +20,11 @@ export const updateUserServerSchema = zod.object({ image: zod.string().optional(), timezone: zod.string().optional(), }); + +export const updateUserPasswordServerSchema = zod.object({ + current_password: zod.string().min(1, 'Current password is required'), + new_password: passwordSchema, + confirm_new_password: passwordSchema, +}).refine((data) => data.new_password === data.confirm_new_password, { + message: 'New password and confirm new password must match', +}); From 16b878a2e957941f1d508d6c37ebeaaf52e38b49 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 23 Jun 2025 10:40:28 +0200 Subject: [PATCH 125/136] feat(api): stricter user data api types checking --- src/app/api/user/me/validation.ts | 5 +- src/app/api/user/validation.ts | 16 +- src/lib/timezones.ts | 3713 +++++++++++++++++++++++++++++ 3 files changed, 3730 insertions(+), 4 deletions(-) create mode 100644 src/lib/timezones.ts diff --git a/src/app/api/user/me/validation.ts b/src/app/api/user/me/validation.ts index 7fe04f6..2e8ff0a 100644 --- a/src/app/api/user/me/validation.ts +++ b/src/app/api/user/me/validation.ts @@ -5,6 +5,7 @@ import { newUserEmailServerSchema, newUserNameServerSchema, passwordSchema, + timezoneSchema, } from '@/app/api/user/validation'; // ---------------------------------------- @@ -17,8 +18,8 @@ export const updateUserServerSchema = zod.object({ first_name: firstNameSchema.optional(), last_name: lastNameSchema.optional(), email: newUserEmailServerSchema.optional(), - image: zod.string().optional(), - timezone: zod.string().optional(), + image: zod.url().optional(), + timezone: timezoneSchema.optional(), }); export const updateUserPasswordServerSchema = zod.object({ diff --git a/src/app/api/user/validation.ts b/src/app/api/user/validation.ts index 79b1e7e..100470e 100644 --- a/src/app/api/user/validation.ts +++ b/src/app/api/user/validation.ts @@ -1,6 +1,7 @@ import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { prisma } from '@/prisma'; import zod from 'zod/v4'; +import { allTimeZones } from '@/lib/timezones'; extendZodWithOpenApi(zod); @@ -107,6 +108,17 @@ export const passwordSchema = zod 'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character', ); +// ---------------------------------------- +// +// Timezone Validation +// +// ---------------------------------------- +export const timezoneSchema = zod + .enum(allTimeZones) + .openapi('Timezone', { + description: 'Valid timezone from the list of supported timezones', + }); + // ---------------------------------------- // // User Schema Validation (for API responses) @@ -119,8 +131,8 @@ export const FullUserSchema = zod first_name: zod.string().nullish(), last_name: zod.string().nullish(), email: zod.email(), - image: zod.string().nullish(), - timezone: zod.string(), + image: zod.url().nullish(), + timezone: zod.string().refine((i) => (allTimeZones as string[]).includes(i)).nullish(), created_at: zod.date(), updated_at: zod.date(), }) diff --git a/src/lib/timezones.ts b/src/lib/timezones.ts new file mode 100644 index 0000000..e1d681a --- /dev/null +++ b/src/lib/timezones.ts @@ -0,0 +1,3713 @@ +export const timezoneData = { + ianaVersion: '2025b', + fullVersionId: 'TZDB: 2025b (mapping: $Revision$)', + zones: [ + { + id: 'Africa/Abidjan', + aliases: [ + 'Africa/Accra', + 'Africa/Bamako', + 'Africa/Banjul', + 'Africa/Conakry', + 'Africa/Dakar', + 'Africa/Freetown', + 'Africa/Lome', + 'Africa/Nouakchott', + 'Africa/Ouagadougou', + 'Africa/Timbuktu', + 'Atlantic/Reykjavik', + 'Atlantic/St_Helena', + 'Iceland', + ], + location: { + countryCode: 'CI', + countryName: 'C\u00F4te d\u0027Ivoire', + comment: '', + latitude: 5.316666666666666, + longitude: -4.033333333333333, + }, + }, + { + id: 'Africa/Algiers', + aliases: [], + location: { + countryCode: 'DZ', + countryName: 'Algeria', + comment: '', + latitude: 36.78333333333333, + longitude: 3.05, + }, + }, + { + id: 'Africa/Bissau', + aliases: [], + location: { + countryCode: 'GW', + countryName: 'Guinea-Bissau', + comment: '', + latitude: 11.85, + longitude: -15.583333333333334, + }, + }, + { + id: 'Africa/Cairo', + aliases: ['Egypt'], + location: { + countryCode: 'EG', + countryName: 'Egypt', + comment: '', + latitude: 30.05, + longitude: 31.25, + }, + }, + { + id: 'Africa/Casablanca', + aliases: [], + location: { + countryCode: 'MA', + countryName: 'Morocco', + comment: '', + latitude: 33.65, + longitude: -7.583333333333333, + }, + }, + { + id: 'Africa/Ceuta', + aliases: [], + location: { + countryCode: 'ES', + countryName: 'Spain', + comment: 'Ceuta, Melilla', + latitude: 35.88333333333333, + longitude: -5.316666666666666, + }, + }, + { + id: 'Africa/El_Aaiun', + aliases: [], + location: { + countryCode: 'EH', + countryName: 'Western Sahara', + comment: '', + latitude: 27.15, + longitude: -13.2, + }, + }, + { + id: 'Africa/Johannesburg', + aliases: ['Africa/Maseru', 'Africa/Mbabane'], + location: { + countryCode: 'ZA', + countryName: 'South Africa', + comment: '', + latitude: -26.25, + longitude: 28, + }, + }, + { + id: 'Africa/Juba', + aliases: [], + location: { + countryCode: 'SS', + countryName: 'South Sudan', + comment: '', + latitude: 4.85, + longitude: 31.616666666666667, + }, + }, + { + id: 'Africa/Khartoum', + aliases: [], + location: { + countryCode: 'SD', + countryName: 'Sudan', + comment: '', + latitude: 15.6, + longitude: 32.53333333333333, + }, + }, + { + id: 'Africa/Lagos', + aliases: [ + 'Africa/Bangui', + 'Africa/Brazzaville', + 'Africa/Douala', + 'Africa/Kinshasa', + 'Africa/Libreville', + 'Africa/Luanda', + 'Africa/Malabo', + 'Africa/Niamey', + 'Africa/Porto-Novo', + ], + location: { + countryCode: 'NG', + countryName: 'Nigeria', + comment: '', + latitude: 6.45, + longitude: 3.4, + }, + }, + { + id: 'Africa/Maputo', + aliases: [ + 'Africa/Blantyre', + 'Africa/Bujumbura', + 'Africa/Gaborone', + 'Africa/Harare', + 'Africa/Kigali', + 'Africa/Lubumbashi', + 'Africa/Lusaka', + ], + location: { + countryCode: 'MZ', + countryName: 'Mozambique', + comment: '', + latitude: -25.966666666666665, + longitude: 32.583333333333336, + }, + }, + { + id: 'Africa/Monrovia', + aliases: [], + location: { + countryCode: 'LR', + countryName: 'Liberia', + comment: '', + latitude: 6.3, + longitude: -10.783333333333333, + }, + }, + { + id: 'Africa/Nairobi', + aliases: [ + 'Africa/Addis_Ababa', + 'Africa/Asmara', + 'Africa/Asmera', + 'Africa/Dar_es_Salaam', + 'Africa/Djibouti', + 'Africa/Kampala', + 'Africa/Mogadishu', + 'Indian/Antananarivo', + 'Indian/Comoro', + 'Indian/Mayotte', + ], + location: { + countryCode: 'KE', + countryName: 'Kenya', + comment: '', + latitude: -1.2833333333333334, + longitude: 36.81666666666667, + }, + }, + { + id: 'Africa/Ndjamena', + aliases: [], + location: { + countryCode: 'TD', + countryName: 'Chad', + comment: '', + latitude: 12.116666666666667, + longitude: 15.05, + }, + }, + { + id: 'Africa/Sao_Tome', + aliases: [], + location: { + countryCode: 'ST', + countryName: 'Sao Tome \u0026 Principe', + comment: '', + latitude: 0.3333333333333333, + longitude: 6.733333333333333, + }, + }, + { + id: 'Africa/Tripoli', + aliases: ['Libya'], + location: { + countryCode: 'LY', + countryName: 'Libya', + comment: '', + latitude: 32.9, + longitude: 13.183333333333334, + }, + }, + { + id: 'Africa/Tunis', + aliases: [], + location: { + countryCode: 'TN', + countryName: 'Tunisia', + comment: '', + latitude: 36.8, + longitude: 10.183333333333334, + }, + }, + { + id: 'Africa/Windhoek', + aliases: [], + location: { + countryCode: 'NA', + countryName: 'Namibia', + comment: '', + latitude: -22.566666666666666, + longitude: 17.1, + }, + }, + { + id: 'America/Adak', + aliases: ['America/Atka', 'US/Aleutian'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska - western Aleutians', + latitude: 51.88, + longitude: -176.65805555555556, + }, + }, + { + id: 'America/Anchorage', + aliases: ['US/Alaska'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska (most areas)', + latitude: 61.21805555555556, + longitude: -149.90027777777777, + }, + }, + { + id: 'America/Araguaina', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Tocantins', + latitude: -7.2, + longitude: -48.2, + }, + }, + { + id: 'America/Argentina/Buenos_Aires', + aliases: ['America/Buenos_Aires'], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Buenos Aires (BA, CF)', + latitude: -34.6, + longitude: -58.45, + }, + }, + { + id: 'America/Argentina/Catamarca', + aliases: ['America/Argentina/ComodRivadavia', 'America/Catamarca'], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Catamarca (CT), Chubut (CH)', + latitude: -28.466666666666665, + longitude: -65.78333333333333, + }, + }, + { + id: 'America/Argentina/Cordoba', + aliases: ['America/Cordoba', 'America/Rosario'], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)', + latitude: -31.4, + longitude: -64.18333333333334, + }, + }, + { + id: 'America/Argentina/Jujuy', + aliases: ['America/Jujuy'], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Jujuy (JY)', + latitude: -24.183333333333334, + longitude: -65.3, + }, + }, + { + id: 'America/Argentina/La_Rioja', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'La Rioja (LR)', + latitude: -29.433333333333334, + longitude: -66.85, + }, + }, + { + id: 'America/Argentina/Mendoza', + aliases: ['America/Mendoza'], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Mendoza (MZ)', + latitude: -32.88333333333333, + longitude: -68.81666666666666, + }, + }, + { + id: 'America/Argentina/Rio_Gallegos', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Santa Cruz (SC)', + latitude: -51.63333333333333, + longitude: -69.21666666666667, + }, + }, + { + id: 'America/Argentina/Salta', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Salta (SA, LP, NQ, RN)', + latitude: -24.783333333333335, + longitude: -65.41666666666667, + }, + }, + { + id: 'America/Argentina/San_Juan', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'San Juan (SJ)', + latitude: -31.533333333333335, + longitude: -68.51666666666667, + }, + }, + { + id: 'America/Argentina/San_Luis', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'San Luis (SL)', + latitude: -33.31666666666667, + longitude: -66.35, + }, + }, + { + id: 'America/Argentina/Tucuman', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Tucuman (TM)', + latitude: -26.816666666666666, + longitude: -65.21666666666667, + }, + }, + { + id: 'America/Argentina/Ushuaia', + aliases: [], + location: { + countryCode: 'AR', + countryName: 'Argentina', + comment: 'Tierra del Fuego (TF)', + latitude: -54.8, + longitude: -68.3, + }, + }, + { + id: 'America/Asuncion', + aliases: [], + location: { + countryCode: 'PY', + countryName: 'Paraguay', + comment: '', + latitude: -25.266666666666666, + longitude: -57.666666666666664, + }, + }, + { + id: 'America/Bahia', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Bahia', + latitude: -12.983333333333333, + longitude: -38.516666666666666, + }, + }, + { + id: 'America/Bahia_Banderas', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Bahia de Banderas', + latitude: 20.8, + longitude: -105.25, + }, + }, + { + id: 'America/Barbados', + aliases: [], + location: { + countryCode: 'BB', + countryName: 'Barbados', + comment: '', + latitude: 13.1, + longitude: -59.61666666666667, + }, + }, + { + id: 'America/Belem', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Para (east), Amapa', + latitude: -1.45, + longitude: -48.483333333333334, + }, + }, + { + id: 'America/Belize', + aliases: [], + location: { + countryCode: 'BZ', + countryName: 'Belize', + comment: '', + latitude: 17.5, + longitude: -88.2, + }, + }, + { + id: 'America/Boa_Vista', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Roraima', + latitude: 2.816666666666667, + longitude: -60.666666666666664, + }, + }, + { + id: 'America/Bogota', + aliases: [], + location: { + countryCode: 'CO', + countryName: 'Colombia', + comment: '', + latitude: 4.6, + longitude: -74.08333333333333, + }, + }, + { + id: 'America/Boise', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Mountain - ID (south), OR (east)', + latitude: 43.61361111111111, + longitude: -116.2025, + }, + }, + { + id: 'America/Cambridge_Bay', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Mountain - NU (west)', + latitude: 69.1138888888889, + longitude: -105.05277777777778, + }, + }, + { + id: 'America/Campo_Grande', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Mato Grosso do Sul', + latitude: -20.45, + longitude: -54.61666666666667, + }, + }, + { + id: 'America/Cancun', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Quintana Roo', + latitude: 21.083333333333332, + longitude: -86.76666666666667, + }, + }, + { + id: 'America/Caracas', + aliases: [], + location: { + countryCode: 'VE', + countryName: 'Venezuela', + comment: '', + latitude: 10.5, + longitude: -66.93333333333334, + }, + }, + { + id: 'America/Cayenne', + aliases: [], + location: { + countryCode: 'GF', + countryName: 'French Guiana', + comment: '', + latitude: 4.933333333333334, + longitude: -52.333333333333336, + }, + }, + { + id: 'America/Chicago', + aliases: ['CST6CDT', 'US/Central'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central (most areas)', + latitude: 41.85, + longitude: -87.65, + }, + }, + { + id: 'America/Chihuahua', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Chihuahua (most areas)', + latitude: 28.633333333333333, + longitude: -106.08333333333333, + }, + }, + { + id: 'America/Ciudad_Juarez', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Chihuahua (US border - west)', + latitude: 31.733333333333334, + longitude: -106.48333333333333, + }, + }, + { + id: 'America/Costa_Rica', + aliases: [], + location: { + countryCode: 'CR', + countryName: 'Costa Rica', + comment: '', + latitude: 9.933333333333334, + longitude: -84.08333333333333, + }, + }, + { + id: 'America/Coyhaique', + aliases: [], + location: { + countryCode: 'CL', + countryName: 'Chile', + comment: 'Aysen Region', + latitude: -45.56666666666667, + longitude: -72.06666666666666, + }, + }, + { + id: 'America/Cuiaba', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Mato Grosso', + latitude: -15.583333333333334, + longitude: -56.083333333333336, + }, + }, + { + id: 'America/Danmarkshavn', + aliases: [], + location: { + countryCode: 'GL', + countryName: 'Greenland', + comment: 'National Park (east coast)', + latitude: 76.76666666666667, + longitude: -18.666666666666668, + }, + }, + { + id: 'America/Dawson', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'MST - Yukon (west)', + latitude: 64.06666666666666, + longitude: -139.41666666666666, + }, + }, + { + id: 'America/Dawson_Creek', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'MST - BC (Dawson Cr, Ft St John)', + latitude: 55.766666666666666, + longitude: -120.23333333333333, + }, + }, + { + id: 'America/Denver', + aliases: ['America/Shiprock', 'MST7MDT', 'Navajo', 'US/Mountain'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Mountain (most areas)', + latitude: 39.73916666666667, + longitude: -104.98416666666667, + }, + }, + { + id: 'America/Detroit', + aliases: ['US/Michigan'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - MI (most areas)', + latitude: 42.33138888888889, + longitude: -83.04583333333333, + }, + }, + { + id: 'America/Edmonton', + aliases: ['America/Yellowknife', 'Canada/Mountain'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Mountain - AB, BC(E), NT(E), SK(W)', + latitude: 53.55, + longitude: -113.46666666666667, + }, + }, + { + id: 'America/Eirunepe', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Amazonas (west)', + latitude: -6.666666666666667, + longitude: -69.86666666666666, + }, + }, + { + id: 'America/El_Salvador', + aliases: [], + location: { + countryCode: 'SV', + countryName: 'El Salvador', + comment: '', + latitude: 13.7, + longitude: -89.2, + }, + }, + { + id: 'America/Fort_Nelson', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'MST - BC (Ft Nelson)', + latitude: 58.8, + longitude: -122.7, + }, + }, + { + id: 'America/Fortaleza', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Brazil (northeast: MA, PI, CE, RN, PB)', + latitude: -3.716666666666667, + longitude: -38.5, + }, + }, + { + id: 'America/Glace_Bay', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Atlantic - NS (Cape Breton)', + latitude: 46.2, + longitude: -59.95, + }, + }, + { + id: 'America/Goose_Bay', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Atlantic - Labrador (most areas)', + latitude: 53.333333333333336, + longitude: -60.416666666666664, + }, + }, + { + id: 'America/Grand_Turk', + aliases: [], + location: { + countryCode: 'TC', + countryName: 'Turks \u0026 Caicos Is', + comment: '', + latitude: 21.466666666666665, + longitude: -71.13333333333334, + }, + }, + { + id: 'America/Guatemala', + aliases: [], + location: { + countryCode: 'GT', + countryName: 'Guatemala', + comment: '', + latitude: 14.633333333333333, + longitude: -90.51666666666667, + }, + }, + { + id: 'America/Guayaquil', + aliases: [], + location: { + countryCode: 'EC', + countryName: 'Ecuador', + comment: 'Ecuador (mainland)', + latitude: -2.1666666666666665, + longitude: -79.83333333333333, + }, + }, + { + id: 'America/Guyana', + aliases: [], + location: { + countryCode: 'GY', + countryName: 'Guyana', + comment: '', + latitude: 6.8, + longitude: -58.166666666666664, + }, + }, + { + id: 'America/Halifax', + aliases: ['Canada/Atlantic'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Atlantic - NS (most areas), PE', + latitude: 44.65, + longitude: -63.6, + }, + }, + { + id: 'America/Havana', + aliases: ['Cuba'], + location: { + countryCode: 'CU', + countryName: 'Cuba', + comment: '', + latitude: 23.133333333333333, + longitude: -82.36666666666666, + }, + }, + { + id: 'America/Hermosillo', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Sonora', + latitude: 29.066666666666666, + longitude: -110.96666666666667, + }, + }, + { + id: 'America/Indiana/Indianapolis', + aliases: [ + 'America/Fort_Wayne', + 'America/Indianapolis', + 'US/East-Indiana', + ], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - IN (most areas)', + latitude: 39.76833333333333, + longitude: -86.15805555555555, + }, + }, + { + id: 'America/Indiana/Knox', + aliases: ['America/Knox_IN', 'US/Indiana-Starke'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central - IN (Starke)', + latitude: 41.295833333333334, + longitude: -86.625, + }, + }, + { + id: 'America/Indiana/Marengo', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - IN (Crawford)', + latitude: 38.37555555555556, + longitude: -86.34472222222222, + }, + }, + { + id: 'America/Indiana/Petersburg', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - IN (Pike)', + latitude: 38.49194444444444, + longitude: -87.2786111111111, + }, + }, + { + id: 'America/Indiana/Tell_City', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central - IN (Perry)', + latitude: 37.95305555555556, + longitude: -86.76138888888889, + }, + }, + { + id: 'America/Indiana/Vevay', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - IN (Switzerland)', + latitude: 38.74777777777778, + longitude: -85.06722222222223, + }, + }, + { + id: 'America/Indiana/Vincennes', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - IN (Da, Du, K, Mn)', + latitude: 38.67722222222222, + longitude: -87.5286111111111, + }, + }, + { + id: 'America/Indiana/Winamac', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - IN (Pulaski)', + latitude: 41.05138888888889, + longitude: -86.60305555555556, + }, + }, + { + id: 'America/Inuvik', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Mountain - NT (west)', + latitude: 68.34972222222223, + longitude: -133.71666666666667, + }, + }, + { + id: 'America/Iqaluit', + aliases: ['America/Pangnirtung'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Eastern - NU (most areas)', + latitude: 63.733333333333334, + longitude: -68.46666666666667, + }, + }, + { + id: 'America/Jamaica', + aliases: ['Jamaica'], + location: { + countryCode: 'JM', + countryName: 'Jamaica', + comment: '', + latitude: 17.968055555555555, + longitude: -76.79333333333334, + }, + }, + { + id: 'America/Juneau', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska - Juneau area', + latitude: 58.301944444444445, + longitude: -134.41972222222222, + }, + }, + { + id: 'America/Kentucky/Louisville', + aliases: ['America/Louisville'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - KY (Louisville area)', + latitude: 38.25416666666667, + longitude: -85.75944444444444, + }, + }, + { + id: 'America/Kentucky/Monticello', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern - KY (Wayne)', + latitude: 36.82972222222222, + longitude: -84.84916666666666, + }, + }, + { + id: 'America/La_Paz', + aliases: [], + location: { + countryCode: 'BO', + countryName: 'Bolivia', + comment: '', + latitude: -16.5, + longitude: -68.15, + }, + }, + { + id: 'America/Lima', + aliases: [], + location: { + countryCode: 'PE', + countryName: 'Peru', + comment: '', + latitude: -12.05, + longitude: -77.05, + }, + }, + { + id: 'America/Los_Angeles', + aliases: ['PST8PDT', 'US/Pacific'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Pacific', + latitude: 34.05222222222222, + longitude: -118.24277777777777, + }, + }, + { + id: 'America/Maceio', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Alagoas, Sergipe', + latitude: -9.666666666666666, + longitude: -35.71666666666667, + }, + }, + { + id: 'America/Managua', + aliases: [], + location: { + countryCode: 'NI', + countryName: 'Nicaragua', + comment: '', + latitude: 12.15, + longitude: -86.28333333333333, + }, + }, + { + id: 'America/Manaus', + aliases: ['Brazil/West'], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Amazonas (east)', + latitude: -3.1333333333333333, + longitude: -60.016666666666666, + }, + }, + { + id: 'America/Martinique', + aliases: [], + location: { + countryCode: 'MQ', + countryName: 'Martinique', + comment: '', + latitude: 14.6, + longitude: -61.083333333333336, + }, + }, + { + id: 'America/Matamoros', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Coahuila, Nuevo Leon, Tamaulipas (US border)', + latitude: 25.833333333333332, + longitude: -97.5, + }, + }, + { + id: 'America/Mazatlan', + aliases: ['Mexico/BajaSur'], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Baja California Sur, Nayarit (most areas), Sinaloa', + latitude: 23.216666666666665, + longitude: -106.41666666666667, + }, + }, + { + id: 'America/Menominee', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central - MI (Wisconsin border)', + latitude: 45.10777777777778, + longitude: -87.61416666666666, + }, + }, + { + id: 'America/Merida', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Campeche, Yucatan', + latitude: 20.966666666666665, + longitude: -89.61666666666666, + }, + }, + { + id: 'America/Metlakatla', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska - Annette Island', + latitude: 55.12694444444445, + longitude: -131.57638888888889, + }, + }, + { + id: 'America/Mexico_City', + aliases: ['Mexico/General'], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Central Mexico', + latitude: 19.4, + longitude: -99.15, + }, + }, + { + id: 'America/Miquelon', + aliases: [], + location: { + countryCode: 'PM', + countryName: 'St Pierre \u0026 Miquelon', + comment: '', + latitude: 47.05, + longitude: -56.333333333333336, + }, + }, + { + id: 'America/Moncton', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Atlantic - New Brunswick', + latitude: 46.1, + longitude: -64.78333333333333, + }, + }, + { + id: 'America/Monterrey', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas)', + latitude: 25.666666666666668, + longitude: -100.31666666666666, + }, + }, + { + id: 'America/Montevideo', + aliases: [], + location: { + countryCode: 'UY', + countryName: 'Uruguay', + comment: '', + latitude: -34.909166666666664, + longitude: -56.2125, + }, + }, + { + id: 'America/New_York', + aliases: ['EST5EDT', 'US/Eastern'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Eastern (most areas)', + latitude: 40.714166666666664, + longitude: -74.00638888888889, + }, + }, + { + id: 'America/Nome', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska (west)', + latitude: 64.50111111111111, + longitude: -165.4063888888889, + }, + }, + { + id: 'America/Noronha', + aliases: ['Brazil/DeNoronha'], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Atlantic islands', + latitude: -3.85, + longitude: -32.416666666666664, + }, + }, + { + id: 'America/North_Dakota/Beulah', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central - ND (Mercer)', + latitude: 47.26416666666667, + longitude: -101.77777777777777, + }, + }, + { + id: 'America/North_Dakota/Center', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central - ND (Oliver)', + latitude: 47.11638888888889, + longitude: -101.29916666666666, + }, + }, + { + id: 'America/North_Dakota/New_Salem', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Central - ND (Morton rural)', + latitude: 46.845, + longitude: -101.41083333333333, + }, + }, + { + id: 'America/Nuuk', + aliases: ['America/Godthab'], + location: { + countryCode: 'GL', + countryName: 'Greenland', + comment: 'most of Greenland', + latitude: 64.18333333333334, + longitude: -51.733333333333334, + }, + }, + { + id: 'America/Ojinaga', + aliases: [], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Chihuahua (US border - east)', + latitude: 29.566666666666666, + longitude: -104.41666666666667, + }, + }, + { + id: 'America/Panama', + aliases: [ + 'America/Atikokan', + 'America/Cayman', + 'America/Coral_Harbour', + 'EST', + ], + location: { + countryCode: 'PA', + countryName: 'Panama', + comment: '', + latitude: 8.966666666666667, + longitude: -79.53333333333333, + }, + }, + { + id: 'America/Paramaribo', + aliases: [], + location: { + countryCode: 'SR', + countryName: 'Suriname', + comment: '', + latitude: 5.833333333333333, + longitude: -55.166666666666664, + }, + }, + { + id: 'America/Phoenix', + aliases: ['America/Creston', 'MST', 'US/Arizona'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'MST - AZ (except Navajo)', + latitude: 33.44833333333333, + longitude: -112.07333333333334, + }, + }, + { + id: 'America/Port-au-Prince', + aliases: [], + location: { + countryCode: 'HT', + countryName: 'Haiti', + comment: '', + latitude: 18.533333333333335, + longitude: -72.33333333333333, + }, + }, + { + id: 'America/Porto_Velho', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Rondonia', + latitude: -8.766666666666667, + longitude: -63.9, + }, + }, + { + id: 'America/Puerto_Rico', + aliases: [ + 'America/Anguilla', + 'America/Antigua', + 'America/Aruba', + 'America/Blanc-Sablon', + 'America/Curacao', + 'America/Dominica', + 'America/Grenada', + 'America/Guadeloupe', + 'America/Kralendijk', + 'America/Lower_Princes', + 'America/Marigot', + 'America/Montserrat', + 'America/Port_of_Spain', + 'America/St_Barthelemy', + 'America/St_Kitts', + 'America/St_Lucia', + 'America/St_Thomas', + 'America/St_Vincent', + 'America/Tortola', + 'America/Virgin', + ], + location: { + countryCode: 'PR', + countryName: 'Puerto Rico', + comment: '', + latitude: 18.468333333333334, + longitude: -66.1061111111111, + }, + }, + { + id: 'America/Punta_Arenas', + aliases: [], + location: { + countryCode: 'CL', + countryName: 'Chile', + comment: 'Magallanes Region', + latitude: -53.15, + longitude: -70.91666666666667, + }, + }, + { + id: 'America/Rankin_Inlet', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Central - NU (central)', + latitude: 62.81666666666667, + longitude: -92.08305555555556, + }, + }, + { + id: 'America/Recife', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Pernambuco', + latitude: -8.05, + longitude: -34.9, + }, + }, + { + id: 'America/Regina', + aliases: ['Canada/Saskatchewan'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'CST - SK (most areas)', + latitude: 50.4, + longitude: -104.65, + }, + }, + { + id: 'America/Resolute', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Central - NU (Resolute)', + latitude: 74.69555555555556, + longitude: -94.82916666666667, + }, + }, + { + id: 'America/Rio_Branco', + aliases: ['America/Porto_Acre', 'Brazil/Acre'], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Acre', + latitude: -9.966666666666667, + longitude: -67.8, + }, + }, + { + id: 'America/Santarem', + aliases: [], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Para (west)', + latitude: -2.433333333333333, + longitude: -54.86666666666667, + }, + }, + { + id: 'America/Santiago', + aliases: ['Chile/Continental'], + location: { + countryCode: 'CL', + countryName: 'Chile', + comment: 'most of Chile', + latitude: -33.45, + longitude: -70.66666666666667, + }, + }, + { + id: 'America/Santo_Domingo', + aliases: [], + location: { + countryCode: 'DO', + countryName: 'Dominican Republic', + comment: '', + latitude: 18.466666666666665, + longitude: -69.9, + }, + }, + { + id: 'America/Sao_Paulo', + aliases: ['Brazil/East'], + location: { + countryCode: 'BR', + countryName: 'Brazil', + comment: 'Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)', + latitude: -23.533333333333335, + longitude: -46.61666666666667, + }, + }, + { + id: 'America/Scoresbysund', + aliases: [], + location: { + countryCode: 'GL', + countryName: 'Greenland', + comment: 'Scoresbysund/Ittoqqortoormiit', + latitude: 70.48333333333333, + longitude: -21.966666666666665, + }, + }, + { + id: 'America/Sitka', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska - Sitka area', + latitude: 57.17638888888889, + longitude: -135.30194444444444, + }, + }, + { + id: 'America/St_Johns', + aliases: ['Canada/Newfoundland'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Newfoundland, Labrador (SE)', + latitude: 47.56666666666667, + longitude: -52.71666666666667, + }, + }, + { + id: 'America/Swift_Current', + aliases: [], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'CST - SK (midwest)', + latitude: 50.28333333333333, + longitude: -107.83333333333333, + }, + }, + { + id: 'America/Tegucigalpa', + aliases: [], + location: { + countryCode: 'HN', + countryName: 'Honduras', + comment: '', + latitude: 14.1, + longitude: -87.21666666666667, + }, + }, + { + id: 'America/Thule', + aliases: [], + location: { + countryCode: 'GL', + countryName: 'Greenland', + comment: 'Thule/Pituffik', + latitude: 76.56666666666666, + longitude: -68.78333333333333, + }, + }, + { + id: 'America/Tijuana', + aliases: ['America/Ensenada', 'America/Santa_Isabel', 'Mexico/BajaNorte'], + location: { + countryCode: 'MX', + countryName: 'Mexico', + comment: 'Baja California', + latitude: 32.53333333333333, + longitude: -117.01666666666667, + }, + }, + { + id: 'America/Toronto', + aliases: [ + 'America/Montreal', + 'America/Nassau', + 'America/Nipigon', + 'America/Thunder_Bay', + 'Canada/Eastern', + ], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Eastern - ON \u0026 QC (most areas)', + latitude: 43.65, + longitude: -79.38333333333334, + }, + }, + { + id: 'America/Vancouver', + aliases: ['Canada/Pacific'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Pacific - BC (most areas)', + latitude: 49.266666666666666, + longitude: -123.11666666666666, + }, + }, + { + id: 'America/Whitehorse', + aliases: ['Canada/Yukon'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'MST - Yukon (east)', + latitude: 60.71666666666667, + longitude: -135.05, + }, + }, + { + id: 'America/Winnipeg', + aliases: ['America/Rainy_River', 'Canada/Central'], + location: { + countryCode: 'CA', + countryName: 'Canada', + comment: 'Central - ON (west), Manitoba', + latitude: 49.88333333333333, + longitude: -97.15, + }, + }, + { + id: 'America/Yakutat', + aliases: [], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Alaska - Yakutat', + latitude: 59.54694444444444, + longitude: -139.72722222222222, + }, + }, + { + id: 'Antarctica/Casey', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Casey', + latitude: -66.28333333333333, + longitude: 110.51666666666667, + }, + }, + { + id: 'Antarctica/Davis', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Davis', + latitude: -68.58333333333333, + longitude: 77.96666666666667, + }, + }, + { + id: 'Antarctica/Macquarie', + aliases: [], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Macquarie Island', + latitude: -54.5, + longitude: 158.95, + }, + }, + { + id: 'Antarctica/Mawson', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Mawson', + latitude: -67.6, + longitude: 62.88333333333333, + }, + }, + { + id: 'Antarctica/Palmer', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Palmer', + latitude: -64.8, + longitude: -64.1, + }, + }, + { + id: 'Antarctica/Rothera', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Rothera', + latitude: -67.56666666666666, + longitude: -68.13333333333334, + }, + }, + { + id: 'Antarctica/Troll', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Troll', + latitude: -72.01138888888889, + longitude: 2.535, + }, + }, + { + id: 'Antarctica/Vostok', + aliases: [], + location: { + countryCode: 'AQ', + countryName: 'Antarctica', + comment: 'Vostok', + latitude: -78.4, + longitude: 106.9, + }, + }, + { + id: 'Asia/Almaty', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'most of Kazakhstan', + latitude: 43.25, + longitude: 76.95, + }, + }, + { + id: 'Asia/Amman', + aliases: [], + location: { + countryCode: 'JO', + countryName: 'Jordan', + comment: '', + latitude: 31.95, + longitude: 35.93333333333333, + }, + }, + { + id: 'Asia/Anadyr', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B09 - Bering Sea', + latitude: 64.75, + longitude: 177.48333333333332, + }, + }, + { + id: 'Asia/Aqtau', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'Mangghystau/Mankistau', + latitude: 44.516666666666666, + longitude: 50.266666666666666, + }, + }, + { + id: 'Asia/Aqtobe', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'Aqtobe/Aktobe', + latitude: 50.28333333333333, + longitude: 57.166666666666664, + }, + }, + { + id: 'Asia/Ashgabat', + aliases: ['Asia/Ashkhabad'], + location: { + countryCode: 'TM', + countryName: 'Turkmenistan', + comment: '', + latitude: 37.95, + longitude: 58.38333333333333, + }, + }, + { + id: 'Asia/Atyrau', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'Atyrau/Atirau/Gur\u0027yev', + latitude: 47.11666666666667, + longitude: 51.93333333333333, + }, + }, + { + id: 'Asia/Baghdad', + aliases: [], + location: { + countryCode: 'IQ', + countryName: 'Iraq', + comment: '', + latitude: 33.35, + longitude: 44.416666666666664, + }, + }, + { + id: 'Asia/Baku', + aliases: [], + location: { + countryCode: 'AZ', + countryName: 'Azerbaijan', + comment: '', + latitude: 40.38333333333333, + longitude: 49.85, + }, + }, + { + id: 'Asia/Bangkok', + aliases: ['Asia/Phnom_Penh', 'Asia/Vientiane', 'Indian/Christmas'], + location: { + countryCode: 'TH', + countryName: 'Thailand', + comment: '', + latitude: 13.75, + longitude: 100.51666666666667, + }, + }, + { + id: 'Asia/Barnaul', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B04 - Altai', + latitude: 53.36666666666667, + longitude: 83.75, + }, + }, + { + id: 'Asia/Beirut', + aliases: [], + location: { + countryCode: 'LB', + countryName: 'Lebanon', + comment: '', + latitude: 33.88333333333333, + longitude: 35.5, + }, + }, + { + id: 'Asia/Bishkek', + aliases: [], + location: { + countryCode: 'KG', + countryName: 'Kyrgyzstan', + comment: '', + latitude: 42.9, + longitude: 74.6, + }, + }, + { + id: 'Asia/Chita', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B06 - Zabaykalsky', + latitude: 52.05, + longitude: 113.46666666666667, + }, + }, + { + id: 'Asia/Colombo', + aliases: [], + location: { + countryCode: 'LK', + countryName: 'Sri Lanka', + comment: '', + latitude: 6.933333333333334, + longitude: 79.85, + }, + }, + { + id: 'Asia/Damascus', + aliases: [], + location: { + countryCode: 'SY', + countryName: 'Syria', + comment: '', + latitude: 33.5, + longitude: 36.3, + }, + }, + { + id: 'Asia/Dhaka', + aliases: ['Asia/Dacca'], + location: { + countryCode: 'BD', + countryName: 'Bangladesh', + comment: '', + latitude: 23.716666666666665, + longitude: 90.41666666666667, + }, + }, + { + id: 'Asia/Dili', + aliases: [], + location: { + countryCode: 'TL', + countryName: 'East Timor', + comment: '', + latitude: -8.55, + longitude: 125.58333333333333, + }, + }, + { + id: 'Asia/Dubai', + aliases: ['Asia/Muscat', 'Indian/Mahe', 'Indian/Reunion'], + location: { + countryCode: 'AE', + countryName: 'United Arab Emirates', + comment: '', + latitude: 25.3, + longitude: 55.3, + }, + }, + { + id: 'Asia/Dushanbe', + aliases: [], + location: { + countryCode: 'TJ', + countryName: 'Tajikistan', + comment: '', + latitude: 38.583333333333336, + longitude: 68.8, + }, + }, + { + id: 'Asia/Famagusta', + aliases: [], + location: { + countryCode: 'CY', + countryName: 'Cyprus', + comment: 'Northern Cyprus', + latitude: 35.11666666666667, + longitude: 33.95, + }, + }, + { + id: 'Asia/Gaza', + aliases: [], + location: { + countryCode: 'PS', + countryName: 'Palestine', + comment: 'Gaza Strip', + latitude: 31.5, + longitude: 34.46666666666667, + }, + }, + { + id: 'Asia/Hebron', + aliases: [], + location: { + countryCode: 'PS', + countryName: 'Palestine', + comment: 'West Bank', + latitude: 31.533333333333335, + longitude: 35.095, + }, + }, + { + id: 'Asia/Ho_Chi_Minh', + aliases: ['Asia/Saigon'], + location: { + countryCode: 'VN', + countryName: 'Vietnam', + comment: '', + latitude: 10.75, + longitude: 106.66666666666667, + }, + }, + { + id: 'Asia/Hong_Kong', + aliases: ['Hongkong'], + location: { + countryCode: 'HK', + countryName: 'Hong Kong', + comment: '', + latitude: 22.283333333333335, + longitude: 114.15, + }, + }, + { + id: 'Asia/Hovd', + aliases: [], + location: { + countryCode: 'MN', + countryName: 'Mongolia', + comment: 'Bayan-Olgii, Hovd, Uvs', + latitude: 48.016666666666666, + longitude: 91.65, + }, + }, + { + id: 'Asia/Irkutsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B05 - Irkutsk, Buryatia', + latitude: 52.266666666666666, + longitude: 104.33333333333333, + }, + }, + { + id: 'Asia/Jakarta', + aliases: [], + location: { + countryCode: 'ID', + countryName: 'Indonesia', + comment: 'Java, Sumatra', + latitude: -6.166666666666667, + longitude: 106.8, + }, + }, + { + id: 'Asia/Jayapura', + aliases: [], + location: { + countryCode: 'ID', + countryName: 'Indonesia', + comment: 'New Guinea (West Papua / Irian Jaya), Malukus/Moluccas', + latitude: -2.533333333333333, + longitude: 140.7, + }, + }, + { + id: 'Asia/Jerusalem', + aliases: ['Asia/Tel_Aviv', 'Israel'], + location: { + countryCode: 'IL', + countryName: 'Israel', + comment: '', + latitude: 31.780555555555555, + longitude: 35.22388888888889, + }, + }, + { + id: 'Asia/Kabul', + aliases: [], + location: { + countryCode: 'AF', + countryName: 'Afghanistan', + comment: '', + latitude: 34.516666666666666, + longitude: 69.2, + }, + }, + { + id: 'Asia/Kamchatka', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B09 - Kamchatka', + latitude: 53.016666666666666, + longitude: 158.65, + }, + }, + { + id: 'Asia/Karachi', + aliases: [], + location: { + countryCode: 'PK', + countryName: 'Pakistan', + comment: '', + latitude: 24.866666666666667, + longitude: 67.05, + }, + }, + { + id: 'Asia/Kathmandu', + aliases: ['Asia/Katmandu'], + location: { + countryCode: 'NP', + countryName: 'Nepal', + comment: '', + latitude: 27.716666666666665, + longitude: 85.31666666666666, + }, + }, + { + id: 'Asia/Khandyga', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B06 - Tomponsky, Ust-Maysky', + latitude: 62.65638888888889, + longitude: 135.55388888888888, + }, + }, + { + id: 'Asia/Kolkata', + aliases: ['Asia/Calcutta'], + location: { + countryCode: 'IN', + countryName: 'India', + comment: '', + latitude: 22.533333333333335, + longitude: 88.36666666666666, + }, + }, + { + id: 'Asia/Krasnoyarsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B04 - Krasnoyarsk area', + latitude: 56.016666666666666, + longitude: 92.83333333333333, + }, + }, + { + id: 'Asia/Kuching', + aliases: ['Asia/Brunei'], + location: { + countryCode: 'MY', + countryName: 'Malaysia', + comment: 'Sabah, Sarawak', + latitude: 1.55, + longitude: 110.33333333333333, + }, + }, + { + id: 'Asia/Macau', + aliases: ['Asia/Macao'], + location: { + countryCode: 'MO', + countryName: 'Macau', + comment: '', + latitude: 22.197222222222223, + longitude: 113.54166666666667, + }, + }, + { + id: 'Asia/Magadan', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B08 - Magadan', + latitude: 59.56666666666667, + longitude: 150.8, + }, + }, + { + id: 'Asia/Makassar', + aliases: ['Asia/Ujung_Pandang'], + location: { + countryCode: 'ID', + countryName: 'Indonesia', + comment: + 'Borneo (east, south), Sulawesi/Celebes, Bali, Nusa Tengarra, Timor (west)', + latitude: -5.116666666666666, + longitude: 119.4, + }, + }, + { + id: 'Asia/Manila', + aliases: [], + location: { + countryCode: 'PH', + countryName: 'Philippines', + comment: '', + latitude: 14.586666666666666, + longitude: 120.96777777777778, + }, + }, + { + id: 'Asia/Nicosia', + aliases: ['Europe/Nicosia'], + location: { + countryCode: 'CY', + countryName: 'Cyprus', + comment: 'most of Cyprus', + latitude: 35.166666666666664, + longitude: 33.36666666666667, + }, + }, + { + id: 'Asia/Novokuznetsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B04 - Kemerovo', + latitude: 53.75, + longitude: 87.11666666666666, + }, + }, + { + id: 'Asia/Novosibirsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B04 - Novosibirsk', + latitude: 55.03333333333333, + longitude: 82.91666666666667, + }, + }, + { + id: 'Asia/Omsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B03 - Omsk', + latitude: 55, + longitude: 73.4, + }, + }, + { + id: 'Asia/Oral', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'West Kazakhstan', + latitude: 51.21666666666667, + longitude: 51.35, + }, + }, + { + id: 'Asia/Pontianak', + aliases: [], + location: { + countryCode: 'ID', + countryName: 'Indonesia', + comment: 'Borneo (west, central)', + latitude: -0.03333333333333333, + longitude: 109.33333333333333, + }, + }, + { + id: 'Asia/Pyongyang', + aliases: [], + location: { + countryCode: 'KP', + countryName: 'Korea (North)', + comment: '', + latitude: 39.016666666666666, + longitude: 125.75, + }, + }, + { + id: 'Asia/Qatar', + aliases: ['Asia/Bahrain'], + location: { + countryCode: 'QA', + countryName: 'Qatar', + comment: '', + latitude: 25.283333333333335, + longitude: 51.53333333333333, + }, + }, + { + id: 'Asia/Qostanay', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'Qostanay/Kostanay/Kustanay', + latitude: 53.2, + longitude: 63.61666666666667, + }, + }, + { + id: 'Asia/Qyzylorda', + aliases: [], + location: { + countryCode: 'KZ', + countryName: 'Kazakhstan', + comment: 'Qyzylorda/Kyzylorda/Kzyl-Orda', + latitude: 44.8, + longitude: 65.46666666666667, + }, + }, + { + id: 'Asia/Riyadh', + aliases: ['Antarctica/Syowa', 'Asia/Aden', 'Asia/Kuwait'], + location: { + countryCode: 'SA', + countryName: 'Saudi Arabia', + comment: '', + latitude: 24.633333333333333, + longitude: 46.71666666666667, + }, + }, + { + id: 'Asia/Sakhalin', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B08 - Sakhalin Island', + latitude: 46.96666666666667, + longitude: 142.7, + }, + }, + { + id: 'Asia/Samarkand', + aliases: [], + location: { + countryCode: 'UZ', + countryName: 'Uzbekistan', + comment: 'Uzbekistan (west)', + latitude: 39.666666666666664, + longitude: 66.8, + }, + }, + { + id: 'Asia/Seoul', + aliases: ['ROK'], + location: { + countryCode: 'KR', + countryName: 'Korea (South)', + comment: '', + latitude: 37.55, + longitude: 126.96666666666667, + }, + }, + { + id: 'Asia/Shanghai', + aliases: ['Asia/Chongqing', 'Asia/Chungking', 'Asia/Harbin', 'PRC'], + location: { + countryCode: 'CN', + countryName: 'China', + comment: 'Beijing Time', + latitude: 31.233333333333334, + longitude: 121.46666666666667, + }, + }, + { + id: 'Asia/Singapore', + aliases: ['Asia/Kuala_Lumpur', 'Singapore'], + location: { + countryCode: 'SG', + countryName: 'Singapore', + comment: '', + latitude: 1.2833333333333334, + longitude: 103.85, + }, + }, + { + id: 'Asia/Srednekolymsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B08 - Sakha (E), N Kuril Is', + latitude: 67.46666666666667, + longitude: 153.71666666666667, + }, + }, + { + id: 'Asia/Taipei', + aliases: ['ROC'], + location: { + countryCode: 'TW', + countryName: 'Taiwan', + comment: '', + latitude: 25.05, + longitude: 121.5, + }, + }, + { + id: 'Asia/Tashkent', + aliases: [], + location: { + countryCode: 'UZ', + countryName: 'Uzbekistan', + comment: 'Uzbekistan (east)', + latitude: 41.333333333333336, + longitude: 69.3, + }, + }, + { + id: 'Asia/Tbilisi', + aliases: [], + location: { + countryCode: 'GE', + countryName: 'Georgia', + comment: '', + latitude: 41.71666666666667, + longitude: 44.81666666666667, + }, + }, + { + id: 'Asia/Tehran', + aliases: ['Iran'], + location: { + countryCode: 'IR', + countryName: 'Iran', + comment: '', + latitude: 35.666666666666664, + longitude: 51.43333333333333, + }, + }, + { + id: 'Asia/Thimphu', + aliases: ['Asia/Thimbu'], + location: { + countryCode: 'BT', + countryName: 'Bhutan', + comment: '', + latitude: 27.466666666666665, + longitude: 89.65, + }, + }, + { + id: 'Asia/Tokyo', + aliases: ['Japan'], + location: { + countryCode: 'JP', + countryName: 'Japan', + comment: '', + latitude: 35.654444444444444, + longitude: 139.7447222222222, + }, + }, + { + id: 'Asia/Tomsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B04 - Tomsk', + latitude: 56.5, + longitude: 84.96666666666667, + }, + }, + { + id: 'Asia/Ulaanbaatar', + aliases: ['Asia/Choibalsan', 'Asia/Ulan_Bator'], + location: { + countryCode: 'MN', + countryName: 'Mongolia', + comment: 'most of Mongolia', + latitude: 47.916666666666664, + longitude: 106.88333333333334, + }, + }, + { + id: 'Asia/Urumqi', + aliases: ['Asia/Kashgar'], + location: { + countryCode: 'CN', + countryName: 'China', + comment: 'Xinjiang Time', + latitude: 43.8, + longitude: 87.58333333333333, + }, + }, + { + id: 'Asia/Ust-Nera', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B07 - Oymyakonsky', + latitude: 64.56027777777778, + longitude: 143.22666666666666, + }, + }, + { + id: 'Asia/Vladivostok', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B07 - Amur River', + latitude: 43.166666666666664, + longitude: 131.93333333333334, + }, + }, + { + id: 'Asia/Yakutsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B06 - Lena River', + latitude: 62, + longitude: 129.66666666666666, + }, + }, + { + id: 'Asia/Yangon', + aliases: ['Asia/Rangoon', 'Indian/Cocos'], + location: { + countryCode: 'MM', + countryName: 'Myanmar (Burma)', + comment: '', + latitude: 16.783333333333335, + longitude: 96.16666666666667, + }, + }, + { + id: 'Asia/Yekaterinburg', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B02 - Urals', + latitude: 56.85, + longitude: 60.6, + }, + }, + { + id: 'Asia/Yerevan', + aliases: [], + location: { + countryCode: 'AM', + countryName: 'Armenia', + comment: '', + latitude: 40.18333333333333, + longitude: 44.5, + }, + }, + { + id: 'Atlantic/Azores', + aliases: [], + location: { + countryCode: 'PT', + countryName: 'Portugal', + comment: 'Azores', + latitude: 37.733333333333334, + longitude: -25.666666666666668, + }, + }, + { + id: 'Atlantic/Bermuda', + aliases: [], + location: { + countryCode: 'BM', + countryName: 'Bermuda', + comment: '', + latitude: 32.28333333333333, + longitude: -64.76666666666667, + }, + }, + { + id: 'Atlantic/Canary', + aliases: [], + location: { + countryCode: 'ES', + countryName: 'Spain', + comment: 'Canary Islands', + latitude: 28.1, + longitude: -15.4, + }, + }, + { + id: 'Atlantic/Cape_Verde', + aliases: [], + location: { + countryCode: 'CV', + countryName: 'Cape Verde', + comment: '', + latitude: 14.916666666666666, + longitude: -23.516666666666666, + }, + }, + { + id: 'Atlantic/Faroe', + aliases: ['Atlantic/Faeroe'], + location: { + countryCode: 'FO', + countryName: 'Faroe Islands', + comment: '', + latitude: 62.016666666666666, + longitude: -6.766666666666667, + }, + }, + { + id: 'Atlantic/Madeira', + aliases: [], + location: { + countryCode: 'PT', + countryName: 'Portugal', + comment: 'Madeira Islands', + latitude: 32.63333333333333, + longitude: -16.9, + }, + }, + { + id: 'Atlantic/South_Georgia', + aliases: [], + location: { + countryCode: 'GS', + countryName: 'South Georgia \u0026 the South Sandwich Islands', + comment: '', + latitude: -54.266666666666666, + longitude: -36.53333333333333, + }, + }, + { + id: 'Atlantic/Stanley', + aliases: [], + location: { + countryCode: 'FK', + countryName: 'Falkland Islands', + comment: '', + latitude: -51.7, + longitude: -57.85, + }, + }, + { + id: 'Australia/Adelaide', + aliases: ['Australia/South'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'South Australia', + latitude: -34.916666666666664, + longitude: 138.58333333333334, + }, + }, + { + id: 'Australia/Brisbane', + aliases: ['Australia/Queensland'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Queensland (most areas)', + latitude: -27.466666666666665, + longitude: 153.03333333333333, + }, + }, + { + id: 'Australia/Broken_Hill', + aliases: ['Australia/Yancowinna'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'New South Wales (Yancowinna)', + latitude: -31.95, + longitude: 141.45, + }, + }, + { + id: 'Australia/Darwin', + aliases: ['Australia/North'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Northern Territory', + latitude: -12.466666666666667, + longitude: 130.83333333333334, + }, + }, + { + id: 'Australia/Eucla', + aliases: [], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Western Australia (Eucla)', + latitude: -31.716666666666665, + longitude: 128.86666666666667, + }, + }, + { + id: 'Australia/Hobart', + aliases: ['Australia/Currie', 'Australia/Tasmania'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Tasmania', + latitude: -42.88333333333333, + longitude: 147.31666666666666, + }, + }, + { + id: 'Australia/Lindeman', + aliases: [], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Queensland (Whitsunday Islands)', + latitude: -20.266666666666666, + longitude: 149, + }, + }, + { + id: 'Australia/Lord_Howe', + aliases: ['Australia/LHI'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Lord Howe Island', + latitude: -31.55, + longitude: 159.08333333333334, + }, + }, + { + id: 'Australia/Melbourne', + aliases: ['Australia/Victoria'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Victoria', + latitude: -37.81666666666667, + longitude: 144.96666666666667, + }, + }, + { + id: 'Australia/Perth', + aliases: ['Australia/West'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'Western Australia (most areas)', + latitude: -31.95, + longitude: 115.85, + }, + }, + { + id: 'Australia/Sydney', + aliases: ['Australia/ACT', 'Australia/Canberra', 'Australia/NSW'], + location: { + countryCode: 'AU', + countryName: 'Australia', + comment: 'New South Wales (most areas)', + latitude: -33.86666666666667, + longitude: 151.21666666666667, + }, + }, + { + id: 'Etc/GMT', + aliases: [ + 'Etc/GMT\u002B0', + 'Etc/GMT-0', + 'Etc/GMT0', + 'Etc/Greenwich', + 'GMT', + 'GMT\u002B0', + 'GMT-0', + 'GMT0', + 'Greenwich', + ], + location: null, + }, + { + id: 'Etc/GMT-1', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-10', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-11', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-12', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-13', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-14', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-2', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-3', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-4', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-5', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-6', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-7', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-8', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT-9', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B1', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B10', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B11', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B12', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B2', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B3', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B4', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B5', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B6', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B7', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B8', + aliases: [], + location: null, + }, + { + id: 'Etc/GMT\u002B9', + aliases: [], + location: null, + }, + { + id: 'Etc/UTC', + aliases: [ + 'Etc/UCT', + 'Etc/Universal', + 'Etc/Zulu', + 'UCT', + 'UTC', + 'Universal', + 'Zulu', + ], + location: null, + }, + { + id: 'Europe/Andorra', + aliases: [], + location: { + countryCode: 'AD', + countryName: 'Andorra', + comment: '', + latitude: 42.5, + longitude: 1.5166666666666666, + }, + }, + { + id: 'Europe/Astrakhan', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B01 - Astrakhan', + latitude: 46.35, + longitude: 48.05, + }, + }, + { + id: 'Europe/Athens', + aliases: ['EET'], + location: { + countryCode: 'GR', + countryName: 'Greece', + comment: '', + latitude: 37.96666666666667, + longitude: 23.716666666666665, + }, + }, + { + id: 'Europe/Belgrade', + aliases: [ + 'Europe/Ljubljana', + 'Europe/Podgorica', + 'Europe/Sarajevo', + 'Europe/Skopje', + 'Europe/Zagreb', + ], + location: { + countryCode: 'RS', + countryName: 'Serbia', + comment: '', + latitude: 44.833333333333336, + longitude: 20.5, + }, + }, + { + id: 'Europe/Berlin', + aliases: [ + 'Arctic/Longyearbyen', + 'Atlantic/Jan_Mayen', + 'Europe/Copenhagen', + 'Europe/Oslo', + 'Europe/Stockholm', + ], + location: { + countryCode: 'DE', + countryName: 'Germany', + comment: 'most of Germany', + latitude: 52.5, + longitude: 13.366666666666667, + }, + }, + { + id: 'Europe/Brussels', + aliases: ['CET', 'Europe/Amsterdam', 'Europe/Luxembourg', 'MET'], + location: { + countryCode: 'BE', + countryName: 'Belgium', + comment: '', + latitude: 50.833333333333336, + longitude: 4.333333333333333, + }, + }, + { + id: 'Europe/Bucharest', + aliases: [], + location: { + countryCode: 'RO', + countryName: 'Romania', + comment: '', + latitude: 44.43333333333333, + longitude: 26.1, + }, + }, + { + id: 'Europe/Budapest', + aliases: [], + location: { + countryCode: 'HU', + countryName: 'Hungary', + comment: '', + latitude: 47.5, + longitude: 19.083333333333332, + }, + }, + { + id: 'Europe/Chisinau', + aliases: ['Europe/Tiraspol'], + location: { + countryCode: 'MD', + countryName: 'Moldova', + comment: '', + latitude: 47, + longitude: 28.833333333333332, + }, + }, + { + id: 'Europe/Dublin', + aliases: ['Eire'], + location: { + countryCode: 'IE', + countryName: 'Ireland', + comment: '', + latitude: 53.333333333333336, + longitude: -6.25, + }, + }, + { + id: 'Europe/Gibraltar', + aliases: [], + location: { + countryCode: 'GI', + countryName: 'Gibraltar', + comment: '', + latitude: 36.13333333333333, + longitude: -5.35, + }, + }, + { + id: 'Europe/Helsinki', + aliases: ['Europe/Mariehamn'], + location: { + countryCode: 'FI', + countryName: 'Finland', + comment: '', + latitude: 60.166666666666664, + longitude: 24.966666666666665, + }, + }, + { + id: 'Europe/Istanbul', + aliases: ['Asia/Istanbul', 'Turkey'], + location: { + countryCode: 'TR', + countryName: 'Turkey', + comment: '', + latitude: 41.016666666666666, + longitude: 28.966666666666665, + }, + }, + { + id: 'Europe/Kaliningrad', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK-01 - Kaliningrad', + latitude: 54.71666666666667, + longitude: 20.5, + }, + }, + { + id: 'Europe/Kirov', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B00 - Kirov', + latitude: 58.6, + longitude: 49.65, + }, + }, + { + id: 'Europe/Kyiv', + aliases: ['Europe/Kiev', 'Europe/Uzhgorod', 'Europe/Zaporozhye'], + location: { + countryCode: 'UA', + countryName: 'Ukraine', + comment: 'most of Ukraine', + latitude: 50.43333333333333, + longitude: 30.516666666666666, + }, + }, + { + id: 'Europe/Lisbon', + aliases: ['Portugal', 'WET'], + location: { + countryCode: 'PT', + countryName: 'Portugal', + comment: 'Portugal (mainland)', + latitude: 38.71666666666667, + longitude: -9.133333333333333, + }, + }, + { + id: 'Europe/London', + aliases: [ + 'Europe/Belfast', + 'Europe/Guernsey', + 'Europe/Isle_of_Man', + 'Europe/Jersey', + 'GB', + 'GB-Eire', + ], + location: { + countryCode: 'GB', + countryName: 'Britain (UK)', + comment: '', + latitude: 51.50833333333333, + longitude: -0.12527777777777777, + }, + }, + { + id: 'Europe/Madrid', + aliases: [], + location: { + countryCode: 'ES', + countryName: 'Spain', + comment: 'Spain (mainland)', + latitude: 40.4, + longitude: -3.683333333333333, + }, + }, + { + id: 'Europe/Malta', + aliases: [], + location: { + countryCode: 'MT', + countryName: 'Malta', + comment: '', + latitude: 35.9, + longitude: 14.516666666666667, + }, + }, + { + id: 'Europe/Minsk', + aliases: [], + location: { + countryCode: 'BY', + countryName: 'Belarus', + comment: '', + latitude: 53.9, + longitude: 27.566666666666666, + }, + }, + { + id: 'Europe/Moscow', + aliases: ['W-SU'], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B00 - Moscow area', + latitude: 55.755833333333335, + longitude: 37.617777777777775, + }, + }, + { + id: 'Europe/Paris', + aliases: ['Europe/Monaco'], + location: { + countryCode: 'FR', + countryName: 'France', + comment: '', + latitude: 48.86666666666667, + longitude: 2.3333333333333335, + }, + }, + { + id: 'Europe/Prague', + aliases: ['Europe/Bratislava'], + location: { + countryCode: 'CZ', + countryName: 'Czech Republic', + comment: '', + latitude: 50.083333333333336, + longitude: 14.433333333333334, + }, + }, + { + id: 'Europe/Riga', + aliases: [], + location: { + countryCode: 'LV', + countryName: 'Latvia', + comment: '', + latitude: 56.95, + longitude: 24.1, + }, + }, + { + id: 'Europe/Rome', + aliases: ['Europe/San_Marino', 'Europe/Vatican'], + location: { + countryCode: 'IT', + countryName: 'Italy', + comment: '', + latitude: 41.9, + longitude: 12.483333333333333, + }, + }, + { + id: 'Europe/Samara', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B01 - Samara, Udmurtia', + latitude: 53.2, + longitude: 50.15, + }, + }, + { + id: 'Europe/Saratov', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B01 - Saratov', + latitude: 51.56666666666667, + longitude: 46.03333333333333, + }, + }, + { + id: 'Europe/Simferopol', + aliases: [], + location: { + countryCode: 'UA', + countryName: 'Ukraine', + comment: 'Crimea', + latitude: 44.95, + longitude: 34.1, + }, + }, + { + id: 'Europe/Sofia', + aliases: [], + location: { + countryCode: 'BG', + countryName: 'Bulgaria', + comment: '', + latitude: 42.68333333333333, + longitude: 23.316666666666666, + }, + }, + { + id: 'Europe/Tallinn', + aliases: [], + location: { + countryCode: 'EE', + countryName: 'Estonia', + comment: '', + latitude: 59.416666666666664, + longitude: 24.75, + }, + }, + { + id: 'Europe/Tirane', + aliases: [], + location: { + countryCode: 'AL', + countryName: 'Albania', + comment: '', + latitude: 41.333333333333336, + longitude: 19.833333333333332, + }, + }, + { + id: 'Europe/Ulyanovsk', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B01 - Ulyanovsk', + latitude: 54.333333333333336, + longitude: 48.4, + }, + }, + { + id: 'Europe/Vienna', + aliases: [], + location: { + countryCode: 'AT', + countryName: 'Austria', + comment: '', + latitude: 48.21666666666667, + longitude: 16.333333333333332, + }, + }, + { + id: 'Europe/Vilnius', + aliases: [], + location: { + countryCode: 'LT', + countryName: 'Lithuania', + comment: '', + latitude: 54.68333333333333, + longitude: 25.316666666666666, + }, + }, + { + id: 'Europe/Volgograd', + aliases: [], + location: { + countryCode: 'RU', + countryName: 'Russia', + comment: 'MSK\u002B00 - Volgograd', + latitude: 48.733333333333334, + longitude: 44.416666666666664, + }, + }, + { + id: 'Europe/Warsaw', + aliases: ['Poland'], + location: { + countryCode: 'PL', + countryName: 'Poland', + comment: '', + latitude: 52.25, + longitude: 21, + }, + }, + { + id: 'Europe/Zurich', + aliases: ['Europe/Busingen', 'Europe/Vaduz'], + location: { + countryCode: 'CH', + countryName: 'Switzerland', + comment: '', + latitude: 47.38333333333333, + longitude: 8.533333333333333, + }, + }, + { + id: 'Indian/Chagos', + aliases: [], + location: { + countryCode: 'IO', + countryName: 'British Indian Ocean Territory', + comment: '', + latitude: -7.333333333333333, + longitude: 72.41666666666667, + }, + }, + { + id: 'Indian/Maldives', + aliases: ['Indian/Kerguelen'], + location: { + countryCode: 'MV', + countryName: 'Maldives', + comment: '', + latitude: 4.166666666666667, + longitude: 73.5, + }, + }, + { + id: 'Indian/Mauritius', + aliases: [], + location: { + countryCode: 'MU', + countryName: 'Mauritius', + comment: '', + latitude: -20.166666666666668, + longitude: 57.5, + }, + }, + { + id: 'Pacific/Apia', + aliases: [], + location: { + countryCode: 'WS', + countryName: 'Samoa (western)', + comment: '', + latitude: -13.833333333333334, + longitude: -171.73333333333332, + }, + }, + { + id: 'Pacific/Auckland', + aliases: ['Antarctica/McMurdo', 'Antarctica/South_Pole', 'NZ'], + location: { + countryCode: 'NZ', + countryName: 'New Zealand', + comment: 'most of New Zealand', + latitude: -36.86666666666667, + longitude: 174.76666666666668, + }, + }, + { + id: 'Pacific/Bougainville', + aliases: [], + location: { + countryCode: 'PG', + countryName: 'Papua New Guinea', + comment: 'Bougainville', + latitude: -6.216666666666667, + longitude: 155.56666666666666, + }, + }, + { + id: 'Pacific/Chatham', + aliases: ['NZ-CHAT'], + location: { + countryCode: 'NZ', + countryName: 'New Zealand', + comment: 'Chatham Islands', + latitude: -43.95, + longitude: -176.55, + }, + }, + { + id: 'Pacific/Easter', + aliases: ['Chile/EasterIsland'], + location: { + countryCode: 'CL', + countryName: 'Chile', + comment: 'Easter Island', + latitude: -27.15, + longitude: -109.43333333333334, + }, + }, + { + id: 'Pacific/Efate', + aliases: [], + location: { + countryCode: 'VU', + countryName: 'Vanuatu', + comment: '', + latitude: -17.666666666666668, + longitude: 168.41666666666666, + }, + }, + { + id: 'Pacific/Fakaofo', + aliases: [], + location: { + countryCode: 'TK', + countryName: 'Tokelau', + comment: '', + latitude: -9.366666666666667, + longitude: -171.23333333333332, + }, + }, + { + id: 'Pacific/Fiji', + aliases: [], + location: { + countryCode: 'FJ', + countryName: 'Fiji', + comment: '', + latitude: -18.133333333333333, + longitude: 178.41666666666666, + }, + }, + { + id: 'Pacific/Galapagos', + aliases: [], + location: { + countryCode: 'EC', + countryName: 'Ecuador', + comment: 'Galapagos Islands', + latitude: -0.9, + longitude: -89.6, + }, + }, + { + id: 'Pacific/Gambier', + aliases: [], + location: { + countryCode: 'PF', + countryName: 'French Polynesia', + comment: 'Gambier Islands', + latitude: -23.133333333333333, + longitude: -134.95, + }, + }, + { + id: 'Pacific/Guadalcanal', + aliases: ['Pacific/Pohnpei', 'Pacific/Ponape'], + location: { + countryCode: 'SB', + countryName: 'Solomon Islands', + comment: '', + latitude: -9.533333333333333, + longitude: 160.2, + }, + }, + { + id: 'Pacific/Guam', + aliases: ['Pacific/Saipan'], + location: { + countryCode: 'GU', + countryName: 'Guam', + comment: '', + latitude: 13.466666666666667, + longitude: 144.75, + }, + }, + { + id: 'Pacific/Honolulu', + aliases: ['HST', 'Pacific/Johnston', 'US/Hawaii'], + location: { + countryCode: 'US', + countryName: 'United States', + comment: 'Hawaii', + latitude: 21.306944444444444, + longitude: -157.85833333333332, + }, + }, + { + id: 'Pacific/Kanton', + aliases: ['Pacific/Enderbury'], + location: { + countryCode: 'KI', + countryName: 'Kiribati', + comment: 'Phoenix Islands', + latitude: -2.783333333333333, + longitude: -171.71666666666667, + }, + }, + { + id: 'Pacific/Kiritimati', + aliases: [], + location: { + countryCode: 'KI', + countryName: 'Kiribati', + comment: 'Line Islands', + latitude: 1.8666666666666667, + longitude: -157.33333333333334, + }, + }, + { + id: 'Pacific/Kosrae', + aliases: [], + location: { + countryCode: 'FM', + countryName: 'Micronesia', + comment: 'Kosrae', + latitude: 5.316666666666666, + longitude: 162.98333333333332, + }, + }, + { + id: 'Pacific/Kwajalein', + aliases: ['Kwajalein'], + location: { + countryCode: 'MH', + countryName: 'Marshall Islands', + comment: 'Kwajalein', + latitude: 9.083333333333334, + longitude: 167.33333333333334, + }, + }, + { + id: 'Pacific/Marquesas', + aliases: [], + location: { + countryCode: 'PF', + countryName: 'French Polynesia', + comment: 'Marquesas Islands', + latitude: -9, + longitude: -139.5, + }, + }, + { + id: 'Pacific/Nauru', + aliases: [], + location: { + countryCode: 'NR', + countryName: 'Nauru', + comment: '', + latitude: -0.5166666666666667, + longitude: 166.91666666666666, + }, + }, + { + id: 'Pacific/Niue', + aliases: [], + location: { + countryCode: 'NU', + countryName: 'Niue', + comment: '', + latitude: -19.016666666666666, + longitude: -169.91666666666666, + }, + }, + { + id: 'Pacific/Norfolk', + aliases: [], + location: { + countryCode: 'NF', + countryName: 'Norfolk Island', + comment: '', + latitude: -29.05, + longitude: 167.96666666666667, + }, + }, + { + id: 'Pacific/Noumea', + aliases: [], + location: { + countryCode: 'NC', + countryName: 'New Caledonia', + comment: '', + latitude: -22.266666666666666, + longitude: 166.45, + }, + }, + { + id: 'Pacific/Pago_Pago', + aliases: ['Pacific/Midway', 'Pacific/Samoa', 'US/Samoa'], + location: { + countryCode: 'AS', + countryName: 'Samoa (American)', + comment: '', + latitude: -14.266666666666667, + longitude: -170.7, + }, + }, + { + id: 'Pacific/Palau', + aliases: [], + location: { + countryCode: 'PW', + countryName: 'Palau', + comment: '', + latitude: 7.333333333333333, + longitude: 134.48333333333332, + }, + }, + { + id: 'Pacific/Pitcairn', + aliases: [], + location: { + countryCode: 'PN', + countryName: 'Pitcairn', + comment: '', + latitude: -25.066666666666666, + longitude: -130.08333333333334, + }, + }, + { + id: 'Pacific/Port_Moresby', + aliases: [ + 'Antarctica/DumontDUrville', + 'Pacific/Chuuk', + 'Pacific/Truk', + 'Pacific/Yap', + ], + location: { + countryCode: 'PG', + countryName: 'Papua New Guinea', + comment: 'most of Papua New Guinea', + latitude: -9.5, + longitude: 147.16666666666666, + }, + }, + { + id: 'Pacific/Rarotonga', + aliases: [], + location: { + countryCode: 'CK', + countryName: 'Cook Islands', + comment: '', + latitude: -21.233333333333334, + longitude: -159.76666666666668, + }, + }, + { + id: 'Pacific/Tahiti', + aliases: [], + location: { + countryCode: 'PF', + countryName: 'French Polynesia', + comment: 'Society Islands', + latitude: -17.533333333333335, + longitude: -149.56666666666666, + }, + }, + { + id: 'Pacific/Tarawa', + aliases: [ + 'Pacific/Funafuti', + 'Pacific/Majuro', + 'Pacific/Wake', + 'Pacific/Wallis', + ], + location: { + countryCode: 'KI', + countryName: 'Kiribati', + comment: 'Gilbert Islands', + latitude: 1.4166666666666667, + longitude: 173, + }, + }, + { + id: 'Pacific/Tongatapu', + aliases: [], + location: { + countryCode: 'TO', + countryName: 'Tonga', + comment: '', + latitude: -21.133333333333333, + longitude: -175.2, + }, + }, + ], +} as const; + +type TimeZoneIds = (typeof timezoneData)['zones'][number]['id']; +type TimeZoneAlias = (typeof timezoneData)['zones'][number]['aliases'][number]; +export type TimeZones = TimeZoneIds | TimeZoneAlias; + +export const timeZoneIds = timezoneData.zones.map((zone) => zone.id) as TimeZoneIds[]; +export const timeZoneAliases = timezoneData.zones.flatMap((zone) => zone.aliases) as TimeZoneAlias[]; +export const allTimeZones = [...timeZoneIds, ...timeZoneAliases] as const; \ No newline at end of file From 4cf5ce26ffc43f00e5bf69ef202581ac5792f6af Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 23 Jun 2025 10:44:26 +0200 Subject: [PATCH 126/136] feat(api): implement DELETE method for /api/user/me endpoint --- src/app/api/user/me/route.ts | 41 ++++++++++++++++++++++++++++++++++ src/app/api/user/me/swagger.ts | 21 +++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/app/api/user/me/route.ts b/src/app/api/user/me/route.ts index 5ba9792..dcd3bc3 100644 --- a/src/app/api/user/me/route.ts +++ b/src/app/api/user/me/route.ts @@ -8,6 +8,7 @@ import { import { FullUserResponseSchema } from '../validation'; import { ErrorResponseSchema, + SuccessResponseSchema, ZodErrorResponseSchema, } from '@/app/api/validation'; @@ -117,3 +118,43 @@ export const PATCH = auth(async function PATCH(req) { { status: 200 }, ); }); + +export const DELETE = auth(async function DELETE(req) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const dbUser = await prisma.user.findUnique({ + where: { + id: authCheck.user.id, + }, + }); + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User not found', + }, + { status: 404 }, + ); + + await prisma.user.delete({ + where: { + id: authCheck.user.id, + }, + }); + + return returnZodTypeCheckedResponse( + SuccessResponseSchema, + { + success: true, + message: 'User deleted successfully', + }, + { status: 200 }, + ); +}); \ No newline at end of file diff --git a/src/app/api/user/me/swagger.ts b/src/app/api/user/me/swagger.ts index e0a36a1..6a9e375 100644 --- a/src/app/api/user/me/swagger.ts +++ b/src/app/api/user/me/swagger.ts @@ -7,6 +7,7 @@ import { serverReturnedDataValidationErrorResponse, userNotFoundResponse, } from '@/lib/defaultApiResponses'; +import { SuccessResponseSchema } from '../../validation'; export default function registerSwaggerPaths(registry: OpenAPIRegistry) { registry.registerPath({ @@ -60,4 +61,24 @@ export default function registerSwaggerPaths(registry: OpenAPIRegistry) { }, tags: ['User'], }); + + registry.registerPath({ + method: 'delete', + path: '/api/user/me', + description: 'Delete the currently authenticated user', + responses: { + 200: { + description: 'User deleted successfully', + content: { + 'application/json': { + schema: SuccessResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + ...serverReturnedDataValidationErrorResponse, + }, + tags: ['User'], + }); } From 29f2a01ac69b47c80f520afc2e4df5f91eb40ca5 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Mon, 23 Jun 2025 10:45:56 +0200 Subject: [PATCH 127/136] style: format code --- src/app/api/user/me/password/route.ts | 5 ++++- src/app/api/user/me/route.ts | 2 +- src/app/api/user/me/validation.ts | 16 +++++++++------- src/app/api/user/validation.ts | 13 +++++++------ src/lib/timezones.ts | 10 +++++++--- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/app/api/user/me/password/route.ts b/src/app/api/user/me/password/route.ts index 03fb426..0b92559 100644 --- a/src/app/api/user/me/password/route.ts +++ b/src/app/api/user/me/password/route.ts @@ -65,7 +65,10 @@ export const PATCH = auth(async function PATCH(req) { { status: 400 }, ); - if (dbUser.accounts.length === 0 || dbUser.accounts[0].provider !== 'credentials') + if ( + dbUser.accounts.length === 0 || + dbUser.accounts[0].provider !== 'credentials' + ) return returnZodTypeCheckedResponse( ErrorResponseSchema, { diff --git a/src/app/api/user/me/route.ts b/src/app/api/user/me/route.ts index dcd3bc3..5571a6b 100644 --- a/src/app/api/user/me/route.ts +++ b/src/app/api/user/me/route.ts @@ -157,4 +157,4 @@ export const DELETE = auth(async function DELETE(req) { }, { status: 200 }, ); -}); \ No newline at end of file +}); diff --git a/src/app/api/user/me/validation.ts b/src/app/api/user/me/validation.ts index 2e8ff0a..66f07cc 100644 --- a/src/app/api/user/me/validation.ts +++ b/src/app/api/user/me/validation.ts @@ -22,10 +22,12 @@ export const updateUserServerSchema = zod.object({ timezone: timezoneSchema.optional(), }); -export const updateUserPasswordServerSchema = zod.object({ - current_password: zod.string().min(1, 'Current password is required'), - new_password: passwordSchema, - confirm_new_password: passwordSchema, -}).refine((data) => data.new_password === data.confirm_new_password, { - message: 'New password and confirm new password must match', -}); +export const updateUserPasswordServerSchema = zod + .object({ + current_password: zod.string().min(1, 'Current password is required'), + new_password: passwordSchema, + confirm_new_password: passwordSchema, + }) + .refine((data) => data.new_password === data.confirm_new_password, { + message: 'New password and confirm new password must match', + }); diff --git a/src/app/api/user/validation.ts b/src/app/api/user/validation.ts index 100470e..89b8ba4 100644 --- a/src/app/api/user/validation.ts +++ b/src/app/api/user/validation.ts @@ -113,11 +113,9 @@ export const passwordSchema = zod // Timezone Validation // // ---------------------------------------- -export const timezoneSchema = zod - .enum(allTimeZones) - .openapi('Timezone', { - description: 'Valid timezone from the list of supported timezones', - }); +export const timezoneSchema = zod.enum(allTimeZones).openapi('Timezone', { + description: 'Valid timezone from the list of supported timezones', +}); // ---------------------------------------- // @@ -132,7 +130,10 @@ export const FullUserSchema = zod last_name: zod.string().nullish(), email: zod.email(), image: zod.url().nullish(), - timezone: zod.string().refine((i) => (allTimeZones as string[]).includes(i)).nullish(), + timezone: zod + .string() + .refine((i) => (allTimeZones as string[]).includes(i)) + .nullish(), created_at: zod.date(), updated_at: zod.date(), }) diff --git a/src/lib/timezones.ts b/src/lib/timezones.ts index e1d681a..9382aab 100644 --- a/src/lib/timezones.ts +++ b/src/lib/timezones.ts @@ -3708,6 +3708,10 @@ type TimeZoneIds = (typeof timezoneData)['zones'][number]['id']; type TimeZoneAlias = (typeof timezoneData)['zones'][number]['aliases'][number]; export type TimeZones = TimeZoneIds | TimeZoneAlias; -export const timeZoneIds = timezoneData.zones.map((zone) => zone.id) as TimeZoneIds[]; -export const timeZoneAliases = timezoneData.zones.flatMap((zone) => zone.aliases) as TimeZoneAlias[]; -export const allTimeZones = [...timeZoneIds, ...timeZoneAliases] as const; \ No newline at end of file +export const timeZoneIds = timezoneData.zones.map( + (zone) => zone.id, +) as TimeZoneIds[]; +export const timeZoneAliases = timezoneData.zones.flatMap( + (zone) => zone.aliases, +) as TimeZoneAlias[]; +export const allTimeZones = [...timeZoneIds, ...timeZoneAliases] as const; From 3ee0dcf950130d77d97feaaeb9f0e3fd0fc51438 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Jun 2025 11:01:37 +0000 Subject: [PATCH 128/136] fix(deps): update dependency next to v15.4.0-canary.93 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index c5c77fb..5cb263e 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.92", + "next": "15.4.0-canary.93", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index 56de1d1..650108b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/env@npm:15.4.0-canary.92" - checksum: 10c0/5d3df767dab8227aa64058b5082977b069ee7c22038b13b1da1471a4b312bca7b0163cf50f130f22a850b479aca8b9fea649d02720fc24f49528fd70751554c9 +"@next/env@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/env@npm:15.4.0-canary.93" + checksum: 10c0/c6ac8755baf784bc7bec90c64f33c60882d79a46806dc80206ec32e6472b61b00e5ddc75c8de1cf053b248ec372919f4a76e8f00d231ed133376607868e4ad48 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.92" +"@next/swc-darwin-arm64@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.93" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.92" +"@next/swc-darwin-x64@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.93" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.92" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.93" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.92" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.93" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.92" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.93" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.92" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.93" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.92" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.93" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.92" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.93" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.92" + next: "npm:15.4.0-canary.93" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.92": - version: 15.4.0-canary.92 - resolution: "next@npm:15.4.0-canary.92" +"next@npm:15.4.0-canary.93": + version: 15.4.0-canary.93 + resolution: "next@npm:15.4.0-canary.93" dependencies: - "@next/env": "npm:15.4.0-canary.92" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.92" - "@next/swc-darwin-x64": "npm:15.4.0-canary.92" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.92" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.92" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.92" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.92" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.92" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.92" + "@next/env": "npm:15.4.0-canary.93" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.93" + "@next/swc-darwin-x64": "npm:15.4.0-canary.93" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.93" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.93" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.93" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.93" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.93" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.93" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/78b76ba1af4e0c11a1839142f774b9572814f524798d6a27c64180bfe3679ad93af6d3947260b66d02d1fa407a5da3523ca688bcff7fbc939e63559c9587069e + checksum: 10c0/d54f7a7cb76a3ca5aa22d477f8403fccb3c60b9335fea7ed03ae360701c173ab58fde064af208dfec993089ab77f559f04c996c5b0627c67c0c0ee53aa2bd378 languageName: node linkType: hard From 2889424bfba47df757b53a6d3bb63f873a7eb5c6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 24 Jun 2025 00:01:37 +0000 Subject: [PATCH 129/136] fix(deps): update dependency next to v15.4.0-canary.94 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 5cb263e..f9a6d96 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.93", + "next": "15.4.0-canary.94", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index 650108b..38156a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/env@npm:15.4.0-canary.93" - checksum: 10c0/c6ac8755baf784bc7bec90c64f33c60882d79a46806dc80206ec32e6472b61b00e5ddc75c8de1cf053b248ec372919f4a76e8f00d231ed133376607868e4ad48 +"@next/env@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/env@npm:15.4.0-canary.94" + checksum: 10c0/d4c4f9fd1ab996271f57b2ace4db53c0f0209ddcfc536dbe1fe28f3dd3bcc858b402abdf69d7ebb778581d94da4034a5a0bef0ced234e4a476fafdcba2ea46a0 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.93" +"@next/swc-darwin-arm64@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.94" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.93" +"@next/swc-darwin-x64@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.94" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.93" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.94" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.93" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.94" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.93" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.94" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.93" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.94" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.93" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.94" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.93" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.94" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.93" + next: "npm:15.4.0-canary.94" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.93": - version: 15.4.0-canary.93 - resolution: "next@npm:15.4.0-canary.93" +"next@npm:15.4.0-canary.94": + version: 15.4.0-canary.94 + resolution: "next@npm:15.4.0-canary.94" dependencies: - "@next/env": "npm:15.4.0-canary.93" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.93" - "@next/swc-darwin-x64": "npm:15.4.0-canary.93" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.93" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.93" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.93" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.93" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.93" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.93" + "@next/env": "npm:15.4.0-canary.94" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.94" + "@next/swc-darwin-x64": "npm:15.4.0-canary.94" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.94" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.94" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.94" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.94" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.94" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.94" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/d54f7a7cb76a3ca5aa22d477f8403fccb3c60b9335fea7ed03ae360701c173ab58fde064af208dfec993089ab77f559f04c996c5b0627c67c0c0ee53aa2bd378 + checksum: 10c0/4d3a3f0f85524bb0d595a58b61e017dee584024d4190f7f2709a4dd02ff922040e206531a652d89c3e47447c9c2c2e3b84729fd52fb9db1cb88db6c46c52c537 languageName: node linkType: hard From d62e9543488ca7e768cc24590637c8c8924746a6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 24 Jun 2025 17:01:52 +0000 Subject: [PATCH 130/136] chore(deps): update dependency @types/node to v22.15.33 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f9a6d96..93da188 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "devDependencies": { "@eslint/eslintrc": "3.3.1", "@tailwindcss/postcss": "4.1.10", - "@types/node": "22.15.32", + "@types/node": "22.15.33", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "@types/swagger-ui-react": "5", diff --git a/yarn.lock b/yarn.lock index 38156a2..d7ba663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3102,12 +3102,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.32": - version: 22.15.32 - resolution: "@types/node@npm:22.15.32" +"@types/node@npm:22.15.33": + version: 22.15.33 + resolution: "@types/node@npm:22.15.33" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/63a2fa52adf1134d1b3bee8b1862d4b8e4550fffc190551068d3d41a41d9e5c0c8f1cb81faa18767b260637360f662115c26c5e4e7718868ead40c4a57cbc0e3 + checksum: 10c0/ee040c29c891aa37fffc27d04a8529318c391356346933646b7692eaf62236831ad532f6ebaf43ebd6a2ef1f0f091860d8a0a83a4e3c5a4f66d37aa1b2c99f31 languageName: node linkType: hard @@ -6560,7 +6560,7 @@ __metadata: "@radix-ui/react-tabs": "npm:^1.1.11" "@tailwindcss/postcss": "npm:4.1.10" "@tanstack/react-query": "npm:^5.80.7" - "@types/node": "npm:22.15.32" + "@types/node": "npm:22.15.33" "@types/react": "npm:19.1.8" "@types/react-dom": "npm:19.1.6" "@types/swagger-ui-react": "npm:5" From 21eff651e8ab77b8de4613ce8d4760ece92deb8b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 25 Jun 2025 00:01:36 +0000 Subject: [PATCH 131/136] fix(deps): update dependency next to v15.4.0-canary.95 --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 93da188..f943b16 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.511.0", - "next": "15.4.0-canary.94", + "next": "15.4.0-canary.95", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/yarn.lock b/yarn.lock index d7ba663..b97a688 100644 --- a/yarn.lock +++ b/yarn.lock @@ -939,10 +939,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/env@npm:15.4.0-canary.94" - checksum: 10c0/d4c4f9fd1ab996271f57b2ace4db53c0f0209ddcfc536dbe1fe28f3dd3bcc858b402abdf69d7ebb778581d94da4034a5a0bef0ced234e4a476fafdcba2ea46a0 +"@next/env@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/env@npm:15.4.0-canary.95" + checksum: 10c0/dfa499393a68293517db690e805074ee2da8667188c7508adbd4c94f2966861c91ba5ec7a4a91b75e29e603fdb299d637d80180c87df6910796c3fa376a02f96 languageName: node linkType: hard @@ -955,58 +955,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.94" +"@next/swc-darwin-arm64@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-darwin-arm64@npm:15.4.0-canary.95" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.94" +"@next/swc-darwin-x64@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-darwin-x64@npm:15.4.0-canary.95" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.94" +"@next/swc-linux-arm64-gnu@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.0-canary.95" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.94" +"@next/swc-linux-arm64-musl@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.0-canary.95" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.94" +"@next/swc-linux-x64-gnu@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.0-canary.95" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.94" +"@next/swc-linux-x64-musl@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-linux-x64-musl@npm:15.4.0-canary.95" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.94" +"@next/swc-win32-arm64-msvc@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.0-canary.95" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.94" +"@next/swc-win32-x64-msvc@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.0-canary.95" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6573,7 +6573,7 @@ __metadata: eslint-config-next: "npm:15.3.4" eslint-config-prettier: "npm:10.1.5" lucide-react: "npm:^0.511.0" - next: "npm:15.4.0-canary.94" + next: "npm:15.4.0-canary.95" next-auth: "npm:^5.0.0-beta.25" next-themes: "npm:^0.4.6" orval: "npm:7.10.0" @@ -6856,19 +6856,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.0-canary.94": - version: 15.4.0-canary.94 - resolution: "next@npm:15.4.0-canary.94" +"next@npm:15.4.0-canary.95": + version: 15.4.0-canary.95 + resolution: "next@npm:15.4.0-canary.95" dependencies: - "@next/env": "npm:15.4.0-canary.94" - "@next/swc-darwin-arm64": "npm:15.4.0-canary.94" - "@next/swc-darwin-x64": "npm:15.4.0-canary.94" - "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.94" - "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.94" - "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.94" - "@next/swc-linux-x64-musl": "npm:15.4.0-canary.94" - "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.94" - "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.94" + "@next/env": "npm:15.4.0-canary.95" + "@next/swc-darwin-arm64": "npm:15.4.0-canary.95" + "@next/swc-darwin-x64": "npm:15.4.0-canary.95" + "@next/swc-linux-arm64-gnu": "npm:15.4.0-canary.95" + "@next/swc-linux-arm64-musl": "npm:15.4.0-canary.95" + "@next/swc-linux-x64-gnu": "npm:15.4.0-canary.95" + "@next/swc-linux-x64-musl": "npm:15.4.0-canary.95" + "@next/swc-win32-arm64-msvc": "npm:15.4.0-canary.95" + "@next/swc-win32-x64-msvc": "npm:15.4.0-canary.95" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -6911,7 +6911,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/4d3a3f0f85524bb0d595a58b61e017dee584024d4190f7f2709a4dd02ff922040e206531a652d89c3e47447c9c2c2e3b84729fd52fb9db1cb88db6c46c52c537 + checksum: 10c0/7841ffa1522278ae2205e3343be2ab61bb5d6a1492c062f2469031c59f00dff3bd102d336a224d6956c6d0c57700ff0818d7f9e5ee926a5315ab73ae39062f2e languageName: node linkType: hard From a6f74e0c22bb394f4a74d34b930f10f99f24a1ad Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:01:20 +0200 Subject: [PATCH 132/136] feat: add Radix UI components and implement sidebar functionality - Added new Radix UI components: Dialog, Tooltip, Separator, and updated existing components. - Introduced a Sidebar component with collapsible functionality and mobile responsiveness. - Implemented a custom hook `useIsMobile` to manage mobile state. - Updated package dependencies in package.json and yarn.lock for new components. - Created utility components such as Button, Skeleton, and Input for consistent styling. feat: add AppSidebar component with collapsible functionality and sidebar menu - Introduced AppSidebar component for a customizable sidebar layout. - Implemented collapsible sections using Radix UI's Collapsible component. - Added sidebar menu items with icons and links for navigation. - Created Sidebar UI components including SidebarHeader, SidebarFooter, and SidebarMenu. - Integrated ThemePicker for theme selection within the sidebar. - Updated sidebar styles and layout for better responsiveness. chore: add @radix-ui/react-collapsible dependency - Added @radix-ui/react-collapsible package to manage collapsible UI elements. --- package.json | 9 +- src/app/{ => (main)}/home/page.tsx | 4 +- src/app/(main)/layout.tsx | 23 + src/app/globals.css | 18 +- src/components/custom-ui/app-sidebar.tsx | 147 ++++ src/components/misc/header.tsx | 23 + src/components/misc/logo.tsx | 1 + src/components/ui/collapsible.tsx | 33 + src/components/ui/separator.tsx | 7 +- src/components/ui/sheet.tsx | 139 ++++ src/components/ui/sidebar.tsx | 725 +++++++++++++++++++ src/components/ui/skeleton.tsx | 13 + src/components/ui/tooltip.tsx | 61 ++ src/components/wrappers/sidebar-provider.tsx | 23 + src/hooks/use-mobile.ts | 19 + yarn.lock | 482 +++++++----- 16 files changed, 1520 insertions(+), 207 deletions(-) rename src/app/{ => (main)}/home/page.tsx (81%) create mode 100644 src/app/(main)/layout.tsx create mode 100644 src/components/custom-ui/app-sidebar.tsx create mode 100644 src/components/misc/header.tsx create mode 100644 src/components/ui/collapsible.tsx create mode 100644 src/components/ui/sheet.tsx create mode 100644 src/components/ui/sidebar.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/components/wrappers/sidebar-provider.tsx create mode 100644 src/hooks/use-mobile.ts diff --git a/package.json b/package.json index f943b16..1623ef9 100644 --- a/package.json +++ b/package.json @@ -27,20 +27,23 @@ "@fortawesome/react-fontawesome": "^0.2.2", "@hookform/resolvers": "^5.0.1", "@prisma/client": "^6.9.0", + "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-dropdown-menu": "^2.1.14", "@radix-ui/react-hover-card": "^1.1.13", "@radix-ui/react-label": "^2.1.6", "@radix-ui/react-scroll-area": "^1.2.8", "@radix-ui/react-select": "^2.2.4", - "@radix-ui/react-separator": "^1.1.6", - "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.2.4", "@radix-ui/react-tabs": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.7", "@tanstack/react-query": "^5.80.7", "bcryptjs": "^3.0.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "lucide-react": "^0.511.0", + "lucide-react": "^0.515.0", "next": "15.4.0-canary.95", "next-auth": "^5.0.0-beta.25", "next-themes": "^0.4.6", diff --git a/src/app/home/page.tsx b/src/app/(main)/home/page.tsx similarity index 81% rename from src/app/home/page.tsx rename to src/app/(main)/home/page.tsx index 77f3cf8..c381c03 100644 --- a/src/app/home/page.tsx +++ b/src/app/(main)/home/page.tsx @@ -1,15 +1,13 @@ 'use client'; import { RedirectButton } from '@/components/buttons/redirect-button'; -import { ThemePicker } from '@/components/misc/theme-picker'; import { useGetApiUserMe } from '@/generated/api/user/user'; export default function Home() { const { data, isLoading } = useGetApiUserMe(); return ( -
-
{}
+

Hello{' '} diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx new file mode 100644 index 0000000..7106e70 --- /dev/null +++ b/src/app/(main)/layout.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { cookies } from 'next/headers'; + +import { AppSidebar } from '@/components/custom-ui/app-sidebar'; +import SidebarProviderWrapper from '@/components/wrappers/sidebar-provider'; +import Header from '@/components/misc/header'; + +export default async function Layout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const cookieStore = await cookies(); + const defaultOpen = cookieStore.get('sidebar_state')?.value === 'true'; + return ( + <> + + +
{children}
+
+ + ); +} diff --git a/src/app/globals.css b/src/app/globals.css index f85cb2f..a5f7eaf 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -55,6 +55,8 @@ --card: var(--neutral-800); + --sidebar-width-icon: 32px; + /* ------------------- */ --foreground: oklch(0.13 0.028 261.692); @@ -95,17 +97,17 @@ --chart-5: oklch(0.769 0.188 70.08); - --sidebar: oklch(0.985 0.002 247.839); + --sidebar: var(--background); - --sidebar-foreground: oklch(0.13 0.028 261.692); + --sidebar-foreground: var(--text); --sidebar-primary: oklch(0.21 0.034 264.665); - --sidebar-primary-foreground: oklch(0.985 0.002 247.839); + --sidebar-primary-foreground: var(--text); --sidebar-accent: oklch(0.967 0.003 264.542); - --sidebar-accent-foreground: oklch(0.21 0.034 264.665); + --sidebar-accent-foreground: var(--text); --sidebar-border: oklch(0.928 0.006 264.531); @@ -339,17 +341,17 @@ --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.21 0.034 264.665); + --sidebar: var(--background); - --sidebar-foreground: oklch(0.985 0.002 247.839); + --sidebar-foreground: var(--text); --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0.002 247.839); + --sidebar-primary-foreground: var(--text); --sidebar-accent: oklch(0.278 0.033 256.848); - --sidebar-accent-foreground: oklch(0.985 0.002 247.839); + --sidebar-accent-foreground: var(--text); --sidebar-border: oklch(1 0 0 / 10%); diff --git a/src/components/custom-ui/app-sidebar.tsx b/src/components/custom-ui/app-sidebar.tsx new file mode 100644 index 0000000..b279c73 --- /dev/null +++ b/src/components/custom-ui/app-sidebar.tsx @@ -0,0 +1,147 @@ +'use client'; + +import React from 'react'; +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarGroup, + SidebarGroupAction, + SidebarGroupContent, + SidebarGroupLabel, + SidebarHeader, + SidebarInput, + SidebarInset, + SidebarMenu, + SidebarMenuAction, + SidebarMenuBadge, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSkeleton, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem, + SidebarProvider, + SidebarRail, + SidebarSeparator, + SidebarTrigger, + useSidebar, +} from '@/components/ui/sidebar'; + +import { ChevronDown } from 'lucide-react'; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from '@/components/ui/collapsible'; + +import Logo from '@/components/misc/logo'; + +import Link from 'next/link'; + +import { ThemePicker } from '@/components/misc/theme-picker'; + +import { + Star, + CalendarDays, + User, + Users, + CalendarClock, + CalendarPlus, +} from 'lucide-react'; + +const items = [ + { + title: 'Calendar', + url: '#', + icon: CalendarDays, + }, + { + title: 'Friends', + url: '#', + icon: User, + }, + { + title: 'Groups', + url: '#', + icon: Users, + }, + { + title: 'Events', + url: '#', + icon: CalendarClock, + }, +]; + +export function AppSidebar() { + return ( + <> + + + + + + + + + + + + {' '} + + Favorites + + + + + + + + + + + + + {items.map((item) => ( + + + + + + {item.title} + + + + + ))} + + + + + + + + + New Event + + + + + + + + ); +} diff --git a/src/components/misc/header.tsx b/src/components/misc/header.tsx new file mode 100644 index 0000000..dbf8a1f --- /dev/null +++ b/src/components/misc/header.tsx @@ -0,0 +1,23 @@ +import { SidebarTrigger } from '@/components/ui/sidebar'; +import { ThemePicker } from '@/components/misc/theme-picker'; + +export default function Header({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( +
+
+ + + + Search + + + +
+
{children}
+
+ ); +} diff --git a/src/components/misc/logo.tsx b/src/components/misc/logo.tsx index 129adef..739fc90 100644 --- a/src/components/misc/logo.tsx +++ b/src/components/misc/logo.tsx @@ -90,6 +90,7 @@ export default function Logo({ return ( {alt) { + return ; +} + +function CollapsibleTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CollapsibleContent({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Collapsible, CollapsibleTrigger, CollapsibleContent }; diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx index 3b4f1ef..3234cdc 100644 --- a/src/components/ui/separator.tsx +++ b/src/components/ui/separator.tsx @@ -13,10 +13,13 @@ function Separator({ }: React.ComponentProps) { return ( ); diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx new file mode 100644 index 0000000..84649ad --- /dev/null +++ b/src/components/ui/sheet.tsx @@ -0,0 +1,139 @@ +"use client" + +import * as React from "react" +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { XIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Sheet({ ...props }: React.ComponentProps) { + return +} + +function SheetTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function SheetClose({ + ...props +}: React.ComponentProps) { + return +} + +function SheetPortal({ + ...props +}: React.ComponentProps) { + return +} + +function SheetOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SheetContent({ + className, + children, + side = "right", + ...props +}: React.ComponentProps & { + side?: "top" | "right" | "bottom" | "left" +}) { + return ( + + + + {children} + + + Close + + + + ) +} + +function SheetHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function SheetFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function SheetTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SheetDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Sheet, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx new file mode 100644 index 0000000..6b68b8f --- /dev/null +++ b/src/components/ui/sidebar.tsx @@ -0,0 +1,725 @@ +'use client'; + +import * as React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { cva, VariantProps } from 'class-variance-authority'; +import { PanelLeftIcon } from 'lucide-react'; + +import { useIsMobile } from '@/hooks/use-mobile'; +import { cn } from '@/lib/utils'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Separator } from '@/components/ui/separator'; +import { + Sheet, + SheetContent, + SheetDescription, + SheetHeader, + SheetTitle, +} from '@/components/ui/sheet'; +import { Skeleton } from '@/components/ui/skeleton'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/tooltip'; + +const SIDEBAR_COOKIE_NAME = 'sidebar_state'; +const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; +const SIDEBAR_WIDTH = '16rem'; +const SIDEBAR_WIDTH_MOBILE = '18rem'; +const SIDEBAR_WIDTH_ICON = '4rem'; +const SIDEBAR_KEYBOARD_SHORTCUT = 'b'; + +type SidebarContextProps = { + state: 'expanded' | 'collapsed'; + open: boolean; + setOpen: (open: boolean) => void; + openMobile: boolean; + setOpenMobile: (open: boolean) => void; + isMobile: boolean; + toggleSidebar: () => void; +}; + +const SidebarContext = React.createContext(null); + +function useSidebar() { + const context = React.useContext(SidebarContext); + if (!context) { + throw new Error('useSidebar must be used within a SidebarProvider.'); + } + + return context; +} + +function SidebarProvider({ + defaultOpen = true, + open: openProp, + onOpenChange: setOpenProp, + className, + style, + children, + ...props +}: React.ComponentProps<'div'> & { + defaultOpen?: boolean; + open?: boolean; + onOpenChange?: (open: boolean) => void; +}) { + const isMobile = useIsMobile(); + const [openMobile, setOpenMobile] = React.useState(false); + + // This is the internal state of the sidebar. + // We use openProp and setOpenProp for control from outside the component. + const [_open, _setOpen] = React.useState(defaultOpen); + const open = openProp ?? _open; + const setOpen = React.useCallback( + (value: boolean | ((value: boolean) => boolean)) => { + const openState = typeof value === 'function' ? value(open) : value; + if (setOpenProp) { + setOpenProp(openState); + } else { + _setOpen(openState); + } + + // This sets the cookie to keep the sidebar state. + document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; + }, + [setOpenProp, open], + ); + + // Helper to toggle the sidebar. + const toggleSidebar = React.useCallback(() => { + return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open); + }, [isMobile, setOpen, setOpenMobile]); + + // Adds a keyboard shortcut to toggle the sidebar. + React.useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if ( + event.key === SIDEBAR_KEYBOARD_SHORTCUT && + (event.metaKey || event.ctrlKey) + ) { + event.preventDefault(); + toggleSidebar(); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [toggleSidebar]); + + // We add a state so that we can do data-state="expanded" or "collapsed". + // This makes it easier to style the sidebar with Tailwind classes. + const state = open ? 'expanded' : 'collapsed'; + + const contextValue = React.useMemo( + () => ({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar, + }), + [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar], + ); + + return ( + + +
+ {children} +
+
+
+ ); +} + +function Sidebar({ + side = 'left', + variant = 'sidebar', + collapsible = 'offcanvas', + className, + children, + ...props +}: React.ComponentProps<'div'> & { + side?: 'left' | 'right'; + variant?: 'sidebar' | 'floating' | 'inset'; + collapsible?: 'offcanvas' | 'icon' | 'none'; +}) { + const { isMobile, state, openMobile, setOpenMobile } = useSidebar(); + + if (collapsible === 'none') { + return ( +
+ {children} +
+ ); + } + + if (isMobile) { + return ( + + + + Sidebar + Displays the mobile sidebar. + +
{children}
+
+
+ ); + } + + return ( +
+ {/* This is what handles the sidebar gap on desktop */} +
+ +
+ ); +} + +function SidebarTrigger({ + className, + onClick, + ...props +}: React.ComponentProps) { + const { toggleSidebar } = useSidebar(); + + return ( + + ); +} + +function SidebarRail({ className, ...props }: React.ComponentProps<'button'>) { + const { toggleSidebar } = useSidebar(); + + return ( + + + + + ); +} diff --git a/src/components/custom-ui/app-sidebar.tsx b/src/components/custom-ui/app-sidebar.tsx index ae00c9b..4861363 100644 --- a/src/components/custom-ui/app-sidebar.tsx +++ b/src/components/custom-ui/app-sidebar.tsx @@ -6,27 +6,27 @@ import { SidebarContent, SidebarFooter, SidebarGroup, - SidebarGroupAction, + // SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, - SidebarInput, - SidebarInset, + // SidebarInput, + // SidebarInset, SidebarMenu, - SidebarMenuAction, - SidebarMenuBadge, + // SidebarMenuAction, + // SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, - SidebarMenuSkeleton, - SidebarMenuSub, - SidebarMenuSubButton, - SidebarMenuSubItem, - SidebarProvider, - SidebarRail, - SidebarSeparator, - SidebarTrigger, - useSidebar, -} from '@/components/ui/sidebar'; + // SidebarMenuSkeleton, + // SidebarMenuSub, + // SidebarMenuSubButton, + // SidebarMenuSubItem, + // SidebarProvider, + // SidebarRail, + // SidebarSeparator, + // SidebarTrigger, + // useSidebar, +} from '@/components/custom-ui/sidebar'; import { ChevronDown } from 'lucide-react'; import { @@ -39,8 +39,6 @@ import Logo from '@/components/misc/logo'; import Link from 'next/link'; -import { ThemePicker } from '@/components/misc/theme-picker'; - import { Star, CalendarDays, diff --git a/src/components/ui/sidebar.tsx b/src/components/custom-ui/sidebar.tsx similarity index 99% rename from src/components/ui/sidebar.tsx rename to src/components/custom-ui/sidebar.tsx index 6b68b8f..11228cb 100644 --- a/src/components/ui/sidebar.tsx +++ b/src/components/custom-ui/sidebar.tsx @@ -466,7 +466,7 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {
  • ); diff --git a/src/components/misc/header.tsx b/src/components/misc/header.tsx index dbf8a1f..ed53953 100644 --- a/src/components/misc/header.tsx +++ b/src/components/misc/header.tsx @@ -1,5 +1,22 @@ -import { SidebarTrigger } from '@/components/ui/sidebar'; +import { SidebarTrigger } from '@/components/custom-ui/sidebar'; import { ThemePicker } from '@/components/misc/theme-picker'; +import { NotificationButton } from '@/components/buttons/notification-button'; + +import { BellRing, Inbox } from 'lucide-react'; +import UserDropdown from '@/components/misc/user-dropdown'; + +const items = [ + { + title: 'Calendar', + url: '#', + icon: Inbox, + }, + { + title: 'Friends', + url: '#', + icon: BellRing, + }, +]; export default function Header({ children, @@ -8,13 +25,24 @@ export default function Header({ }>) { return (
    -
    +
    Search - + + {items.map((item) => ( + + + + ))} +
    {children}
    diff --git a/src/components/misc/nav-user.tsx b/src/components/misc/nav-user.tsx new file mode 100644 index 0000000..53ab582 --- /dev/null +++ b/src/components/misc/nav-user.tsx @@ -0,0 +1,110 @@ +'use client'; + +import { + BadgeCheck, + Bell, + ChevronsUpDown, + CreditCard, + LogOut, + Sparkles, +} from 'lucide-react'; + +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/custom-ui/sidebar'; + +export function NavUser({ + user, +}: { + user: { + name: string; + email: string; + avatar: string; + }; +}) { + const { isMobile } = useSidebar(); + + return ( + + + + + + + + CN + +
    + {user.name} + {user.email} +
    + +
    +
    + + +
    + + + CN + +
    + {user.name} + {user.email} +
    +
    +
    + + + + + Upgrade to Pro + + + + + + + Account + + + + Billing + + + + Notifications + + + + + + Log out + +
    +
    +
    +
    + ); +} diff --git a/src/components/misc/notification-dot.tsx b/src/components/misc/notification-dot.tsx new file mode 100644 index 0000000..a918188 --- /dev/null +++ b/src/components/misc/notification-dot.tsx @@ -0,0 +1,35 @@ +import { cn } from '@/lib/utils'; +import { cva, type VariantProps } from 'class-variance-authority'; +import { CircleSmall } from 'lucide-react'; + +const dotVariants = cva('', { + variants: { + variant: { + neutral: 'fill-neutral-900', + active: 'fill-red-600 stroke-red-600', + hidden: 'hidden', + }, + }, + defaultVariants: { + variant: 'hidden', + }, +}); + +function NotificationDot({ + className, + dotVariant, + ...props +}: { + className: string; + dotVariant: VariantProps['variant']; +}) { + return ( + + ); +} + +export type NDot = VariantProps['variant']; +export { NotificationDot, dotVariants }; diff --git a/src/components/misc/user-card.tsx b/src/components/misc/user-card.tsx new file mode 100644 index 0000000..faefc35 --- /dev/null +++ b/src/components/misc/user-card.tsx @@ -0,0 +1,29 @@ +import { useGetApiUserMe } from '@/generated/api/user/user'; +import { Avatar } from '@/components/ui/avatar'; +import Image from 'next/image'; +import { User } from 'lucide-react'; + +export default function UserCard() { + const { data } = useGetApiUserMe(); + return ( +
    + + {data?.data.user.image ? ( + Avatar + ) : ( + + )} + +
    {data?.data.user.name}
    +
    + {data?.data.user.email} +
    +
    + ); +} diff --git a/src/components/misc/user-dropdown.tsx b/src/components/misc/user-dropdown.tsx new file mode 100644 index 0000000..8f5aa05 --- /dev/null +++ b/src/components/misc/user-dropdown.tsx @@ -0,0 +1,59 @@ +'use client'; + +import { Avatar } from '@/components/ui/avatar'; +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + // DropdownMenuLabel, + // DropdownMenuPortal, + DropdownMenuSeparator, + // DropdownMenuShortcut, + // DropdownMenuSub, + // DropdownMenuSubContent, + // DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { useGetApiUserMe } from '@/generated/api/user/user'; +import { ChevronDown, User } from 'lucide-react'; +import Image from 'next/image'; +import Link from 'next/link'; +import UserCard from '@/components/misc/user-card'; + +export default function UserDropdown() { + const { data } = useGetApiUserMe(); + return ( + + + + + + + + + + Settings + + + Logout + + + + ); +} diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..6a21b65 --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +'use client'; + +import * as React from 'react'; +import * as AvatarPrimitive from '@radix-ui/react-avatar'; + +import { cn } from '@/lib/utils'; + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx index 84649ad..e8d5ec1 100644 --- a/src/components/ui/sheet.tsx +++ b/src/components/ui/sheet.tsx @@ -1,31 +1,31 @@ -"use client" +'use client'; -import * as React from "react" -import * as SheetPrimitive from "@radix-ui/react-dialog" -import { XIcon } from "lucide-react" +import * as React from 'react'; +import * as SheetPrimitive from '@radix-ui/react-dialog'; +import { XIcon } from 'lucide-react'; -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; function Sheet({ ...props }: React.ComponentProps) { - return + return ; } function SheetTrigger({ ...props }: React.ComponentProps) { - return + return ; } function SheetClose({ ...props }: React.ComponentProps) { - return + return ; } function SheetPortal({ ...props }: React.ComponentProps) { - return + return ; } function SheetOverlay({ @@ -34,71 +34,71 @@ function SheetOverlay({ }: React.ComponentProps) { return ( - ) + ); } function SheetContent({ className, children, - side = "right", + side = 'right', ...props }: React.ComponentProps & { - side?: "top" | "right" | "bottom" | "left" + side?: 'top' | 'right' | 'bottom' | 'left'; }) { return ( {children} - - - Close + + + Close - ) + ); } -function SheetHeader({ className, ...props }: React.ComponentProps<"div">) { +function SheetHeader({ className, ...props }: React.ComponentProps<'div'>) { return (
    - ) + ); } -function SheetFooter({ className, ...props }: React.ComponentProps<"div">) { +function SheetFooter({ className, ...props }: React.ComponentProps<'div'>) { return (
    - ) + ); } function SheetTitle({ @@ -107,11 +107,11 @@ function SheetTitle({ }: React.ComponentProps) { return ( - ) + ); } function SheetDescription({ @@ -120,11 +120,11 @@ function SheetDescription({ }: React.ComponentProps) { return ( - ) + ); } export { @@ -136,4 +136,4 @@ export { SheetFooter, SheetTitle, SheetDescription, -} +}; diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx index 32ea0ef..a9344b2 100644 --- a/src/components/ui/skeleton.tsx +++ b/src/components/ui/skeleton.tsx @@ -1,13 +1,13 @@ -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; -function Skeleton({ className, ...props }: React.ComponentProps<"div">) { +function Skeleton({ className, ...props }: React.ComponentProps<'div'>) { return (
    - ) + ); } -export { Skeleton } +export { Skeleton }; diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx index 4ee26b3..2b8b1d7 100644 --- a/src/components/ui/tooltip.tsx +++ b/src/components/ui/tooltip.tsx @@ -1,9 +1,9 @@ -"use client" +'use client'; -import * as React from "react" -import * as TooltipPrimitive from "@radix-ui/react-tooltip" +import * as React from 'react'; +import * as TooltipPrimitive from '@radix-ui/react-tooltip'; -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; function TooltipProvider({ delayDuration = 0, @@ -11,11 +11,11 @@ function TooltipProvider({ }: React.ComponentProps) { return ( - ) + ); } function Tooltip({ @@ -23,15 +23,15 @@ function Tooltip({ }: React.ComponentProps) { return ( - + - ) + ); } function TooltipTrigger({ ...props }: React.ComponentProps) { - return + return ; } function TooltipContent({ @@ -43,19 +43,19 @@ function TooltipContent({ return ( {children} - + - ) + ); } -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/src/components/query-provider.tsx b/src/components/wrappers/query-provider.tsx similarity index 100% rename from src/components/query-provider.tsx rename to src/components/wrappers/query-provider.tsx diff --git a/src/components/wrappers/sidebar-provider.tsx b/src/components/wrappers/sidebar-provider.tsx index 3873fa4..3c9ff95 100644 --- a/src/components/wrappers/sidebar-provider.tsx +++ b/src/components/wrappers/sidebar-provider.tsx @@ -1,7 +1,7 @@ 'use client'; import React from 'react'; -import { SidebarProvider } from '../ui/sidebar'; +import { SidebarProvider } from '../custom-ui/sidebar'; export default function SidebarProviderWrapper({ defaultOpen, diff --git a/src/hooks/use-mobile.ts b/src/hooks/use-mobile.ts index 2b0fe1d..821f8ff 100644 --- a/src/hooks/use-mobile.ts +++ b/src/hooks/use-mobile.ts @@ -1,19 +1,21 @@ -import * as React from "react" +import * as React from 'react'; -const MOBILE_BREAKPOINT = 768 +const MOBILE_BREAKPOINT = 768; export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState(undefined) + const [isMobile, setIsMobile] = React.useState( + undefined, + ); React.useEffect(() => { - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); const onChange = () => { - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - } - mql.addEventListener("change", onChange) - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - return () => mql.removeEventListener("change", onChange) - }, []) + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + }; + mql.addEventListener('change', onChange); + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + return () => mql.removeEventListener('change', onChange); + }, []); - return !!isMobile + return !!isMobile; } diff --git a/yarn.lock b/yarn.lock index 3328163..ba978f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1299,6 +1299,29 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-avatar@npm:^1.1.10": + version: 1.1.10 + resolution: "@radix-ui/react-avatar@npm:1.1.10" + dependencies: + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-is-hydrated": "npm:0.1.0" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/9fb0cf9a9d0fdbeaa2efda476402fc09db2e6ff9cd9aa3ea1d315d9c9579840722a4833725cb196c455e0bd775dfe04221a4f6855685ce89d2133c42e2b07e5f + languageName: node + linkType: hard + "@radix-ui/react-collapsible@npm:^1.1.11": version: 1.1.11 resolution: "@radix-ui/react-collapsible@npm:1.1.11" @@ -1441,7 +1464,7 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-dropdown-menu@npm:^2.1.14": +"@radix-ui/react-dropdown-menu@npm:^2.1.15": version: 2.1.15 resolution: "@radix-ui/react-dropdown-menu@npm:2.1.15" dependencies: @@ -1951,6 +1974,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-use-is-hydrated@npm:0.1.0": + version: 0.1.0 + resolution: "@radix-ui/react-use-is-hydrated@npm:0.1.0" + dependencies: + use-sync-external-store: "npm:^1.5.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/635079bafe32829fc7405895154568ea94a22689b170489fd6d77668e4885e72ff71ed6d0ea3d602852841ef0f1927aa400fee2178d5dfbeb8bc9297da7d6498 + languageName: node + linkType: hard + "@radix-ui/react-use-layout-effect@npm:1.1.1": version: 1.1.1 resolution: "@radix-ui/react-use-layout-effect@npm:1.1.1" @@ -6637,9 +6675,10 @@ __metadata: "@fortawesome/react-fontawesome": "npm:^0.2.2" "@hookform/resolvers": "npm:^5.0.1" "@prisma/client": "npm:^6.9.0" + "@radix-ui/react-avatar": "npm:^1.1.10" "@radix-ui/react-collapsible": "npm:^1.1.11" "@radix-ui/react-dialog": "npm:^1.1.14" - "@radix-ui/react-dropdown-menu": "npm:^2.1.14" + "@radix-ui/react-dropdown-menu": "npm:^2.1.15" "@radix-ui/react-hover-card": "npm:^1.1.13" "@radix-ui/react-label": "npm:^2.1.6" "@radix-ui/react-scroll-area": "npm:^1.2.8" @@ -9394,7 +9433,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.4.0": +"use-sync-external-store@npm:^1.4.0, use-sync-external-store@npm:^1.5.0": version: 1.5.0 resolution: "use-sync-external-store@npm:1.5.0" peerDependencies: From 8bee6ede3fc144c0c3013e7c3c448565f2befaef Mon Sep 17 00:00:00 2001 From: SomeCodecat <88855796+SomeCodecat@users.noreply.github.com> Date: Wed, 25 Jun 2025 12:01:04 +0200 Subject: [PATCH 135/136] refactor: remove unused imports from notification button and user dropdown components --- src/components/buttons/notification-button.tsx | 9 --------- src/components/custom-ui/app-sidebar.tsx | 14 -------------- src/components/misc/user-dropdown.tsx | 7 ------- 3 files changed, 30 deletions(-) diff --git a/src/components/buttons/notification-button.tsx b/src/components/buttons/notification-button.tsx index 0b718f9..f41f325 100644 --- a/src/components/buttons/notification-button.tsx +++ b/src/components/buttons/notification-button.tsx @@ -2,15 +2,6 @@ import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, - // DropdownMenuGroup, - // DropdownMenuItem, - // DropdownMenuLabel, - // DropdownMenuPortal, - // DropdownMenuSeparator, - // DropdownMenuShortcut, - // DropdownMenuSub, - // DropdownMenuSubContent, - // DropdownMenuSubTrigger, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { NDot, NotificationDot } from '@/components/misc/notification-dot'; diff --git a/src/components/custom-ui/app-sidebar.tsx b/src/components/custom-ui/app-sidebar.tsx index 4861363..f823970 100644 --- a/src/components/custom-ui/app-sidebar.tsx +++ b/src/components/custom-ui/app-sidebar.tsx @@ -6,26 +6,12 @@ import { SidebarContent, SidebarFooter, SidebarGroup, - // SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, - // SidebarInput, - // SidebarInset, SidebarMenu, - // SidebarMenuAction, - // SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, - // SidebarMenuSkeleton, - // SidebarMenuSub, - // SidebarMenuSubButton, - // SidebarMenuSubItem, - // SidebarProvider, - // SidebarRail, - // SidebarSeparator, - // SidebarTrigger, - // useSidebar, } from '@/components/custom-ui/sidebar'; import { ChevronDown } from 'lucide-react'; diff --git a/src/components/misc/user-dropdown.tsx b/src/components/misc/user-dropdown.tsx index 8f5aa05..e55f4bb 100644 --- a/src/components/misc/user-dropdown.tsx +++ b/src/components/misc/user-dropdown.tsx @@ -5,15 +5,8 @@ import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, - DropdownMenuGroup, DropdownMenuItem, - // DropdownMenuLabel, - // DropdownMenuPortal, DropdownMenuSeparator, - // DropdownMenuShortcut, - // DropdownMenuSub, - // DropdownMenuSubContent, - // DropdownMenuSubTrigger, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useGetApiUserMe } from '@/generated/api/user/user'; From 4c6e66c1a2e194391429277035d0e41766f485d1 Mon Sep 17 00:00:00 2001 From: Dominik Stahl Date: Wed, 25 Jun 2025 14:24:23 +0200 Subject: [PATCH 136/136] test: integrate cypress --- .env.test | 6 + .github/workflows/tests.yml | 34 + .gitignore | 6 + cypress.config.ts | 16 + cypress/e2e/auth-user.ts | 12 + cypress/e2e/event-create.cy.ts | 9 + cypress/e2e/login.cy.ts | 45 + cypress/e2e/seed.ts | 29 + cypress/support/commands.ts | 62 ++ cypress/support/component-index.html | 14 + cypress/support/component.ts | 38 + cypress/support/e2e.ts | 17 + exportSwagger.ts | 19 +- package.json | 9 +- src/app/login/page.tsx | 6 +- src/components/buttons/sso-login-button.tsx | 4 +- src/components/forms/login-form.tsx | 20 +- src/components/misc/theme-picker.cy.tsx | 41 + src/components/misc/theme-picker.tsx | 16 +- tsconfig.json | 3 +- yarn.lock | 1029 ++++++++++++++++++- 21 files changed, 1396 insertions(+), 39 deletions(-) create mode 100644 .env.test create mode 100644 .github/workflows/tests.yml create mode 100644 cypress.config.ts create mode 100644 cypress/e2e/auth-user.ts create mode 100644 cypress/e2e/event-create.cy.ts create mode 100644 cypress/e2e/login.cy.ts create mode 100644 cypress/e2e/seed.ts create mode 100644 cypress/support/commands.ts create mode 100644 cypress/support/component-index.html create mode 100644 cypress/support/component.ts create mode 100644 cypress/support/e2e.ts create mode 100644 src/components/misc/theme-picker.cy.tsx diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..266baa3 --- /dev/null +++ b/.env.test @@ -0,0 +1,6 @@ +AUTH_SECRET="auth_secret" +AUTH_URL="http://127.0.0.1:3000" +HOSTNAME="127.0.0.1" +DATABASE_URL="file:/tmp/dev.db" +AUTH_AUTHENTIK_ID="id" +AUTH_AUTHENTIK_ISSUER="issuer" \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..3220256 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,34 @@ +name: tests +on: + push: + branches: + - main + - renovate/* + pull_request: +jobs: + tests: + name: Tests + runs-on: docker + container: + image: cypress/browsers:latest + options: --user 1001 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Enable corepack + run: corepack enable + + - name: Cypress run (e2e) + uses: https://github.com/cypress-io/github-action@v6 + with: + build: yarn cypress:build + start: yarn cypress:start_server + e2e: true + wait-on: 'http://127.0.0.1:3000' + + - name: Cypress run (component) + uses: https://github.com/cypress-io/github-action@v6 + with: + component: true + install: false diff --git a/.gitignore b/.gitignore index cda64ee..03ddb54 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* !.env.example +!.env.test # vercel .vercel @@ -45,3 +46,8 @@ next-env.d.ts /prisma/*.db* src/generated/* data + +# cypress +cypress/videos +cypress/screenshots +cypress/coverage diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 0000000..bebdaa5 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'cypress'; + +export default defineConfig({ + component: { + devServer: { + framework: 'next', + bundler: 'webpack', + }, + }, + + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); diff --git a/cypress/e2e/auth-user.ts b/cypress/e2e/auth-user.ts new file mode 100644 index 0000000..5b02ab9 --- /dev/null +++ b/cypress/e2e/auth-user.ts @@ -0,0 +1,12 @@ +export default function authUser() { + cy.visit('http://127.0.0.1:3000/login'); + cy.getBySel('login-header').should('exist'); + cy.getBySel('login-form').should('exist'); + cy.getBySel('email-input').should('exist'); + cy.getBySel('password-input').should('exist'); + cy.getBySel('login-button').should('exist'); + cy.getBySel('email-input').type('cypress@example.com'); + cy.getBySel('password-input').type('Password123!'); + cy.getBySel('login-button').click(); + cy.url().should('include', '/home'); +} diff --git a/cypress/e2e/event-create.cy.ts b/cypress/e2e/event-create.cy.ts new file mode 100644 index 0000000..e9097ce --- /dev/null +++ b/cypress/e2e/event-create.cy.ts @@ -0,0 +1,9 @@ +import authUser from './auth-user'; + +describe('event creation', () => { + it('loads', () => { + authUser(); + + cy.visit('http://127.0.0.1:3000/events/new'); + }); +}); diff --git a/cypress/e2e/login.cy.ts b/cypress/e2e/login.cy.ts new file mode 100644 index 0000000..d9461d1 --- /dev/null +++ b/cypress/e2e/login.cy.ts @@ -0,0 +1,45 @@ +describe('login and register', () => { + it('loads', () => { + cy.visit('http://127.0.0.1:3000/'); + + cy.getBySel('login-header').should('exist'); + }); + + it('shows register form', () => { + cy.visit('http://127.0.0.1:3000/'); + + cy.getBySel('register-switch').click(); + + cy.getBySel('register-form').should('exist'); + cy.getBySel('first-name-input').should('exist'); + cy.getBySel('last-name-input').should('exist'); + cy.getBySel('email-input').should('exist'); + cy.getBySel('username-input').should('exist'); + cy.getBySel('password-input').should('exist'); + cy.getBySel('confirm-password-input').should('exist'); + cy.getBySel('register-button').should('exist'); + }); + + it('allows to register', async () => { + cy.visit('http://127.0.0.1:3000/'); + + cy.getBySel('register-switch').click(); + + cy.getBySel('first-name-input').type('Test'); + cy.getBySel('last-name-input').type('User'); + cy.getBySel('email-input').type('test@example.com'); + cy.getBySel('username-input').type('testuser'); + cy.getBySel('password-input').type('Password123!'); + cy.getBySel('confirm-password-input').type('Password123!'); + cy.getBySel('register-button').click(); + cy.getBySel('login-header').should('exist'); + cy.getBySel('login-form').should('exist'); + cy.getBySel('email-input').should('exist'); + cy.getBySel('password-input').should('exist'); + cy.getBySel('login-button').should('exist'); + cy.getBySel('email-input').type('test@example.com'); + cy.getBySel('password-input').type('Password123!'); + cy.getBySel('login-button').click(); + cy.url().should('include', '/home'); + }); +}); diff --git a/cypress/e2e/seed.ts b/cypress/e2e/seed.ts new file mode 100644 index 0000000..c3cd389 --- /dev/null +++ b/cypress/e2e/seed.ts @@ -0,0 +1,29 @@ +import { PrismaClient } from '../../src/generated/prisma'; + +const prisma = new PrismaClient(); + +export default async function requireUser() { + await prisma.$transaction(async (tx) => { + const { id } = await tx.user.create({ + data: { + email: 'cypress@example.com', + name: 'cypress', + password_hash: + '$2a$10$FmkVRHXzMb63dLHHwG1mDOepZJirL.U964wU/3Xr7cFis8XdRh8sO', + first_name: 'Cypress', + last_name: 'Tester', + emailVerified: new Date(), + }, + }); + + await tx.account.create({ + data: { + userId: id, + type: 'credentials', + provider: 'credentials', + providerAccountId: id, + }, + }); + }); +} +requireUser(); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 0000000..59717f5 --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,62 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } + +Cypress.Commands.add('getBySel', (selector, ...args) => { + return cy.get(`[data-cy=${selector}]`, ...args); +}); + +Cypress.Commands.add('getBySelLike', (selector, ...args) => { + return cy.get(`[data-cy*=${selector}]`, ...args); +}); + +declare global { + namespace Cypress { + interface Chainable { + getBySel( + selector: string, + ...args: any[] + ): Chainable>; + getBySelLike( + selector: string, + ...args: any[] + ): Chainable>; + } + } +} + +export {}; diff --git a/cypress/support/component-index.html b/cypress/support/component-index.html new file mode 100644 index 0000000..2cbfac6 --- /dev/null +++ b/cypress/support/component-index.html @@ -0,0 +1,14 @@ + + + + + + + Components App + +
    + + +
    + + diff --git a/cypress/support/component.ts b/cypress/support/component.ts new file mode 100644 index 0000000..b1f1c92 --- /dev/null +++ b/cypress/support/component.ts @@ -0,0 +1,38 @@ +// *********************************************************** +// This example support/component.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +import '@/app/globals.css'; + +// Import commands.js using ES2015 syntax: +import './commands'; + +import { mount } from 'cypress/react'; + +// Augment the Cypress namespace to include type definitions for +// your custom command. +// Alternatively, can be defined in cypress/support/component.d.ts +// with a at the top of your spec. +declare global { + namespace Cypress { + interface Chainable { + mount: typeof mount; + } + } +} + +Cypress.Commands.add('mount', mount); + +// Example use: +// cy.mount() diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts new file mode 100644 index 0000000..e66558e --- /dev/null +++ b/cypress/support/e2e.ts @@ -0,0 +1,17 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; diff --git a/exportSwagger.ts b/exportSwagger.ts index 1eb2837..6b6df1e 100644 --- a/exportSwagger.ts +++ b/exportSwagger.ts @@ -22,16 +22,15 @@ async function exportSwagger() { ); await Promise.all( - filesToImport.map((file) => { - return import(file) - .then((module) => { - if (module.default) { - module.default(registry); - } - }) - .catch((error) => { - console.error(`Error importing ${file}:`, error); - }); + filesToImport.map(async (file) => { + try { + const moduleImp = await import(file); + if (moduleImp.default) { + moduleImp.default(registry); + } + } catch (error) { + console.error(`Error importing ${file}:`, error); + } }), ); diff --git a/package.json b/package.json index 2ef0160..4cbe9c5 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "next dev --turbopack", "build": "prettier --check . && next build", - "start": "next start", + "start": "node .next/standalone/server.js", "lint": "next lint", "format": "prettier --write .", "prisma:migrate": "dotenv -e .env.local -- prisma migrate dev", @@ -15,7 +15,11 @@ "prisma:migrate:reset": "dotenv -e .env.local -- prisma migrate reset", "dev_container": "docker compose -f docker-compose.dev.yml up --watch --build", "swagger:generate": "ts-node -r tsconfig-paths/register exportSwagger.ts", - "orval:generate": "orval" + "orval:generate": "orval", + "cypress:build": "rm -rf /tmp/dev.db && DATABASE_URL=\"file:/tmp/dev.db\" yarn prisma:generate && yarn swagger:generate && yarn orval:generate && DATABASE_URL=\"file:/tmp/dev.db\" yarn prisma:db:push && prettier --check . && NODE_ENV=test next build", + "cypress:start_server": "DATABASE_URL=\"file:/tmp/dev.db\" ts-node cypress/e2e/seed.ts && cp .env.test .next/standalone && cp public .next/standalone/ -r && cp .next/static/ .next/standalone/.next/ -r && NODE_ENV=test HOSTNAME=\"0.0.0.0\" dotenv -e .env.test -- node .next/standalone/server.js", + "cypress:open": "cypress open", + "cypress:run": "cypress run" }, "dependencies": { "@asteasolutions/zod-to-openapi": "^8.0.0-beta.4", @@ -63,6 +67,7 @@ "@types/react-dom": "19.1.6", "@types/swagger-ui-react": "5", "@types/webpack-env": "1.18.8", + "cypress": "14.5.0", "dotenv-cli": "8.0.0", "eslint": "9.29.0", "eslint-config-next": "15.3.4", diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 76778ae..dcd207d 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -33,7 +33,10 @@ export default async function LoginPage() {
    - + @@ -46,6 +49,7 @@ export default async function LoginPage() { key={provider.id} provider={provider.id} providerDisplayName={provider.name} + data-cy={'sso-login-button_' + provider.name.toLowerCase()} /> ))} diff --git a/src/components/buttons/sso-login-button.tsx b/src/components/buttons/sso-login-button.tsx index 644efce..013ef73 100644 --- a/src/components/buttons/sso-login-button.tsx +++ b/src/components/buttons/sso-login-button.tsx @@ -5,10 +5,11 @@ import { faOpenid } from '@fortawesome/free-brands-svg-icons'; export default function SSOLogin({ provider, providerDisplayName, + ...props }: { provider: string; providerDisplayName: string; -}) { +} & React.HTMLAttributes) { return (
    Login with {providerDisplayName} diff --git a/src/components/forms/login-form.tsx b/src/components/forms/login-form.tsx index 8f6b709..c1139b4 100644 --- a/src/components/forms/login-form.tsx +++ b/src/components/forms/login-form.tsx @@ -48,13 +48,18 @@ function LoginFormElement({ }); return ( - +
    - @@ -129,6 +136,7 @@ function RegisterFormElement({ ref={formRef} className='flex flex-col gap-5 w-full' onSubmit={onSubmit} + data-cy='register-form' >
    - - - setTheme('light')}> + + setTheme('light')} + data-cy='light-theme' + > Light - setTheme('dark')}> + setTheme('dark')} data-cy='dark-theme'> Dark - setTheme('system')}> + setTheme('system')} + data-cy='system-theme' + > System diff --git a/tsconfig.json b/tsconfig.json index 251099e..f74ced0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,8 @@ ], "paths": { "@/*": ["./src/*"] - } + }, + "types": ["node", "cypress", "@types/webpack-env"] }, "ts-node": { "compilerOptions": { diff --git a/yarn.lock b/yarn.lock index ba978f0..e704d75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -144,6 +144,42 @@ __metadata: languageName: node linkType: hard +"@cypress/request@npm:^3.0.8": + version: 3.0.8 + resolution: "@cypress/request@npm:3.0.8" + dependencies: + aws-sign2: "npm:~0.7.0" + aws4: "npm:^1.8.0" + caseless: "npm:~0.12.0" + combined-stream: "npm:~1.0.6" + extend: "npm:~3.0.2" + forever-agent: "npm:~0.6.1" + form-data: "npm:~4.0.0" + http-signature: "npm:~1.4.0" + is-typedarray: "npm:~1.0.0" + isstream: "npm:~0.1.2" + json-stringify-safe: "npm:~5.0.1" + mime-types: "npm:~2.1.19" + performance-now: "npm:^2.1.0" + qs: "npm:6.14.0" + safe-buffer: "npm:^5.1.2" + tough-cookie: "npm:^5.0.0" + tunnel-agent: "npm:^0.6.0" + uuid: "npm:^8.3.2" + checksum: 10c0/76cabf6ad64df224bab9b66869f71c4fb63315f9775ef1769da9da6c8d6d470899bee7f5b800379020efb6c7f37fd16a4a8e25c61319e14cd720bd3f606a38fd + languageName: node + linkType: hard + +"@cypress/xvfb@npm:^1.2.4": + version: 1.2.4 + resolution: "@cypress/xvfb@npm:1.2.4" + dependencies: + debug: "npm:^3.1.0" + lodash.once: "npm:^4.1.1" + checksum: 10c0/1bf6224b244f6093033d77f04f6bef719280542656de063cf8ac3f38957b62aa633e6918af0b9673a8bf0123b42a850db51d9729a3ae3da885ac179bc7fc1d26 + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/core@npm:1.4.3" @@ -3264,6 +3300,20 @@ __metadata: languageName: node linkType: hard +"@types/sinonjs__fake-timers@npm:8.1.1": + version: 8.1.1 + resolution: "@types/sinonjs__fake-timers@npm:8.1.1" + checksum: 10c0/e2e6c425a548177c0930c2f9b82d3951956c9701b9ebf59623d5ad2c3229c523d3c0d598e79fe7392a239657abd3dbe3676be0650ce438bcd1199ee3b617a4d7 + languageName: node + linkType: hard + +"@types/sizzle@npm:^2.3.2": + version: 2.3.9 + resolution: "@types/sizzle@npm:2.3.9" + checksum: 10c0/db0277ff62e8ebe6cdae2020fd045fd7fd19f29a3a2ce13c555b14fb00e105e79004883732118b9f2e8b943cb302645e9eddb4e7bdeef1a171da679cd4c32b72 + languageName: node + linkType: hard + "@types/swagger-ui-react@npm:5": version: 5.18.0 resolution: "@types/swagger-ui-react@npm:5.18.0" @@ -3315,6 +3365,15 @@ __metadata: languageName: node linkType: hard +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": version: 8.35.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.35.0" @@ -3636,6 +3695,16 @@ __metadata: languageName: node linkType: hard +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + "ajv-draft-04@npm:^1.0.0, ajv-draft-04@npm:~1.0.0": version: 1.0.0 resolution: "ajv-draft-04@npm:1.0.0" @@ -3702,6 +3771,15 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -3739,6 +3817,13 @@ __metadata: languageName: node linkType: hard +"arch@npm:^2.2.0": + version: 2.2.0 + resolution: "arch@npm:2.2.0" + checksum: 10c0/4ceaf8d8207817c216ebc4469742052cb0a097bc45d9b7fcd60b7507220da545a28562ab5bdd4dfe87921bb56371a0805da4e10d704e01f93a15f83240f1284c + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -3892,6 +3977,22 @@ __metadata: languageName: node linkType: hard +"asn1@npm:~0.2.3": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 10c0/00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: 10c0/b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -3899,6 +4000,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + "astring@npm:^1.8.1": version: 1.9.0 resolution: "astring@npm:1.9.0" @@ -3915,6 +4023,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.0": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -3922,6 +4037,13 @@ __metadata: languageName: node linkType: hard +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + languageName: node + linkType: hard + "autolinker@npm:^3.11.0": version: 3.16.2 resolution: "autolinker@npm:3.16.2" @@ -3940,6 +4062,20 @@ __metadata: languageName: node linkType: hard +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 10c0/021d2cc5547d4d9ef1633e0332e746a6f447997758b8b68d6fb33f290986872d2bff5f0c37d5832f41a7229361f093cd81c40898d96ed153493c0fb5cd8575d2 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: 10c0/c993d0d186d699f685d73113733695d648ec7d4b301aba2e2a559d0cd9c1c902308cc52f4095e1396b23fddbc35113644e7f0a6a32753636306e41e3ed6f1e79 + languageName: node + linkType: hard + "axe-core@npm:^4.10.0": version: 4.10.3 resolution: "axe-core@npm:4.10.3" @@ -3972,13 +4108,22 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.5.1": +"base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf languageName: node linkType: hard +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: 10c0/ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 + languageName: node + linkType: hard + "bcryptjs@npm:^3.0.2": version: 3.0.2 resolution: "bcryptjs@npm:3.0.2" @@ -3988,6 +4133,20 @@ __metadata: languageName: node linkType: hard +"blob-util@npm:^2.0.2": + version: 2.0.2 + resolution: "blob-util@npm:2.0.2" + checksum: 10c0/ed82d587827e5c86be122301a7c250f8364963e9582f72a826255bfbd32f8d69cc10169413d666667bb1c4fc8061329ae89d176ffe46fee8f32080af944ccddc + languageName: node + linkType: hard + +"bluebird@npm:^3.7.2": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.12 resolution: "brace-expansion@npm:1.1.12" @@ -4016,6 +4175,23 @@ __metadata: languageName: node linkType: hard +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer@npm:^5.7.1": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -4043,6 +4219,13 @@ __metadata: languageName: node linkType: hard +"cachedir@npm:^2.3.0": + version: 2.4.0 + resolution: "cachedir@npm:2.4.0" + checksum: 10c0/76bff9009f2c446cd3777a4aede99af634a89670a67012b8041f65e951d3d36cefe8940341ea80c72219ee9913fa1f6146824cd9dfe9874a4bded728af7e6d76 + languageName: node + linkType: hard + "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -4096,7 +4279,14 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.2": +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: 10c0/ccf64bcb6c0232cdc5b7bd91ddd06e23a4b541f138336d4725233ac538041fb2f29c2e86c3c4a7a61ef990b665348db23a047060b9414c3a6603e9fa61ad4626 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -4127,6 +4317,13 @@ __metadata: languageName: node linkType: hard +"check-more-types@npm:^2.24.0": + version: 2.24.0 + resolution: "check-more-types@npm:2.24.0" + checksum: 10c0/93fda2c32eb5f6cd1161a84a2f4107c0e00b40a851748516791dd9a0992b91bdf504e3bf6bf7673ce603ae620042e11ed4084d16d6d92b36818abc9c2e725520 + languageName: node + linkType: hard + "chokidar@npm:^4.0.3": version: 4.0.3 resolution: "chokidar@npm:4.0.3" @@ -4143,6 +4340,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^4.1.0": + version: 4.2.0 + resolution: "ci-info@npm:4.2.0" + checksum: 10c0/37a2f4b6a213a5cf835890eb0241f0d5b022f6cfefde58a69e9af8e3a0e71e06d6ad7754b0d4efb9cd2613e58a7a33996d71b56b0d04242722e86666f3f3d058 + languageName: node + linkType: hard + "class-variance-authority@npm:^0.7.1": version: 0.7.1 resolution: "class-variance-authority@npm:0.7.1" @@ -4159,6 +4363,45 @@ __metadata: languageName: node linkType: hard +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-table3@npm:0.6.1": + version: 0.6.1 + resolution: "cli-table3@npm:0.6.1" + dependencies: + colors: "npm:1.4.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + colors: + optional: true + checksum: 10c0/19ab1bb14bd11b3ca3557ce5ad37ef73e489ea814b99f803171e6ac0a3f2ae5fffb6dbc8864e33cdcf2a3644ebc31b488b8e624fd74af44a1c77cc365c143db4 + languageName: node + linkType: hard + +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: "npm:^3.0.0" + string-width: "npm:^4.2.0" + checksum: 10c0/dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 + languageName: node + linkType: hard + "client-only@npm:0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" @@ -4220,7 +4463,21 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": +"colorette@npm:^2.0.16": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"colors@npm:1.4.0": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 10c0/9af357c019da3c5a098a301cf64e3799d27549d8f185d86f79af23069e4f4303110d115da98483519331f6fb71c8568d5688fa1c6523600044fd4a54e97c4efb + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -4236,6 +4493,20 @@ __metadata: languageName: node linkType: hard +"commander@npm:^6.2.1": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + +"common-tags@npm:^1.8.0": + version: 1.8.2 + resolution: "common-tags@npm:1.8.2" + checksum: 10c0/23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63 + languageName: node + linkType: hard + "compare-versions@npm:^6.1.1": version: 6.1.1 resolution: "compare-versions@npm:6.1.1" @@ -4266,6 +4537,13 @@ __metadata: languageName: node linkType: hard +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 10c0/980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -4273,7 +4551,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -4298,6 +4576,60 @@ __metadata: languageName: node linkType: hard +"cypress@npm:14.5.0": + version: 14.5.0 + resolution: "cypress@npm:14.5.0" + dependencies: + "@cypress/request": "npm:^3.0.8" + "@cypress/xvfb": "npm:^1.2.4" + "@types/sinonjs__fake-timers": "npm:8.1.1" + "@types/sizzle": "npm:^2.3.2" + arch: "npm:^2.2.0" + blob-util: "npm:^2.0.2" + bluebird: "npm:^3.7.2" + buffer: "npm:^5.7.1" + cachedir: "npm:^2.3.0" + chalk: "npm:^4.1.0" + check-more-types: "npm:^2.24.0" + ci-info: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-table3: "npm:0.6.1" + commander: "npm:^6.2.1" + common-tags: "npm:^1.8.0" + dayjs: "npm:^1.10.4" + debug: "npm:^4.3.4" + enquirer: "npm:^2.3.6" + eventemitter2: "npm:6.4.7" + execa: "npm:4.1.0" + executable: "npm:^4.1.1" + extract-zip: "npm:2.0.1" + figures: "npm:^3.2.0" + fs-extra: "npm:^9.1.0" + getos: "npm:^3.2.1" + hasha: "npm:5.2.2" + is-installed-globally: "npm:~0.4.0" + lazy-ass: "npm:^1.6.0" + listr2: "npm:^3.8.3" + lodash: "npm:^4.17.21" + log-symbols: "npm:^4.0.0" + minimist: "npm:^1.2.8" + ospath: "npm:^1.2.2" + pretty-bytes: "npm:^5.6.0" + process: "npm:^0.11.10" + proxy-from-env: "npm:1.0.0" + request-progress: "npm:^3.0.0" + semver: "npm:^7.7.1" + supports-color: "npm:^8.1.1" + tmp: "npm:~0.2.3" + tree-kill: "npm:1.2.2" + untildify: "npm:^4.0.0" + yauzl: "npm:^2.10.0" + bin: + cypress: bin/cypress + checksum: 10c0/b76b05c029625357fbc34f22b632c55f9f981f86c3a568a88ea3d8982b8299e4bd4275e966b2ec767f9a989c6e9059fb03a4a8086048b4e990079b1cab19ba11 + languageName: node + linkType: hard + "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -4305,6 +4637,15 @@ __metadata: languageName: node linkType: hard +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 10c0/64589a15c5bd01fa41ff7007e0f2c6552c5ef2028075daa16b188a3721f4ba001841bf306dfc2eee6e2e6e7f76b38f5f17fb21fa847504192290ffa9e150118a + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" @@ -4338,7 +4679,14 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": +"dayjs@npm:^1.10.4": + version: 1.11.13 + resolution: "dayjs@npm:1.11.13" + checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -4350,7 +4698,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": +"debug@npm:^3.1.0, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -4520,6 +4868,16 @@ __metadata: languageName: node linkType: hard +"ecc-jsbn@npm:~0.1.1": + version: 0.1.2 + resolution: "ecc-jsbn@npm:0.1.2" + dependencies: + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.1.0" + checksum: 10c0/6cf168bae1e2dad2e46561d9af9cbabfbf5ff592176ad4e9f0f41eaaf5fe5e10bb58147fe0a804de62b1ee9dad42c28810c88d652b21b6013c47ba8efa274ca1 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -4543,6 +4901,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/b0701c92a10b89afb1cb45bf54a5292c6f008d744eb4382fa559d54775ff31617d1d7bc3ef617575f552e24fad2c7c1a1835948c66b3f3a4be0a6c1f35c883d8 + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.18.1": version: 5.18.2 resolution: "enhanced-resolve@npm:5.18.2" @@ -4553,7 +4920,7 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.4.1": +"enquirer@npm:^2.3.6, enquirer@npm:^2.4.1": version: 2.4.1 resolution: "enquirer@npm:2.4.1" dependencies: @@ -4841,6 +5208,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -5145,6 +5519,30 @@ __metadata: languageName: node linkType: hard +"eventemitter2@npm:6.4.7": + version: 6.4.7 + resolution: "eventemitter2@npm:6.4.7" + checksum: 10c0/35d8e9d51b919114eb072d33786274e1475db50efe00960c24c088ce4f76c07a826ccc927602724928efb3d8f09a7d8dd1fa79e410875118c0e9846959287f34 + languageName: node + linkType: hard + +"execa@npm:4.1.0": + version: 4.1.0 + resolution: "execa@npm:4.1.0" + dependencies: + cross-spawn: "npm:^7.0.0" + get-stream: "npm:^5.0.0" + human-signals: "npm:^1.1.1" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.0" + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/02211601bb1c52710260edcc68fb84c3c030dc68bafc697c90ada3c52cc31375337de8c24826015b8382a58d63569ffd203b79c94fef217d65503e3e8d2c52ba + languageName: node + linkType: hard + "execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -5162,6 +5560,15 @@ __metadata: languageName: node linkType: hard +"executable@npm:^4.1.1": + version: 4.1.1 + resolution: "executable@npm:4.1.1" + dependencies: + pify: "npm:^2.2.0" + checksum: 10c0/c3cc5d2d2e3cdb1b7d7b0639ebd5566d113d7ada21cfa07f5226d55ba2a210320116720e07570ed5659ef2ec516bc00c8f0488dac75d112fd324ef25c2100173 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.2 resolution: "exponential-backoff@npm:3.1.2" @@ -5169,6 +5576,44 @@ __metadata: languageName: node linkType: hard +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + +"extract-zip@npm:2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + languageName: node + linkType: hard + +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: 10c0/f75114a8388f0cbce68e277b6495dc3930db4dde1611072e4a140c24e204affd77320d004b947a132e9a3b97b8253017b2b62dce661975fb0adced707abf1ab5 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: 10c0/e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -5262,6 +5707,15 @@ __metadata: languageName: node linkType: hard +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + "fdir@npm:^6.4.4": version: 6.4.6 resolution: "fdir@npm:6.4.6" @@ -5274,6 +5728,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -5348,7 +5811,14 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: 10c0/364f7f5f7d93ab661455351ce116a67877b66f59aca199559a999bd39e3cfadbfbfacc10415a915255e2210b30c23febe9aec3ca16bf2d1ff11c935a1000e24c + languageName: node + linkType: hard + +"form-data@npm:^4.0.0, form-data@npm:~4.0.0": version: 4.0.3 resolution: "form-data@npm:4.0.3" dependencies: @@ -5379,6 +5849,18 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + languageName: node + linkType: hard + "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -5458,6 +5940,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -5485,6 +5976,24 @@ __metadata: languageName: node linkType: hard +"getos@npm:^3.2.1": + version: 3.2.1 + resolution: "getos@npm:3.2.1" + dependencies: + async: "npm:^3.2.0" + checksum: 10c0/21556fca1da4dfc8f1707261b4f9ff19b9e9bfefa76478249d2abddba3cd014bd6c5360634add1590b27e0b27d422e8f997dddaa0234aae1fa4c54f33f82e841 + languageName: node + linkType: hard + +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 10c0/c13f8530ecf16fc509f3fa5cd8dd2129ffa5d0c7ccdf5728b6022d52954c2d24be3706b4cdf15333eec52f1fbb43feb70a01dabc639d1d10071e371da8aaa52f + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -5519,6 +6028,15 @@ __metadata: languageName: node linkType: hard +"global-dirs@npm:^3.0.0": + version: 3.0.1 + resolution: "global-dirs@npm:3.0.1" + dependencies: + ini: "npm:2.0.0" + checksum: 10c0/ef65e2241a47ff978f7006a641302bc7f4c03dfb98783d42bf7224c136e3a06df046e70ee3a010cf30214114755e46c9eb5eb1513838812fbbe0d92b14c25080 + languageName: node + linkType: hard + "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -5619,6 +6137,16 @@ __metadata: languageName: node linkType: hard +"hasha@npm:5.2.2": + version: 5.2.2 + resolution: "hasha@npm:5.2.2" + dependencies: + is-stream: "npm:^2.0.0" + type-fest: "npm:^0.8.0" + checksum: 10c0/9d10d4e665a37beea6e18ba3a0c0399a05b26e505c5ff2fe9115b64fedb3ca95f68c89cf15b08ee4d09fd3064b5e1bfc8e8247353c7aa6b7388471d0f86dca74 + languageName: node + linkType: hard + "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -5679,6 +6207,17 @@ __metadata: languageName: node linkType: hard +"http-signature@npm:~1.4.0": + version: 1.4.0 + resolution: "http-signature@npm:1.4.0" + dependencies: + assert-plus: "npm:^1.0.0" + jsprim: "npm:^2.0.2" + sshpk: "npm:^1.18.0" + checksum: 10c0/b9806f5a9ed82a146589837d175c43b596b1cc8c9431665e83d47c152aa8a4629dd1b1e050f8f56e7f17f62cf97b58e888775093310441ddee5f105f28646b2b + languageName: node + linkType: hard + "http2-client@npm:^1.2.5": version: 1.3.5 resolution: "http2-client@npm:1.3.5" @@ -5696,6 +6235,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^1.1.1": + version: 1.1.1 + resolution: "human-signals@npm:1.1.1" + checksum: 10c0/18810ed239a7a5e23fb6c32d0fd4be75d7cd337a07ad59b8dbf0794cb0761e6e628349ee04c409e605fe55344716eab5d0a47a62ba2a2d0d367c89a2b4247b1e + languageName: node + linkType: hard + "human-signals@npm:^2.1.0": version: 2.1.0 resolution: "human-signals@npm:2.1.0" @@ -5712,7 +6258,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.2.1": +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb @@ -5764,6 +6310,13 @@ __metadata: languageName: node linkType: hard +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + "inherits@npm:^2.0.1": version: 2.0.4 resolution: "inherits@npm:2.0.4" @@ -5771,6 +6324,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:2.0.0": + version: 2.0.0 + resolution: "ini@npm:2.0.0" + checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 + languageName: node + linkType: hard + "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -5972,6 +6532,16 @@ __metadata: languageName: node linkType: hard +"is-installed-globally@npm:~0.4.0": + version: 0.4.0 + resolution: "is-installed-globally@npm:0.4.0" + dependencies: + global-dirs: "npm:^3.0.0" + is-path-inside: "npm:^3.0.2" + checksum: 10c0/f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d + languageName: node + linkType: hard + "is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" @@ -6003,6 +6573,13 @@ __metadata: languageName: node linkType: hard +"is-path-inside@npm:^3.0.2": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -6068,6 +6645,20 @@ __metadata: languageName: node linkType: hard +"is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -6115,6 +6706,13 @@ __metadata: languageName: node linkType: hard +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 10c0/a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f + languageName: node + linkType: hard + "iterator.prototype@npm:^1.1.4": version: 1.1.5 resolution: "iterator.prototype@npm:1.1.5" @@ -6190,6 +6788,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: 10c0/e046e05c59ff880ee4ef68902dbdcb6d2f3c5d60c357d4d68647dc23add556c31c0e5f41bdb7e69e793dd63468bd9e085da3636341048ef577b18f5b713877c0 + languageName: node + linkType: hard + "jsep@npm:^1.2.0, jsep@npm:^1.3.6, jsep@npm:^1.4.0": version: 1.4.0 resolution: "jsep@npm:1.4.0" @@ -6218,6 +6823,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -6225,6 +6837,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -6293,6 +6912,18 @@ __metadata: languageName: node linkType: hard +"jsprim@npm:^2.0.2": + version: 2.0.2 + resolution: "jsprim@npm:2.0.2" + dependencies: + assert-plus: "npm:1.0.0" + extsprintf: "npm:1.3.0" + json-schema: "npm:0.4.0" + verror: "npm:1.10.0" + checksum: 10c0/677be2d41df536c92c6d0114a492ef197084018cfbb1a3e10b1fa1aad889564b2e3a7baa6af7949cc2d73678f42368b0be165a26bd4e4de6883a30dd6a24e98d + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -6330,6 +6961,13 @@ __metadata: languageName: node linkType: hard +"lazy-ass@npm:^1.6.0": + version: 1.6.0 + resolution: "lazy-ass@npm:1.6.0" + checksum: 10c0/4af6cb9a333fbc811268c745f9173fba0f99ecb817cc9c0fae5dbf986b797b730ff525504128f6623b91aba32b02124553a34b0d14de3762b637b74d7233f3bd + languageName: node + linkType: hard + "leven@npm:3.1.0, leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -6466,6 +7104,27 @@ __metadata: languageName: node linkType: hard +"listr2@npm:^3.8.3": + version: 3.14.0 + resolution: "listr2@npm:3.14.0" + dependencies: + cli-truncate: "npm:^2.1.0" + colorette: "npm:^2.0.16" + log-update: "npm:^4.0.0" + p-map: "npm:^4.0.0" + rfdc: "npm:^1.3.0" + rxjs: "npm:^7.5.1" + through: "npm:^2.3.8" + wrap-ansi: "npm:^7.0.0" + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 10c0/8301703876ad6bf50cd769e9c1169c2aa435951d69d4f54fc202a13c1b6006a9b3afbcf9842440eb22f08beec4d311d365e31d4ed2e0fcabf198d8085b06a421 + languageName: node + linkType: hard + "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -6503,6 +7162,13 @@ __metadata: languageName: node linkType: hard +"lodash.once@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 + languageName: node + linkType: hard + "lodash.topath@npm:^4.5.2": version: 4.5.2 resolution: "lodash.topath@npm:4.5.2" @@ -6538,6 +7204,28 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:^4.0.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: "npm:^4.3.0" + cli-cursor: "npm:^3.1.0" + slice-ansi: "npm:^4.0.0" + wrap-ansi: "npm:^6.2.0" + checksum: 10c0/18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86 + languageName: node + linkType: hard + "loglevel-plugin-prefix@npm:0.8.4": version: 0.8.4 resolution: "loglevel-plugin-prefix@npm:0.8.4" @@ -6698,6 +7386,7 @@ __metadata: bcryptjs: "npm:^3.0.2" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" + cypress: "npm:14.5.0" dotenv-cli: "npm:8.0.0" eslint: "npm:9.29.0" eslint-config-next: "npm:15.3.4" @@ -6755,7 +7444,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12": +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -6816,7 +7505,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -7171,7 +7860,7 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^4.0.1": +"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" dependencies: @@ -7327,7 +8016,16 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.2": +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: @@ -7431,6 +8129,13 @@ __metadata: languageName: node linkType: hard +"ospath@npm:^1.2.2": + version: 1.2.2 + resolution: "ospath@npm:1.2.2" + checksum: 10c0/e485a6ca91964f786163408b093860bf26a9d9704d83ec39ccf463b9f11ea712b780b23b73d1f64536de62c5f66244dd94ed83fc9ffe3c1564dd1eed5cdae923 + languageName: node + linkType: hard + "own-keys@npm:^1.0.1": version: 1.0.1 resolution: "own-keys@npm:1.0.1" @@ -7460,6 +8165,15 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + "p-map@npm:^7.0.2": version: 7.0.3 resolution: "p-map@npm:7.0.3" @@ -7535,6 +8249,20 @@ __metadata: languageName: node linkType: hard +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 10c0/22c54de06f269e29f640e0e075207af57de5052a3d15e360c09b9a8663f393f6f45902006c1e71aa8a5a1cdfb1a47fe268826f8496d6425c362f00f5bc3e85d9 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -7556,6 +8284,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^2.2.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + "pony-cause@npm:^1.1.1": version: 1.1.1 resolution: "pony-cause@npm:1.1.1" @@ -7624,6 +8359,13 @@ __metadata: languageName: node linkType: hard +"pretty-bytes@npm:^5.6.0": + version: 5.6.0 + resolution: "pretty-bytes@npm:5.6.0" + checksum: 10c0/f69f494dcc1adda98dbe0e4a36d301e8be8ff99bfde7a637b2ee2820e7cb583b0fc0f3a63b0e3752c01501185a5cf38602c7be60da41bdf84ef5b70e89c370f3 + languageName: node + linkType: hard + "prisma@npm:6.10.1": version: 6.10.1 resolution: "prisma@npm:6.10.1" @@ -7699,6 +8441,13 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:1.0.0": + version: 1.0.0 + resolution: "proxy-from-env@npm:1.0.0" + checksum: 10c0/c64df9b21f7f820dc882cd6f7f81671840acd28b9688ee3e3e6af47a56ec7f0edcabe5bc96b32b26218b35eeff377bcc27ac27f89b6b21401003e187ff13256f + languageName: node + linkType: hard + "proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -7706,6 +8455,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.3 + resolution: "pump@npm:3.0.3" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/ada5cdf1d813065bbc99aa2c393b8f6beee73b5de2890a8754c9f488d7323ffd2ca5f5a0943b48934e3fcbd97637d0337369c3c631aeb9614915db629f1c75c9 + languageName: node + linkType: hard + "punycode.js@npm:^2.3.1": version: 2.3.1 resolution: "punycode.js@npm:2.3.1" @@ -7720,6 +8479,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.14.0": + version: 6.14.0 + resolution: "qs@npm:6.14.0" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c + languageName: node + linkType: hard + "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -8034,6 +8802,15 @@ __metadata: languageName: node linkType: hard +"request-progress@npm:^3.0.0": + version: 3.0.0 + resolution: "request-progress@npm:3.0.0" + dependencies: + throttleit: "npm:^1.0.0" + checksum: 10c0/d5dcb7155a738572c8781436f6b418e866066a30eea0f99a9ab26b6f0ed6c13637462bba736357de3899b8d30431ee9202ac956a5f8ccdd0d9d1ed0962000d14 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -8128,6 +8905,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + "ret@npm:^0.2.0": version: 0.2.2 resolution: "ret@npm:0.2.2" @@ -8149,6 +8936,13 @@ __metadata: languageName: node linkType: hard +"rfdc@npm:^1.3.0": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -8158,6 +8952,15 @@ __metadata: languageName: node linkType: hard +"rxjs@npm:^7.5.1": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.3": version: 1.1.3 resolution: "safe-array-concat@npm:1.1.3" @@ -8171,7 +8974,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0": +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.2": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -8206,7 +9009,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -8501,7 +9304,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.3": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -8540,6 +9343,28 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -8596,6 +9421,27 @@ __metadata: languageName: node linkType: hard +"sshpk@npm:^1.18.0": + version: 1.18.0 + resolution: "sshpk@npm:1.18.0" + dependencies: + asn1: "npm:~0.2.3" + assert-plus: "npm:^1.0.0" + bcrypt-pbkdf: "npm:^1.0.0" + dashdash: "npm:^1.12.0" + ecc-jsbn: "npm:~0.1.1" + getpass: "npm:^0.1.1" + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.0.2" + tweetnacl: "npm:~0.14.0" + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: 10c0/e516e34fa981cfceef45fd2e947772cc70dbd57523e5c608e2cd73752ba7f8a99a04df7c3ed751588e8d91956b6f16531590b35d3489980d1c54c38bebcd41b1 + languageName: node + linkType: hard + "ssri@npm:^12.0.0": version: 12.0.0 resolution: "ssri@npm:12.0.0" @@ -8795,6 +9641,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -8930,6 +9785,20 @@ __metadata: languageName: node linkType: hard +"throttleit@npm:^1.0.0": + version: 1.0.1 + resolution: "throttleit@npm:1.0.1" + checksum: 10c0/4d41a1bf467646b1aa7bec0123b78452a0e302d7344f6a67e43e68434f0a02ea3ba44df050a40c69adeb9cae3cbf6b36b38cfe94bcc3c4a8243c9b63e38e059b + languageName: node + linkType: hard + +"through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" @@ -8940,6 +9809,31 @@ __metadata: languageName: node linkType: hard +"tldts-core@npm:^6.1.86": + version: 6.1.86 + resolution: "tldts-core@npm:6.1.86" + checksum: 10c0/8133c29375f3f99f88fce5f4d62f6ecb9532b106f31e5423b27c1eb1b6e711bd41875184a456819ceaed5c8b94f43911b1ad57e25c6eb86e1fc201228ff7e2af + languageName: node + linkType: hard + +"tldts@npm:^6.1.32": + version: 6.1.86 + resolution: "tldts@npm:6.1.86" + dependencies: + tldts-core: "npm:^6.1.86" + bin: + tldts: bin/cli.js + checksum: 10c0/27ae7526d9d78cb97b2de3f4d102e0b4321d1ccff0648a7bb0e039ed54acbce86bacdcd9cd3c14310e519b457854e7bafbef1f529f58a1e217a737ced63f0940 + languageName: node + linkType: hard + +"tmp@npm:~0.2.3": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -8956,6 +9850,15 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^5.0.0": + version: 5.1.2 + resolution: "tough-cookie@npm:5.1.2" + dependencies: + tldts: "npm:^6.1.32" + checksum: 10c0/5f95023a47de0f30a902bba951664b359725597d8adeabc66a0b93a931c3af801e1e697dae4b8c21a012056c0ea88bd2bf4dfe66b2adcf8e2f42cd9796fe0626 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -8963,6 +9866,15 @@ __metadata: languageName: node linkType: hard +"tree-kill@npm:1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 + languageName: node + linkType: hard + "tree-sitter-json@npm:=0.24.8": version: 0.24.8 resolution: "tree-sitter-json@npm:0.24.8" @@ -9113,6 +10025,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + "tw-animate-css@npm:1.3.4": version: 1.3.4 resolution: "tw-animate-css@npm:1.3.4" @@ -9120,6 +10041,13 @@ __metadata: languageName: node linkType: hard +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 10c0/4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -9136,6 +10064,20 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.0": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -9376,6 +10318,13 @@ __metadata: languageName: node linkType: hard +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: 10c0/d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -9449,6 +10398,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -9463,6 +10421,17 @@ __metadata: languageName: node linkType: hard +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: 10c0/37ccdf8542b5863c525128908ac80f2b476eed36a32cb944de930ca1e2e78584cc435c4b9b4c68d0fc13a47b45ff364b4be43aa74f8804f9050140f660fb660d + languageName: node + linkType: hard + "web-streams-polyfill@npm:^3.0.3": version: 3.3.3 resolution: "web-streams-polyfill@npm:3.3.3" @@ -9595,6 +10564,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -9606,6 +10586,13 @@ __metadata: languageName: node linkType: hard +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + "xml-but-prettier@npm:^1.0.1": version: 1.0.1 resolution: "xml-but-prettier@npm:1.0.1" @@ -9688,6 +10675,16 @@ __metadata: languageName: node linkType: hard +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1"