From 41e54d940bf53480bddc7d95e72a4c162e4a9c63 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 9 Dec 2023 00:32:45 +0100 Subject: [PATCH] refactor: migrate to sqlite as database --- .env.example | 5 +- .gitignore | 3 + apps/nextjs/next.config.mjs | 5 +- apps/nextjs/src/app/page.tsx | 6 +- apps/nextjs/src/env.mjs | 10 +-- packages/db/drizzle.config.ts | 17 +--- packages/db/index.ts | 21 ++--- packages/db/package.json | 5 +- packages/db/schema/_table.ts | 9 -- packages/db/schema/auth.ts | 84 ----------------- packages/db/schema/post.ts | 14 --- packages/db/schema/sqlite.ts | 79 ++++++++++++++++ pnpm-lock.yaml | 165 ++++++++++++++++++++++++++++------ 13 files changed, 244 insertions(+), 179 deletions(-) delete mode 100644 packages/db/schema/_table.ts delete mode 100644 packages/db/schema/auth.ts delete mode 100644 packages/db/schema/post.ts create mode 100644 packages/db/schema/sqlite.ts diff --git a/.env.example b/.env.example index 2ee83ee87..36a7e2f14 100644 --- a/.env.example +++ b/.env.example @@ -5,10 +5,7 @@ # If you are cloning this repo, create a copy of this file named `.env` and populate it with your secrets. # The database URL is used to connect to your PlanetScale database. -DB_HOST='aws.connect.psdb.cloud' -DB_NAME='YOUR_DB_NAME' -DB_USERNAME='' -DB_PASSWORD='pscale_pw_' +DB_URL='FULL_PATH_TO_YOUR_SQLITE_DB_FILE' # @see https://next-auth.js.org/configuration/options#nextauth_url AUTH_URL='http://localhost:3000' diff --git a/.gitignore b/.gitignore index dedd72512..a9669defa 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ yarn-error.log* # turbo .turbo + +# database +db.sqlite \ No newline at end of file diff --git a/apps/nextjs/next.config.mjs b/apps/nextjs/next.config.mjs index 97bea3aee..ffdb573aa 100644 --- a/apps/nextjs/next.config.mjs +++ b/apps/nextjs/next.config.mjs @@ -6,10 +6,13 @@ import "@alparr/auth/env.mjs"; const config = { reactStrictMode: true, /** Enables hot reloading for local packages without a build step */ - transpilePackages: ["@alparr/api", "@alparr/auth", "@alparr/db"], + transpilePackages: ["@alparr/api", "@alparr/auth", "@alparr/db", "@alparr/ui"], /** We already do linting and typechecking as separate tasks in CI */ eslint: { ignoreDuringBuilds: true }, typescript: { ignoreBuildErrors: true }, + experimental: { + optimizePackageImports: ['@mantine/core', '@mantine/hooks'], + }, }; export default config; diff --git a/apps/nextjs/src/app/page.tsx b/apps/nextjs/src/app/page.tsx index 8af6b3e8a..41e2206c2 100644 --- a/apps/nextjs/src/app/page.tsx +++ b/apps/nextjs/src/app/page.tsx @@ -1,10 +1,14 @@ +import { db } from "@alparr/db"; import { Button, Stack, Title } from "@mantine/core"; -export default function HomePage() { +export default async function HomePage() { + const users = await db.query.users.findMany(); + return ( Home +
{JSON.stringify(users)}
); } diff --git a/apps/nextjs/src/env.mjs b/apps/nextjs/src/env.mjs index 3adac3a4b..f098ee199 100644 --- a/apps/nextjs/src/env.mjs +++ b/apps/nextjs/src/env.mjs @@ -14,10 +14,7 @@ export const env = createEnv({ * built with invalid env vars. */ server: { - DB_USERNAME: z.string(), - DB_PASSWORD: z.string(), - DB_HOST: z.string(), - DB_NAME: z.string(), + DB_URL: z.string(), }, /** * Specify your client-side environment variables schema here. @@ -32,10 +29,7 @@ export const env = createEnv({ runtimeEnv: { VERCEL_URL: process.env.VERCEL_URL, PORT: process.env.PORT, - DB_USERNAME: process.env.DB_USERNAME, - DB_PASSWORD: process.env.DB_PASSWORD, - DB_HOST: process.env.DB_HOST, - DB_NAME: process.env.DB_NAME, + DB_URL: process.env.DB_URL, // NEXT_PUBLIC_CLIENTVAR: process.env.NEXT_PUBLIC_CLIENTVAR, }, skipValidation: diff --git a/packages/db/drizzle.config.ts b/packages/db/drizzle.config.ts index 47c9afe36..61d448cde 100644 --- a/packages/db/drizzle.config.ts +++ b/packages/db/drizzle.config.ts @@ -3,21 +3,8 @@ import type { Config } from "drizzle-kit"; dotenv.config({ path: "../../.env" }); -const uri = [ - "mysql://", - process.env.DB_USERNAME, - ":", - process.env.DB_PASSWORD, - "@", - process.env.DB_HOST, - ":3306/", - process.env.DB_NAME, - '?ssl={"rejectUnauthorized":true}', -].join(""); - export default { schema: "./schema", - driver: "mysql2", - dbCredentials: { uri }, - tablesFilter: ["t3turbo_*"], + driver: "better-sqlite", + dbCredentials: { url: process.env.DB_URL! }, } satisfies Config; diff --git a/packages/db/index.ts b/packages/db/index.ts index 746768317..aac19b480 100644 --- a/packages/db/index.ts +++ b/packages/db/index.ts @@ -1,20 +1,13 @@ -import { Client } from "@planetscale/database"; -import { drizzle } from "drizzle-orm/planetscale-serverless"; +import Database from 'better-sqlite3'; +import { drizzle } from "drizzle-orm/better-sqlite3"; -import * as auth from "./schema/auth"; -import * as post from "./schema/post"; +import * as sqliteSchema from "./schema/sqlite"; -export const schema = { ...auth, ...post }; -export { mySqlTable as tableCreator } from "./schema/_table"; +export const schema = sqliteSchema; export * from "drizzle-orm"; -export const db = drizzle( - new Client({ - host: process.env.DB_HOST, - username: process.env.DB_USERNAME, - password: process.env.DB_PASSWORD, - }).connection(), - { schema }, -); +const sqlite = new Database(process.env.DB_URL!); + +export const db = drizzle(sqlite, { schema }); diff --git a/packages/db/package.json b/packages/db/package.json index 075c6629b..0ba18f250 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -9,12 +9,13 @@ "clean": "rm -rf .turbo node_modules", "lint": "eslint .", "format": "prettier --check . --ignore-path ../../.gitignore", - "push": "drizzle-kit push:mysql", + "push": "drizzle-kit push:sqlite", "studio": "drizzle-kit studio", "typecheck": "tsc --noEmit" }, "dependencies": { - "@planetscale/database": "^1.11.0", + "@types/better-sqlite3": "^7.6.8", + "better-sqlite3": "^9.2.2", "drizzle-orm": "^0.29.1" }, "devDependencies": { diff --git a/packages/db/schema/_table.ts b/packages/db/schema/_table.ts deleted file mode 100644 index 9cde0e1db..000000000 --- a/packages/db/schema/_table.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mysqlTableCreator } from "drizzle-orm/mysql-core"; - -/** - * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same - * database instance for multiple projects. - * - * @see https://orm.drizzle.team/docs/goodies#multi-project-schema - */ -export const mySqlTable = mysqlTableCreator((name) => `t3turbo_${name}`); diff --git a/packages/db/schema/auth.ts b/packages/db/schema/auth.ts deleted file mode 100644 index 1e932bf86..000000000 --- a/packages/db/schema/auth.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { AdapterAccount } from "@auth/core/adapters"; -import { relations, sql } from "drizzle-orm"; -import { - index, - int, - primaryKey, - text, - timestamp, - varchar, -} from "drizzle-orm/mysql-core"; - -import { mySqlTable } from "./_table"; - -export const users = mySqlTable("user", { - id: varchar("id", { length: 255 }).notNull().primaryKey(), - name: varchar("name", { length: 255 }), - email: varchar("email", { length: 255 }).notNull(), - emailVerified: timestamp("emailVerified", { - mode: "date", - fsp: 3, - }).default(sql`CURRENT_TIMESTAMP(3)`), - image: varchar("image", { length: 255 }), -}); - -export const usersRelations = relations(users, ({ many }) => ({ - accounts: many(accounts), -})); - -export const accounts = mySqlTable( - "account", - { - userId: varchar("userId", { length: 255 }).notNull(), - type: varchar("type", { length: 255 }) - .$type() - .notNull(), - provider: varchar("provider", { length: 255 }).notNull(), - providerAccountId: varchar("providerAccountId", { length: 255 }).notNull(), - refresh_token: varchar("refresh_token", { length: 255 }), - access_token: varchar("access_token", { length: 255 }), - expires_at: int("expires_at"), - token_type: varchar("token_type", { length: 255 }), - scope: varchar("scope", { length: 255 }), - id_token: text("id_token"), - session_state: varchar("session_state", { length: 255 }), - }, - (account) => ({ - compoundKey: primaryKey(account.provider, account.providerAccountId), - userIdIdx: index("userId_idx").on(account.userId), - }), -); - -export const accountsRelations = relations(accounts, ({ one }) => ({ - user: one(users, { fields: [accounts.userId], references: [users.id] }), -})); - -export const sessions = mySqlTable( - "session", - { - sessionToken: varchar("sessionToken", { length: 255 }) - .notNull() - .primaryKey(), - userId: varchar("userId", { length: 255 }).notNull(), - expires: timestamp("expires", { mode: "date" }).notNull(), - }, - (session) => ({ - userIdIdx: index("userId_idx").on(session.userId), - }), -); - -export const sessionsRelations = relations(sessions, ({ one }) => ({ - user: one(users, { fields: [sessions.userId], references: [users.id] }), -})); - -export const verificationTokens = mySqlTable( - "verificationToken", - { - identifier: varchar("identifier", { length: 255 }).notNull(), - token: varchar("token", { length: 255 }).notNull(), - expires: timestamp("expires", { mode: "date" }).notNull(), - }, - (vt) => ({ - compoundKey: primaryKey(vt.identifier, vt.token), - }), -); diff --git a/packages/db/schema/post.ts b/packages/db/schema/post.ts deleted file mode 100644 index 3b26be3ab..000000000 --- a/packages/db/schema/post.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { sql } from "drizzle-orm"; -import { serial, timestamp, varchar } from "drizzle-orm/mysql-core"; - -import { mySqlTable } from "./_table"; - -export const post = mySqlTable("post", { - id: serial("id").primaryKey(), - title: varchar("name", { length: 256 }).notNull(), - content: varchar("content", { length: 256 }).notNull(), - createdAt: timestamp("created_at") - .default(sql`CURRENT_TIMESTAMP`) - .notNull(), - updatedAt: timestamp("updatedAt").onUpdateNow(), -}); diff --git a/packages/db/schema/sqlite.ts b/packages/db/schema/sqlite.ts new file mode 100644 index 000000000..aefdb4d7f --- /dev/null +++ b/packages/db/schema/sqlite.ts @@ -0,0 +1,79 @@ +import type { AdapterAccount } from '@auth/core/adapters'; +import type { InferSelectModel } from 'drizzle-orm'; +import { relations } from 'drizzle-orm'; +import { index, integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core'; + +export const users = sqliteTable('user', { + id: text('id').notNull().primaryKey(), + name: text('name'), + email: text('email'), + emailVerified: integer('emailVerified', { mode: 'timestamp_ms' }), + image: text('image'), + password: text('password'), + salt: text('salt'), +}); + +export const accounts = sqliteTable( + 'account', + { + userId: text('userId') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + type: text('type').$type().notNull(), + provider: text('provider').notNull(), + providerAccountId: text('providerAccountId').notNull(), + refresh_token: text('refresh_token'), + access_token: text('access_token'), + expires_at: integer('expires_at'), + token_type: text('token_type'), + scope: text('scope'), + id_token: text('id_token'), + session_state: text('session_state'), + }, + (account) => ({ + compoundKey: primaryKey({ columns: [account.provider, account.providerAccountId] }), + userIdIdx: index('userId_idx').on(account.userId), + }) +); + +export const sessions = sqliteTable( + 'session', + { + sessionToken: text('sessionToken').notNull().primaryKey(), + userId: text('userId') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + expires: integer('expires', { mode: 'timestamp_ms' }).notNull(), + }, + (session) => ({ + userIdIdx: index('user_id_idx').on(session.userId), + }) +); + +export const verificationTokens = sqliteTable( + 'verificationToken', + { + identifier: text('identifier').notNull(), + token: text('token').notNull(), + expires: integer('expires', { mode: 'timestamp_ms' }).notNull(), + }, + (vt) => ({ + compoundKey: primaryKey({ columns: [vt.identifier, vt.token] }), + }) +); + +export const accountRelations = relations(accounts, ({ one }) => ({ + user: one(users, { + fields: [accounts.userId], + references: [users.id], + }), +})); + +export const userRelations = relations(users, ({ many }) => ({ + accounts: many(accounts), +})); + +export type User = InferSelectModel; +export type Account = InferSelectModel; +export type Session = InferSelectModel; +export type VerificationToken = InferSelectModel; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index addb54829..5e65b5394 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -270,12 +270,15 @@ importers: packages/db: dependencies: - '@planetscale/database': - specifier: ^1.11.0 - version: 1.11.0 + '@types/better-sqlite3': + specifier: ^7.6.8 + version: 7.6.8 + better-sqlite3: + specifier: ^9.2.2 + version: 9.2.2 drizzle-orm: specifier: ^0.29.1 - version: 0.29.1(@planetscale/database@1.11.0) + version: 0.29.1(@types/better-sqlite3@7.6.8)(better-sqlite3@9.2.2) devDependencies: '@alparr/eslint-config': specifier: workspace:^0.2.0 @@ -1698,11 +1701,6 @@ packages: '@parcel/watcher-win32-x64': 2.3.0 dev: true - /@planetscale/database@1.11.0: - resolution: {integrity: sha512-aWbU+D/IRHoDE9975y+Q4c+EwwAWxCPwFId+N1AhQVFXzbeJMkj6KN2iQtoi03elcLMRdfT+V3i9Z4WRw+/oIA==} - engines: {node: '>=16'} - dev: false - /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false @@ -2460,6 +2458,12 @@ packages: update-check: 1.5.4 dev: true + /@types/better-sqlite3@7.6.8: + resolution: {integrity: sha512-ASndM4rdGrzk7iXXqyNC4fbwt4UEjpK0i3j4q4FyeQrLAthfB6s7EF135ZJE0qQxtKIMFwmyT6x0switET7uIw==} + dependencies: + '@types/node': 18.18.13 + dev: false + /@types/eslint@8.44.7: resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==} dependencies: @@ -2512,7 +2516,6 @@ packages: resolution: {integrity: sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g==} dependencies: undici-types: 5.26.5 - dev: true /@types/object.omit@3.0.3: resolution: {integrity: sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew==} @@ -3025,13 +3028,20 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true /basic-ftp@5.0.3: resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} engines: {node: '>=10.0.0'} dev: true + /better-sqlite3@9.2.2: + resolution: {integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -3041,7 +3051,6 @@ packages: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 - dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3049,7 +3058,6 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -3096,7 +3104,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -3250,6 +3257,10 @@ packages: fsevents: 2.3.2 dev: true + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3529,10 +3540,16 @@ packages: dependencies: ms: 2.1.2 + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3641,7 +3658,6 @@ packages: /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - dev: true /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -3751,7 +3767,7 @@ packages: - utf-8-validate dev: true - /drizzle-orm@0.29.1(@planetscale/database@1.11.0): + /drizzle-orm@0.29.1(@types/better-sqlite3@7.6.8)(better-sqlite3@9.2.2): resolution: {integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -3813,7 +3829,8 @@ packages: sqlite3: optional: true dependencies: - '@planetscale/database': 1.11.0 + '@types/better-sqlite3': 7.6.8 + better-sqlite3: 9.2.2 dev: false /duplexer@0.1.2: @@ -3841,6 +3858,12 @@ packages: engines: {node: '>= 0.8'} dev: true + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + /entities@3.0.1: resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} engines: {node: '>=0.12'} @@ -4383,6 +4406,11 @@ packages: engines: {node: '>=6'} dev: true + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + /ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: @@ -4451,7 +4479,6 @@ packages: /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: true /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -4491,6 +4518,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -4648,6 +4679,10 @@ packages: - supports-color dev: true + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4941,7 +4976,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} @@ -4974,7 +5008,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true /inquirer@7.3.3: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} @@ -5689,6 +5722,11 @@ packages: engines: {node: '>=6'} dev: true + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + /miniflare@3.20231030.2: resolution: {integrity: sha512-+DYdMqWlUaY4wBylIjewNu8OVsPFquYjQkxoSb2jGIMBmlKaef65Hn2Bu8sub5tQzQ8tLO0FRklmD2Upx0HCCQ==} engines: {node: '>=16.13'} @@ -5760,6 +5798,10 @@ packages: yallist: 4.0.0 dev: true + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} dependencies: @@ -5807,6 +5849,10 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /napi-wasm@1.1.0: resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} dev: true @@ -5978,6 +6024,13 @@ packages: lower-case: 1.1.4 dev: true + /node-abi@3.52.0: + resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + /node-addon-api@7.0.0: resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} dev: true @@ -6475,6 +6528,25 @@ packages: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} dev: false + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.52.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -6671,6 +6743,13 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -6712,7 +6791,6 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} @@ -6853,7 +6931,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} @@ -7094,7 +7171,6 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -7226,6 +7302,18 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -7398,7 +7486,6 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -7419,7 +7506,6 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -7495,6 +7581,26 @@ packages: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + /tar-stream@3.1.6: resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} dependencies: @@ -7651,6 +7757,12 @@ packages: /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /turbo-darwin-64@1.10.16: resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} cpu: [x64] @@ -7823,7 +7935,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true /undici@5.27.2: resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==}