Fix: Add testing
This commit is contained in:
parent
d022d9fcf6
commit
ed6195e1e2
22 changed files with 338 additions and 87 deletions
27
.github/workflows/playwright.yml
vendored
Normal file
27
.github/workflows/playwright.yml
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
name: Playwright Tests
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main, master]
|
||||||
|
pull_request:
|
||||||
|
branches: [main, master]
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
timeout-minutes: 60
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install -g pnpm && pnpm install
|
||||||
|
- name: Install Playwright Browsers
|
||||||
|
run: pnpm exec playwright install --with-deps
|
||||||
|
- name: Run Playwright tests
|
||||||
|
run: pnpm exec playwright test
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: playwright-report
|
||||||
|
path: playwright-report/
|
||||||
|
retention-days: 30
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -27,3 +27,9 @@ gitignore
|
||||||
# System Files
|
# System Files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
|
# Playwright
|
||||||
|
/test-results/
|
||||||
|
/playwright-report/
|
||||||
|
/blob-report/
|
||||||
|
/playwright/.cache/
|
||||||
|
|
|
@ -49,7 +49,7 @@ To get started with li'l Judd, follow the instructions below.
|
||||||
VITE_DISCORD_CLIENT_ID=your_discord_client_id
|
VITE_DISCORD_CLIENT_ID=your_discord_client_id
|
||||||
VITE_DISCORD_CLIENT_SECRET=your_discord_client_secret
|
VITE_DISCORD_CLIENT_SECRET=your_discord_client_secret
|
||||||
VITE_DISCORD_BOT_TOKEN=your_discord_bot_token
|
VITE_DISCORD_BOT_TOKEN=your_discord_bot_token
|
||||||
VITE_DISCORD_BOT_PERMISSIONS=18977581952080
|
VITE_DISCORD_OAUTH2_PERMISSIONS=18977581952080
|
||||||
|
|
||||||
VITE_AUTH_SECRET=your_auth_secret
|
VITE_AUTH_SECRET=your_auth_secret
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,11 @@ Authorization: Bearer {{$dotenv DISCORD_ACCESS_TOKEN}}
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
|
GET https://discord.com/api/users/@me
|
||||||
|
Authorization: Bot {{$dotenv DISCORD_BOT_TOKEN}}
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
GET https://discord.com/api/users/@me/guilds
|
GET https://discord.com/api/users/@me/guilds
|
||||||
Authorization: Bearer {{$dotenv DISCORD_ACCESS_TOKEN}}
|
Authorization: Bearer {{$dotenv DISCORD_ACCESS_TOKEN}}
|
||||||
|
|
||||||
|
|
122
e2e/auth.spec.ts
Normal file
122
e2e/auth.spec.ts
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
import { createId } from "@paralleldrive/cuid2";
|
||||||
|
import { expect, test, type BrowserContext, type Page } from "@playwright/test";
|
||||||
|
import { Lucia, type Cookie } from "lucia";
|
||||||
|
import createClient from "openapi-fetch";
|
||||||
|
import * as schema from "~/drizzle/schema";
|
||||||
|
import { paths } from "~/types/discord";
|
||||||
|
|
||||||
|
import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle";
|
||||||
|
import "dotenv/config";
|
||||||
|
import { drizzle } from "drizzle-orm/postgres-js";
|
||||||
|
import postgres from "postgres";
|
||||||
|
|
||||||
|
const queryClient = postgres(process.env.DATABASE_URL!);
|
||||||
|
const db = drizzle(queryClient, {
|
||||||
|
schema,
|
||||||
|
});
|
||||||
|
|
||||||
|
const adapter = new DrizzlePostgreSQLAdapter(db, schema.sessions, schema.users);
|
||||||
|
export const lucia = new Lucia(adapter, {
|
||||||
|
getUserAttributes: (attributes) => attributes,
|
||||||
|
});
|
||||||
|
|
||||||
|
let context: BrowserContext;
|
||||||
|
let page: Page;
|
||||||
|
|
||||||
|
let sessionCookie: Cookie | undefined;
|
||||||
|
|
||||||
|
test.describe.serial("User auth process", () => {
|
||||||
|
test.beforeAll(async ({ browser }) => {
|
||||||
|
context = await browser.newContext();
|
||||||
|
page = await context.newPage();
|
||||||
|
});
|
||||||
|
|
||||||
|
test.beforeEach(async () => {
|
||||||
|
if (!sessionCookie) return;
|
||||||
|
|
||||||
|
const sameSiteProps = {
|
||||||
|
lax: "Lax",
|
||||||
|
strict: "Strict",
|
||||||
|
none: "None",
|
||||||
|
} as const;
|
||||||
|
const expires = sessionCookie.attributes.expires
|
||||||
|
? sessionCookie.attributes.expires.getTime() / 1000
|
||||||
|
: undefined;
|
||||||
|
const sameSite = sessionCookie.attributes.sameSite
|
||||||
|
? sameSiteProps[sessionCookie.attributes.sameSite]
|
||||||
|
: undefined;
|
||||||
|
await context.addCookies([
|
||||||
|
{
|
||||||
|
name: sessionCookie.name,
|
||||||
|
value: sessionCookie.value,
|
||||||
|
...sessionCookie.attributes,
|
||||||
|
sameSite,
|
||||||
|
expires,
|
||||||
|
secure: false,
|
||||||
|
domain: "localhost",
|
||||||
|
path: "/",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test.afterAll(async () => {
|
||||||
|
await context.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Landing page", async () => {
|
||||||
|
await page.goto("/");
|
||||||
|
await page.waitForLoadState("load");
|
||||||
|
|
||||||
|
expect(await page.screenshot()).toMatchSnapshot("landing_page.png");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Unauthorized Access Redirect Test", async () => {
|
||||||
|
await page.goto("/config");
|
||||||
|
await page.waitForURL("/");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Generate auth session for further tests", async () => {
|
||||||
|
const { GET } = createClient<paths>({
|
||||||
|
baseUrl: "https://discord.com/api/v10",
|
||||||
|
});
|
||||||
|
const discordUserResponse = await GET("/users/@me", {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bot ${process.env.DISCORD_BOT_TOKEN}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (discordUserResponse.error) throw discordUserResponse.error;
|
||||||
|
const discordUser = discordUserResponse.data;
|
||||||
|
const userId = createId();
|
||||||
|
await db.insert(schema.users).values({
|
||||||
|
id: userId,
|
||||||
|
discord_id: discordUser.id,
|
||||||
|
name: discordUser.global_name,
|
||||||
|
image: discordUser.avatar,
|
||||||
|
});
|
||||||
|
const session = await lucia.createSession(
|
||||||
|
userId,
|
||||||
|
{},
|
||||||
|
{ sessionId: createId() },
|
||||||
|
);
|
||||||
|
sessionCookie = lucia.createSessionCookie(session.id);
|
||||||
|
await db
|
||||||
|
.insert(schema.discordTokens)
|
||||||
|
.values({
|
||||||
|
userId,
|
||||||
|
accessToken: "tokens.accessToken",
|
||||||
|
expiresAt: sessionCookie.attributes.expires ?? new Date(),
|
||||||
|
refreshToken: "tokens.refreshToken",
|
||||||
|
})
|
||||||
|
.returning()
|
||||||
|
.execute();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Landing page when logged in", async () => {
|
||||||
|
await page.goto("/");
|
||||||
|
await page.waitForLoadState("load");
|
||||||
|
|
||||||
|
expect(await page.screenshot()).toMatchSnapshot(
|
||||||
|
"landing_page_logged_in.png",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
BIN
e2e/auth.spec.ts-snapshots/landing-page-chromium-linux.png
Normal file
BIN
e2e/auth.spec.ts-snapshots/landing-page-chromium-linux.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 KiB |
BIN
e2e/auth.spec.ts-snapshots/landing-page-firefox-linux.png
Normal file
BIN
e2e/auth.spec.ts-snapshots/landing-page-firefox-linux.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 328 KiB |
Binary file not shown.
After Width: | Height: | Size: 227 KiB |
Binary file not shown.
After Width: | Height: | Size: 331 KiB |
Binary file not shown.
After Width: | Height: | Size: 716 KiB |
BIN
e2e/auth.spec.ts-snapshots/landing-page-webkit-linux.png
Normal file
BIN
e2e/auth.spec.ts-snapshots/landing-page-webkit-linux.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 710 KiB |
|
@ -10,7 +10,9 @@
|
||||||
"discord-openapi-gen": "openapi-typescript https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json -o ./src/types/discord.d.ts",
|
"discord-openapi-gen": "openapi-typescript https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json -o ./src/types/discord.d.ts",
|
||||||
"liljudd-openapi-gen": "openapi-typescript ./public/api/specs/liljudd.json -o ./src/types/liljudd.d.ts",
|
"liljudd-openapi-gen": "openapi-typescript ./public/api/specs/liljudd.json -o ./src/types/liljudd.d.ts",
|
||||||
"typecheck": "tsc --noEmit --checkJs false --skipLibCheck --preserveSymLinks",
|
"typecheck": "tsc --noEmit --checkJs false --skipLibCheck --preserveSymLinks",
|
||||||
"drizzle-studio": "drizzle-kit studio"
|
"drizzle-studio": "drizzle-kit studio",
|
||||||
|
"test": "pnpm exec playwright test",
|
||||||
|
"test-ui": "pnpm exec playwright test --ui"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "^6.5.1",
|
"@fortawesome/fontawesome-svg-core": "^6.5.1",
|
||||||
|
@ -38,7 +40,9 @@
|
||||||
"vinxi": "^0.3.4"
|
"vinxi": "^0.3.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@playwright/test": "^1.42.0",
|
||||||
"@types/json-stable-stringify": "^1.0.36",
|
"@types/json-stable-stringify": "^1.0.36",
|
||||||
|
"@types/node": "^20.11.22",
|
||||||
"@types/object-hash": "^3.0.6",
|
"@types/object-hash": "^3.0.6",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.1.0",
|
"@typescript-eslint/eslint-plugin": "^7.1.0",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
|
|
77
playwright.config.ts
Normal file
77
playwright.config.ts
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
import { defineConfig, devices } from "@playwright/test";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read environment variables from file.
|
||||||
|
* https://github.com/motdotla/dotenv
|
||||||
|
*/
|
||||||
|
// require('dotenv').config();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://playwright.dev/docs/test-configuration.
|
||||||
|
*/
|
||||||
|
export default defineConfig({
|
||||||
|
testDir: "./e2e",
|
||||||
|
/* Run tests in files in parallel */
|
||||||
|
fullyParallel: true,
|
||||||
|
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||||
|
forbidOnly: !!process.env.CI,
|
||||||
|
/* Retry on CI only */
|
||||||
|
retries: process.env.CI ? 2 : 0,
|
||||||
|
/* Opt out of parallel tests on CI. */
|
||||||
|
workers: process.env.CI ? 1 : undefined,
|
||||||
|
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||||
|
reporter: "html",
|
||||||
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||||
|
use: {
|
||||||
|
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||||
|
baseURL: "http://localhost:3000",
|
||||||
|
|
||||||
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||||
|
trace: "on-first-retry",
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Configure projects for major browsers */
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
name: "chromium",
|
||||||
|
use: { ...devices["Desktop Chrome"] },
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "firefox",
|
||||||
|
use: { ...devices["Desktop Firefox"] },
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "webkit",
|
||||||
|
use: { ...devices["Desktop Safari"] },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Test against mobile viewports. */
|
||||||
|
// {
|
||||||
|
// name: 'Mobile Chrome',
|
||||||
|
// use: { ...devices['Pixel 5'] },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: 'Mobile Safari',
|
||||||
|
// use: { ...devices['iPhone 12'] },
|
||||||
|
// },
|
||||||
|
|
||||||
|
/* Test against branded browsers. */
|
||||||
|
// {
|
||||||
|
// name: 'Microsoft Edge',
|
||||||
|
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: 'Google Chrome',
|
||||||
|
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
||||||
|
// },
|
||||||
|
],
|
||||||
|
|
||||||
|
/* Run your local dev server before starting the tests */
|
||||||
|
webServer: {
|
||||||
|
command: "pnpm start",
|
||||||
|
url: "http://localhost:3000",
|
||||||
|
reuseExistingServer: !process.env.CI,
|
||||||
|
},
|
||||||
|
});
|
126
pnpm-lock.yaml
126
pnpm-lock.yaml
|
@ -73,12 +73,18 @@ dependencies:
|
||||||
version: 1.8.15
|
version: 1.8.15
|
||||||
vinxi:
|
vinxi:
|
||||||
specifier: ^0.3.4
|
specifier: ^0.3.4
|
||||||
version: 0.3.4(preact@10.19.6)(sass@1.71.1)
|
version: 0.3.4(@types/node@20.11.22)(preact@10.19.6)(sass@1.71.1)
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@playwright/test':
|
||||||
|
specifier: ^1.42.0
|
||||||
|
version: 1.42.0
|
||||||
'@types/json-stable-stringify':
|
'@types/json-stable-stringify':
|
||||||
specifier: ^1.0.36
|
specifier: ^1.0.36
|
||||||
version: 1.0.36
|
version: 1.0.36
|
||||||
|
'@types/node':
|
||||||
|
specifier: ^20.11.22
|
||||||
|
version: 20.11.22
|
||||||
'@types/object-hash':
|
'@types/object-hash':
|
||||||
specifier: ^3.0.6
|
specifier: ^3.0.6
|
||||||
version: 3.0.6
|
version: 3.0.6
|
||||||
|
@ -316,7 +322,6 @@ packages:
|
||||||
/@babel/parser@7.24.0:
|
/@babel/parser@7.24.0:
|
||||||
resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==}
|
resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.24.0
|
'@babel/types': 7.24.0
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -988,7 +993,6 @@ packages:
|
||||||
|
|
||||||
/@mapbox/node-pre-gyp@1.0.11:
|
/@mapbox/node-pre-gyp@1.0.11:
|
||||||
resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
|
resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
detect-libc: 2.0.2
|
detect-libc: 2.0.2
|
||||||
https-proxy-agent: 5.0.1
|
https-proxy-agent: 5.0.1
|
||||||
|
@ -1508,6 +1512,13 @@ packages:
|
||||||
'@parcel/watcher-win32-x64': 2.4.1
|
'@parcel/watcher-win32-x64': 2.4.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@playwright/test@1.42.0:
|
||||||
|
resolution: {integrity: sha512-2k1HzC28Fs+HiwbJOQDUwrWMttqSLUVdjCqitBOjdCD0svWOMQUVqrXX6iFD7POps6xXAojsX/dGBpKnjZctLA==}
|
||||||
|
engines: {node: '>=16'}
|
||||||
|
dependencies:
|
||||||
|
playwright: 1.42.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@polka/url@1.0.0-next.24:
|
/@polka/url@1.0.0-next.24:
|
||||||
resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==}
|
resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -1529,7 +1540,7 @@ packages:
|
||||||
magic-string: 0.30.5
|
magic-string: 0.30.5
|
||||||
node-html-parser: 6.1.12
|
node-html-parser: 6.1.12
|
||||||
resolve: 1.22.8
|
resolve: 1.22.8
|
||||||
vite: 5.1.1(sass@1.71.1)
|
vite: 5.1.1(@types/node@20.11.22)(sass@1.71.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- preact
|
- preact
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -1563,7 +1574,7 @@ packages:
|
||||||
'@prefresh/utils': 1.2.0
|
'@prefresh/utils': 1.2.0
|
||||||
'@rollup/pluginutils': 4.2.1
|
'@rollup/pluginutils': 4.2.1
|
||||||
preact: 10.19.6
|
preact: 10.19.6
|
||||||
vite: 5.1.1(sass@1.71.1)
|
vite: 5.1.1(@types/node@20.11.22)(sass@1.71.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -1947,7 +1958,6 @@ packages:
|
||||||
resolution: {integrity: sha512-/G+IxWxma6V3E+pqK1tSl2Fo1kl41pK1yeCyDsgkF9WlVAme4j5ISYM2zR11bgLFJGLN5sVK40T4RJNuiZbEjA==}
|
resolution: {integrity: sha512-/G+IxWxma6V3E+pqK1tSl2Fo1kl41pK1yeCyDsgkF9WlVAme4j5ISYM2zR11bgLFJGLN5sVK40T4RJNuiZbEjA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 5.26.5
|
undici-types: 5.26.5
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@types/object-hash@3.0.6:
|
/@types/object-hash@3.0.6:
|
||||||
resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==}
|
resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==}
|
||||||
|
@ -2176,7 +2186,6 @@ packages:
|
||||||
/@vercel/nft@0.24.4:
|
/@vercel/nft@0.24.4:
|
||||||
resolution: {integrity: sha512-KjYAZty7boH5fi5udp6p+lNu6nawgs++pHW+3koErMgbRkkHuToGX/FwjN5clV1FcaM3udfd4zW/sUapkMgpZw==}
|
resolution: {integrity: sha512-KjYAZty7boH5fi5udp6p+lNu6nawgs++pHW+3koErMgbRkkHuToGX/FwjN5clV1FcaM3udfd4zW/sUapkMgpZw==}
|
||||||
engines: {node: '>=16'}
|
engines: {node: '>=16'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@mapbox/node-pre-gyp': 1.0.11
|
'@mapbox/node-pre-gyp': 1.0.11
|
||||||
'@rollup/pluginutils': 4.2.1
|
'@rollup/pluginutils': 4.2.1
|
||||||
|
@ -2218,7 +2227,6 @@ packages:
|
||||||
|
|
||||||
/@vinxi/listhen@1.5.6:
|
/@vinxi/listhen@1.5.6:
|
||||||
resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==}
|
resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@parcel/watcher': 2.4.1
|
'@parcel/watcher': 2.4.1
|
||||||
'@parcel/watcher-wasm': 2.3.0
|
'@parcel/watcher-wasm': 2.3.0
|
||||||
|
@ -2255,7 +2263,7 @@ packages:
|
||||||
magicast: 0.2.11
|
magicast: 0.2.11
|
||||||
recast: 0.23.4
|
recast: 0.23.4
|
||||||
tslib: 2.6.2
|
tslib: 2.6.2
|
||||||
vinxi: 0.3.4(preact@10.19.6)(sass@1.71.1)
|
vinxi: 0.3.4(@types/node@20.11.22)(preact@10.19.6)(sass@1.71.1)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@vinxi/server-components@0.3.0(vinxi@0.3.4):
|
/@vinxi/server-components@0.3.0(vinxi@0.3.4):
|
||||||
|
@ -2270,7 +2278,7 @@ packages:
|
||||||
astring: 1.8.6
|
astring: 1.8.6
|
||||||
magicast: 0.2.11
|
magicast: 0.2.11
|
||||||
recast: 0.23.4
|
recast: 0.23.4
|
||||||
vinxi: 0.3.4(preact@10.19.6)(sass@1.71.1)
|
vinxi: 0.3.4(@types/node@20.11.22)(preact@10.19.6)(sass@1.71.1)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@vinxi/server-functions@0.3.0(vinxi@0.3.4):
|
/@vinxi/server-functions@0.3.0(vinxi@0.3.4):
|
||||||
|
@ -2285,7 +2293,7 @@ packages:
|
||||||
astring: 1.8.6
|
astring: 1.8.6
|
||||||
magicast: 0.2.11
|
magicast: 0.2.11
|
||||||
recast: 0.23.4
|
recast: 0.23.4
|
||||||
vinxi: 0.3.4(preact@10.19.6)(sass@1.71.1)
|
vinxi: 0.3.4(@types/node@20.11.22)(preact@10.19.6)(sass@1.71.1)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/abbrev@1.1.1:
|
/abbrev@1.1.1:
|
||||||
|
@ -2317,7 +2325,6 @@ packages:
|
||||||
/acorn@8.11.3:
|
/acorn@8.11.3:
|
||||||
resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
|
resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
|
||||||
engines: {node: '>=0.4.0'}
|
engines: {node: '>=0.4.0'}
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
/agent-base@6.0.2:
|
/agent-base@6.0.2:
|
||||||
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
||||||
|
@ -2451,7 +2458,6 @@ packages:
|
||||||
|
|
||||||
/astring@1.8.6:
|
/astring@1.8.6:
|
||||||
resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
|
resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/async-sema@3.1.1:
|
/async-sema@3.1.1:
|
||||||
|
@ -2576,7 +2582,6 @@ packages:
|
||||||
/browserslist@4.23.0:
|
/browserslist@4.23.0:
|
||||||
resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
|
resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
|
||||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
caniuse-lite: 1.0.30001591
|
caniuse-lite: 1.0.30001591
|
||||||
electron-to-chromium: 1.4.686
|
electron-to-chromium: 1.4.686
|
||||||
|
@ -2754,7 +2759,6 @@ packages:
|
||||||
|
|
||||||
/color-support@1.1.3:
|
/color-support@1.1.3:
|
||||||
resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
|
resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/commander@2.20.3:
|
/commander@2.20.3:
|
||||||
|
@ -2816,7 +2820,6 @@ packages:
|
||||||
/crc-32@1.2.2:
|
/crc-32@1.2.2:
|
||||||
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
|
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
|
||||||
engines: {node: '>=0.8'}
|
engines: {node: '>=0.8'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/crc32-stream@5.0.0:
|
/crc32-stream@5.0.0:
|
||||||
|
@ -2981,7 +2984,6 @@ packages:
|
||||||
/detect-libc@1.0.3:
|
/detect-libc@1.0.3:
|
||||||
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/detect-libc@2.0.2:
|
/detect-libc@2.0.2:
|
||||||
|
@ -3056,7 +3058,6 @@ packages:
|
||||||
|
|
||||||
/drizzle-kit@0.20.14:
|
/drizzle-kit@0.20.14:
|
||||||
resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==}
|
resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@drizzle-team/studio': 0.0.39
|
'@drizzle-team/studio': 0.0.39
|
||||||
'@esbuild-kit/esm-loader': 2.6.5
|
'@esbuild-kit/esm-loader': 2.6.5
|
||||||
|
@ -3162,7 +3163,6 @@ packages:
|
||||||
|
|
||||||
/dts-buddy@0.2.5:
|
/dts-buddy@0.2.5:
|
||||||
resolution: {integrity: sha512-66HTWHyXS3JwgpRwcu88rsDyZfPUb0oPYmiNg5f4BgCAFTVorJXpygf339QyXOXX1PuqHpvB+qo7O+8Ni1vXUQ==}
|
resolution: {integrity: sha512-66HTWHyXS3JwgpRwcu88rsDyZfPUb0oPYmiNg5f4BgCAFTVorJXpygf339QyXOXX1PuqHpvB+qo7O+8Ni1vXUQ==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/source-map': 0.3.5
|
'@jridgewell/source-map': 0.3.5
|
||||||
'@jridgewell/sourcemap-codec': 1.4.15
|
'@jridgewell/sourcemap-codec': 1.4.15
|
||||||
|
@ -3290,7 +3290,6 @@ packages:
|
||||||
/esbuild@0.18.20:
|
/esbuild@0.18.20:
|
||||||
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
|
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
hasBin: true
|
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@esbuild/android-arm': 0.18.20
|
'@esbuild/android-arm': 0.18.20
|
||||||
|
@ -3319,7 +3318,6 @@ packages:
|
||||||
/esbuild@0.19.12:
|
/esbuild@0.19.12:
|
||||||
resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
|
resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
hasBin: true
|
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@esbuild/aix-ppc64': 0.19.12
|
'@esbuild/aix-ppc64': 0.19.12
|
||||||
|
@ -3372,7 +3370,6 @@ packages:
|
||||||
|
|
||||||
/eslint-config-prettier@9.1.0(eslint@8.57.0):
|
/eslint-config-prettier@9.1.0(eslint@8.57.0):
|
||||||
resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
|
resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
|
||||||
hasBin: true
|
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: '>=7.0.0'
|
eslint: '>=7.0.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -3412,7 +3409,6 @@ packages:
|
||||||
/eslint@8.57.0:
|
/eslint@8.57.0:
|
||||||
resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
|
resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
|
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
|
||||||
'@eslint-community/regexpp': 4.10.0
|
'@eslint-community/regexpp': 4.10.0
|
||||||
|
@ -3478,7 +3474,6 @@ packages:
|
||||||
/esprima@4.0.1:
|
/esprima@4.0.1:
|
||||||
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
|
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/esquery@1.5.0:
|
/esquery@1.5.0:
|
||||||
|
@ -3649,7 +3644,6 @@ packages:
|
||||||
|
|
||||||
/flat@5.0.2:
|
/flat@5.0.2:
|
||||||
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
|
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/flatted@3.3.1:
|
/flatted@3.3.1:
|
||||||
|
@ -3696,6 +3690,14 @@ packages:
|
||||||
/fs.realpath@1.0.0:
|
/fs.realpath@1.0.0:
|
||||||
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
||||||
|
|
||||||
|
/fsevents@2.3.2:
|
||||||
|
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
||||||
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
|
os: [darwin]
|
||||||
|
requiresBuild: true
|
||||||
|
dev: true
|
||||||
|
optional: true
|
||||||
|
|
||||||
/fsevents@2.3.3:
|
/fsevents@2.3.3:
|
||||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
|
@ -3770,7 +3772,6 @@ packages:
|
||||||
|
|
||||||
/giget@1.2.1:
|
/giget@1.2.1:
|
||||||
resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==}
|
resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
citty: 0.1.6
|
citty: 0.1.6
|
||||||
consola: 3.2.3
|
consola: 3.2.3
|
||||||
|
@ -3963,7 +3964,6 @@ packages:
|
||||||
|
|
||||||
/he@1.2.0:
|
/he@1.2.0:
|
||||||
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
|
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/heap@0.2.7:
|
/heap@0.2.7:
|
||||||
|
@ -4136,13 +4136,11 @@ packages:
|
||||||
/is-docker@2.2.1:
|
/is-docker@2.2.1:
|
||||||
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
|
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/is-docker@3.0.0:
|
/is-docker@3.0.0:
|
||||||
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
|
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
|
||||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/is-extglob@2.1.1:
|
/is-extglob@2.1.1:
|
||||||
|
@ -4177,7 +4175,6 @@ packages:
|
||||||
/is-inside-container@1.0.0:
|
/is-inside-container@1.0.0:
|
||||||
resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
|
resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
|
||||||
engines: {node: '>=14.16'}
|
engines: {node: '>=14.16'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
is-docker: 3.0.0
|
is-docker: 3.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -4278,7 +4275,6 @@ packages:
|
||||||
|
|
||||||
/jiti@1.21.0:
|
/jiti@1.21.0:
|
||||||
resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
|
resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/js-tokens@4.0.0:
|
/js-tokens@4.0.0:
|
||||||
|
@ -4287,14 +4283,12 @@ packages:
|
||||||
|
|
||||||
/js-yaml@4.1.0:
|
/js-yaml@4.1.0:
|
||||||
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
|
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
argparse: 2.0.1
|
argparse: 2.0.1
|
||||||
|
|
||||||
/jsesc@2.5.2:
|
/jsesc@2.5.2:
|
||||||
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
|
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/json-buffer@3.0.1:
|
/json-buffer@3.0.1:
|
||||||
|
@ -4303,7 +4297,6 @@ packages:
|
||||||
|
|
||||||
/json-diff@0.9.0:
|
/json-diff@0.9.0:
|
||||||
resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==}
|
resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
cli-color: 2.0.3
|
cli-color: 2.0.3
|
||||||
difflib: 0.2.4
|
difflib: 0.2.4
|
||||||
|
@ -4331,7 +4324,6 @@ packages:
|
||||||
/json5@2.2.3:
|
/json5@2.2.3:
|
||||||
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
|
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/jsonc-parser@3.2.1:
|
/jsonc-parser@3.2.1:
|
||||||
|
@ -4399,7 +4391,6 @@ packages:
|
||||||
|
|
||||||
/listhen@1.7.2:
|
/listhen@1.7.2:
|
||||||
resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==}
|
resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@parcel/watcher': 2.4.1
|
'@parcel/watcher': 2.4.1
|
||||||
'@parcel/watcher-wasm': 2.4.1
|
'@parcel/watcher-wasm': 2.4.1
|
||||||
|
@ -4558,13 +4549,11 @@ packages:
|
||||||
/mime@1.6.0:
|
/mime@1.6.0:
|
||||||
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
|
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/mime@3.0.0:
|
/mime@3.0.0:
|
||||||
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
/mimic-fn@2.1.0:
|
/mimic-fn@2.1.0:
|
||||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||||
|
@ -4624,7 +4613,6 @@ packages:
|
||||||
/mkdirp@1.0.4:
|
/mkdirp@1.0.4:
|
||||||
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
|
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/mlly@1.6.1:
|
/mlly@1.6.1:
|
||||||
|
@ -4670,7 +4658,6 @@ packages:
|
||||||
/nanoid@3.3.7:
|
/nanoid@3.3.7:
|
||||||
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
|
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
|
||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/natural-compare@1.4.0:
|
/natural-compare@1.4.0:
|
||||||
|
@ -4684,7 +4671,6 @@ packages:
|
||||||
/nitropack@2.8.1:
|
/nitropack@2.8.1:
|
||||||
resolution: {integrity: sha512-pODv2kEEzZSDQR+1UMXbGyNgMedUDq/qUomtiAnQKQvLy52VGlecXO1xDfH3i0kP1yKEcKTnWsx1TAF5gHM7xQ==}
|
resolution: {integrity: sha512-pODv2kEEzZSDQR+1UMXbGyNgMedUDq/qUomtiAnQKQvLy52VGlecXO1xDfH3i0kP1yKEcKTnWsx1TAF5gHM7xQ==}
|
||||||
engines: {node: ^16.11.0 || >=17.0.0}
|
engines: {node: ^16.11.0 || >=17.0.0}
|
||||||
hasBin: true
|
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
xml2js: ^0.6.2
|
xml2js: ^0.6.2
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
|
@ -4800,7 +4786,6 @@ packages:
|
||||||
|
|
||||||
/node-gyp-build@4.8.0:
|
/node-gyp-build@4.8.0:
|
||||||
resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==}
|
resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/node-html-parser@6.1.12:
|
/node-html-parser@6.1.12:
|
||||||
|
@ -4817,7 +4802,6 @@ packages:
|
||||||
/nopt@5.0.0:
|
/nopt@5.0.0:
|
||||||
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
|
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
abbrev: 1.1.1
|
abbrev: 1.1.1
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -4858,7 +4842,6 @@ packages:
|
||||||
/nypm@0.3.6:
|
/nypm@0.3.6:
|
||||||
resolution: {integrity: sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==}
|
resolution: {integrity: sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==}
|
||||||
engines: {node: ^14.16.0 || >=16.10.0}
|
engines: {node: ^14.16.0 || >=16.10.0}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
citty: 0.1.6
|
citty: 0.1.6
|
||||||
execa: 8.0.1
|
execa: 8.0.1
|
||||||
|
@ -4967,7 +4950,6 @@ packages:
|
||||||
|
|
||||||
/openapi-typescript@6.7.4:
|
/openapi-typescript@6.7.4:
|
||||||
resolution: {integrity: sha512-EZyeW9Wy7UDCKv0iYmKrq2pVZtquXiD/YHiUClAKqiMi42nodx/EQH11K6fLqjt1IZlJmVokrAsExsBMM2RROQ==}
|
resolution: {integrity: sha512-EZyeW9Wy7UDCKv0iYmKrq2pVZtquXiD/YHiUClAKqiMi42nodx/EQH11K6fLqjt1IZlJmVokrAsExsBMM2RROQ==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-colors: 4.1.3
|
ansi-colors: 4.1.3
|
||||||
fast-glob: 3.3.2
|
fast-glob: 3.3.2
|
||||||
|
@ -5139,6 +5121,20 @@ packages:
|
||||||
pathe: 1.1.2
|
pathe: 1.1.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/playwright-core@1.42.0:
|
||||||
|
resolution: {integrity: sha512-0HD9y8qEVlcbsAjdpBaFjmaTHf+1FeIddy8VJLeiqwhcNqGCBe4Wp2e8knpqiYbzxtxarxiXyNDw2cG8sCaNMQ==}
|
||||||
|
engines: {node: '>=16'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/playwright@1.42.0:
|
||||||
|
resolution: {integrity: sha512-Ko7YRUgj5xBHbntrgt4EIw/nE//XBHOKVKnBjO1KuZkmkhlbgyggTe5s9hjqQ1LpN+Xg+kHsQyt5Pa0Bw5XpvQ==}
|
||||||
|
engines: {node: '>=16'}
|
||||||
|
dependencies:
|
||||||
|
playwright-core: 1.42.0
|
||||||
|
optionalDependencies:
|
||||||
|
fsevents: 2.3.2
|
||||||
|
dev: true
|
||||||
|
|
||||||
/possible-typed-array-names@1.0.0:
|
/possible-typed-array-names@1.0.0:
|
||||||
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
|
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
@ -5204,7 +5200,6 @@ packages:
|
||||||
/prettier@3.2.5:
|
/prettier@3.2.5:
|
||||||
resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
|
resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/pretty-bytes@6.1.1:
|
/pretty-bytes@6.1.1:
|
||||||
|
@ -5331,7 +5326,6 @@ packages:
|
||||||
|
|
||||||
/resolve@1.22.8:
|
/resolve@1.22.8:
|
||||||
resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
|
resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
is-core-module: 2.13.1
|
is-core-module: 2.13.1
|
||||||
path-parse: 1.0.7
|
path-parse: 1.0.7
|
||||||
|
@ -5344,14 +5338,12 @@ packages:
|
||||||
|
|
||||||
/rimraf@3.0.2:
|
/rimraf@3.0.2:
|
||||||
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
|
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
glob: 7.2.3
|
glob: 7.2.3
|
||||||
|
|
||||||
/rollup-plugin-visualizer@5.12.0(rollup@4.12.0):
|
/rollup-plugin-visualizer@5.12.0(rollup@4.12.0):
|
||||||
resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==}
|
resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
rollup: 2.x || 3.x || 4.x
|
rollup: 2.x || 3.x || 4.x
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
|
@ -5368,7 +5360,6 @@ packages:
|
||||||
/rollup@4.12.0:
|
/rollup@4.12.0:
|
||||||
resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
|
resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
|
||||||
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree': 1.0.5
|
'@types/estree': 1.0.5
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
@ -5418,7 +5409,6 @@ packages:
|
||||||
/sass@1.71.1:
|
/sass@1.71.1:
|
||||||
resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==}
|
resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
chokidar: 3.6.0
|
chokidar: 3.6.0
|
||||||
immutable: 4.3.5
|
immutable: 4.3.5
|
||||||
|
@ -5430,13 +5420,11 @@ packages:
|
||||||
|
|
||||||
/semver@6.3.1:
|
/semver@6.3.1:
|
||||||
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
|
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/semver@7.6.0:
|
/semver@7.6.0:
|
||||||
resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
|
resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
lru-cache: 6.0.0
|
lru-cache: 6.0.0
|
||||||
|
|
||||||
|
@ -5795,7 +5783,6 @@ packages:
|
||||||
/terser@5.28.1:
|
/terser@5.28.1:
|
||||||
resolution: {integrity: sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==}
|
resolution: {integrity: sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/source-map': 0.3.5
|
'@jridgewell/source-map': 0.3.5
|
||||||
acorn: 8.11.3
|
acorn: 8.11.3
|
||||||
|
@ -5906,13 +5893,11 @@ packages:
|
||||||
/typescript@5.0.4:
|
/typescript@5.0.4:
|
||||||
resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
|
resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
|
||||||
engines: {node: '>=12.20'}
|
engines: {node: '>=12.20'}
|
||||||
hasBin: true
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/typescript@5.3.3:
|
/typescript@5.3.3:
|
||||||
resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
|
resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
|
||||||
engines: {node: '>=14.17'}
|
engines: {node: '>=14.17'}
|
||||||
hasBin: true
|
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/ufo@1.4.0:
|
/ufo@1.4.0:
|
||||||
|
@ -5932,7 +5917,6 @@ packages:
|
||||||
|
|
||||||
/undici-types@5.26.5:
|
/undici-types@5.26.5:
|
||||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||||
dev: false
|
|
||||||
|
|
||||||
/undici-types@5.28.3:
|
/undici-types@5.28.3:
|
||||||
resolution: {integrity: sha512-VJD0un4i6M1/lFOJPhacHdq6FadtlkdhKBed2W6yBqmrAr/W58oqENaOIX031stDVFwz9AemOLkIj/2AXAMLCg==}
|
resolution: {integrity: sha512-VJD0un4i6M1/lFOJPhacHdq6FadtlkdhKBed2W6yBqmrAr/W58oqENaOIX031stDVFwz9AemOLkIj/2AXAMLCg==}
|
||||||
|
@ -6056,7 +6040,6 @@ packages:
|
||||||
|
|
||||||
/untun@0.1.3:
|
/untun@0.1.3:
|
||||||
resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==}
|
resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
citty: 0.1.6
|
citty: 0.1.6
|
||||||
consola: 3.2.3
|
consola: 3.2.3
|
||||||
|
@ -6065,7 +6048,6 @@ packages:
|
||||||
|
|
||||||
/update-browserslist-db@1.0.13(browserslist@4.23.0):
|
/update-browserslist-db@1.0.13(browserslist@4.23.0):
|
||||||
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
|
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
|
||||||
hasBin: true
|
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
browserslist: '>= 4.21.0'
|
browserslist: '>= 4.21.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -6106,9 +6088,8 @@ packages:
|
||||||
resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==}
|
resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vinxi@0.3.4(preact@10.19.6)(sass@1.71.1):
|
/vinxi@0.3.4(@types/node@20.11.22)(preact@10.19.6)(sass@1.71.1):
|
||||||
resolution: {integrity: sha512-WAQbutVIX9zE2U5jraq+uvW2ytzb59HtX+/KVKqZSgjfQQpCHyi3XNxRkf46WTM5gASDEDFaG0l5ZHunmf7/cw==}
|
resolution: {integrity: sha512-WAQbutVIX9zE2U5jraq+uvW2ytzb59HtX+/KVKqZSgjfQQpCHyi3XNxRkf46WTM5gASDEDFaG0l5ZHunmf7/cw==}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.24.0
|
'@babel/core': 7.24.0
|
||||||
'@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0)
|
'@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0)
|
||||||
|
@ -6153,7 +6134,7 @@ packages:
|
||||||
unenv: 1.9.0
|
unenv: 1.9.0
|
||||||
unimport: 3.7.1(rollup@4.12.0)
|
unimport: 3.7.1(rollup@4.12.0)
|
||||||
unstorage: 1.10.1
|
unstorage: 1.10.1
|
||||||
vite: 5.1.1(sass@1.71.1)
|
vite: 5.1.1(@types/node@20.11.22)(sass@1.71.1)
|
||||||
ws: 8.16.0
|
ws: 8.16.0
|
||||||
zod: 3.22.4
|
zod: 3.22.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -6207,7 +6188,7 @@ packages:
|
||||||
open: 9.1.0
|
open: 9.1.0
|
||||||
picocolors: 1.0.0
|
picocolors: 1.0.0
|
||||||
sirv: 2.0.4
|
sirv: 2.0.4
|
||||||
vite: 5.1.1(sass@1.71.1)
|
vite: 5.1.1(@types/node@20.11.22)(sass@1.71.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- rollup
|
- rollup
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -6231,7 +6212,7 @@ packages:
|
||||||
open: 9.1.0
|
open: 9.1.0
|
||||||
picocolors: 1.0.0
|
picocolors: 1.0.0
|
||||||
sirv: 2.0.4
|
sirv: 2.0.4
|
||||||
vite: 5.1.4(sass@1.71.1)
|
vite: 5.1.4(@types/node@20.11.22)(sass@1.71.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- rollup
|
- rollup
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -6253,7 +6234,7 @@ packages:
|
||||||
merge-anything: 5.1.7
|
merge-anything: 5.1.7
|
||||||
solid-js: 1.8.15
|
solid-js: 1.8.15
|
||||||
solid-refresh: 0.6.3(solid-js@1.8.15)
|
solid-refresh: 0.6.3(solid-js@1.8.15)
|
||||||
vite: 5.1.1(sass@1.71.1)
|
vite: 5.1.1(@types/node@20.11.22)(sass@1.71.1)
|
||||||
vitefu: 0.2.5(vite@5.1.1)
|
vitefu: 0.2.5(vite@5.1.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -6275,16 +6256,15 @@ packages:
|
||||||
merge-anything: 5.1.7
|
merge-anything: 5.1.7
|
||||||
solid-js: 1.8.15
|
solid-js: 1.8.15
|
||||||
solid-refresh: 0.6.3(solid-js@1.8.15)
|
solid-refresh: 0.6.3(solid-js@1.8.15)
|
||||||
vite: 5.1.4(sass@1.71.1)
|
vite: 5.1.4(@types/node@20.11.22)(sass@1.71.1)
|
||||||
vitefu: 0.2.5(vite@5.1.4)
|
vitefu: 0.2.5(vite@5.1.4)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vite@5.1.1(sass@1.71.1):
|
/vite@5.1.1(@types/node@20.11.22)(sass@1.71.1):
|
||||||
resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==}
|
resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==}
|
||||||
engines: {node: ^18.0.0 || >=20.0.0}
|
engines: {node: ^18.0.0 || >=20.0.0}
|
||||||
hasBin: true
|
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@types/node': ^18.0.0 || >=20.0.0
|
'@types/node': ^18.0.0 || >=20.0.0
|
||||||
less: '*'
|
less: '*'
|
||||||
|
@ -6309,6 +6289,7 @@ packages:
|
||||||
terser:
|
terser:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@types/node': 20.11.22
|
||||||
esbuild: 0.19.12
|
esbuild: 0.19.12
|
||||||
postcss: 8.4.35
|
postcss: 8.4.35
|
||||||
rollup: 4.12.0
|
rollup: 4.12.0
|
||||||
|
@ -6317,7 +6298,7 @@ packages:
|
||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vite@5.1.4(sass@1.71.1):
|
/vite@5.1.4(@types/node@20.11.22)(sass@1.71.1):
|
||||||
resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
|
resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
|
||||||
engines: {node: ^18.0.0 || >=20.0.0}
|
engines: {node: ^18.0.0 || >=20.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
@ -6345,6 +6326,7 @@ packages:
|
||||||
terser:
|
terser:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@types/node': 20.11.22
|
||||||
esbuild: 0.19.12
|
esbuild: 0.19.12
|
||||||
postcss: 8.4.35
|
postcss: 8.4.35
|
||||||
rollup: 4.12.0
|
rollup: 4.12.0
|
||||||
|
@ -6361,7 +6343,7 @@ packages:
|
||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 5.1.1(sass@1.71.1)
|
vite: 5.1.1(@types/node@20.11.22)(sass@1.71.1)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vitefu@0.2.5(vite@5.1.4):
|
/vitefu@0.2.5(vite@5.1.4):
|
||||||
|
@ -6372,7 +6354,7 @@ packages:
|
||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 5.1.4(sass@1.71.1)
|
vite: 5.1.4(@types/node@20.11.22)(sass@1.71.1)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/webidl-conversions@3.0.1:
|
/webidl-conversions@3.0.1:
|
||||||
|
@ -6409,14 +6391,12 @@ packages:
|
||||||
/which@2.0.2:
|
/which@2.0.2:
|
||||||
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
isexe: 2.0.0
|
isexe: 2.0.0
|
||||||
|
|
||||||
/which@4.0.0:
|
/which@4.0.0:
|
||||||
resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
|
resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
|
||||||
engines: {node: ^16.13.0 || >=18.0.0}
|
engines: {node: ^16.13.0 || >=18.0.0}
|
||||||
hasBin: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
isexe: 3.1.1
|
isexe: 3.1.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
|
@ -4,6 +4,12 @@ import "../styles/components/NavBar.scss";
|
||||||
import { FontAwesomeIcon } from "./FontAwesomeIcon";
|
import { FontAwesomeIcon } from "./FontAwesomeIcon";
|
||||||
import NavUser from "./NavUser";
|
import NavUser from "./NavUser";
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_CLIENT_ID === "undefined")
|
||||||
|
throw new Error("No env VITE_DISCORD_CLIENT_ID found!");
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_OAUTH2_PERMISSIONS === "undefined")
|
||||||
|
throw new Error("No env VITE_DISCORD_OAUTH2_PERMISSIONS found!");
|
||||||
|
|
||||||
export function Li(props: {
|
export function Li(props: {
|
||||||
href: string;
|
href: string;
|
||||||
rel?: string;
|
rel?: string;
|
||||||
|
@ -36,7 +42,7 @@ function NavBar() {
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="flex-row responsive thick">
|
<ul class="flex-row responsive thick">
|
||||||
<Li
|
<Li
|
||||||
href={`https://discord.com/api/oauth2/authorize?client_id=${import.meta.env.VITE_DISCORD_CLIENT_ID}&permissions=${import.meta.env.VITE_DISCORD_BOT_PERMISSIONS}&scope=bot`}
|
href={`https://discord.com/api/oauth2/authorize?client_id=${import.meta.env.VITE_DISCORD_CLIENT_ID}&permissions=${import.meta.env.VITE_DISCORD_OAUTH2_PERMISSIONS}&scope=bot`}
|
||||||
name="Invite to your server"
|
name="Invite to your server"
|
||||||
>
|
>
|
||||||
<FontAwesomeIcon class="lower" icon={faCirclePlus} size="xl" />
|
<FontAwesomeIcon class="lower" icon={faCirclePlus} size="xl" />
|
||||||
|
|
|
@ -2,7 +2,10 @@ import { drizzle } from "drizzle-orm/postgres-js";
|
||||||
import postgres from "postgres";
|
import postgres from "postgres";
|
||||||
import * as schema from "./schema";
|
import * as schema from "./schema";
|
||||||
|
|
||||||
const queryClient = postgres(import.meta.env.VITE_DATABASE_URL ?? "");
|
if (typeof import.meta.env.VITE_DATABASE_URL === "undefined")
|
||||||
|
throw new Error("No env VITE_DATABASE_URL found!");
|
||||||
|
|
||||||
|
const queryClient = postgres(import.meta.env.VITE_DATABASE_URL);
|
||||||
const db = drizzle(queryClient, {
|
const db = drizzle(queryClient, {
|
||||||
schema,
|
schema,
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,6 +4,18 @@ import { Lucia } from "lucia";
|
||||||
import db from "~/drizzle";
|
import db from "~/drizzle";
|
||||||
import { sessions, users } from "~/drizzle/schema";
|
import { sessions, users } from "~/drizzle/schema";
|
||||||
|
|
||||||
|
if (typeof import.meta.env.PROD === "undefined")
|
||||||
|
throw new Error("No env PROD found!");
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_CLIENT_ID === "undefined")
|
||||||
|
throw new Error("No env VITE_DISCORD_CLIENT_ID found!");
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_CLIENT_SECRET === "undefined")
|
||||||
|
throw new Error("No env PROD found!");
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_AUTH_REDIRECT_URL === "undefined")
|
||||||
|
throw new Error("No env VITE_AUTH_REDIRECT_URL found!");
|
||||||
|
|
||||||
const adapter = new DrizzlePostgreSQLAdapter(db, sessions, users);
|
const adapter = new DrizzlePostgreSQLAdapter(db, sessions, users);
|
||||||
|
|
||||||
export const lucia = new Lucia(adapter, {
|
export const lucia = new Lucia(adapter, {
|
||||||
|
|
|
@ -11,12 +11,11 @@ import { discord, lucia } from "~/lib/auth";
|
||||||
import { paths } from "~/types/discord";
|
import { paths } from "~/types/discord";
|
||||||
|
|
||||||
export async function GET(event: APIEvent): Promise<Response> {
|
export async function GET(event: APIEvent): Promise<Response> {
|
||||||
const code = new URL(event.request.url).searchParams.get("code");
|
const url = new URL(event.request.url);
|
||||||
const state = new URL(event.request.url).searchParams.get("state");
|
const code = url.searchParams.get("code");
|
||||||
const error = new URL(event.request.url).searchParams.get("error");
|
const state = url.searchParams.get("state");
|
||||||
const error_description = new URL(event.request.url).searchParams.get(
|
const error = url.searchParams.get("error");
|
||||||
"error_description",
|
const error_description = url.searchParams.get("error_description");
|
||||||
);
|
|
||||||
if (error)
|
if (error)
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case "access_denied":
|
case "access_denied":
|
||||||
|
@ -61,7 +60,6 @@ export async function GET(event: APIEvent): Promise<Response> {
|
||||||
{ sessionId: createId() },
|
{ sessionId: createId() },
|
||||||
);
|
);
|
||||||
const sessionCookie = lucia.createSessionCookie(session.id);
|
const sessionCookie = lucia.createSessionCookie(session.id);
|
||||||
console.log(sessionCookie);
|
|
||||||
setCookie(
|
setCookie(
|
||||||
sessionCookie.name,
|
sessionCookie.name,
|
||||||
sessionCookie.value,
|
sessionCookie.value,
|
||||||
|
@ -100,7 +98,6 @@ export async function GET(event: APIEvent): Promise<Response> {
|
||||||
})
|
})
|
||||||
.returning()
|
.returning()
|
||||||
.execute();
|
.execute();
|
||||||
console.log(createId(), createId(), { warst: createId() });
|
|
||||||
const session = await lucia.createSession(
|
const session = await lucia.createSession(
|
||||||
userId,
|
userId,
|
||||||
{},
|
{},
|
||||||
|
|
|
@ -4,6 +4,9 @@ import httpStatus from "http-status";
|
||||||
import { setCookie } from "vinxi/http";
|
import { setCookie } from "vinxi/http";
|
||||||
import { discord } from "~/lib/auth";
|
import { discord } from "~/lib/auth";
|
||||||
|
|
||||||
|
if (typeof import.meta.env.PROD === "undefined")
|
||||||
|
throw new Error("No env PROD found!");
|
||||||
|
|
||||||
export async function GET(event: APIEvent) {
|
export async function GET(event: APIEvent) {
|
||||||
const state = generateState();
|
const state = generateState();
|
||||||
const url = await discord.createAuthorizationURL(state, {
|
const url = await discord.createAuthorizationURL(state, {
|
||||||
|
|
|
@ -19,6 +19,9 @@ import { discordTokens } from "~/drizzle/schema";
|
||||||
import { paths } from "~/types/discord";
|
import { paths } from "~/types/discord";
|
||||||
import "../../styles/pages/config.scss";
|
import "../../styles/pages/config.scss";
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_BOT_TOKEN === "undefined")
|
||||||
|
throw new Error("No env VITE_DISCORD_BOT_TOKEN found!");
|
||||||
|
|
||||||
const guessTZ = () => Intl.DateTimeFormat().resolvedOptions().timeZone;
|
const guessTZ = () => Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||||
|
|
||||||
const initialValue = (params: ReturnType<typeof useParams>) => ({
|
const initialValue = (params: ReturnType<typeof useParams>) => ({
|
||||||
|
|
|
@ -15,6 +15,12 @@ import { discordTokens } from "~/drizzle/schema";
|
||||||
import { paths } from "~/types/discord";
|
import { paths } from "~/types/discord";
|
||||||
import "../../styles/pages/config.scss";
|
import "../../styles/pages/config.scss";
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_CLIENT_ID === "undefined")
|
||||||
|
throw new Error("No env VITE_DISCORD_CLIENT_ID found!");
|
||||||
|
|
||||||
|
if (typeof import.meta.env.VITE_DISCORD_OAUTH2_PERMISSIONS === "undefined")
|
||||||
|
throw new Error("No env VITE_DISCORD_OAUTH2_PERMISSIONS found!");
|
||||||
|
|
||||||
const initialValue = () => ({
|
const initialValue = () => ({
|
||||||
success: null as boolean | null,
|
success: null as boolean | null,
|
||||||
guilds: [] as {
|
guilds: [] as {
|
||||||
|
@ -105,7 +111,7 @@ function index() {
|
||||||
href={
|
href={
|
||||||
i() % 3 === 0
|
i() % 3 === 0
|
||||||
? `/config/${guild.id}`
|
? `/config/${guild.id}`
|
||||||
: `https://discord.com/api/oauth2/authorize?client_id=${import.meta.env.VITE_DISCORD_CLIENT_ID}&permissions=${import.meta.env.VITE_DISCORD_BOT_PERMISSIONS}&scope=bot&guild_id=${guild.id}`
|
: `https://discord.com/api/oauth2/authorize?client_id=${import.meta.env.VITE_DISCORD_CLIENT_ID}&permissions=${import.meta.env.VITE_DISCORD_OAUTH2_PERMISSIONS}&scope=bot&guild_id=${guild.id}`
|
||||||
}
|
}
|
||||||
class="flex-row centered"
|
class="flex-row centered"
|
||||||
>
|
>
|
||||||
|
|
2
src/types/env.d.ts
vendored
2
src/types/env.d.ts
vendored
|
@ -4,7 +4,7 @@ interface ImportMetaEnv {
|
||||||
readonly VITE_DISCORD_CLIENT_ID: string;
|
readonly VITE_DISCORD_CLIENT_ID: string;
|
||||||
readonly VITE_DISCORD_CLIENT_SECRET: string;
|
readonly VITE_DISCORD_CLIENT_SECRET: string;
|
||||||
readonly VITE_DISCORD_BOT_TOKEN: string;
|
readonly VITE_DISCORD_BOT_TOKEN: string;
|
||||||
readonly VITE_DISCORD_BOT_PERMISSIONS: string;
|
readonly VITE_DISCORD_OAUTH2_PERMISSIONS: string;
|
||||||
|
|
||||||
readonly VITE_AUTH_SECRET: string;
|
readonly VITE_AUTH_SECRET: string;
|
||||||
readonly VITE_AUTH_REDIRECT_PROXY_URL: string | undefined;
|
readonly VITE_AUTH_REDIRECT_PROXY_URL: string | undefined;
|
||||||
|
|
Loading…
Reference in a new issue