From 8889537ff8dab790eb2efe30f76395b83afb9dde Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 19 Dec 2025 22:11:35 +0100 Subject: [PATCH] wip: libsql migration --- Dockerfile | 1 - package.json | 1 - packages/api/src/router/app.ts | 18 +- packages/api/src/router/board.ts | 287 ------------------ .../router/certificates/certificate-router.ts | 3 +- packages/api/src/router/group.ts | 7 - .../router/integration/integration-router.ts | 42 --- packages/core/package.json | 3 +- .../src/infrastructure/db/drivers/sqlite.ts | 8 +- packages/cron-jobs/src/jobs/icons-updater.ts | 40 --- packages/db/collection.ts | 18 +- packages/db/driver.ts | 4 +- packages/db/package.json | 2 - packages/db/test/db-mock.ts | 11 +- packages/db/transactions.ts | 9 +- packages/icons/src/auto-icon-searcher.ts | 4 +- .../src/import/import-initial-oldmarr.ts | 7 - .../src/import/import-single-oldmarr.ts | 3 - pnpm-lock.yaml | 252 +++++++++++++-- 19 files changed, 255 insertions(+), 465 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4cf6a8533..e466d04f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,7 +45,6 @@ COPY --from=builder /app/apps/nextjs/package.json . COPY --from=builder /app/apps/tasks/tasks.cjs ./apps/tasks/tasks.cjs COPY --from=builder /app/apps/websocket/wssServer.cjs ./apps/websocket/wssServer.cjs -COPY --from=builder /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/build/better_sqlite3.node COPY --from=builder /app/packages/db/migrations ./db/migrations diff --git a/package.json b/package.json index be82bfea1..66dfe7c99 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ "onlyBuiltDependencies": [ "@tree-sitter-grammars/tree-sitter-yaml", "bcrypt", - "better-sqlite3", "cpu-features", "esbuild", "sharp", diff --git a/packages/api/src/router/app.ts b/packages/api/src/router/app.ts index 32c607951..8041f3300 100644 --- a/packages/api/src/router/app.ts +++ b/packages/api/src/router/app.ts @@ -5,7 +5,7 @@ import { createId } from "@homarr/common"; import { asc, eq, inArray, like } from "@homarr/db"; import { apps } from "@homarr/db/schema"; import { selectAppSchema } from "@homarr/db/validationSchemas"; -import { getIconForName } from "@homarr/icons"; +import { getIconForNameAsync } from "@homarr/icons"; import { appCreateManySchema, appEditSchema, appManageSchema } from "@homarr/validation/app"; import { byIdSchema, paginatedSchema } from "@homarr/validation/common"; @@ -141,13 +141,15 @@ export const appRouter = createTRPCRouter({ .output(z.void()) .mutation(async ({ ctx, input }) => { await ctx.db.insert(apps).values( - input.map((app) => ({ - id: createId(), - name: app.name, - description: app.description, - iconUrl: app.iconUrl ?? getIconForName(ctx.db, app.name).sync()?.url ?? defaultIcon, - href: app.href, - })), + await Promise.all( + input.map(async (app) => ({ + id: createId(), + name: app.name, + description: app.description, + iconUrl: app.iconUrl ?? (await getIconForNameAsync(ctx.db, app.name))?.url ?? defaultIcon, + href: app.href, + })), + ), ); }), update: permissionRequiredProcedure diff --git a/packages/api/src/router/board.ts b/packages/api/src/router/board.ts index 8d118018b..67a24afd5 100644 --- a/packages/api/src/router/board.ts +++ b/packages/api/src/router/board.ts @@ -477,47 +477,6 @@ export const boardRouter = createTRPCRouter({ } }); }, - handleSync(db) { - db.transaction((transaction) => { - transaction - .insert(boards) - .values({ - ...boardProps, - id: newBoardId, - name: input.name, - creatorId: ctx.session.user.id, - }) - .run(); - - if (layoutsToInsert.length > 0) { - transaction.insert(layouts).values(layoutsToInsert).run(); - } - - if (sectionsToInsert.length > 0) { - transaction.insert(sections).values(sectionsToInsert).run(); - } - - if (sectionLayoutsToInsert.length > 0) { - transaction.insert(sectionLayouts).values(sectionLayoutsToInsert).run(); - } - - if (sectionCollapseStatesToInsert.length > 0) { - transaction.insert(sectionCollapseStates).values(sectionCollapseStatesToInsert).run(); - } - - if (itemsToInsert.length > 0) { - transaction.insert(items).values(itemsToInsert).run(); - } - - if (itemLayoutsToInsert.length > 0) { - transaction.insert(itemLayouts).values(itemLayoutsToInsert).run(); - } - - if (itemIntegrationsToInsert.length > 0) { - transaction.insert(integrationItems).values(itemIntegrationsToInsert).run(); - } - }); - }, }); }), renameBoard: protectedProcedure.input(boardRenameSchema).mutation(async ({ ctx, input }) => { @@ -954,216 +913,6 @@ export const boardRouter = createTRPCRouter({ } }); }, - handleSync(db) { - db.transaction((transaction) => { - const addedSections = filterAddedItems(input.sections, dbBoard.sections); - - if (addedSections.length > 0) { - transaction - .insert(sections) - .values( - addedSections.map((section) => ({ - id: section.id, - kind: section.kind, - yOffset: section.kind !== "dynamic" ? section.yOffset : null, - xOffset: section.kind === "dynamic" ? null : 0, - options: section.kind === "dynamic" ? superjson.stringify(section.options) : emptySuperJSON, - name: "name" in section ? section.name : null, - boardId: dbBoard.id, - })), - ) - .run(); - - if (addedSections.some((section) => section.kind === "dynamic")) { - transaction - .insert(sectionLayouts) - .values( - addedSections - .filter((section) => section.kind === "dynamic") - .flatMap((section) => - section.layouts.map( - (sectionLayout): InferInsertModel => ({ - layoutId: sectionLayout.layoutId, - sectionId: section.id, - parentSectionId: sectionLayout.parentSectionId, - height: sectionLayout.height, - width: sectionLayout.width, - xOffset: sectionLayout.xOffset, - yOffset: sectionLayout.yOffset, - }), - ), - ), - ) - .run(); - } - } - - const addedItems = filterAddedItems(input.items, dbBoard.items); - - if (addedItems.length > 0) { - transaction - .insert(items) - .values( - addedItems.map((item) => ({ - id: item.id, - kind: item.kind, - options: superjson.stringify(item.options), - advancedOptions: superjson.stringify(item.advancedOptions), - boardId: dbBoard.id, - })), - ) - .run(); - transaction - .insert(itemLayouts) - .values( - addedItems.flatMap((item) => - item.layouts.map( - (layoutSection): InferInsertModel => ({ - layoutId: layoutSection.layoutId, - sectionId: layoutSection.sectionId, - itemId: item.id, - height: layoutSection.height, - width: layoutSection.width, - xOffset: layoutSection.xOffset, - yOffset: layoutSection.yOffset, - }), - ), - ), - ) - .run(); - } - - const inputIntegrationRelations = input.items.flatMap(({ integrationIds, id: itemId }) => - integrationIds.map((integrationId) => ({ - integrationId, - itemId, - })), - ); - const dbIntegrationRelations = dbBoard.items.flatMap(({ integrationIds, id: itemId }) => - integrationIds.map((integrationId) => ({ - integrationId, - itemId, - })), - ); - const addedIntegrationRelations = inputIntegrationRelations.filter( - (inputRelation) => - !dbIntegrationRelations.some( - (dbRelation) => - dbRelation.itemId === inputRelation.itemId && - dbRelation.integrationId === inputRelation.integrationId, - ), - ); - - if (addedIntegrationRelations.length > 0) { - transaction - .insert(integrationItems) - .values( - addedIntegrationRelations.map((relation) => ({ - itemId: relation.itemId, - integrationId: relation.integrationId, - })), - ) - .run(); - } - - const updatedItems = filterUpdatedItems(input.items, dbBoard.items); - - for (const item of updatedItems) { - transaction - .update(items) - .set({ - kind: item.kind, - options: superjson.stringify(item.options), - advancedOptions: superjson.stringify(item.advancedOptions), - }) - .where(eq(items.id, item.id)) - .run(); - - for (const itemSectionLayout of item.layouts) { - transaction - .update(itemLayouts) - .set({ - height: itemSectionLayout.height, - width: itemSectionLayout.width, - xOffset: itemSectionLayout.xOffset, - yOffset: itemSectionLayout.yOffset, - sectionId: itemSectionLayout.sectionId, - }) - .where(and(eq(itemLayouts.itemId, item.id), eq(itemLayouts.layoutId, itemSectionLayout.layoutId))) - .run(); - } - } - - const updatedSections = filterUpdatedItems(input.sections, dbBoard.sections); - - for (const section of updatedSections) { - const prev = dbBoard.sections.find((dbSection) => dbSection.id === section.id); - transaction - .update(sections) - .set({ - yOffset: prev?.kind !== "dynamic" && "yOffset" in section ? section.yOffset : null, - xOffset: prev?.kind !== "dynamic" && "yOffset" in section ? 0 : null, - options: section.kind === "dynamic" ? superjson.stringify(section.options) : emptySuperJSON, - name: prev?.kind === "category" && "name" in section ? section.name : null, - }) - .where(eq(sections.id, section.id)) - .run(); - - if (section.kind !== "dynamic") continue; - - for (const sectionLayout of section.layouts) { - transaction - .update(sectionLayouts) - .set({ - height: sectionLayout.height, - width: sectionLayout.width, - xOffset: sectionLayout.xOffset, - yOffset: sectionLayout.yOffset, - parentSectionId: sectionLayout.parentSectionId, - }) - .where( - and(eq(sectionLayouts.sectionId, section.id), eq(sectionLayouts.layoutId, sectionLayout.layoutId)), - ) - .run(); - } - } - - const removedIntegrationRelations = dbIntegrationRelations.filter( - (dbRelation) => - !inputIntegrationRelations.some( - (inputRelation) => - dbRelation.itemId === inputRelation.itemId && - dbRelation.integrationId === inputRelation.integrationId, - ), - ); - - for (const relation of removedIntegrationRelations) { - transaction - .delete(integrationItems) - .where( - and( - eq(integrationItems.itemId, relation.itemId), - eq(integrationItems.integrationId, relation.integrationId), - ), - ) - .run(); - } - - const removedItems = filterRemovedItems(input.items, dbBoard.items); - - const itemIds = removedItems.map((item) => item.id); - if (itemIds.length > 0) { - transaction.delete(items).where(inArray(items.id, itemIds)).run(); - } - - const removedSections = filterRemovedItems(input.sections, dbBoard.sections); - const sectionIds = removedSections.map((section) => section.id); - - if (sectionIds.length > 0) { - transaction.delete(sections).where(inArray(sections.id, sectionIds)).run(); - } - }); - }, }); }), getBoardPermissions: protectedProcedure.input(byIdSchema).query(async ({ input, ctx }) => { @@ -1256,24 +1005,6 @@ export const boardRouter = createTRPCRouter({ ); }); }, - handleSync(db) { - db.transaction((transaction) => { - transaction.delete(boardUserPermissions).where(eq(boardUserPermissions.boardId, input.entityId)).run(); - if (input.permissions.length === 0) { - return; - } - transaction - .insert(boardUserPermissions) - .values( - input.permissions.map((permission) => ({ - userId: permission.principalId, - permission: permission.permission, - boardId: input.entityId, - })), - ) - .run(); - }); - }, }); }), saveGroupBoardPermissions: protectedProcedure.input(boardSavePermissionsSchema).mutation(async ({ input, ctx }) => { @@ -1297,24 +1028,6 @@ export const boardRouter = createTRPCRouter({ ); }); }, - handleSync(db) { - db.transaction((transaction) => { - transaction.delete(boardGroupPermissions).where(eq(boardGroupPermissions.boardId, input.entityId)).run(); - if (input.permissions.length === 0) { - return; - } - transaction - .insert(boardGroupPermissions) - .values( - input.permissions.map((permission) => ({ - groupId: permission.principalId, - permission: permission.permission, - boardId: input.entityId, - })), - ) - .run(); - }); - }, }); }), importOldmarrConfig: permissionRequiredProcedure diff --git a/packages/api/src/router/certificates/certificate-router.ts b/packages/api/src/router/certificates/certificate-router.ts index cab6633f0..616650899 100644 --- a/packages/api/src/router/certificates/certificate-router.ts +++ b/packages/api/src/router/certificates/certificate-router.ts @@ -91,7 +91,7 @@ export const certificateRouter = createTRPCRouter({ hostname: input.hostname, thumbprint: input.thumbprint, }); - const dbResult = await ctx.db + await ctx.db .delete(trustedCertificateHostnames) .where( and( @@ -103,7 +103,6 @@ export const certificateRouter = createTRPCRouter({ logger.info("Removed trusted hostname", { hostname: input.hostname, thumbprint: input.thumbprint, - count: dbResult.changes, }); }), removeCertificate: permissionRequiredProcedure diff --git a/packages/api/src/router/group.ts b/packages/api/src/router/group.ts index 13fb4fdd3..cfd013131 100644 --- a/packages/api/src/router/group.ts +++ b/packages/api/src/router/group.ts @@ -260,13 +260,6 @@ export const groupRouter = createTRPCRouter({ } }); }, - handleSync: (db) => { - db.transaction((trx) => { - for (const { id, position } of positions) { - trx.update(groups).set({ position }).where(eq(groups.id, id)).run(); - } - }); - }, }); }), savePermissions: permissionRequiredProcedure diff --git a/packages/api/src/router/integration/integration-router.ts b/packages/api/src/router/integration/integration-router.ts index 4a12e062e..47a6cf338 100644 --- a/packages/api/src/router/integration/integration-router.ts +++ b/packages/api/src/router/integration/integration-router.ts @@ -541,27 +541,6 @@ export const integrationRouter = createTRPCRouter({ ); }); }, - handleSync(db) { - db.transaction((transaction) => { - transaction - .delete(integrationUserPermissions) - .where(eq(integrationUserPermissions.integrationId, input.entityId)) - .run(); - if (input.permissions.length === 0) { - return; - } - transaction - .insert(integrationUserPermissions) - .values( - input.permissions.map((permission) => ({ - userId: permission.principalId, - permission: permission.permission, - integrationId: input.entityId, - })), - ) - .run(); - }); - }, }); }), saveGroupIntegrationPermissions: protectedProcedure @@ -587,27 +566,6 @@ export const integrationRouter = createTRPCRouter({ ); }); }, - handleSync(db) { - db.transaction((transaction) => { - transaction - .delete(integrationGroupPermissions) - .where(eq(integrationGroupPermissions.integrationId, input.entityId)) - .run(); - if (input.permissions.length === 0) { - return; - } - transaction - .insert(integrationGroupPermissions) - .values( - input.permissions.map((permission) => ({ - groupId: permission.principalId, - permission: permission.permission, - integrationId: input.entityId, - })), - ) - .run(); - }); - }, }); }), searchInIntegration: protectedProcedure diff --git a/packages/core/package.json b/packages/core/package.json index 6fe412842..785b680e6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -37,8 +37,8 @@ }, "prettier": "@homarr/prettier-config", "dependencies": { + "@libsql/client": "^0.15.15", "@t3-oss/env-nextjs": "^0.13.8", - "better-sqlite3": "^12.5.0", "dns-caching": "^0.2.9", "drizzle-orm": "^0.45.1", "ioredis": "5.8.2", @@ -52,7 +52,6 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/better-sqlite3": "7.6.13", "@types/pg": "^8.16.0", "eslint": "^9.39.2", "typescript": "^5.9.3" diff --git a/packages/core/src/infrastructure/db/drivers/sqlite.ts b/packages/core/src/infrastructure/db/drivers/sqlite.ts index ce95fe5a0..19bd65aa3 100644 --- a/packages/core/src/infrastructure/db/drivers/sqlite.ts +++ b/packages/core/src/infrastructure/db/drivers/sqlite.ts @@ -1,10 +1,10 @@ -import Database from "better-sqlite3"; -import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; +import { createClient } from "@libsql/client"; +import { drizzle as drizzleSqlite } from "drizzle-orm/libsql"; import { dbEnv } from "../env"; import type { SharedDrizzleConfig } from "./shared"; export const createSqliteDb = >(config: SharedDrizzleConfig) => { - const connection = new Database(dbEnv.URL); - return drizzleSqlite(connection, config); + const client = createClient({ url: `file:${dbEnv.URL}` }); + return drizzleSqlite(client, config); }; diff --git a/packages/cron-jobs/src/jobs/icons-updater.ts b/packages/cron-jobs/src/jobs/icons-updater.ts index b48c26ea6..7cb2a957a 100644 --- a/packages/cron-jobs/src/jobs/icons-updater.ts +++ b/packages/cron-jobs/src/jobs/icons-updater.ts @@ -121,46 +121,6 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { ); } - countDeleted += deadIcons.length; - }); - }, - handleSync() { - db.transaction((transaction) => { - if (newIconRepositories.length >= 1) { - transaction.insert(iconRepositories).values(newIconRepositories).run(); - } - - if (newIcons.length >= 1) { - // We only insert 5000 icons at a time to avoid SQLite limitations - for (const chunck of splitToNChunks(newIcons, Math.ceil(newIcons.length / 5000))) { - transaction.insert(icons).values(chunck).run(); - } - } - if (deadIcons.length >= 1) { - transaction - .delete(icons) - .where( - inArray( - // Combine iconRepositoryId and checksum to allow same icons on different repositories - sql`concat(${icons.iconRepositoryId}, '.', ${icons.checksum})`, - deadIcons.map((icon) => `${icon.iconRepositoryId}.${icon.checksum}`), - ), - ) - .run(); - } - - if (deadIconRepositories.length >= 1) { - transaction - .delete(iconRepositories) - .where( - inArray( - iconRepositories.id, - deadIconRepositories.map((iconRepository) => iconRepository.id), - ), - ) - .run(); - } - countDeleted += deadIcons.length; }); }, diff --git a/packages/db/collection.ts b/packages/db/collection.ts index 00e5aba18..37e084bad 100644 --- a/packages/db/collection.ts +++ b/packages/db/collection.ts @@ -31,20 +31,8 @@ export const createDbInsertCollectionForTransaction = { - db.transaction((transaction) => { - for (const [key, values] of objectEntries(context)) { - if (values.length >= 1) { - transaction - .insert(schema[key]) - .values(values as never) - .run(); - } - } - }); - }, // We allow any database that supports async passed here but then fallback to mysql to prevent typescript errors - insertAllAsync: async (db: HomarrDatabaseMysql | HomarrDatabasePostgresql) => { + insertAllAsync: async (db: HomarrDatabaseMysql | HomarrDatabasePostgresql | HomarrDatabase) => { const innerDb = db as HomarrDatabaseMysql; await innerDb.transaction(async (transaction) => { for (const [key, values] of objectEntries(context)) { @@ -61,7 +49,7 @@ export const createDbInsertCollectionForTransaction = ( tablesInInsertOrder: TTableKey[], ) => { - const { insertAll, insertAllAsync, ...collection } = createDbInsertCollectionForTransaction(tablesInInsertOrder); + const { insertAllAsync, ...collection } = createDbInsertCollectionForTransaction(tablesInInsertOrder); return { ...collection, @@ -75,7 +63,7 @@ export const createDbInsertCollectionWithoutTransaction = ; +export type HomarrDatabase = LibSQLDatabase; export type HomarrDatabaseMysql = MySql2Database; export type HomarrDatabasePostgresql = NodePgDatabase; diff --git a/packages/db/package.json b/packages/db/package.json index 7a244db4f..e8047f42e 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -51,7 +51,6 @@ "@paralleldrive/cuid2": "^3.1.0", "@testcontainers/mysql": "^11.10.0", "@testcontainers/postgresql": "^11.10.0", - "better-sqlite3": "^12.5.0", "dotenv": "^17.2.3", "drizzle-kit": "^0.31.8", "drizzle-orm": "^0.45.1", @@ -64,7 +63,6 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/better-sqlite3": "7.6.13", "@types/pg": "^8.16.0", "dotenv-cli": "^11.0.0", "esbuild": "^0.27.1", diff --git a/packages/db/test/db-mock.ts b/packages/db/test/db-mock.ts index 4001534a6..019d3b504 100644 --- a/packages/db/test/db-mock.ts +++ b/packages/db/test/db-mock.ts @@ -1,15 +1,16 @@ -import Database from "better-sqlite3"; -import { drizzle } from "drizzle-orm/better-sqlite3"; -import { migrate } from "drizzle-orm/better-sqlite3/migrator"; +import { createClient } from "@libsql/client"; +import { drizzle } from "drizzle-orm/libsql"; +import { migrate } from "drizzle-orm/libsql/migrator"; import { DB_CASING } from "@homarr/core/infrastructure/db/constants"; import * as sqliteSchema from "../schema/sqlite"; export const createDb = (debug?: boolean) => { - const sqlite = new Database(":memory:"); + const sqlite = createClient({ url: ":memory:" }); const db = drizzle(sqlite, { schema: sqliteSchema, logger: debug, casing: DB_CASING }); - migrate(db, { + // TODO: Make async and awaitable + void migrate(db, { migrationsFolder: "./packages/db/migrations/sqlite", }); diff --git a/packages/db/transactions.ts b/packages/db/transactions.ts index 1ad35b3dd..555edf123 100644 --- a/packages/db/transactions.ts +++ b/packages/db/transactions.ts @@ -1,11 +1,9 @@ -import { isMysql, isPostgresql } from "./collection"; import type { HomarrDatabase, HomarrDatabaseMysql } from "./driver"; import type { MySqlSchema } from "./schema"; import * as schema from "./schema"; interface HandleTransactionInput { handleAsync: (db: HomarrDatabaseMysql, schema: MySqlSchema) => Promise; - handleSync: (db: HomarrDatabase) => void; } /** @@ -14,10 +12,5 @@ interface HandleTransactionInput { * But it can also generally be used when dealing with different database drivers. */ export const handleDiffrentDbDriverOperationsAsync = async (db: HomarrDatabase, input: HandleTransactionInput) => { - if (isMysql() || isPostgresql()) { - // Schema type is always the correct one based on env variables - await input.handleAsync(db as unknown as HomarrDatabaseMysql, schema as unknown as MySqlSchema); - } else { - input.handleSync(db); - } + await input.handleAsync(db as unknown as HomarrDatabaseMysql, schema as unknown as MySqlSchema); }; diff --git a/packages/icons/src/auto-icon-searcher.ts b/packages/icons/src/auto-icon-searcher.ts index 06f3d9b76..0eef30e5e 100644 --- a/packages/icons/src/auto-icon-searcher.ts +++ b/packages/icons/src/auto-icon-searcher.ts @@ -2,8 +2,8 @@ import type { Database } from "@homarr/db"; import { like } from "@homarr/db"; import { icons } from "@homarr/db/schema"; -export const getIconForName = (db: Database, name: string) => { - return db.query.icons.findFirst({ +export const getIconForNameAsync = async (db: Database, name: string) => { + return await db.query.icons.findFirst({ where: like(icons.name, `%${name}%`), }); }; diff --git a/packages/old-import/src/import/import-initial-oldmarr.ts b/packages/old-import/src/import/import-initial-oldmarr.ts index f773c1b36..e2517a4f9 100644 --- a/packages/old-import/src/import/import-initial-oldmarr.ts +++ b/packages/old-import/src/import/import-initial-oldmarr.ts @@ -45,13 +45,6 @@ export const importInitialOldmarrAsync = async ( await integrationInsertCollection.insertAllAsync(transaction); }); }, - handleSync(db) { - db.transaction((transaction) => { - boardInsertCollection.insertAll(transaction); - userInsertCollection.insertAll(transaction); - integrationInsertCollection.insertAll(transaction); - }); - }, }); logger.info("Import successful", { duration: stopwatch.getElapsedInHumanWords() }); diff --git a/packages/old-import/src/import/import-single-oldmarr.ts b/packages/old-import/src/import/import-single-oldmarr.ts index 2ca6ed4c1..777f47ce7 100644 --- a/packages/old-import/src/import/import-single-oldmarr.ts +++ b/packages/old-import/src/import/import-single-oldmarr.ts @@ -35,8 +35,5 @@ export const importSingleOldmarrConfigAsync = async ( async handleAsync(db) { await boardInsertCollection.insertAllAsync(db); }, - handleSync(db) { - boardInsertCollection.insertAll(db); - }, }); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 502582e78..d9d2f8899 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -877,18 +877,18 @@ importers: packages/core: dependencies: + '@libsql/client': + specifier: ^0.15.15 + version: 0.15.15 '@t3-oss/env-nextjs': specifier: ^0.13.8 version: 0.13.8(arktype@2.1.20)(typescript@5.9.3)(zod@4.1.13) - better-sqlite3: - specifier: ^12.5.0 - version: 12.5.0 dns-caching: specifier: ^0.2.9 version: 0.2.9 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3) + version: 0.45.1(@libsql/client-wasm@0.14.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3) ioredis: specifier: 5.8.2 version: 5.8.2 @@ -917,9 +917,6 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript - '@types/better-sqlite3': - specifier: 7.6.13 - version: 7.6.13 '@types/pg': specifier: ^8.16.0 version: 8.16.0 @@ -1140,9 +1137,6 @@ importers: '@testcontainers/postgresql': specifier: ^11.10.0 version: 11.10.0 - better-sqlite3: - specifier: ^12.5.0 - version: 12.5.0 dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -1151,10 +1145,10 @@ importers: version: 0.31.8 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3) + version: 0.45.1(@libsql/client-wasm@0.14.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3) drizzle-zod: specifier: ^0.8.3 - version: 0.8.3(drizzle-orm@0.45.1(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3))(zod@4.1.13) + version: 0.8.3(drizzle-orm@0.45.1(@libsql/client-wasm@0.14.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3))(zod@4.1.13) mysql2: specifier: 3.15.3 version: 3.15.3 @@ -1174,9 +1168,6 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript - '@types/better-sqlite3': - specifier: 7.6.13 - version: 7.6.13 '@types/pg': specifier: ^8.16.0 version: 8.16.0 @@ -3527,9 +3518,70 @@ packages: bundledDependencies: - '@libsql/libsql-wasm-experimental' + '@libsql/client@0.15.15': + resolution: {integrity: sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w==} + '@libsql/core@0.14.0': resolution: {integrity: sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==} + '@libsql/core@0.15.15': + resolution: {integrity: sha512-C88Z6UKl+OyuKKPwz224riz02ih/zHYI3Ho/LAcVOgjsunIRZoBw7fjRfaH9oPMmSNeQfhGklSG2il1URoOIsA==} + + '@libsql/darwin-arm64@0.5.22': + resolution: {integrity: sha512-4B8ZlX3nIDPndfct7GNe0nI3Yw6ibocEicWdC4fvQbSs/jdq/RC2oCsoJxJ4NzXkvktX70C1J4FcmmoBy069UA==} + cpu: [arm64] + os: [darwin] + + '@libsql/darwin-x64@0.5.22': + resolution: {integrity: sha512-ny2HYWt6lFSIdNFzUFIJ04uiW6finXfMNJ7wypkAD8Pqdm6nAByO+Fdqu8t7sD0sqJGeUCiOg480icjyQ2/8VA==} + cpu: [x64] + os: [darwin] + + '@libsql/hrana-client@0.7.0': + resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==} + + '@libsql/isomorphic-fetch@0.3.1': + resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==} + engines: {node: '>=18.0.0'} + + '@libsql/isomorphic-ws@0.1.5': + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + + '@libsql/linux-arm-gnueabihf@0.5.22': + resolution: {integrity: sha512-3Uo3SoDPJe/zBnyZKosziRGtszXaEtv57raWrZIahtQDsjxBVjuzYQinCm9LRCJCUT5t2r5Z5nLDPJi2CwZVoA==} + cpu: [arm] + os: [linux] + + '@libsql/linux-arm-musleabihf@0.5.22': + resolution: {integrity: sha512-LCsXh07jvSojTNJptT9CowOzwITznD+YFGGW+1XxUr7fS+7/ydUrpDfsMX7UqTqjm7xG17eq86VkWJgHJfvpNg==} + cpu: [arm] + os: [linux] + + '@libsql/linux-arm64-gnu@0.5.22': + resolution: {integrity: sha512-KSdnOMy88c9mpOFKUEzPskSaF3VLflfSUCBwas/pn1/sV3pEhtMF6H8VUCd2rsedwoukeeCSEONqX7LLnQwRMA==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-arm64-musl@0.5.22': + resolution: {integrity: sha512-mCHSMAsDTLK5YH//lcV3eFEgiR23Ym0U9oEvgZA0667gqRZg/2px+7LshDvErEKv2XZ8ixzw3p1IrBzLQHGSsw==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-x64-gnu@0.5.22': + resolution: {integrity: sha512-kNBHaIkSg78Y4BqAdgjcR2mBilZXs4HYkAmi58J+4GRwDQZh5fIUWbnQvB9f95DkWUIGVeenqLRFY2pcTmlsew==} + cpu: [x64] + os: [linux] + + '@libsql/linux-x64-musl@0.5.22': + resolution: {integrity: sha512-UZ4Xdxm4pu3pQXjvfJiyCzZop/9j/eA2JjmhMaAhe3EVLH2g11Fy4fwyUp9sT1QJYR1kpc2JLuybPM0kuXv/Tg==} + cpu: [x64] + os: [linux] + + '@libsql/win32-x64-msvc@0.5.22': + resolution: {integrity: sha512-Fj0j8RnBpo43tVZUVoNK6BV/9AtDUM5S7DF3LB4qTYg1LMSZqi3yeCneUTLJD6XomQJlZzbI4mst89yspVSAnA==} + cpu: [x64] + os: [win32] + '@mantine/charts@8.3.10': resolution: {integrity: sha512-/JbuxY7qzrxrZR7ZjKj9dD8OXq03nAIClqJ+fD5ezF8J1cVYH9nx0IaIu8RPpaT4UwRdxz+TH/EutQ0LdeOz8w==} peerDependencies: @@ -3628,6 +3680,9 @@ packages: '@ndaidong/bellajs@12.0.1': resolution: {integrity: sha512-1iY42uiHz0cxNMbde7O3zVN+ZX1viOOUOBRt6ht6lkRZbSjwOnFV34Zv4URp3hGzEe6L9Byk7BOq/41H0PzAOQ==} + '@neon-rs/load@0.0.4': + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + '@next/env@16.0.10': resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} @@ -6047,6 +6102,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -6207,6 +6266,10 @@ packages: engines: {node: '>=0.10'} hasBin: true + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -6855,6 +6918,10 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fetch-retry@6.0.0: resolution: {integrity: sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag==} @@ -6956,6 +7023,10 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} @@ -7895,6 +7966,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libsql@0.5.22: + resolution: {integrity: sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA==} + cpu: [x64, arm64, wasm32, arm] + os: [darwin, linux, win32] + light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} @@ -8453,6 +8529,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -9061,6 +9141,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise-limit@2.7.0: + resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -12244,11 +12327,73 @@ snapshots: js-base64: 3.7.8 optional: true + '@libsql/client@0.15.15': + dependencies: + '@libsql/core': 0.15.15 + '@libsql/hrana-client': 0.7.0 + js-base64: 3.7.8 + libsql: 0.5.22 + promise-limit: 2.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@libsql/core@0.14.0': dependencies: js-base64: 3.7.8 optional: true + '@libsql/core@0.15.15': + dependencies: + js-base64: 3.7.8 + + '@libsql/darwin-arm64@0.5.22': + optional: true + + '@libsql/darwin-x64@0.5.22': + optional: true + + '@libsql/hrana-client@0.7.0': + dependencies: + '@libsql/isomorphic-fetch': 0.3.1 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.8 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/isomorphic-fetch@0.3.1': {} + + '@libsql/isomorphic-ws@0.1.5': + dependencies: + '@types/ws': 8.18.1 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/linux-arm-gnueabihf@0.5.22': + optional: true + + '@libsql/linux-arm-musleabihf@0.5.22': + optional: true + + '@libsql/linux-arm64-gnu@0.5.22': + optional: true + + '@libsql/linux-arm64-musl@0.5.22': + optional: true + + '@libsql/linux-x64-gnu@0.5.22': + optional: true + + '@libsql/linux-x64-musl@0.5.22': + optional: true + + '@libsql/win32-x64-msvc@0.5.22': + optional: true + '@mantine/charts@8.3.10(@mantine/core@8.3.10(@mantine/hooks@8.3.10(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@mantine/hooks@8.3.10(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(recharts@2.15.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: '@mantine/core': 8.3.10(@mantine/hooks@8.3.10(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -12394,6 +12539,8 @@ snapshots: '@ndaidong/bellajs@12.0.1': {} + '@neon-rs/load@0.0.4': {} + '@next/env@16.0.10': {} '@next/eslint-plugin-next@16.0.10': @@ -13760,6 +13907,7 @@ snapshots: '@types/better-sqlite3@7.6.13': dependencies: '@types/node': 24.10.4 + optional: true '@types/body-parser@1.19.5': dependencies: @@ -14695,6 +14843,7 @@ snapshots: prebuild-install: 7.1.2 transitivePeerDependencies: - bare-buffer + optional: true bidi-js@1.0.3: dependencies: @@ -14707,6 +14856,7 @@ snapshots: bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + optional: true bl@4.1.0: dependencies: @@ -15213,6 +15363,8 @@ snapshots: damerau-levenshtein@1.0.8: {} + data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@6.0.2: {} data-urls@6.0.0: @@ -15289,6 +15441,7 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true deep-extend@0.6.0: {} @@ -15352,7 +15505,10 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.1.2: {} + detect-libc@2.0.2: {} + + detect-libc@2.1.2: + optional: true detect-newline@4.0.1: {} @@ -15454,8 +15610,9 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.45.1(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3): + drizzle-orm@0.45.1(@libsql/client-wasm@0.14.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3): optionalDependencies: + '@libsql/client': 0.15.15 '@libsql/client-wasm': 0.14.0 '@types/better-sqlite3': 7.6.13 '@types/pg': 8.16.0 @@ -15464,9 +15621,9 @@ snapshots: mysql2: 3.15.3 pg: 8.16.3 - drizzle-zod@0.8.3(drizzle-orm@0.45.1(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3))(zod@4.1.13): + drizzle-zod@0.8.3(drizzle-orm@0.45.1(@libsql/client-wasm@0.14.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3))(zod@4.1.13): dependencies: - drizzle-orm: 0.45.1(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3) + drizzle-orm: 0.45.1(@libsql/client-wasm@0.14.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(gel@2.0.0)(mysql2@3.15.3)(pg@8.16.3) zod: 4.1.13 dunder-proto@1.0.1: @@ -16121,7 +16278,8 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 - expand-template@2.0.3: {} + expand-template@2.0.3: + optional: true expect-type@1.2.2: {} @@ -16230,6 +16388,11 @@ snapshots: fecha@4.2.3: {} + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fetch-retry@6.0.0: {} fflate@0.4.8: {} @@ -16256,7 +16419,8 @@ snapshots: dependencies: tslib: 2.8.1 - file-uri-to-path@1.0.0: {} + file-uri-to-path@1.0.0: + optional: true fill-range@7.1.1: dependencies: @@ -16322,6 +16486,10 @@ snapshots: format@0.2.2: {} + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + from2@2.3.0: dependencies: inherits: 2.0.4 @@ -16487,7 +16655,8 @@ snapshots: through2: 2.0.5 traverse: 0.6.8 - github-from-package@0.0.0: {} + github-from-package@0.0.0: + optional: true glob-parent@5.1.2: dependencies: @@ -17210,8 +17379,7 @@ snapshots: '@types/react': 19.2.7 react: 19.2.3 - js-base64@3.7.8: - optional: true + js-base64@3.7.8: {} js-file-download@0.4.12: {} @@ -17345,6 +17513,21 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libsql@0.5.22: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.5.22 + '@libsql/darwin-x64': 0.5.22 + '@libsql/linux-arm-gnueabihf': 0.5.22 + '@libsql/linux-arm-musleabihf': 0.5.22 + '@libsql/linux-arm64-gnu': 0.5.22 + '@libsql/linux-arm64-musl': 0.5.22 + '@libsql/linux-x64-gnu': 0.5.22 + '@libsql/linux-x64-musl': 0.5.22 + '@libsql/win32-x64-msvc': 0.5.22 + light-my-request@6.6.0: dependencies: cookie: 1.0.2 @@ -17784,7 +17967,8 @@ snapshots: mimic-fn@4.0.0: {} - mimic-response@3.1.0: {} + mimic-response@3.1.0: + optional: true min-document@2.19.0: dependencies: @@ -17877,7 +18061,8 @@ snapshots: nanoid@5.1.6: {} - napi-build-utils@1.0.2: {} + napi-build-utils@1.0.2: + optional: true natural-compare@1.4.0: {} @@ -17980,6 +18165,7 @@ snapshots: node-abi@3.67.0: dependencies: semver: 7.7.3 + optional: true node-abort-controller@3.1.1: {} @@ -18015,6 +18201,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} node-ical@0.22.1: @@ -18567,6 +18759,7 @@ snapshots: tunnel-agent: 0.6.0 transitivePeerDependencies: - bare-buffer + optional: true prelude-ls@1.2.1: {} @@ -18597,6 +18790,8 @@ snapshots: process@0.11.10: {} + promise-limit@2.7.0: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -19533,13 +19728,15 @@ snapshots: figures: 2.0.0 pkg-conf: 2.1.0 - simple-concat@1.0.1: {} + simple-concat@1.0.1: + optional: true simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + optional: true sirv@3.0.2: dependencies: @@ -20267,6 +20464,7 @@ snapshots: tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 + optional: true tunnel@0.0.6: {}