From d29d1428ed94ef2bdd26bb109b8fda3d23186f78 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 27 Mar 2026 18:55:18 +0200 Subject: [PATCH] feat(standalone/import): import demo DB --- .../src/local-server-worker.ts | 5 +++++ apps/desktop/src/main.ts | 1 + apps/server/src/main.ts | 1 + packages/trilium-core/src/index.ts | 8 +++++-- .../trilium-core/src/services/sql_init.ts | 21 ++++++++++++------- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/apps/client-standalone/src/local-server-worker.ts b/apps/client-standalone/src/local-server-worker.ts index 6a31561117..6b54a947a5 100644 --- a/apps/client-standalone/src/local-server-worker.ts +++ b/apps/client-standalone/src/local-server-worker.ts @@ -162,6 +162,11 @@ async function initialize(): Promise { platform: new StandalonePlatformProvider(queryString), translations: translationProvider, schema: schemaModule.default, + getDemoArchive: async () => { + const response = await fetch("/server-assets/db/demo.zip"); + if (!response.ok) return null; + return new Uint8Array(await response.arrayBuffer()); + }, dbConfig: { provider: sqlProvider!, isReadOnly: false, diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index 22c20aa513..8aef99bae6 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -141,6 +141,7 @@ async function main() { schema: fs.readFileSync(require.resolve("@triliumnext/core/src/assets/schema.sql"), "utf-8"), platform: new DesktopPlatformProvider(), translations: (await import("@triliumnext/server/src/services/i18n.js")).initializeTranslations, + getDemoArchive: async () => fs.readFileSync(require.resolve("@triliumnext/server/src/assets/db/demo.zip")), extraAppInfo: { nodeVersion: process.version, dataDirectory: path.resolve(dataDirs.TRILIUM_DATA_DIR) diff --git a/apps/server/src/main.ts b/apps/server/src/main.ts index d09ef82ebd..5a5c58c150 100644 --- a/apps/server/src/main.ts +++ b/apps/server/src/main.ts @@ -59,6 +59,7 @@ async function startApplication() { schema: fs.readFileSync(require.resolve("@triliumnext/core/src/assets/schema.sql"), "utf-8"), platform: new ServerPlatformProvider(), translations: (await import("./services/i18n.js")).initializeTranslations, + getDemoArchive: async () => fs.readFileSync(require.resolve("@triliumnext/server/src/assets/db/demo.zip")), extraAppInfo: { nodeVersion: process.version, dataDirectory: path.resolve(dataDirs.TRILIUM_DATA_DIR) diff --git a/packages/trilium-core/src/index.ts b/packages/trilium-core/src/index.ts index c4fbcb0920..5625bb69f6 100644 --- a/packages/trilium-core/src/index.ts +++ b/packages/trilium-core/src/index.ts @@ -6,7 +6,7 @@ import { SqlService, SqlServiceParams } from "./services/sql/sql"; import { initMessaging, MessagingProvider } from "./services/messaging/index"; import { initRequest, RequestProvider } from "./services/request"; import { initTranslations, TranslationProvider } from "./services/i18n"; -import { initSchema } from "./services/sql_init"; +import { initSchema, initDemoArchive } from "./services/sql_init"; import appInfo from "./services/app_info"; import { type PlatformProvider, initPlatform } from "./services/platform"; import { type ZipProvider, initZipProvider } from "./services/import/zip_provider"; @@ -103,7 +103,7 @@ export * as routeHelpers from "./routes/helpers"; export * as becca_easy_mocking from "./test/becca_easy_mocking"; export * as becca_mocking from "./test/becca_mocking"; -export async function initializeCore({ dbConfig, executionContext, crypto, zip, translations, messaging, request, schema, extraAppInfo, platform }: { +export async function initializeCore({ dbConfig, executionContext, crypto, zip, translations, messaging, request, schema, extraAppInfo, platform, getDemoArchive }: { dbConfig: SqlServiceParams, executionContext: ExecutionContext, crypto: CryptoProvider, @@ -113,6 +113,7 @@ export async function initializeCore({ dbConfig, executionContext, crypto, zip, schema: string, messaging?: MessagingProvider, request?: RequestProvider, + getDemoArchive?: () => Promise, extraAppInfo?: { nodeVersion: string; dataDirectory: string; @@ -126,6 +127,9 @@ export async function initializeCore({ dbConfig, executionContext, crypto, zip, initContext(executionContext); initSql(new SqlService(dbConfig, getLog())); initSchema(schema); + if (getDemoArchive) { + initDemoArchive(getDemoArchive); + } Object.assign(appInfo, extraAppInfo); if (messaging) { initMessaging(messaging); diff --git a/packages/trilium-core/src/services/sql_init.ts b/packages/trilium-core/src/services/sql_init.ts index b5d8a88fda..d53cac5716 100644 --- a/packages/trilium-core/src/services/sql_init.ts +++ b/packages/trilium-core/src/services/sql_init.ts @@ -15,11 +15,16 @@ import migrationService from "./migration"; export const dbReady = deferred(); let schema: string; +let getDemoArchive: (() => Promise) | null = null; export function initSchema(schemaStr: string) { schema = schemaStr; } +export function initDemoArchive(fn: () => Promise) { + getDemoArchive = fn; +} + function schemaExists() { return !!getSql().getValue(/*sql*/`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'options'`); @@ -177,13 +182,15 @@ async function createInitialDatabase(skipDemoDb?: boolean) { }); // Import demo content. - log.info("Importing demo content..."); - - const dummyTaskContext = new TaskContext("no-progress-reporting", "importNotes", null); - - // if (demoFile) { - // await zipImportService.importZip(dummyTaskContext, demoFile, rootNote); - // } + if (getDemoArchive) { + log.info("Importing demo content..."); + const demoFile = await getDemoArchive(); + if (demoFile) { + const { default: zipImportService } = await import("./import/zip.js"); + const dummyTaskContext = new TaskContext("no-progress-reporting", "importNotes", null); + await zipImportService.importZip(dummyTaskContext, demoFile, rootNote); + } + } // Post-demo. sql.transactional(() => {