diff --git a/package-lock.json b/package-lock.json index a200cce0e..4ef7cafac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,6 +92,7 @@ "@types/better-sqlite3": "^7.6.9", "@types/escape-html": "^1.0.4", "@types/express": "^4.17.21", + "@types/html": "^1.0.4", "@types/ini": "^4.1.0", "@types/jsdom": "^21.1.6", "@types/mime-types": "^2.1.4", @@ -1484,6 +1485,12 @@ "@types/node": "*" } }, + "node_modules/@types/html": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/html/-/html-1.0.4.tgz", + "integrity": "sha512-Wb1ymSAftCLxhc3D6vS0Ike/0xg7W6c+DQxAkerU6pD7C8CMzTYwvrwnlcrTfsVO/nMelB9KOKIT7+N5lOeQUg==", + "dev": true + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", @@ -16229,6 +16236,12 @@ "@types/node": "*" } }, + "@types/html": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/html/-/html-1.0.4.tgz", + "integrity": "sha512-Wb1ymSAftCLxhc3D6vS0Ike/0xg7W6c+DQxAkerU6pD7C8CMzTYwvrwnlcrTfsVO/nMelB9KOKIT7+N5lOeQUg==", + "dev": true + }, "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", diff --git a/package.json b/package.json index c150cb460..6cb0af649 100644 --- a/package.json +++ b/package.json @@ -115,6 +115,7 @@ "@types/better-sqlite3": "^7.6.9", "@types/escape-html": "^1.0.4", "@types/express": "^4.17.21", + "@types/html": "^1.0.4", "@types/ini": "^4.1.0", "@types/jsdom": "^21.1.6", "@types/mime-types": "^2.1.4", diff --git a/src/routes/api/export.js b/src/routes/api/export.js index a69462e9d..b51b5f689 100644 --- a/src/routes/api/export.js +++ b/src/routes/api/export.js @@ -1,7 +1,7 @@ "use strict"; const zipExportService = require('../../services/export/zip.js'); -const singleExportService = require('../../services/export/single.js'); +const singleExportService = require('../../services/export/single'); const opmlExportService = require('../../services/export/opml'); const becca = require('../../becca/becca'); const TaskContext = require('../../services/task_context'); diff --git a/src/routes/api/import.js b/src/routes/api/import.js index 5d296ac88..8fcb91d46 100644 --- a/src/routes/api/import.js +++ b/src/routes/api/import.js @@ -3,7 +3,7 @@ const enexImportService = require('../../services/import/enex.js'); const opmlImportService = require('../../services/import/opml'); const zipImportService = require('../../services/import/zip.js'); -const singleImportService = require('../../services/import/single.js'); +const singleImportService = require('../../services/import/single'); const cls = require('../../services/cls'); const path = require('path'); const becca = require('../../becca/becca'); diff --git a/src/services/export/single.js b/src/services/export/single.ts similarity index 85% rename from src/services/export/single.js rename to src/services/export/single.ts index 07fc96403..f7a51dacf 100644 --- a/src/services/export/single.js +++ b/src/services/export/single.ts @@ -1,12 +1,15 @@ "use strict"; -const mimeTypes = require('mime-types'); -const html = require('html'); -const utils = require('../utils'); -const mdService = require('./md'); -const becca = require('../../becca/becca'); +import mimeTypes = require('mime-types'); +import html = require('html'); +import utils = require('../utils'); +import mdService = require('./md'); +import becca = require('../../becca/becca'); +import TaskContext = require('../task_context'); +import BBranch = require('../../becca/entities/bbranch'); +import { Response } from 'express'; -function exportSingleNote(taskContext, branch, format, res) { +function exportSingleNote(taskContext: TaskContext, branch: BBranch, format: "html" | "markdown", res: Response) { const note = branch.getNote(); if (note.type === 'image' || note.type === 'file') { @@ -20,6 +23,9 @@ function exportSingleNote(taskContext, branch, format, res) { let payload, extension, mime; let content = note.getContent(); + if (typeof content !== "string") { + throw new Error("Unsupported context type for export."); + } if (note.type === 'text') { if (format === 'html') { @@ -64,7 +70,7 @@ function exportSingleNote(taskContext, branch, format, res) { taskContext.taskSucceeded(); } -function inlineAttachments(content) { +function inlineAttachments(content: string) { content = content.replace(/src="[^"]*api\/images\/([a-zA-Z0-9_]+)\/?[^"]+"/g, (match, noteId) => { const note = becca.getNote(noteId); if (!note || !note.mime.startsWith('image/')) {