From ad0c73d210c9198ea90573f8710ecd775d90bb2d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 27 May 2025 19:05:13 +0300 Subject: [PATCH] feat(edit-docs): read from input directory instead of the zip --- apps/edit-docs/src/edit-demo.ts | 24 ++++++++++++---- apps/edit-docs/src/edit-docs.ts | 49 +-------------------------------- apps/edit-docs/src/utils.ts | 46 +++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/apps/edit-docs/src/edit-demo.ts b/apps/edit-docs/src/edit-demo.ts index aafb3a222..62ea49014 100644 --- a/apps/edit-docs/src/edit-demo.ts +++ b/apps/edit-docs/src/edit-demo.ts @@ -1,12 +1,13 @@ -import { extractZip, initializeDatabase, startElectron } from "./utils.js"; +import { extractZip, importData, initializeDatabase, startElectron } from "./utils.js"; import { initializeTranslations } from "@triliumnext/server/src/services/i18n.js"; import debounce from "@triliumnext/client/src/services/debounce.js"; import fs from "fs/promises"; import { join } from "path"; +import cls from "@triliumnext/server/src/services/cls.js"; // Paths are relative to apps/edit-docs/dist. const DEMO_ZIP_PATH = join(__dirname, "../../server/src/assets/db/demo.zip"); -const OUTPUT_DIR = join(__dirname, "../demo"); +const DEMO_ZIP_DIR_PATH = join(__dirname, "../demo"); async function main() { const initializedPromise = startElectron(() => { @@ -15,10 +16,23 @@ async function main() { }); await initializeTranslations(); - await initializeDatabase(false); + await initializeDatabase(true); + cls.init(async () => { + await importData(DEMO_ZIP_DIR_PATH); + setOptions(); + initializedPromise.resolve(); + }); + initializedPromise.resolve(); } +async function setOptions() { + const optionsService = (await import("@triliumnext/server/src/services/options.js")).default; + optionsService.setOption("eraseUnusedAttachmentsAfterSeconds", 10); + optionsService.setOption("eraseUnusedAttachmentsAfterTimeScale", 60); + optionsService.setOption("compressImages", "false"); +} + async function registerHandlers() { const events = (await import("@triliumnext/server/src/services/events.js")).default; const eraseService = (await import("@triliumnext/server/src/services/erase.js")).default; @@ -27,8 +41,8 @@ async function registerHandlers() { eraseService.eraseUnusedAttachmentsNow(); await exportData(); - await fs.rmdir(OUTPUT_DIR, { recursive: true }).catch(() => {}); - await extractZip(DEMO_ZIP_PATH, OUTPUT_DIR); + await fs.rmdir(DEMO_ZIP_DIR_PATH, { recursive: true }).catch(() => {}); + await extractZip(DEMO_ZIP_PATH, DEMO_ZIP_DIR_PATH); }, 10_000); events.subscribe(events.ENTITY_CHANGED, async (e) => { if (e.entityName === "options") { diff --git a/apps/edit-docs/src/edit-docs.ts b/apps/edit-docs/src/edit-docs.ts index 7266ad323..940f89540 100644 --- a/apps/edit-docs/src/edit-docs.ts +++ b/apps/edit-docs/src/edit-docs.ts @@ -3,15 +3,11 @@ import fsExtra from "fs-extra"; import path from "path"; import type { NoteMetaFile } from "@triliumnext/server/src/services/meta/note_meta.js"; import { initializeTranslations } from "@triliumnext/server/src/services/i18n.js"; -import archiver, { type Archiver } from "archiver"; -import type { WriteStream } from "fs"; import debounce from "@triliumnext/client/src/services/debounce.js"; -import { extractZip, initializeDatabase, startElectron } from "./utils.js"; +import { extractZip, importData, initializeDatabase, startElectron } from "./utils.js"; import cls from "@triliumnext/server/src/services/cls.js"; import type { AdvancedExportOptions } from "@triliumnext/server/src/services/export/zip.js"; -import TaskContext from "@triliumnext/server/src/services/task_context.js"; import { parseNoteMetaFile } from "@triliumnext/server/src/services/in_app_help.js"; -import { resolve } from "path"; import type NoteMeta from "@triliumnext/server/src/services/meta/note_meta.js"; interface NoteMapping { @@ -79,49 +75,6 @@ async function setOptions() { optionsService.setOption("compressImages", "false"); } -async function importData(path: string) { - const buffer = await createImportZip(path); - const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default; - const context = new TaskContext("no-progress-reporting", "import", false); - const becca = (await import("@triliumnext/server/src/becca/becca.js")).default; - - const rootNote = becca.getRoot(); - if (!rootNote) { - throw new Error("Missing root note for import."); - } - await importService.importZip(context, buffer, rootNote, { - preserveIds: true - }); -} - -async function createImportZip(path: string) { - const inputFile = "input.zip"; - const archive = archiver("zip", { - zlib: { level: 0 } - }); - - console.log("Archive path is ", resolve(path)) - archive.directory(path, "/"); - - const outputStream = fsExtra.createWriteStream(inputFile); - archive.pipe(outputStream); - await waitForEnd(archive, outputStream); - - try { - return await fsExtra.readFile(inputFile); - } finally { - await fsExtra.rm(inputFile); - } -} - -function waitForEnd(archive: Archiver, stream: WriteStream) { - return new Promise(async (res, rej) => { - stream.on("finish", () => res()); - await archive.finalize(); - }); - -} - async function exportData(noteId: string, format: "html" | "markdown", outputPath: string, ignoredFiles?: Set) { const zipFilePath = "output.zip"; diff --git a/apps/edit-docs/src/utils.ts b/apps/edit-docs/src/utils.ts index fc11eb8fb..059e1e0cc 100644 --- a/apps/edit-docs/src/utils.ts +++ b/apps/edit-docs/src/utils.ts @@ -5,6 +5,10 @@ import path from "path"; import electron from "electron"; import { deferred, type DeferredPromise } from "@triliumnext/server/src/services/utils.js"; import windowService from "@triliumnext/server/src/services/window.js"; +import archiver, { type Archiver } from "archiver"; +import type { WriteStream } from "fs"; +import TaskContext from "@triliumnext/server/src/services/task_context.js"; +import { resolve } from "path"; export function initializeDatabase(skipDemoDb: boolean) { return new Promise(async (resolve) => { @@ -44,6 +48,48 @@ export function startElectron(callback: () => void): DeferredPromise { return initializedPromise; } +export async function importData(path: string) { + const buffer = await createImportZip(path); + const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default; + const context = new TaskContext("no-progress-reporting", "import", false); + const becca = (await import("@triliumnext/server/src/becca/becca.js")).default; + + const rootNote = becca.getRoot(); + if (!rootNote) { + throw new Error("Missing root note for import."); + } + await importService.importZip(context, buffer, rootNote, { + preserveIds: true + }); +} + +async function createImportZip(path: string) { + const inputFile = "input.zip"; + const archive = archiver("zip", { + zlib: { level: 0 } + }); + + console.log("Archive path is ", resolve(path)) + archive.directory(path, "/"); + + const outputStream = fsExtra.createWriteStream(inputFile); + archive.pipe(outputStream); + await waitForEnd(archive, outputStream); + + try { + return await fsExtra.readFile(inputFile); + } finally { + await fsExtra.rm(inputFile); + } +} + +function waitForEnd(archive: Archiver, stream: WriteStream) { + return new Promise(async (res, rej) => { + stream.on("finish", () => res()); + await archive.finalize(); + }); +} + export async function extractZip(zipFilePath: string, outputPath: string, ignoredFiles?: Set) { const deferred = (await import("@triliumnext/server/src/services/utils.js")).deferred;