Skip to content
This repository was archived by the owner on Jun 24, 2025. It is now read-only.

Commit ad0c73d

Browse files
committed
feat(edit-docs): read from input directory instead of the zip
1 parent 0bb2947 commit ad0c73d

File tree

3 files changed

+66
-53
lines changed

3 files changed

+66
-53
lines changed

apps/edit-docs/src/edit-demo.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { extractZip, initializeDatabase, startElectron } from "./utils.js";
1+
import { extractZip, importData, initializeDatabase, startElectron } from "./utils.js";
22
import { initializeTranslations } from "@triliumnext/server/src/services/i18n.js";
33
import debounce from "@triliumnext/client/src/services/debounce.js";
44
import fs from "fs/promises";
55
import { join } from "path";
6+
import cls from "@triliumnext/server/src/services/cls.js";
67

78
// Paths are relative to apps/edit-docs/dist.
89
const DEMO_ZIP_PATH = join(__dirname, "../../server/src/assets/db/demo.zip");
9-
const OUTPUT_DIR = join(__dirname, "../demo");
10+
const DEMO_ZIP_DIR_PATH = join(__dirname, "../demo");
1011

1112
async function main() {
1213
const initializedPromise = startElectron(() => {
@@ -15,10 +16,23 @@ async function main() {
1516
});
1617

1718
await initializeTranslations();
18-
await initializeDatabase(false);
19+
await initializeDatabase(true);
20+
cls.init(async () => {
21+
await importData(DEMO_ZIP_DIR_PATH);
22+
setOptions();
23+
initializedPromise.resolve();
24+
});
25+
1926
initializedPromise.resolve();
2027
}
2128

29+
async function setOptions() {
30+
const optionsService = (await import("@triliumnext/server/src/services/options.js")).default;
31+
optionsService.setOption("eraseUnusedAttachmentsAfterSeconds", 10);
32+
optionsService.setOption("eraseUnusedAttachmentsAfterTimeScale", 60);
33+
optionsService.setOption("compressImages", "false");
34+
}
35+
2236
async function registerHandlers() {
2337
const events = (await import("@triliumnext/server/src/services/events.js")).default;
2438
const eraseService = (await import("@triliumnext/server/src/services/erase.js")).default;
@@ -27,8 +41,8 @@ async function registerHandlers() {
2741
eraseService.eraseUnusedAttachmentsNow();
2842
await exportData();
2943

30-
await fs.rmdir(OUTPUT_DIR, { recursive: true }).catch(() => {});
31-
await extractZip(DEMO_ZIP_PATH, OUTPUT_DIR);
44+
await fs.rmdir(DEMO_ZIP_DIR_PATH, { recursive: true }).catch(() => {});
45+
await extractZip(DEMO_ZIP_PATH, DEMO_ZIP_DIR_PATH);
3246
}, 10_000);
3347
events.subscribe(events.ENTITY_CHANGED, async (e) => {
3448
if (e.entityName === "options") {

apps/edit-docs/src/edit-docs.ts

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,11 @@ import fsExtra from "fs-extra";
33
import path from "path";
44
import type { NoteMetaFile } from "@triliumnext/server/src/services/meta/note_meta.js";
55
import { initializeTranslations } from "@triliumnext/server/src/services/i18n.js";
6-
import archiver, { type Archiver } from "archiver";
7-
import type { WriteStream } from "fs";
86
import debounce from "@triliumnext/client/src/services/debounce.js";
9-
import { extractZip, initializeDatabase, startElectron } from "./utils.js";
7+
import { extractZip, importData, initializeDatabase, startElectron } from "./utils.js";
108
import cls from "@triliumnext/server/src/services/cls.js";
119
import type { AdvancedExportOptions } from "@triliumnext/server/src/services/export/zip.js";
12-
import TaskContext from "@triliumnext/server/src/services/task_context.js";
1310
import { parseNoteMetaFile } from "@triliumnext/server/src/services/in_app_help.js";
14-
import { resolve } from "path";
1511
import type NoteMeta from "@triliumnext/server/src/services/meta/note_meta.js";
1612

1713
interface NoteMapping {
@@ -79,49 +75,6 @@ async function setOptions() {
7975
optionsService.setOption("compressImages", "false");
8076
}
8177

82-
async function importData(path: string) {
83-
const buffer = await createImportZip(path);
84-
const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default;
85-
const context = new TaskContext("no-progress-reporting", "import", false);
86-
const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
87-
88-
const rootNote = becca.getRoot();
89-
if (!rootNote) {
90-
throw new Error("Missing root note for import.");
91-
}
92-
await importService.importZip(context, buffer, rootNote, {
93-
preserveIds: true
94-
});
95-
}
96-
97-
async function createImportZip(path: string) {
98-
const inputFile = "input.zip";
99-
const archive = archiver("zip", {
100-
zlib: { level: 0 }
101-
});
102-
103-
console.log("Archive path is ", resolve(path))
104-
archive.directory(path, "/");
105-
106-
const outputStream = fsExtra.createWriteStream(inputFile);
107-
archive.pipe(outputStream);
108-
await waitForEnd(archive, outputStream);
109-
110-
try {
111-
return await fsExtra.readFile(inputFile);
112-
} finally {
113-
await fsExtra.rm(inputFile);
114-
}
115-
}
116-
117-
function waitForEnd(archive: Archiver, stream: WriteStream) {
118-
return new Promise<void>(async (res, rej) => {
119-
stream.on("finish", () => res());
120-
await archive.finalize();
121-
});
122-
123-
}
124-
12578
async function exportData(noteId: string, format: "html" | "markdown", outputPath: string, ignoredFiles?: Set<string>) {
12679
const zipFilePath = "output.zip";
12780

apps/edit-docs/src/utils.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import path from "path";
55
import electron from "electron";
66
import { deferred, type DeferredPromise } from "@triliumnext/server/src/services/utils.js";
77
import windowService from "@triliumnext/server/src/services/window.js";
8+
import archiver, { type Archiver } from "archiver";
9+
import type { WriteStream } from "fs";
10+
import TaskContext from "@triliumnext/server/src/services/task_context.js";
11+
import { resolve } from "path";
812

913
export function initializeDatabase(skipDemoDb: boolean) {
1014
return new Promise<void>(async (resolve) => {
@@ -44,6 +48,48 @@ export function startElectron(callback: () => void): DeferredPromise<void> {
4448
return initializedPromise;
4549
}
4650

51+
export async function importData(path: string) {
52+
const buffer = await createImportZip(path);
53+
const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default;
54+
const context = new TaskContext("no-progress-reporting", "import", false);
55+
const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
56+
57+
const rootNote = becca.getRoot();
58+
if (!rootNote) {
59+
throw new Error("Missing root note for import.");
60+
}
61+
await importService.importZip(context, buffer, rootNote, {
62+
preserveIds: true
63+
});
64+
}
65+
66+
async function createImportZip(path: string) {
67+
const inputFile = "input.zip";
68+
const archive = archiver("zip", {
69+
zlib: { level: 0 }
70+
});
71+
72+
console.log("Archive path is ", resolve(path))
73+
archive.directory(path, "/");
74+
75+
const outputStream = fsExtra.createWriteStream(inputFile);
76+
archive.pipe(outputStream);
77+
await waitForEnd(archive, outputStream);
78+
79+
try {
80+
return await fsExtra.readFile(inputFile);
81+
} finally {
82+
await fsExtra.rm(inputFile);
83+
}
84+
}
85+
86+
function waitForEnd(archive: Archiver, stream: WriteStream) {
87+
return new Promise<void>(async (res, rej) => {
88+
stream.on("finish", () => res());
89+
await archive.finalize();
90+
});
91+
}
92+
4793
export async function extractZip(zipFilePath: string, outputPath: string, ignoredFiles?: Set<string>) {
4894
const deferred = (await import("@triliumnext/server/src/services/utils.js")).deferred;
4995

0 commit comments

Comments
 (0)