diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..d5fb9133e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,17 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "errors", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "revealProblems": "never" + }, + "runOptions": { + "runOn": "folderOpen" + } + } + ] + } \ No newline at end of file diff --git a/electron.ts b/electron.ts index 86c80a9a3..754b73bac 100644 --- a/electron.ts +++ b/electron.ts @@ -1,10 +1,12 @@ "use strict"; -import electron = require("electron"); -import sqlInit = require("./src/services/sql_init"); -import appIconService = require("./src/services/app_icon"); -import windowService = require("./src/services/window"); -import tray = require("./src/services/tray"); +import electron from "electron"; +import electronDebug from "electron-debug"; +import electronDl from "electron-dl"; +import sqlInit from "./src/services/sql_init.js"; +import appIconService from "./src/services/app_icon.js"; +import windowService from "./src/services/window.js"; +import tray from "./src/services/tray.js"; // Prevent Trilium starting twice on first install and on uninstall for the Windows installer. if (require('electron-squirrel-startup')) { @@ -12,11 +14,11 @@ if (require('electron-squirrel-startup')) { } // Adds debug features like hotkeys for triggering dev tools and reload -require("electron-debug")(); +electronDebug(); appIconService.installLocalAppIcon(); -require("electron-dl")({ saveAs: true }); +electronDl({ saveAs: true }); // needed for excalidraw export https://github.com/zadam/trilium/issues/4271 electron.app.commandLine.appendSwitch( @@ -65,4 +67,4 @@ electron.app.on("will-quit", () => { // this is to disable electron warning spam in the dev console (local development only) process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true"; -require("./src/www.js"); +require('./src/www.js'); diff --git a/package-lock.json b/package-lock.json index bf5b43e1f..c1d41949a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -113,6 +113,7 @@ "@types/sax": "^1.2.7", "@types/semver": "^7.5.8", "@types/serve-favicon": "^2.5.7", + "@types/session-file-store": "^1.2.5", "@types/stream-throttle": "^0.1.4", "@types/tmp": "^0.2.6", "@types/turndown": "^5.0.4", @@ -2616,6 +2617,16 @@ "@types/node": "*" } }, + "node_modules/@types/session-file-store": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/session-file-store/-/session-file-store-1.2.5.tgz", + "integrity": "sha512-xjIyh40IznXLrvbAY/nmxu5cMcPcE3ZoDrSDvd02m6p8UjUgOtZAGI7Os5DDd6THuxClLWNhFo/awy1tYp64Bg==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/express-session": "*" + } + }, "node_modules/@types/stream-throttle": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@types/stream-throttle/-/stream-throttle-0.1.4.tgz", diff --git a/package.json b/package.json index 9383b0a64..ea74bfe48 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,8 @@ "make-electron": "npm run webpack && npm run prepare-dist && electron-forge make", "package-electron": "electron-forge package", "prepare-dist": "rimraf ./dist && tsc && ts-node ./bin/copy-dist.ts", - "update-build-info": "ts-node bin/update-build-info.ts" + "update-build-info": "ts-node bin/update-build-info.ts", + "errors": "tsc --watch --noEmit" }, "dependencies": { "@braintree/sanitize-url": "^7.1.0", @@ -145,6 +146,7 @@ "@types/sax": "^1.2.7", "@types/semver": "^7.5.8", "@types/serve-favicon": "^2.5.7", + "@types/session-file-store": "^1.2.5", "@types/stream-throttle": "^0.1.4", "@types/tmp": "^0.2.6", "@types/turndown": "^5.0.4", diff --git a/spec/etapi/app_info.ts b/spec/etapi/app_info.ts index 9ea99b143..6ba049357 100644 --- a/spec/etapi/app_info.ts +++ b/spec/etapi/app_info.ts @@ -1,4 +1,4 @@ -import etapi = require("../support/etapi"); +import etapi from "../support/etapi.js"; etapi.describeEtapi("app_info", () => { it("get", async () => { diff --git a/spec/etapi/backup.ts b/spec/etapi/backup.ts index 3afda9141..2f9532f71 100644 --- a/spec/etapi/backup.ts +++ b/spec/etapi/backup.ts @@ -1,4 +1,4 @@ -import etapi = require("../support/etapi"); +import etapi from "../support/etapi.js"; etapi.describeEtapi("backup", () => { it("create", async () => { diff --git a/spec/etapi/import.ts b/spec/etapi/import.ts index 7471387ab..88c9e0a88 100644 --- a/spec/etapi/import.ts +++ b/spec/etapi/import.ts @@ -1,6 +1,6 @@ -import etapi = require("../support/etapi"); -import fs = require("fs"); -import path = require("path"); +import etapi from "../support/etapi.js"; +import fs from "fs"; +import path from "path"; etapi.describeEtapi("import", () => { // temporarily skip this test since test-export.zip is missing diff --git a/spec/etapi/notes.ts b/spec/etapi/notes.ts index 208a7088d..60a0ebcd7 100644 --- a/spec/etapi/notes.ts +++ b/spec/etapi/notes.ts @@ -1,5 +1,5 @@ -import crypto = require("crypto"); -import etapi = require("../support/etapi"); +import crypto from "crypto"; +import etapi from "../support/etapi"; etapi.describeEtapi("notes", () => { it("create", async () => { diff --git a/spec/search/becca_mocking.ts b/spec/search/becca_mocking.ts index cb4e62b60..c31631ce5 100644 --- a/spec/search/becca_mocking.ts +++ b/spec/search/becca_mocking.ts @@ -1,9 +1,9 @@ -import BNote = require("../../src/becca/entities/bnote"); -import BBranch = require("../../src/becca/entities/bbranch"); -import BAttribute = require("../../src/becca/entities/battribute"); -import becca = require("../../src/becca/becca"); -import randtoken = require("rand-token"); -import SearchResult = require("../../src/services/search/search_result"); +import BNote from "../../src/becca/entities/bnote.js"; +import BBranch from "../../src/becca/entities/bbranch.js"; +import BAttribute from "../../src/becca/entities/battribute.js"; +import becca from "../../src/becca/becca.js"; +import randtoken from "rand-token"; +import SearchResult from "../../src/services/search/search_result.js"; import { NoteType } from "../../src/becca/entities/rows"; randtoken.generator({ source: "crypto" }); @@ -80,7 +80,7 @@ function note(title: string, extraParams = {}) { return new NoteBuilder(note); } -export = { +export default { NoteBuilder, findNoteByTitle, note, diff --git a/spec/search/lexer.spec.ts b/spec/search/lexer.spec.ts index 971f9cb13..d97f435c3 100644 --- a/spec/search/lexer.spec.ts +++ b/spec/search/lexer.spec.ts @@ -1,4 +1,4 @@ -import lex = require("../../src/services/search/services/lex"); +import lex from "../../src/services/search/services/lex.js"; describe("Lexer fulltext", () => { it("simple lexing", () => { diff --git a/spec/search/parens.spec.ts b/spec/search/parens.spec.ts index ae1ac5b2f..bf1482356 100644 --- a/spec/search/parens.spec.ts +++ b/spec/search/parens.spec.ts @@ -1,24 +1,26 @@ -const handleParens = require('../../src/services/search/services/handle_parens'); +import handleParens from "../../src/services/search/services/handle_parens"; +import { TokenStructure } from "../../src/services/search/services/types"; describe("Parens handler", () => { it("handles parens", () => { const input = ["(", "hello", ")", "and", "(", "(", "pick", "one", ")", "and", "another", ")"] .map(token => ({token})); - expect(handleParens(input)) - .toEqual([ + const actual: TokenStructure = [ + [ + {token: "hello"} + ], + {token: "and"}, + [ [ - {token: "hello"} + {token: "pick"}, + {token: "one"} ], {token: "and"}, - [ - [ - {token: "pick"}, - {token: "one"} - ], - {token: "and"}, - {token: "another"} - ] - ]); + {token: "another"} + ] + ]; + + expect(handleParens(input)).toEqual(actual); }); }); diff --git a/spec/search/parser.spec.ts b/spec/search/parser.spec.ts index d8ba2d7a6..003036664 100644 --- a/spec/search/parser.spec.ts +++ b/spec/search/parser.spec.ts @@ -2,9 +2,9 @@ // There are many issues with the types of the parser e.g. "parse" function returns "Expression" // but we access properties like "subExpressions" which is not defined in the "Expression" class. -import Expression = require('../../src/services/search/expressions/expression'); -import SearchContext = require('../../src/services/search/search_context'); -import parse = require('../../src/services/search/services/parse'); +import Expression from "../../src/services/search/expressions/expression.js"; +import SearchContext from "../../src/services/search/search_context.js"; +import parse from "../../src/services/search/services/parse.js"; function tokens(toks: Array, cur = 0): Array { return toks.map((arg) => { diff --git a/spec/search/search.spec.ts b/spec/search/search.spec.ts index 4d8a06aba..a058ae895 100644 --- a/spec/search/search.spec.ts +++ b/spec/search/search.spec.ts @@ -1,11 +1,10 @@ -import searchService = require('../../src/services/search/services/search'); -import BNote = require('../../src/becca/entities/bnote'); -import BBranch = require('../../src/becca/entities/bbranch'); -import SearchContext = require('../../src/services/search/search_context'); -import dateUtils = require('../../src/services/date_utils'); -import becca = require('../../src/becca/becca'); -// const { NoteBuilder, findNoteByTitle, note } = require("./becca_mocking"); -import becca_mocking = require('./becca_mocking'); +import searchService from "../../src/services/search/services/search.js"; +import BNote from "../../src/becca/entities/bnote.js"; +import BBranch from "../../src/becca/entities/bbranch.js"; +import SearchContext from "../../src/services/search/search_context.js"; +import dateUtils from "../../src/services/date_utils.js"; +import becca from "../../src/becca/becca.js"; +import becca_mocking from "./becca_mocking.js"; describe('Search', () => { let rootNote: any; diff --git a/spec/search/value_extractor.spec.ts b/spec/search/value_extractor.spec.ts index 28343bab8..1672ddbb6 100644 --- a/spec/search/value_extractor.spec.ts +++ b/spec/search/value_extractor.spec.ts @@ -1,7 +1,7 @@ -import becca_mocking = require('./becca_mocking'); -import ValueExtractor = require('../../src/services/search/value_extractor'); -import becca = require('../../src/becca/becca'); -import SearchContext = require('../../src/services/search/search_context'); +import becca_mocking from "./becca_mocking.js"; +import ValueExtractor from "../../src/services/search/value_extractor.js"; +import becca from "../../src/becca/becca.js"; +import SearchContext from "../../src/services/search/search_context.js"; const dsc = new SearchContext(); diff --git a/spec/support/etapi.ts b/spec/support/etapi.ts index 734b3adf3..19043d8fa 100644 --- a/spec/support/etapi.ts +++ b/spec/support/etapi.ts @@ -1,5 +1,5 @@ -import child_process = require("child_process"); -import kill = require("tree-kill"); +import child_process from "child_process"; +import kill from "tree-kill"; let etapiAuthToken: string | undefined; @@ -164,7 +164,7 @@ function checkStatus(response: Response): void { } } -export { +export default { describeEtapi, getEtapi, getEtapiResponse, diff --git a/src/anonymize.ts b/src/anonymize.ts index cd449e479..89f9d2d0c 100644 --- a/src/anonymize.ts +++ b/src/anonymize.ts @@ -1,5 +1,5 @@ -import anonymizationService = require('./services/anonymization'); -import sqlInit = require('./services/sql_init'); +import anonymizationService from "./services/anonymization.js"; +import sqlInit from "./services/sql_init.js"; require('./becca/entity_constructor'); sqlInit.dbReady.then(async () => { diff --git a/src/app.ts b/src/app.ts index ceabe33f9..e6da1bcfe 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,11 +1,11 @@ -import express = require('express'); -import path = require('path'); -import favicon = require('serve-favicon'); -import cookieParser = require('cookie-parser'); -import helmet = require('helmet'); -import compression = require('compression'); -import sessionParser = require('./routes/session_parser'); -import utils = require('./services/utils'); +import express from "express"; +import path from "path"; +import favicon from "serve-favicon"; +import cookieParser from "cookie-parser"; +import helmet from "helmet"; +import compression from "compression"; +import sessionParser from "./routes/session_parser.js"; +import utils from "./services/utils.js"; require('./services/handlers'); require('./becca/becca_loader'); @@ -20,7 +20,7 @@ if (!utils.isElectron()) { app.use(compression()); // HTTP compression } -app.use(helmet.default({ +app.use(helmet({ hidePoweredBy: false, // errors out in electron contentSecurityPolicy: false, crossOriginEmbedderPolicy: false @@ -57,4 +57,4 @@ if (utils.isElectron()) { require('@electron/remote/main').initialize(); } -export = app; +export default app; diff --git a/src/becca/becca-interface.ts b/src/becca/becca-interface.ts index 21892676d..562ec85db 100644 --- a/src/becca/becca-interface.ts +++ b/src/becca/becca-interface.ts @@ -1,17 +1,17 @@ -import sql = require('../services/sql'); -import NoteSet = require('../services/search/note_set'); -import NotFoundError = require('../errors/not_found_error'); -import BOption = require('./entities/boption'); -import BNote = require('./entities/bnote'); -import BEtapiToken = require('./entities/betapi_token'); -import BAttribute = require('./entities/battribute'); -import BBranch = require('./entities/bbranch'); -import BRevision = require('./entities/brevision'); -import BAttachment = require('./entities/battachment'); +import sql from "../services/sql.js"; +import NoteSet from "../services/search/note_set.js"; +import NotFoundError from "../errors/not_found_error.js"; +import BOption from "./entities/boption.js"; +import BNote from "./entities/bnote.js"; +import BEtapiToken from "./entities/betapi_token.js"; +import BAttribute from "./entities/battribute.js"; +import BBranch from "./entities/bbranch.js"; +import BRevision from "./entities/brevision.js"; +import BAttachment from "./entities/battachment.js"; import { AttachmentRow, RevisionRow } from './entities/rows'; -import BBlob = require('./entities/bblob'); -import BRecentNote = require('./entities/brecent_note'); -import AbstractBeccaEntity = require('./entities/abstract_becca_entity'); +import BBlob from "./entities/bblob.js"; +import BRecentNote from "./entities/brecent_note.js"; +import AbstractBeccaEntity from "./entities/abstract_becca_entity.js"; interface AttachmentOpts { includeContentLength?: boolean; @@ -155,9 +155,7 @@ export default class Becca { } getRevision(revisionId: string): BRevision | null { - const row = sql.getRow("SELECT * FROM revisions WHERE revisionId = ?", [revisionId]); - - const BRevision = require('./entities/brevision'); // avoiding circular dependency problems + const row = sql.getRow("SELECT * FROM revisions WHERE revisionId = ?", [revisionId]); return row ? new BRevision(row) : null; } @@ -179,9 +177,7 @@ export default class Becca { WHERE attachmentId = ? AND isDeleted = 0` : `SELECT * FROM attachments WHERE attachmentId = ? AND isDeleted = 0`; - const BAttachment = require('./entities/battachment'); // avoiding circular dependency problems - - return sql.getRows(query, [attachmentId]) + return sql.getRows(query, [attachmentId]) .map(row => new BAttachment(row))[0]; } @@ -194,7 +190,6 @@ export default class Becca { } getAttachments(attachmentIds: string[]): BAttachment[] { - const BAttachment = require('./entities/battachment'); // avoiding circular dependency problems return sql.getManyRows("SELECT * FROM attachments WHERE attachmentId IN (???) AND isDeleted = 0", attachmentIds) .map(row => new BAttachment(row)); } @@ -204,9 +199,7 @@ export default class Becca { return null; } - const row = sql.getRow("SELECT *, LENGTH(content) AS contentLength FROM blobs WHERE blobId = ?", [entity.blobId]); - - const BBlob = require('./entities/bblob'); // avoiding circular dependency problems + const row = sql.getRow("SELECT *, LENGTH(content) AS contentLength FROM blobs WHERE blobId = ?", [entity.blobId]); return row ? new BBlob(row) : null; } @@ -248,16 +241,12 @@ export default class Becca { } getRecentNotesFromQuery(query: string, params: string[] = []): BRecentNote[] { - const rows = sql.getRows(query, params); - - const BRecentNote = require('./entities/brecent_note'); // avoiding circular dependency problems + const rows = sql.getRows(query, params); return rows.map(row => new BRecentNote(row)); } getRevisionsFromQuery(query: string, params: string[] = []): BRevision[] { const rows = sql.getRows(query, params); - - const BRevision = require('./entities/brevision'); // avoiding circular dependency problems return rows.map(row => new BRevision(row)); } diff --git a/src/becca/becca.ts b/src/becca/becca.ts index a66dc442d..07f8cc0dc 100644 --- a/src/becca/becca.ts +++ b/src/becca/becca.ts @@ -4,4 +4,4 @@ import Becca from "./becca-interface"; const becca = new Becca(); -export = becca; +export default becca; diff --git a/src/becca/becca_loader.ts b/src/becca/becca_loader.ts index b7ea941c8..1bfab31da 100644 --- a/src/becca/becca_loader.ts +++ b/src/becca/becca_loader.ts @@ -1,26 +1,28 @@ "use strict"; -import sql = require('../services/sql'); -import eventService = require('../services/events'); -import becca = require('./becca'); -import sqlInit = require('../services/sql_init'); -import log = require('../services/log'); -import BNote = require('./entities/bnote'); -import BBranch = require('./entities/bbranch'); -import BAttribute = require('./entities/battribute'); -import BOption = require('./entities/boption'); -import BEtapiToken = require('./entities/betapi_token'); -import cls = require('../services/cls'); -import entityConstructor = require('../becca/entity_constructor'); +import sql from "../services/sql.js"; +import eventService from "../services/events.js"; +import becca from "./becca.js"; +import sqlInit from "../services/sql_init.js"; +import log from "../services/log.js"; +import BNote from "./entities/bnote.js"; +import BBranch from "./entities/bbranch.js"; +import BAttribute from "./entities/battribute.js"; +import BOption from "./entities/boption.js"; +import BEtapiToken from "./entities/betapi_token.js"; +import cls from "../services/cls.js"; +import entityConstructor from "../becca/entity_constructor.js"; import { AttributeRow, BranchRow, EtapiTokenRow, NoteRow, OptionRow } from './entities/rows'; -import AbstractBeccaEntity = require('./entities/abstract_becca_entity'); +import AbstractBeccaEntity from "./entities/abstract_becca_entity.js"; +import options_init from "../services/options_init.js"; +import ws from "../services/ws.js"; const beccaLoaded = new Promise((res, rej) => { sqlInit.dbReady.then(() => { cls.init(() => { load(); - require('../services/options_init').initStartupOptions(); + options_init.initStartupOptions(); res(); }); @@ -73,7 +75,7 @@ function load() { function reload(reason: string) { load(); - require('../services/ws').reloadFrontend(reason || "becca reloaded"); + ws.reloadFrontend(reason || "becca reloaded"); } eventService.subscribeBeccaLoader([eventService.ENTITY_CHANGE_SYNCED], ({ entityName, entityRow }) => { @@ -286,7 +288,7 @@ eventService.subscribeBeccaLoader(eventService.ENTER_PROTECTED_SESSION, () => { eventService.subscribeBeccaLoader(eventService.LEAVE_PROTECTED_SESSION, load); -export = { +export default { load, reload, beccaLoaded diff --git a/src/becca/becca_service.ts b/src/becca/becca_service.ts index 2a9eb2781..46d41fdbf 100644 --- a/src/becca/becca_service.ts +++ b/src/becca/becca_service.ts @@ -1,8 +1,8 @@ "use strict"; -import becca = require('./becca'); -import cls = require('../services/cls'); -import log = require('../services/log'); +import becca from "./becca.js"; +import cls from "../services/cls.js"; +import log from "../services/log.js"; function isNotePathArchived(notePath: string[]) { const noteId = notePath[notePath.length - 1]; @@ -82,7 +82,7 @@ function getNoteTitleForPath(notePathArray: string[]) { return titles.join(' / '); } -export = { +export default { getNoteTitle, getNoteTitleForPath, isNotePathArchived diff --git a/src/becca/entities/abstract_becca_entity.ts b/src/becca/entities/abstract_becca_entity.ts index ad4eeae03..67d7d6031 100644 --- a/src/becca/entities/abstract_becca_entity.ts +++ b/src/becca/entities/abstract_becca_entity.ts @@ -1,14 +1,14 @@ "use strict"; -import utils = require('../../services/utils'); -import sql = require('../../services/sql'); -import entityChangesService = require('../../services/entity_changes'); -import eventService = require('../../services/events'); -import dateUtils = require('../../services/date_utils'); -import cls = require('../../services/cls'); -import log = require('../../services/log'); -import protectedSessionService = require('../../services/protected_session'); -import blobService = require('../../services/blob'); +import utils from "../../services/utils.js"; +import sql from "../../services/sql.js"; +import entityChangesService from "../../services/entity_changes.js"; +import eventService from "../../services/events.js"; +import dateUtils from "../../services/date_utils.js"; +import cls from "../../services/cls.js"; +import log from "../../services/log.js"; +import protectedSessionService from "../../services/protected_session.js"; +import blobService from "../../services/blob.js"; import Becca, { ConstructorData } from '../becca-interface'; let becca: Becca; @@ -327,4 +327,4 @@ abstract class AbstractBeccaEntity> { } } -export = AbstractBeccaEntity; +export default AbstractBeccaEntity; diff --git a/src/becca/entities/battachment.ts b/src/becca/entities/battachment.ts index 09f026ff0..bef20acea 100644 --- a/src/becca/entities/battachment.ts +++ b/src/becca/entities/battachment.ts @@ -1,14 +1,15 @@ "use strict"; -import utils = require('../../services/utils'); -import dateUtils = require('../../services/date_utils'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); -import sql = require('../../services/sql'); -import protectedSessionService = require('../../services/protected_session'); -import log = require('../../services/log'); +import utils from "../../services/utils.js"; +import dateUtils from "../../services/date_utils.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; +import sql from "../../services/sql.js"; +import protectedSessionService from "../../services/protected_session.js"; +import log from "../../services/log.js"; import { AttachmentRow } from './rows'; -import BNote = require('./bnote'); -import BBranch = require('./bbranch'); +import BNote from "./bnote.js"; +import BBranch from "./bbranch.js"; +import noteService from "../../services/notes.js"; const attachmentRoleToNoteTypeMapping = { 'image': 'image', @@ -157,8 +158,6 @@ class BAttachment extends AbstractBeccaEntity { throw new Error(`Cannot convert protected attachment outside of protected session`); } - const noteService = require('../../services/notes'); - const { note, branch } = noteService.createNewNote({ parentNoteId: this.ownerId, title: this.title, @@ -249,4 +248,4 @@ class BAttachment extends AbstractBeccaEntity { } } -export = BAttachment; +export default BAttachment; diff --git a/src/becca/entities/battribute.ts b/src/becca/entities/battribute.ts index 6ad1965ed..c0ba201bc 100644 --- a/src/becca/entities/battribute.ts +++ b/src/becca/entities/battribute.ts @@ -1,10 +1,10 @@ "use strict"; -import BNote = require('./bnote'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); -import dateUtils = require('../../services/date_utils'); -import promotedAttributeDefinitionParser = require('../../services/promoted_attribute_definition_parser'); -import sanitizeAttributeName = require('../../services/sanitize_attribute_name'); +import BNote from "./bnote.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; +import dateUtils from "../../services/date_utils.js"; +import promotedAttributeDefinitionParser from "../../services/promoted_attribute_definition_parser.js"; +import sanitizeAttributeName from "../../services/sanitize_attribute_name.js"; import { AttributeRow, AttributeType } from './rows'; interface SavingOpts { @@ -226,4 +226,4 @@ class BAttribute extends AbstractBeccaEntity { } } -export = BAttribute; +export default BAttribute; diff --git a/src/becca/entities/bblob.ts b/src/becca/entities/bblob.ts index 40d1c5885..c02d1f1b7 100644 --- a/src/becca/entities/bblob.ts +++ b/src/becca/entities/bblob.ts @@ -1,4 +1,4 @@ -import AbstractBeccaEntity = require("./abstract_becca_entity"); +import AbstractBeccaEntity from "./abstract_becca_entity.js"; import { BlobRow } from "./rows"; // TODO: Why this does not extend the abstract becca? @@ -37,4 +37,4 @@ class BBlob extends AbstractBeccaEntity { } } -export = BBlob; +export default BBlob; diff --git a/src/becca/entities/bbranch.ts b/src/becca/entities/bbranch.ts index 0f904de92..b0222f115 100644 --- a/src/becca/entities/bbranch.ts +++ b/src/becca/entities/bbranch.ts @@ -1,13 +1,14 @@ "use strict"; -import BNote = require('./bnote'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); -import dateUtils = require('../../services/date_utils'); -import utils = require('../../services/utils'); -import TaskContext = require('../../services/task_context'); -import cls = require('../../services/cls'); -import log = require('../../services/log'); +import BNote from "./bnote.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; +import dateUtils from "../../services/date_utils.js"; +import utils from "../../services/utils.js"; +import TaskContext from "../../services/task_context.js"; +import cls from "../../services/cls.js"; +import log from "../../services/log.js"; import { BranchRow } from './rows'; +import handlers from "../../services/handlers.js"; /** * Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple @@ -157,7 +158,6 @@ class BBranch extends AbstractBeccaEntity { if (parentBranches.length === 1 && parentBranches[0] === this) { // needs to be run before branches and attributes are deleted and thus attached relations disappear - const handlers = require('../../services/handlers'); handlers.runAttachedRelations(note, 'runOnNoteDeletion', note); } } @@ -285,4 +285,4 @@ class BBranch extends AbstractBeccaEntity { } } -export = BBranch; +export default BBranch; diff --git a/src/becca/entities/betapi_token.ts b/src/becca/entities/betapi_token.ts index 390b580bd..dd3f9f0c9 100644 --- a/src/becca/entities/betapi_token.ts +++ b/src/becca/entities/betapi_token.ts @@ -2,8 +2,8 @@ import { EtapiTokenRow } from "./rows"; -import dateUtils = require('../../services/date_utils'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); +import dateUtils from "../../services/date_utils.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; /** * EtapiToken is an entity representing token used to authenticate against Trilium REST API from client applications. @@ -80,4 +80,4 @@ class BEtapiToken extends AbstractBeccaEntity { } } -export = BEtapiToken; +export default BEtapiToken; diff --git a/src/becca/entities/bnote.ts b/src/becca/entities/bnote.ts index a1d4cf395..b6e05fb10 100644 --- a/src/becca/entities/bnote.ts +++ b/src/becca/entities/bnote.ts @@ -1,21 +1,25 @@ "use strict"; -import protectedSessionService = require('../../services/protected_session'); -import log = require('../../services/log'); -import sql = require('../../services/sql'); -import utils = require('../../services/utils'); -import dateUtils = require('../../services/date_utils'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); -import BRevision = require('./brevision'); -import BAttachment = require('./battachment'); -import TaskContext = require('../../services/task_context'); -import dayjs = require("dayjs"); -import utc = require('dayjs/plugin/utc'); -import eventService = require('../../services/events'); -import { AttachmentRow, NoteRow, NoteType, RevisionRow } from './rows'; -import BBranch = require('./bbranch'); -import BAttribute = require('./battribute'); +import protectedSessionService from "../../services/protected_session.js"; +import log from "../../services/log.js"; +import sql from "../../services/sql.js"; +import utils from "../../services/utils.js"; +import dateUtils from "../../services/date_utils.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; +import BRevision from "./brevision.js"; +import BAttachment from "./battachment.js"; +import TaskContext from "../../services/task_context.js"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import eventService from "../../services/events.js"; +import { AttachmentRow, AttributeType, NoteRow, NoteType, RevisionRow } from './rows'; +import BBranch from "./bbranch.js"; +import BAttribute from "./battribute.js"; import { NotePojo } from '../becca-interface'; +import searchService from "../../services/search/services/search.js"; +import cloningService, { CloneResponse } from "../../services/cloning.js"; +import noteService from "../../services/notes.js"; +import handlers from "../../services/handlers.js"; dayjs.extend(utc); const LABEL = 'label'; @@ -890,11 +894,9 @@ class BNote extends AbstractBeccaEntity { } try { - const searchService = require('../../services/search/services/search'); - const {searchResultNoteIds} = searchService.searchFromNote(this); - + const result = searchService.searchFromNote(this); const becca = this.becca; - return (searchResultNoteIds as string[]) // TODO: remove cast once search is converted + return (result.searchResultNoteIds) .map(resultNoteId => becca.notes[resultNoteId]) .filter(note => !!note); } @@ -1261,7 +1263,7 @@ class BNote extends AbstractBeccaEntity { * @param name - attribute name * @param value - attribute value (optional) */ - setAttribute(type: string, name: string, value?: string) { + setAttribute(type: AttributeType, name: string, value?: string) { const attributes = this.getOwnedAttributes(); const attr = attributes.find(attr => attr.type === type && attr.name === name); @@ -1274,8 +1276,6 @@ class BNote extends AbstractBeccaEntity { } } else { - const BAttribute = require('./battribute'); - new BAttribute({ noteId: this.noteId, type: type, @@ -1310,9 +1310,7 @@ class BNote extends AbstractBeccaEntity { * @param name - name of the attribute, not including the leading ~/# * @param value - value of the attribute - text for labels, target note ID for relations; optional. */ - addAttribute(type: string, name: string, value: string = "", isInheritable: boolean = false, position: number | null = null): BAttribute { - const BAttribute = require('./battribute'); - + addAttribute(type: AttributeType, name: string, value: string = "", isInheritable: boolean = false, position: number | null = null): BAttribute { return new BAttribute({ noteId: this.noteId, type: type, @@ -1351,7 +1349,7 @@ class BNote extends AbstractBeccaEntity { * @param name - attribute name * @param value - attribute value (optional) */ - toggleAttribute(type: string, enabled: boolean, name: string, value?: string) { + toggleAttribute(type: AttributeType, enabled: boolean, name: string, value?: string) { if (enabled) { this.setAttribute(type, name, value); } @@ -1423,8 +1421,6 @@ class BNote extends AbstractBeccaEntity { } searchNotesInSubtree(searchString: string) { - const searchService = require('../../services/search/services/search'); - return searchService.searchNotes(searchString) as BNote[]; } @@ -1432,12 +1428,16 @@ class BNote extends AbstractBeccaEntity { return this.searchNotesInSubtree(searchString)[0]; } - cloneTo(parentNoteId: string) { - const cloningService = require('../../services/cloning'); - + cloneTo(parentNoteId: string): CloneResponse { const branch = this.becca.getNote(parentNoteId)?.getParentBranches()[0]; + if (!branch?.branchId) { + return { + success: false, + message: "Unable to find the branch ID to clone." + }; + } - return cloningService.cloneNoteToBranch(this.noteId, branch?.branchId); + return cloningService.cloneNoteToBranch(this.noteId, branch.branchId); } isEligibleForConversionToAttachment(opts: ConvertOpts = { autoConversion: false }) { @@ -1508,7 +1508,6 @@ class BNote extends AbstractBeccaEntity { parentNote.setContent(fixedContent); - const noteService = require('../../services/notes'); noteService.asyncPostProcessContent(parentNote, fixedContent); // to mark an unused attachment for deletion this.deleteNote(); @@ -1535,7 +1534,6 @@ class BNote extends AbstractBeccaEntity { } // needs to be run before branches and attributes are deleted and thus attached relations disappear - const handlers = require('../../services/handlers'); handlers.runAttachedRelations(this, 'runOnNoteDeletion', this); taskContext.noteDeletionHandlerTriggered = true; @@ -1696,4 +1694,4 @@ class BNote extends AbstractBeccaEntity { } } -export = BNote; +export default BNote; diff --git a/src/becca/entities/boption.ts b/src/becca/entities/boption.ts index 48abee024..12c7ceff8 100644 --- a/src/becca/entities/boption.ts +++ b/src/becca/entities/boption.ts @@ -1,7 +1,7 @@ "use strict"; -import dateUtils = require('../../services/date_utils'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); +import dateUtils from "../../services/date_utils.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; import { OptionRow } from './rows'; /** @@ -48,4 +48,4 @@ class BOption extends AbstractBeccaEntity { } } -export = BOption; +export default BOption; diff --git a/src/becca/entities/brecent_note.ts b/src/becca/entities/brecent_note.ts index c19a83603..9ed77bc44 100644 --- a/src/becca/entities/brecent_note.ts +++ b/src/becca/entities/brecent_note.ts @@ -2,8 +2,8 @@ import { RecentNoteRow } from "./rows"; -import dateUtils = require('../../services/date_utils'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); +import dateUtils from "../../services/date_utils.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; /** * RecentNote represents recently visited note. @@ -38,4 +38,4 @@ class BRecentNote extends AbstractBeccaEntity { } } -export = BRecentNote; +export default BRecentNote; diff --git a/src/becca/entities/brevision.ts b/src/becca/entities/brevision.ts index 18a7a8df5..43c7e1a3e 100644 --- a/src/becca/entities/brevision.ts +++ b/src/becca/entities/brevision.ts @@ -1,13 +1,14 @@ "use strict"; -import protectedSessionService = require('../../services/protected_session'); -import utils = require('../../services/utils'); -import dateUtils = require('../../services/date_utils'); -import becca = require('../becca'); -import AbstractBeccaEntity = require('./abstract_becca_entity'); -import sql = require('../../services/sql'); -import BAttachment = require('./battachment'); +import protectedSessionService from "../../services/protected_session.js"; +import utils from "../../services/utils.js"; +import dateUtils from "../../services/date_utils.js"; +import becca from "../becca.js"; +import AbstractBeccaEntity from "./abstract_becca_entity.js"; +import sql from "../../services/sql.js"; +import BAttachment from "./battachment.js"; import { AttachmentRow, RevisionRow } from './rows'; +import eraseService from "../../services/erase.js"; interface ContentOpts { /** will also save this BRevision entity */ @@ -164,7 +165,9 @@ class BRevision extends AbstractBeccaEntity { * Revisions are not soft-deletable, they are immediately hard-deleted (erased). */ eraseRevision() { - require("../../services/erase.js").eraseRevisions([this.revisionId]); + if (this.revisionId) { + eraseService.eraseRevisions([this.revisionId]); + } } beforeSaving() { @@ -211,4 +214,4 @@ class BRevision extends AbstractBeccaEntity { } } -export = BRevision; +export default BRevision; diff --git a/src/becca/entities/rows.ts b/src/becca/entities/rows.ts index 119d392ec..6c46bf301 100644 --- a/src/becca/entities/rows.ts +++ b/src/becca/entities/rows.ts @@ -42,7 +42,7 @@ export interface OptionRow { name: string; value: string; isSynced: boolean; - utcDateModified: string; + utcDateModified?: string; } export interface EtapiTokenRow { @@ -69,7 +69,7 @@ export interface AttributeRow { noteId?: string; type: AttributeType; name: string; - position?: number; + position?: number | null; value?: string; isInheritable?: boolean; utcDateModified?: string; diff --git a/src/becca/entity_constructor.ts b/src/becca/entity_constructor.ts index 01c51363a..eb1b052a6 100644 --- a/src/becca/entity_constructor.ts +++ b/src/becca/entity_constructor.ts @@ -1,14 +1,14 @@ import { ConstructorData } from './becca-interface'; -import AbstractBeccaEntity = require('./entities/abstract_becca_entity'); -import BAttachment = require('./entities/battachment'); -import BAttribute = require('./entities/battribute'); -import BBlob = require('./entities/bblob'); -import BBranch = require('./entities/bbranch'); -import BEtapiToken = require('./entities/betapi_token'); -import BNote = require('./entities/bnote'); -import BOption = require('./entities/boption'); -import BRecentNote = require('./entities/brecent_note'); -import BRevision = require('./entities/brevision'); +import AbstractBeccaEntity from "./entities/abstract_becca_entity.js"; +import BAttachment from "./entities/battachment.js"; +import BAttribute from "./entities/battribute.js"; +import BBlob from "./entities/bblob.js"; +import BBranch from "./entities/bbranch.js"; +import BEtapiToken from "./entities/betapi_token.js"; +import BNote from "./entities/bnote.js"; +import BOption from "./entities/boption.js"; +import BRecentNote from "./entities/brecent_note.js"; +import BRevision from "./entities/brevision.js"; type EntityClass = new (row?: any) => AbstractBeccaEntity; @@ -32,6 +32,6 @@ function getEntityFromEntityName(entityName: keyof typeof ENTITY_NAME_TO_ENTITY) return ENTITY_NAME_TO_ENTITY[entityName]; } -export = { +export default { getEntityFromEntityName }; diff --git a/src/becca/similarity.ts b/src/becca/similarity.ts index e6721d0df..05b91f8ed 100644 --- a/src/becca/similarity.ts +++ b/src/becca/similarity.ts @@ -1,9 +1,9 @@ -import becca = require('./becca'); -import log = require('../services/log'); -import beccaService = require('./becca_service'); -import dateUtils = require('../services/date_utils'); +import becca from "./becca.js"; +import log from "../services/log.js"; +import beccaService from "./becca_service.js"; +import dateUtils from "../services/date_utils.js"; import { JSDOM } from "jsdom"; -import BNote = require('./entities/bnote'); +import BNote from "./entities/bnote.js"; const DEBUG = false; @@ -461,6 +461,6 @@ function setImmediatePromise() { }); } -export = { +export default { findSimilarNotes }; diff --git a/src/errors/not_found_error.ts b/src/errors/not_found_error.ts index f765e11f9..f6ffb0d7e 100644 --- a/src/errors/not_found_error.ts +++ b/src/errors/not_found_error.ts @@ -6,4 +6,4 @@ class NotFoundError { } } -export = NotFoundError; \ No newline at end of file +export default NotFoundError; \ No newline at end of file diff --git a/src/errors/validation_error.ts b/src/errors/validation_error.ts index 8b872bcbe..565082466 100644 --- a/src/errors/validation_error.ts +++ b/src/errors/validation_error.ts @@ -6,4 +6,4 @@ class ValidationError { } } -export = ValidationError; \ No newline at end of file +export default ValidationError; \ No newline at end of file diff --git a/src/etapi/app_info.ts b/src/etapi/app_info.ts index 81830fec2..53cb50ee4 100644 --- a/src/etapi/app_info.ts +++ b/src/etapi/app_info.ts @@ -1,6 +1,6 @@ import { Router } from 'express'; -import appInfo = require('../services/app_info'); -import eu = require('./etapi_utils'); +import appInfo from "../services/app_info.js"; +import eu from "./etapi_utils.js"; function register(router: Router) { eu.route(router, 'get', '/etapi/app-info', (req, res, next) => { @@ -8,6 +8,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/attachments.ts b/src/etapi/attachments.ts index 802e9975f..280672b01 100644 --- a/src/etapi/attachments.ts +++ b/src/etapi/attachments.ts @@ -1,8 +1,8 @@ -import becca = require('../becca/becca'); -import eu = require('./etapi_utils'); -import mappers = require('./mappers'); -import v = require('./validators'); -import utils = require('../services/utils'); +import becca from "../becca/becca.js"; +import eu from "./etapi_utils.js"; +import mappers from "./mappers.js"; +import v from "./validators.js"; +import utils from "../services/utils.js"; import { Router } from 'express'; import { AttachmentRow } from '../becca/entities/rows'; import { ValidatorMap } from './etapi-interface'; @@ -104,6 +104,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/attributes.ts b/src/etapi/attributes.ts index 59865da62..9ca4918dd 100644 --- a/src/etapi/attributes.ts +++ b/src/etapi/attributes.ts @@ -1,8 +1,8 @@ -import becca = require('../becca/becca'); -import eu = require('./etapi_utils'); -import mappers = require('./mappers'); -import attributeService = require('../services/attributes'); -import v = require('./validators'); +import becca from "../becca/becca.js"; +import eu from "./etapi_utils.js"; +import mappers from "./mappers.js"; +import attributeService from "../services/attributes.js"; +import v from "./validators.js"; import { Router } from 'express'; import { AttributeRow } from '../becca/entities/rows'; import { ValidatorMap } from './etapi-interface'; @@ -81,6 +81,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/auth.ts b/src/etapi/auth.ts index e6c440e52..4ca2fb45b 100644 --- a/src/etapi/auth.ts +++ b/src/etapi/auth.ts @@ -1,7 +1,7 @@ -import becca = require('../becca/becca'); -import eu = require('./etapi_utils'); -import passwordEncryptionService = require('../services/encryption/password_encryption'); -import etapiTokenService = require('../services/etapi_tokens'); +import becca from "../becca/becca.js"; +import eu from "./etapi_utils.js"; +import passwordEncryptionService from "../services/encryption/password_encryption.js"; +import etapiTokenService from "../services/etapi_tokens.js"; import { RequestHandler, Router } from 'express'; function register(router: Router, loginMiddleware: RequestHandler[]) { @@ -39,6 +39,6 @@ function register(router: Router, loginMiddleware: RequestHandler[]) { }); } -export = { +export default { register } diff --git a/src/etapi/backup.ts b/src/etapi/backup.ts index 50c2bd49c..f1b80630d 100644 --- a/src/etapi/backup.ts +++ b/src/etapi/backup.ts @@ -1,7 +1,7 @@ import { Router } from "express"; -import eu = require('./etapi_utils'); -import backupService = require('../services/backup'); +import eu from "./etapi_utils.js"; +import backupService from "../services/backup.js"; function register(router: Router) { eu.route(router, 'put', '/etapi/backup/:backupName', async (req, res, next) => { @@ -11,6 +11,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/branches.ts b/src/etapi/branches.ts index d41a5857b..66dea473f 100644 --- a/src/etapi/branches.ts +++ b/src/etapi/branches.ts @@ -1,11 +1,11 @@ import { Router } from "express"; -import becca = require('../becca/becca'); -import eu = require('./etapi_utils'); -import mappers = require('./mappers'); -import BBranch = require('../becca/entities/bbranch'); -import entityChangesService = require('../services/entity_changes'); -import v = require('./validators'); +import becca from "../becca/becca.js"; +import eu from "./etapi_utils.js"; +import mappers from "./mappers.js"; +import BBranch from "../becca/entities/bbranch.js"; +import entityChangesService from "../services/entity_changes.js"; +import v from "./validators.js"; import { BranchRow } from "../becca/entities/rows"; function register(router: Router) { @@ -84,6 +84,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/etapi_utils.ts b/src/etapi/etapi_utils.ts index 9799deef0..f869fd7db 100644 --- a/src/etapi/etapi_utils.ts +++ b/src/etapi/etapi_utils.ts @@ -1,9 +1,9 @@ -import cls = require('../services/cls'); -import sql = require('../services/sql'); -import log = require('../services/log'); -import becca = require('../becca/becca'); -import etapiTokenService = require('../services/etapi_tokens'); -import config = require('../services/config'); +import cls from "../services/cls.js"; +import sql from "../services/sql.js"; +import log from "../services/log.js"; +import becca from "../becca/becca.js"; +import etapiTokenService from "../services/etapi_tokens.js"; +import config from "../services/config.js"; import { NextFunction, Request, RequestHandler, Response, Router } from 'express'; import { AppRequest, AppRequestHandler } from '../routes/route-interface'; import { ValidatorMap } from './etapi-interface'; @@ -146,7 +146,7 @@ function validateAndPatch(target: any, source: any, allowedProperties: Validator } } -export = { +export default { EtapiError, sendError, route, diff --git a/src/etapi/mappers.ts b/src/etapi/mappers.ts index 537b51738..1caf21cf4 100644 --- a/src/etapi/mappers.ts +++ b/src/etapi/mappers.ts @@ -1,7 +1,7 @@ -import BAttachment = require("../becca/entities/battachment"); -import BAttribute = require("../becca/entities/battribute"); -import BBranch = require("../becca/entities/bbranch"); -import BNote = require("../becca/entities/bnote"); +import BAttachment from "../becca/entities/battachment.js"; +import BAttribute from "../becca/entities/battribute.js"; +import BBranch from "../becca/entities/bbranch.js"; +import BNote from "../becca/entities/bnote.js"; function mapNoteToPojo(note: BNote) { return { @@ -64,7 +64,7 @@ function mapAttachmentToPojo(attachment: BAttachment) { }; } -export = { +export default { mapNoteToPojo, mapBranchToPojo, mapAttributeToPojo, diff --git a/src/etapi/notes.ts b/src/etapi/notes.ts index 62263983f..8bb644ab1 100644 --- a/src/etapi/notes.ts +++ b/src/etapi/notes.ts @@ -1,19 +1,19 @@ -import becca = require('../becca/becca'); -import utils = require('../services/utils'); -import eu = require('./etapi_utils'); -import mappers = require('./mappers'); -import noteService = require('../services/notes'); -import TaskContext = require('../services/task_context'); -import v = require('./validators'); -import searchService = require('../services/search/services/search'); -import SearchContext = require('../services/search/search_context'); -import zipExportService = require('../services/export/zip'); -import zipImportService = require('../services/import/zip'); +import becca from "../becca/becca.js"; +import utils from "../services/utils.js"; +import eu from "./etapi_utils.js"; +import mappers from "./mappers.js"; +import noteService from "../services/notes.js"; +import TaskContext from "../services/task_context.js"; +import v from "./validators.js"; +import searchService from "../services/search/services/search.js"; +import SearchContext from "../services/search/search_context.js"; +import zipExportService from "../services/export/zip.js"; +import zipImportService from "../services/import/zip.js"; import { Router } from 'express'; import { AppRequest } from '../routes/route-interface'; import { ParsedQs } from 'qs'; import { NoteParams } from '../services/note-interface'; -import BNote = require('../becca/entities/bnote'); +import BNote from "../becca/entities/bnote.js"; import { SearchParams } from '../services/search/services/types'; import { ValidatorMap } from './etapi-interface'; @@ -267,6 +267,6 @@ function parseInteger(obj: any, name: string) { return integer; } -export = { +export default { register }; diff --git a/src/etapi/spec.ts b/src/etapi/spec.ts index 530249d46..a5cad4c2a 100644 --- a/src/etapi/spec.ts +++ b/src/etapi/spec.ts @@ -1,7 +1,7 @@ import { Router } from "express"; -import fs = require('fs'); -import path = require('path'); +import fs from "fs"; +import path from "path"; const specPath = path.join(__dirname, 'etapi.openapi.yaml'); let spec: string | null = null; @@ -17,6 +17,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/special_notes.ts b/src/etapi/special_notes.ts index 4de5d77df..1df65c638 100644 --- a/src/etapi/special_notes.ts +++ b/src/etapi/special_notes.ts @@ -1,7 +1,7 @@ -import specialNotesService = require('../services/special_notes'); -import dateNotesService = require('../services/date_notes'); -import eu = require('./etapi_utils'); -import mappers = require('./mappers'); +import specialNotesService from "../services/special_notes.js"; +import dateNotesService from "../services/date_notes.js"; +import eu from "./etapi_utils.js"; +import mappers from "./mappers.js"; import { Router } from 'express'; const getDateInvalidError = (date: string) => new eu.EtapiError(400, "DATE_INVALID", `Date "${date}" is not valid.`); @@ -73,6 +73,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/etapi/validators.ts b/src/etapi/validators.ts index ce6935c7c..81ab051d0 100644 --- a/src/etapi/validators.ts +++ b/src/etapi/validators.ts @@ -1,5 +1,5 @@ -import noteTypeService = require('../services/note_types'); -import dateUtils = require('../services/date_utils'); +import noteTypeService from "../services/note_types.js"; +import dateUtils from "../services/date_utils.js"; function mandatory(obj: unknown) { if (obj === undefined) { @@ -107,7 +107,7 @@ function isValidEntityId(obj: unknown) { } } -export = { +export default { mandatory, notNull, isString, diff --git a/src/routes/api/app_info.ts b/src/routes/api/app_info.ts index 66a9bc366..87501e804 100644 --- a/src/routes/api/app_info.ts +++ b/src/routes/api/app_info.ts @@ -1,11 +1,11 @@ "use strict"; -import appInfo = require('../../services/app_info'); +import appInfo from "../../services/app_info.js"; function getAppInfo() { return appInfo; } -export = { +export default { getAppInfo }; diff --git a/src/routes/api/attachments.ts b/src/routes/api/attachments.ts index 9fde39fc5..d56bd1bbb 100644 --- a/src/routes/api/attachments.ts +++ b/src/routes/api/attachments.ts @@ -1,7 +1,7 @@ -import becca = require('../../becca/becca'); -import blobService = require('../../services/blob'); -import ValidationError = require('../../errors/validation_error'); -import imageService = require("../../services/image"); +import becca from "../../becca/becca.js"; +import blobService from "../../services/blob.js"; +import ValidationError from "../../errors/validation_error.js"; +import imageService from "../../services/image.js"; import { Request } from 'express'; function getAttachmentBlob(req: Request) { @@ -97,7 +97,7 @@ function convertAttachmentToNote(req: Request) { return attachment.convertToNote(); } -export = { +export default { getAttachmentBlob, getAttachments, getAttachment, diff --git a/src/routes/api/attributes.ts b/src/routes/api/attributes.ts index e66906f37..b31afecf4 100644 --- a/src/routes/api/attributes.ts +++ b/src/routes/api/attributes.ts @@ -1,11 +1,11 @@ "use strict"; -import sql = require('../../services/sql'); -import log = require('../../services/log'); -import attributeService = require('../../services/attributes'); -import BAttribute = require('../../becca/entities/battribute'); -import becca = require('../../becca/becca'); -import ValidationError = require('../../errors/validation_error'); +import sql from "../../services/sql.js"; +import log from "../../services/log.js"; +import attributeService from "../../services/attributes.js"; +import BAttribute from "../../becca/entities/battribute.js"; +import becca from "../../becca/becca.js"; +import ValidationError from "../../errors/validation_error.js"; import { Request } from 'express'; function getEffectiveNoteAttributes(req: Request) { @@ -238,7 +238,7 @@ function deleteRelation(req: Request) { } } -export = { +export default { updateNoteAttributes, updateNoteAttribute, setNoteAttribute, diff --git a/src/routes/api/autocomplete.ts b/src/routes/api/autocomplete.ts index 0aaa3f537..f238e7f1e 100644 --- a/src/routes/api/autocomplete.ts +++ b/src/routes/api/autocomplete.ts @@ -1,13 +1,13 @@ "use strict"; -import beccaService = require('../../becca/becca_service'); -import searchService = require('../../services/search/services/search'); -import log = require('../../services/log'); -import utils = require('../../services/utils'); -import cls = require('../../services/cls'); -import becca = require('../../becca/becca'); +import beccaService from "../../becca/becca_service.js"; +import searchService from "../../services/search/services/search.js"; +import log from "../../services/log.js"; +import utils from "../../services/utils.js"; +import cls from "../../services/cls.js"; +import becca from "../../becca/becca.js"; import { Request } from 'express'; -import ValidationError = require('../../errors/validation_error'); +import ValidationError from "../../errors/validation_error.js"; function getAutocomplete(req: Request) { if (typeof req.query.query !== "string") { @@ -75,6 +75,6 @@ function getRecentNotes(activeNoteId: string) { }); } -export = { +export default { getAutocomplete }; diff --git a/src/routes/api/backend_log.ts b/src/routes/api/backend_log.ts index a4dbac9ab..6e3af2a8e 100644 --- a/src/routes/api/backend_log.ts +++ b/src/routes/api/backend_log.ts @@ -1,8 +1,8 @@ "use strict"; -import fs = require('fs'); -import dateUtils = require('../../services/date_utils'); -import dataDir = require('../../services/data_dir'); +import fs from "fs"; +import dateUtils from "../../services/date_utils.js"; +import dataDir from "../../services/data_dir.js"; const { LOG_DIR } = dataDir; function getBackendLog() { @@ -17,6 +17,6 @@ function getBackendLog() { } } -export = { +export default { getBackendLog }; diff --git a/src/routes/api/branches.ts b/src/routes/api/branches.ts index 8c7562128..11141fbe8 100644 --- a/src/routes/api/branches.ts +++ b/src/routes/api/branches.ts @@ -1,16 +1,16 @@ "use strict"; -import sql = require('../../services/sql'); -import utils = require('../../services/utils'); -import entityChangesService = require('../../services/entity_changes'); -import treeService = require('../../services/tree'); -import eraseService = require('../../services/erase'); -import becca = require('../../becca/becca'); -import TaskContext = require('../../services/task_context'); -import branchService = require('../../services/branches'); -import log = require('../../services/log'); -import ValidationError = require('../../errors/validation_error'); -import eventService = require("../../services/events"); +import sql from "../../services/sql.js"; +import utils from "../../services/utils.js"; +import entityChangesService from "../../services/entity_changes.js"; +import treeService from "../../services/tree.js"; +import eraseService from "../../services/erase.js"; +import becca from "../../becca/becca.js"; +import TaskContext from "../../services/task_context.js"; +import branchService from "../../services/branches.js"; +import log from "../../services/log.js"; +import ValidationError from "../../errors/validation_error.js"; +import eventService from "../../services/events.js"; import { Request } from 'express'; /** @@ -224,7 +224,7 @@ function setPrefix(req: Request) { branch.save(); } -export = { +export default { moveBranchToParent, moveBranchBeforeNote, moveBranchAfterNote, diff --git a/src/routes/api/bulk_action.ts b/src/routes/api/bulk_action.ts index 4d1a3e98f..799d05952 100644 --- a/src/routes/api/bulk_action.ts +++ b/src/routes/api/bulk_action.ts @@ -1,6 +1,6 @@ import { Request } from 'express'; -import becca = require('../../becca/becca'); -import bulkActionService = require('../../services/bulk_actions'); +import becca from "../../becca/becca.js"; +import bulkActionService from "../../services/bulk_actions.js"; function execute(req: Request) { const {noteIds, includeDescendants} = req.body; @@ -43,7 +43,7 @@ function getAffectedNoteIds(noteIds: string[], includeDescendants: boolean) { return affectedNoteIds; } -export = { +export default { execute, getAffectedNoteCount }; diff --git a/src/routes/api/clipper.ts b/src/routes/api/clipper.ts index e7f523cec..ae181742c 100644 --- a/src/routes/api/clipper.ts +++ b/src/routes/api/clipper.ts @@ -2,22 +2,22 @@ import { Request } from "express"; -import attributeService = require('../../services/attributes'); -import cloneService = require('../../services/cloning'); -import noteService = require('../../services/notes'); -import dateNoteService = require('../../services/date_notes'); -import dateUtils = require('../../services/date_utils'); -import imageService = require('../../services/image'); -import appInfo = require('../../services/app_info'); -import ws = require('../../services/ws'); -import log = require('../../services/log'); -import utils = require('../../services/utils'); -import path = require('path'); -import htmlSanitizer = require('../../services/html_sanitizer'); -import attributeFormatter = require('../../services/attribute_formatter'); -import jsdom = require("jsdom"); -import BNote = require("../../becca/entities/bnote"); -import ValidationError = require("../../errors/validation_error"); +import attributeService from "../../services/attributes.js"; +import cloneService from "../../services/cloning.js"; +import noteService from "../../services/notes.js"; +import dateNoteService from "../../services/date_notes.js"; +import dateUtils from "../../services/date_utils.js"; +import imageService from "../../services/image.js"; +import appInfo from "../../services/app_info.js"; +import ws from "../../services/ws.js"; +import log from "../../services/log.js"; +import utils from "../../services/utils.js"; +import path from "path"; +import htmlSanitizer from "../../services/html_sanitizer.js"; +import attributeFormatter from "../../services/attribute_formatter.js"; +import jsdom from "jsdom"; +import BNote from "../../becca/entities/bnote.js"; +import ValidationError from "../../errors/validation_error.js"; const { JSDOM } = jsdom; interface Image { @@ -229,7 +229,7 @@ function findNotesByUrl(req: Request){ } } -export = { +export default { createNote, addClipping, openNote, diff --git a/src/routes/api/cloning.ts b/src/routes/api/cloning.ts index 8ab02900d..73de813cb 100644 --- a/src/routes/api/cloning.ts +++ b/src/routes/api/cloning.ts @@ -1,7 +1,7 @@ "use strict"; import { Request } from 'express'; -import cloningService = require('../../services/cloning'); +import cloningService from "../../services/cloning.js"; function cloneNoteToBranch(req: Request) { const {noteId, parentBranchId} = req.params; @@ -29,7 +29,7 @@ function toggleNoteInParent(req: Request) { return cloningService.toggleNoteInParent(present === 'true', noteId, parentNoteId); } -export = { +export default { cloneNoteToBranch, cloneNoteToParentNote, cloneNoteAfter, diff --git a/src/routes/api/database.ts b/src/routes/api/database.ts index 199862b41..8be084d12 100644 --- a/src/routes/api/database.ts +++ b/src/routes/api/database.ts @@ -1,12 +1,12 @@ "use strict"; -import sql = require('../../services/sql'); -import log = require('../../services/log'); -import backupService = require('../../services/backup'); -import anonymizationService = require('../../services/anonymization'); -import consistencyChecksService = require('../../services/consistency_checks'); +import sql from "../../services/sql.js"; +import log from "../../services/log.js"; +import backupService from "../../services/backup.js"; +import anonymizationService from "../../services/anonymization.js"; +import consistencyChecksService from "../../services/consistency_checks.js"; import { Request } from 'express'; -import ValidationError = require('../../errors/validation_error'); +import ValidationError from "../../errors/validation_error.js"; function getExistingBackups() { return backupService.getExistingBackups(); @@ -49,7 +49,7 @@ function checkIntegrity() { }; } -export = { +export default { getExistingBackups, backupDatabase, vacuumDatabase, diff --git a/src/routes/api/etapi_tokens.ts b/src/routes/api/etapi_tokens.ts index d7dd078bd..82cb470e8 100644 --- a/src/routes/api/etapi_tokens.ts +++ b/src/routes/api/etapi_tokens.ts @@ -1,5 +1,5 @@ import { Request } from 'express'; -import etapiTokenService = require('../../services/etapi_tokens'); +import etapiTokenService from "../../services/etapi_tokens.js"; function getTokens() { const tokens = etapiTokenService.getTokens(); @@ -21,7 +21,7 @@ function deleteToken(req: Request) { etapiTokenService.deleteToken(req.params.etapiTokenId); } -export = { +export default { getTokens, createToken, patchToken, diff --git a/src/routes/api/export.ts b/src/routes/api/export.ts index 7d6b3f683..f654487af 100644 --- a/src/routes/api/export.ts +++ b/src/routes/api/export.ts @@ -1,14 +1,14 @@ "use strict"; -import zipExportService = require('../../services/export/zip'); -import singleExportService = require('../../services/export/single'); -import opmlExportService = require('../../services/export/opml'); -import becca = require('../../becca/becca'); -import TaskContext = require('../../services/task_context'); -import log = require('../../services/log'); -import NotFoundError = require('../../errors/not_found_error'); +import zipExportService from "../../services/export/zip.js"; +import singleExportService from "../../services/export/single.js"; +import opmlExportService from "../../services/export/opml.js"; +import becca from "../../becca/becca.js"; +import TaskContext from "../../services/task_context.js"; +import log from "../../services/log.js"; +import NotFoundError from "../../errors/not_found_error.js"; import { Request, Response } from 'express'; -import ValidationError = require('../../errors/validation_error'); +import ValidationError from "../../errors/validation_error.js"; function exportBranch(req: Request, res: Response) { const {branchId, type, format, version, taskId} = req.params; @@ -55,6 +55,6 @@ function exportBranch(req: Request, res: Response) { } } -export = { +export default { exportBranch }; diff --git a/src/routes/api/files.ts b/src/routes/api/files.ts index 3bb269f7d..4adc28f42 100644 --- a/src/routes/api/files.ts +++ b/src/routes/api/files.ts @@ -1,19 +1,19 @@ "use strict"; -import protectedSessionService = require('../../services/protected_session'); -import utils = require('../../services/utils'); -import log = require('../../services/log'); -import noteService = require('../../services/notes'); -import tmp = require('tmp'); -import fs = require('fs'); +import protectedSessionService from "../../services/protected_session.js"; +import utils from "../../services/utils.js"; +import log from "../../services/log.js"; +import noteService from "../../services/notes.js"; +import tmp from "tmp"; +import fs from "fs"; import { Readable } from 'stream'; -import chokidar = require('chokidar'); -import ws = require('../../services/ws'); -import becca = require('../../becca/becca'); -import ValidationError = require('../../errors/validation_error'); +import chokidar from "chokidar"; +import ws from "../../services/ws.js"; +import becca from "../../becca/becca.js"; +import ValidationError from "../../errors/validation_error.js"; import { Request, Response } from 'express'; -import BNote = require('../../becca/entities/bnote'); -import BAttachment = require('../../becca/entities/battachment'); +import BNote from "../../becca/entities/bnote.js"; +import BAttachment from "../../becca/entities/battachment.js"; import { AppRequest } from '../route-interface'; function updateFile(req: AppRequest) { @@ -245,7 +245,7 @@ function uploadModifiedFileToAttachment(req: Request) { attachment.setContent(fileContent); } -export = { +export default { updateFile, updateAttachment, openFile, diff --git a/src/routes/api/fonts.ts b/src/routes/api/fonts.ts index fc68dc920..0f0c85cb2 100644 --- a/src/routes/api/fonts.ts +++ b/src/routes/api/fonts.ts @@ -1,5 +1,5 @@ import { Request, Response } from 'express'; -import optionService = require('../../services/options'); +import optionService from "../../services/options.js"; function getFontCss(req: Request, res: Response) { res.setHeader('Content-Type', 'text/css'); @@ -35,6 +35,6 @@ function getFontCss(req: Request, res: Response) { res.send(style); } -export = { +export default { getFontCss }; diff --git a/src/routes/api/image.ts b/src/routes/api/image.ts index 926ad3ead..890b4a88a 100644 --- a/src/routes/api/image.ts +++ b/src/routes/api/image.ts @@ -1,13 +1,13 @@ "use strict"; -import imageService = require('../../services/image'); -import becca = require('../../becca/becca'); -const RESOURCE_DIR = require('../../services/resource_dir').RESOURCE_DIR; -import fs = require('fs'); +import imageService from "../../services/image.js"; +import becca from "../../becca/becca.js"; +import fs from "fs"; import { Request, Response } from 'express'; -import BNote = require('../../becca/entities/bnote'); -import BRevision = require('../../becca/entities/brevision'); +import BNote from "../../becca/entities/bnote.js"; +import BRevision from "../../becca/entities/brevision.js"; import { AppRequest } from '../route-interface'; +import { RESOURCE_DIR } from "../../services/resource_dir.js"; function returnImageFromNote(req: Request, res: Response) { const image = becca.getNote(req.params.noteId); @@ -112,7 +112,7 @@ function updateImage(req: AppRequest) { return { uploaded: true }; } -export = { +export default { returnImageFromNote, returnImageFromRevision, returnAttachedImage, diff --git a/src/routes/api/import.ts b/src/routes/api/import.ts index f4e0b446e..07bd2169e 100644 --- a/src/routes/api/import.ts +++ b/src/routes/api/import.ts @@ -1,18 +1,18 @@ "use strict"; -import enexImportService = require('../../services/import/enex'); -import opmlImportService = require('../../services/import/opml'); -import zipImportService = require('../../services/import/zip'); -import singleImportService = require('../../services/import/single'); -import cls = require('../../services/cls'); -import path = require('path'); -import becca = require('../../becca/becca'); -import beccaLoader = require('../../becca/becca_loader'); -import log = require('../../services/log'); -import TaskContext = require('../../services/task_context'); -import ValidationError = require('../../errors/validation_error'); +import enexImportService from "../../services/import/enex.js"; +import opmlImportService from "../../services/import/opml.js"; +import zipImportService from "../../services/import/zip.js"; +import singleImportService from "../../services/import/single.js"; +import cls from "../../services/cls.js"; +import path from "path"; +import becca from "../../becca/becca.js"; +import beccaLoader from "../../becca/becca_loader.js"; +import log from "../../services/log.js"; +import TaskContext from "../../services/task_context.js"; +import ValidationError from "../../errors/validation_error.js"; import { Request } from 'express'; -import BNote = require('../../becca/entities/bnote'); +import BNote from "../../becca/entities/bnote.js"; import { AppRequest } from '../route-interface'; async function importNotesToBranch(req: AppRequest) { @@ -136,7 +136,7 @@ async function importAttachmentsToNote(req: AppRequest) { } } -export = { +export default { importNotesToBranch, importAttachmentsToNote }; diff --git a/src/routes/api/keys.ts b/src/routes/api/keys.ts index fe4f208f9..cd49c5c47 100644 --- a/src/routes/api/keys.ts +++ b/src/routes/api/keys.ts @@ -1,7 +1,7 @@ "use strict"; -import keyboardActions = require('../../services/keyboard_actions'); -import becca = require('../../becca/becca'); +import keyboardActions from "../../services/keyboard_actions.js"; +import becca from "../../becca/becca.js"; function getKeyboardActions() { return keyboardActions.getKeyboardActions(); @@ -14,7 +14,7 @@ function getShortcutsForNotes() { return labels.filter(attr => becca.getNote(attr.noteId)?.type !== 'launcher'); } -export = { +export default { getKeyboardActions, getShortcutsForNotes }; diff --git a/src/routes/api/login.ts b/src/routes/api/login.ts index a769c4627..0a3879380 100644 --- a/src/routes/api/login.ts +++ b/src/routes/api/login.ts @@ -1,17 +1,17 @@ "use strict"; -import options = require('../../services/options'); -import utils = require('../../services/utils'); -import dateUtils = require('../../services/date_utils'); -import instanceId = require('../../services/instance_id'); -import passwordEncryptionService = require('../../services/encryption/password_encryption'); -import protectedSessionService = require('../../services/protected_session'); -import appInfo = require('../../services/app_info'); -import eventService = require('../../services/events'); -import sqlInit = require('../../services/sql_init'); -import sql = require('../../services/sql'); -import ws = require('../../services/ws'); -import etapiTokenService = require('../../services/etapi_tokens'); +import options from "../../services/options.js"; +import utils from "../../services/utils.js"; +import dateUtils from "../../services/date_utils.js"; +import instanceId from "../../services/instance_id.js"; +import passwordEncryptionService from "../../services/encryption/password_encryption.js"; +import protectedSessionService from "../../services/protected_session.js"; +import appInfo from "../../services/app_info.js"; +import eventService from "../../services/events.js"; +import sqlInit from "../../services/sql_init.js"; +import sql from "../../services/sql.js"; +import ws from "../../services/ws.js"; +import etapiTokenService from "../../services/etapi_tokens.js"; import { Request } from 'express'; import { AppRequest } from '../route-interface'; @@ -110,7 +110,7 @@ function token(req: Request) { return { token: authToken }; } -export = { +export default { loginSync, loginToProtectedSession, logoutFromProtectedSession, diff --git a/src/routes/api/note_map.ts b/src/routes/api/note_map.ts index 6abfc1878..4c4590e90 100644 --- a/src/routes/api/note_map.ts +++ b/src/routes/api/note_map.ts @@ -1,9 +1,9 @@ "use strict"; -import becca = require('../../becca/becca'); +import becca from "../../becca/becca.js"; import { JSDOM } from "jsdom"; -import BNote = require('../../becca/entities/bnote'); -import BAttribute = require('../../becca/entities/battribute'); +import BNote from "../../becca/entities/bnote.js"; +import BAttribute from "../../becca/entities/battribute.js"; import { Request } from 'express'; function buildDescendantCountMap(noteIdsToCount: string[]) { @@ -384,7 +384,7 @@ function getBacklinks(req: Request) { }); } -export = { +export default { getLinkMap, getTreeMap, getBacklinkCount, diff --git a/src/routes/api/notes.ts b/src/routes/api/notes.ts index c5e3e1c37..0496886a2 100644 --- a/src/routes/api/notes.ts +++ b/src/routes/api/notes.ts @@ -1,17 +1,17 @@ "use strict"; -import noteService = require('../../services/notes'); -import eraseService = require('../../services/erase'); -import treeService = require('../../services/tree'); -import sql = require('../../services/sql'); -import utils = require('../../services/utils'); -import log = require('../../services/log'); -import TaskContext = require('../../services/task_context'); -import becca = require('../../becca/becca'); -import ValidationError = require('../../errors/validation_error'); -import blobService = require('../../services/blob'); +import noteService from "../../services/notes.js"; +import eraseService from "../../services/erase.js"; +import treeService from "../../services/tree.js"; +import sql from "../../services/sql.js"; +import utils from "../../services/utils.js"; +import log from "../../services/log.js"; +import TaskContext from "../../services/task_context.js"; +import becca from "../../becca/becca.js"; +import ValidationError from "../../errors/validation_error.js"; +import blobService from "../../services/blob.js"; import { Request } from 'express'; -import BBranch = require('../../becca/entities/bbranch'); +import BBranch from "../../becca/entities/bbranch.js"; import { AttributeRow } from '../../becca/entities/rows'; function getNote(req: Request) { @@ -250,7 +250,7 @@ function convertNoteToAttachment(req: Request) { }; } -export = { +export default { getNote, getNoteBlob, getNoteMetadata, diff --git a/src/routes/api/options.ts b/src/routes/api/options.ts index 54630e825..2113746ba 100644 --- a/src/routes/api/options.ts +++ b/src/routes/api/options.ts @@ -1,9 +1,9 @@ "use strict"; -import optionService = require('../../services/options'); -import log = require('../../services/log'); -import searchService = require('../../services/search/services/search'); -import ValidationError = require('../../errors/validation_error'); +import optionService from "../../services/options.js"; +import log from "../../services/log.js"; +import searchService from "../../services/search/services/search.js"; +import ValidationError from "../../errors/validation_error.js"; import { Request } from 'express'; // options allowed to be updated directly in the Options dialog @@ -136,7 +136,7 @@ function isAllowed(name: string) { || name.startsWith("hideArchivedNotes"); } -export = { +export default { getOptions, updateOption, updateOptions, diff --git a/src/routes/api/other.ts b/src/routes/api/other.ts index 1d157f291..c09b5d62d 100644 --- a/src/routes/api/other.ts +++ b/src/routes/api/other.ts @@ -1,7 +1,7 @@ import { Request } from "express"; -import becca = require('../../becca/becca'); -import markdownService = require('../../services/import/markdown'); +import becca from "../../becca/becca.js"; +import markdownService from "../../services/import/markdown.js"; function getIconUsage() { const iconClassToCountMap: Record = {}; @@ -35,7 +35,7 @@ function renderMarkdown(req: Request) { }; } -export = { +export default { getIconUsage, renderMarkdown }; diff --git a/src/routes/api/password.ts b/src/routes/api/password.ts index 5fb4c89d6..03721ea3e 100644 --- a/src/routes/api/password.ts +++ b/src/routes/api/password.ts @@ -1,7 +1,7 @@ "use strict"; -import passwordService = require('../../services/encryption/password'); -import ValidationError = require('../../errors/validation_error'); +import passwordService from "../../services/encryption/password.js"; +import ValidationError from "../../errors/validation_error.js"; import { Request } from 'express'; function changePassword(req: Request) { @@ -22,7 +22,7 @@ function resetPassword(req: Request) { return passwordService.resetPassword(); } -export = { +export default { changePassword, resetPassword }; diff --git a/src/routes/api/recent_changes.ts b/src/routes/api/recent_changes.ts index bf662a784..7962c8026 100644 --- a/src/routes/api/recent_changes.ts +++ b/src/routes/api/recent_changes.ts @@ -1,9 +1,9 @@ "use strict"; -import sql = require('../../services/sql'); -import protectedSessionService = require('../../services/protected_session'); -import noteService = require('../../services/notes'); -import becca = require('../../becca/becca'); +import sql from "../../services/sql.js"; +import protectedSessionService from "../../services/protected_session.js"; +import noteService from "../../services/notes.js"; +import becca from "../../becca/becca.js"; import { Request } from 'express'; import { RevisionRow } from '../../becca/entities/rows'; @@ -111,6 +111,6 @@ function getRecentChanges(req: Request) { return recentChanges; } -export = { +export default { getRecentChanges }; diff --git a/src/routes/api/recent_notes.ts b/src/routes/api/recent_notes.ts index 627bdd357..72a49f520 100644 --- a/src/routes/api/recent_notes.ts +++ b/src/routes/api/recent_notes.ts @@ -1,8 +1,8 @@ "use strict"; -import BRecentNote = require('../../becca/entities/brecent_note'); -import sql = require('../../services/sql'); -import dateUtils = require('../../services/date_utils'); +import BRecentNote from "../../becca/entities/brecent_note.js"; +import sql from "../../services/sql.js"; +import dateUtils from "../../services/date_utils.js"; import { Request } from 'express'; function addRecentNote(req: Request) { @@ -19,6 +19,6 @@ function addRecentNote(req: Request) { } } -export = { +export default { addRecentNote }; diff --git a/src/routes/api/relation-map.ts b/src/routes/api/relation-map.ts index c81496349..d24164899 100644 --- a/src/routes/api/relation-map.ts +++ b/src/routes/api/relation-map.ts @@ -1,6 +1,6 @@ import { Request } from 'express'; -import becca = require('../../becca/becca'); -import sql = require('../../services/sql'); +import becca from "../../becca/becca.js"; +import sql from "../../services/sql.js"; interface ResponseData { noteTitles: Record; @@ -76,6 +76,6 @@ function getRelationMap(req: Request) { return resp; } -export = { +export default { getRelationMap }; diff --git a/src/routes/api/revisions.ts b/src/routes/api/revisions.ts index 475b5b9b1..b64ce1bdc 100644 --- a/src/routes/api/revisions.ts +++ b/src/routes/api/revisions.ts @@ -1,17 +1,17 @@ "use strict"; -import beccaService = require('../../becca/becca_service'); -import revisionService = require('../../services/revisions'); -import utils = require('../../services/utils'); -import sql = require('../../services/sql'); -import cls = require('../../services/cls'); -import path = require('path'); -import becca = require('../../becca/becca'); -import blobService = require('../../services/blob'); -import eraseService = require("../../services/erase"); +import beccaService from "../../becca/becca_service.js"; +import revisionService from "../../services/revisions.js"; +import utils from "../../services/utils.js"; +import sql from "../../services/sql.js"; +import cls from "../../services/cls.js"; +import path from "path"; +import becca from "../../becca/becca.js"; +import blobService from "../../services/blob.js"; +import eraseService from "../../services/erase.js"; import { Request, Response } from 'express'; -import BRevision = require('../../becca/entities/brevision'); -import BNote = require('../../becca/entities/bnote'); +import BRevision from "../../becca/entities/brevision.js"; +import BNote from "../../becca/entities/bnote.js"; import { NotePojo } from '../../becca/becca-interface'; interface NotePath { @@ -200,7 +200,7 @@ function getNotePathData(note: BNote): NotePath | undefined { } } -export = { +export default { getRevisionBlob, getRevisions, getRevision, diff --git a/src/routes/api/script.ts b/src/routes/api/script.ts index 8a1b3d072..92aa9fc24 100644 --- a/src/routes/api/script.ts +++ b/src/routes/api/script.ts @@ -1,10 +1,10 @@ "use strict"; -import scriptService = require('../../services/script'); -import attributeService = require('../../services/attributes'); -import becca = require('../../becca/becca'); -import syncService = require('../../services/sync'); -import sql = require('../../services/sql'); +import scriptService from "../../services/script.js"; +import attributeService from "../../services/attributes.js"; +import becca from "../../becca/becca.js"; +import syncService from "../../services/sync.js"; +import sql from "../../services/sql.js"; import { Request } from 'express'; interface ScriptBody { @@ -131,7 +131,7 @@ function getBundle(req: Request) { return scriptService.getScriptBundleForFrontend(note, script, params); } -export = { +export default { exec, run, getStartupBundles, diff --git a/src/routes/api/search.ts b/src/routes/api/search.ts index 358c0d1d2..fbfe74766 100644 --- a/src/routes/api/search.ts +++ b/src/routes/api/search.ts @@ -2,21 +2,21 @@ import { Request } from "express"; -import becca = require('../../becca/becca'); -import SearchContext = require('../../services/search/search_context'); -import searchService = require('../../services/search/services/search'); -import bulkActionService = require('../../services/bulk_actions'); -import cls = require('../../services/cls'); -import attributeFormatter = require('../../services/attribute_formatter'); -import ValidationError = require('../../errors/validation_error'); -import SearchResult = require("../../services/search/search_result"); +import becca from "../../becca/becca.js"; +import SearchContext from "../../services/search/search_context.js"; +import searchService, { EMPTY_RESULT, SearchNoteResult } from "../../services/search/services/search.js"; +import bulkActionService from "../../services/bulk_actions.js"; +import cls from "../../services/cls.js"; +import attributeFormatter from "../../services/attribute_formatter.js"; +import ValidationError from "../../errors/validation_error.js"; +import SearchResult from "../../services/search/search_result.js"; -function searchFromNote(req: Request) { +function searchFromNote(req: Request): SearchNoteResult { const note = becca.getNoteOrThrow(req.params.noteId); if (!note) { // this can be triggered from recent changes, and it's harmless to return an empty list rather than fail - return []; + return EMPTY_RESULT; } if (note.type !== 'search') { @@ -126,7 +126,7 @@ function searchTemplates() { }).map(note => note.noteId); } -export = { +export default { searchFromNote, searchAndExecute, getRelatedNotes, diff --git a/src/routes/api/sender.ts b/src/routes/api/sender.ts index 8d20c1fd9..fd460a0d2 100644 --- a/src/routes/api/sender.ts +++ b/src/routes/api/sender.ts @@ -1,10 +1,10 @@ "use strict"; -import imageType = require('image-type'); -import imageService = require('../../services/image'); -import noteService = require('../../services/notes'); -import sanitize_attribute_name = require('../../services/sanitize_attribute_name'); -import specialNotesService = require('../../services/special_notes'); +import imageType from "image-type"; +import imageService from "../../services/image.js"; +import noteService from "../../services/notes.js"; +import sanitize_attribute_name from "../../services/sanitize_attribute_name.js"; +import specialNotesService from "../../services/special_notes.js"; import { Request } from 'express'; import { AppRequest } from '../route-interface'; @@ -84,7 +84,7 @@ function saveNote(req: Request) { }; } -export = { +export default { uploadImage, saveNote }; diff --git a/src/routes/api/setup.ts b/src/routes/api/setup.ts index 9e63a2331..a4a473a3e 100644 --- a/src/routes/api/setup.ts +++ b/src/routes/api/setup.ts @@ -1,9 +1,9 @@ "use strict"; -import sqlInit = require('../../services/sql_init'); -import setupService = require('../../services/setup'); -import log = require('../../services/log'); -import appInfo = require('../../services/app_info'); +import sqlInit from "../../services/sql_init.js"; +import setupService from "../../services/setup.js"; +import log from "../../services/log.js"; +import appInfo from "../../services/app_info.js"; import { Request } from 'express'; function getStatus() { @@ -51,7 +51,7 @@ function getSyncSeed() { }; } -export = { +export default { getStatus, setupNewDocument, setupSyncFromServer, diff --git a/src/routes/api/similar_notes.ts b/src/routes/api/similar_notes.ts index f60d7f7c6..a845ee3a5 100644 --- a/src/routes/api/similar_notes.ts +++ b/src/routes/api/similar_notes.ts @@ -2,8 +2,8 @@ import { Request } from "express"; -import similarityService = require('../../becca/similarity'); -import becca = require('../../becca/becca'); +import similarityService from "../../becca/similarity.js"; +import becca from "../../becca/becca.js"; async function getSimilarNotes(req: Request) { const noteId = req.params.noteId; @@ -13,6 +13,6 @@ async function getSimilarNotes(req: Request) { return await similarityService.findSimilarNotes(noteId); } -export = { +export default { getSimilarNotes }; diff --git a/src/routes/api/special_notes.ts b/src/routes/api/special_notes.ts index 445cd7315..5d9dc2514 100644 --- a/src/routes/api/special_notes.ts +++ b/src/routes/api/special_notes.ts @@ -1,10 +1,10 @@ "use strict"; -import dateNoteService = require('../../services/date_notes'); -import sql = require('../../services/sql'); -import cls = require('../../services/cls'); -import specialNotesService = require('../../services/special_notes'); -import becca = require('../../becca/becca'); +import dateNoteService from "../../services/date_notes.js"; +import sql from "../../services/sql.js"; +import cls from "../../services/cls.js"; +import specialNotesService from "../../services/special_notes.js"; +import becca from "../../becca/becca.js"; import { Request } from 'express'; function getInboxNote(req: Request) { @@ -82,7 +82,7 @@ function createOrUpdateScriptLauncherFromApi(req: Request) { return specialNotesService.createOrUpdateScriptLauncherFromApi(req.body); } -export = { +export default { getInboxNote, getDayNote, getWeekNote, diff --git a/src/routes/api/sql.ts b/src/routes/api/sql.ts index 3bd1d3eca..9e2f6b09a 100644 --- a/src/routes/api/sql.ts +++ b/src/routes/api/sql.ts @@ -1,9 +1,9 @@ "use strict"; -import sql = require('../../services/sql'); -import becca = require('../../becca/becca'); +import sql from "../../services/sql.js"; +import becca from "../../becca/becca.js"; import { Request } from 'express'; -import ValidationError = require('../../errors/validation_error'); +import ValidationError from "../../errors/validation_error.js"; function getSchema() { const tableNames = sql.getColumn(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name`); @@ -66,7 +66,7 @@ function execute(req: Request) { } } -export = { +export default { getSchema, execute }; diff --git a/src/routes/api/stats.ts b/src/routes/api/stats.ts index 053647daa..aa948930e 100644 --- a/src/routes/api/stats.ts +++ b/src/routes/api/stats.ts @@ -1,5 +1,5 @@ -import sql = require('../../services/sql'); -import becca = require('../../becca/becca'); +import sql from "../../services/sql.js"; +import becca from "../../becca/becca.js"; import { Request } from 'express'; function getNoteSize(req: Request) { @@ -45,7 +45,7 @@ function getSubtreeSize(req: Request) { }; } -export = { +export default { getNoteSize, getSubtreeSize }; diff --git a/src/routes/api/sync.ts b/src/routes/api/sync.ts index 728065336..646a514f4 100644 --- a/src/routes/api/sync.ts +++ b/src/routes/api/sync.ts @@ -1,19 +1,20 @@ "use strict"; -import syncService = require('../../services/sync'); -import syncUpdateService = require('../../services/sync_update'); -import entityChangesService = require('../../services/entity_changes'); -import sql = require('../../services/sql'); -import sqlInit = require('../../services/sql_init'); -import optionService = require('../../services/options'); -import contentHashService = require('../../services/content_hash'); -import log = require('../../services/log'); -import syncOptions = require('../../services/sync_options'); -import utils = require('../../services/utils'); -import ws = require('../../services/ws'); +import syncService from "../../services/sync.js"; +import syncUpdateService from "../../services/sync_update.js"; +import entityChangesService from "../../services/entity_changes.js"; +import sql from "../../services/sql.js"; +import sqlInit from "../../services/sql_init.js"; +import optionService from "../../services/options.js"; +import contentHashService from "../../services/content_hash.js"; +import log from "../../services/log.js"; +import syncOptions from "../../services/sync_options.js"; +import utils from "../../services/utils.js"; +import ws from "../../services/ws.js"; import { Request } from 'express'; import { EntityChange, EntityChangeRecord } from '../../services/entity_changes_interface'; -import ValidationError = require('../../errors/validation_error'); +import ValidationError from "../../errors/validation_error.js"; +import consistencyChecksService from "../../services/consistency_checks.js"; async function testSync() { try { @@ -206,10 +207,10 @@ function queueSector(req: Request) { } function checkEntityChanges() { - require('../../services/consistency_checks').runEntityChangesChecks(); + consistencyChecksService.runEntityChangesChecks(); } -export = { +export default { testSync, checkSync, syncNow, diff --git a/src/routes/api/tree.ts b/src/routes/api/tree.ts index 1b172f10b..f519ea4f8 100644 --- a/src/routes/api/tree.ts +++ b/src/routes/api/tree.ts @@ -1,10 +1,10 @@ "use strict"; -import becca = require('../../becca/becca'); -import log = require('../../services/log'); -import NotFoundError = require('../../errors/not_found_error'); +import becca from "../../becca/becca.js"; +import log from "../../services/log.js"; +import NotFoundError from "../../errors/not_found_error.js"; import { Request } from 'express'; -import BNote = require('../../becca/entities/bnote'); +import BNote from "../../becca/entities/bnote.js"; function getNotesAndBranchesAndAttributes(_noteIds: string[] | Set) { const noteIds = new Set(_noteIds); @@ -160,7 +160,7 @@ function load(req: Request) { return getNotesAndBranchesAndAttributes(req.body.noteIds); } -export = { +export default { getTree, load }; diff --git a/src/routes/assets.ts b/src/routes/assets.ts index 8417c47b9..a03819a83 100644 --- a/src/routes/assets.ts +++ b/src/routes/assets.ts @@ -1,8 +1,8 @@ -import assetPath = require('../services/asset_path'); -import path = require("path"); -import express = require("express"); -import env = require('../services/env'); -import serveStatic = require('serve-static'); +import assetPath from "../services/asset_path.js"; +import path from "path"; +import express from "express"; +import env from "../services/env.js"; +import serveStatic from "serve-static"; const persistentCacheStatic = (root: string, options?: serveStatic.ServeStaticOptions>>) => { if (!env.isDev()) { @@ -76,6 +76,6 @@ function register(app: express.Application) { app.use(`/${assetPath}/translations/`, persistentCacheStatic(path.join(srcRoot, "public", "translations/"))); } -export = { +export default { register }; diff --git a/src/routes/custom.ts b/src/routes/custom.ts index 1bdb94ac0..a2e2f900a 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -1,9 +1,9 @@ -import log = require('../services/log'); -import fileService = require('./api/files'); -import scriptService = require('../services/script'); -import cls = require('../services/cls'); -import sql = require('../services/sql'); -import becca = require('../becca/becca'); +import log from "../services/log.js"; +import fileService from "./api/files.js"; +import scriptService from "../services/script.js"; +import cls from "../services/cls.js"; +import sql from "../services/sql.js"; +import becca from "../becca/becca.js"; import { Request, Response, Router } from 'express'; function handleRequest(req: Request, res: Response) { @@ -84,6 +84,6 @@ function register(router: Router) { }); } -export = { +export default { register }; diff --git a/src/routes/electron.ts b/src/routes/electron.ts index 8a869d935..be78d13ec 100644 --- a/src/routes/electron.ts +++ b/src/routes/electron.ts @@ -56,4 +56,4 @@ function init(app: Application) { }); } -export = init; +export default init; diff --git a/src/routes/error_handlers.ts b/src/routes/error_handlers.ts index 96d326bd9..f054a2683 100644 --- a/src/routes/error_handlers.ts +++ b/src/routes/error_handlers.ts @@ -1,5 +1,5 @@ import { Application, NextFunction, Request, Response } from 'express'; -import log = require('../services/log'); +import log from "../services/log.js"; function register(app: Application) { app.use((err: any, req: Request, res: Response, next: NextFunction) => { @@ -39,6 +39,6 @@ function register(app: Application) { }); } -export = { +export default { register }; diff --git a/src/routes/index.ts b/src/routes/index.ts index 2ede70f42..56a445a20 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1,16 +1,16 @@ "use strict"; -import sql = require('../services/sql'); -import attributeService = require('../services/attributes'); -import config = require('../services/config'); -import optionService = require('../services/options'); -import log = require('../services/log'); -import env = require('../services/env'); -import utils = require('../services/utils'); -import protectedSessionService = require('../services/protected_session'); -import packageJson = require('../../package.json'); -import assetPath = require('../services/asset_path'); -import appPath = require('../services/app_path'); +import sql from "../services/sql.js"; +import attributeService from "../services/attributes.js"; +import config from "../services/config.js"; +import optionService from "../services/options.js"; +import log from "../services/log.js"; +import env from "../services/env.js"; +import utils from "../services/utils.js"; +import protectedSessionService from "../services/protected_session.js"; +import packageJson from "../../package.json"; +import assetPath from "../services/asset_path.js"; +import appPath from "../services/app_path.js"; import { Request, Response } from 'express'; function index(req: Request, res: Response) { @@ -64,6 +64,6 @@ function getAppCssNoteIds() { return attributeService.getNotesWithLabel('appCss').map(note => note.noteId); } -export = { +export default { index }; diff --git a/src/routes/login.ts b/src/routes/login.ts index cce214fbe..48e721f70 100644 --- a/src/routes/login.ts +++ b/src/routes/login.ts @@ -1,13 +1,13 @@ "use strict"; -import utils = require('../services/utils'); -import optionService = require('../services/options'); -import myScryptService = require('../services/encryption/my_scrypt'); -import log = require('../services/log'); -import passwordService = require('../services/encryption/password'); -import assetPath = require('../services/asset_path'); -import appPath = require('../services/app_path'); -import ValidationError = require('../errors/validation_error'); +import utils from "../services/utils.js"; +import optionService from "../services/options.js"; +import myScryptService from "../services/encryption/my_scrypt.js"; +import log from "../services/log.js"; +import passwordService from "../services/encryption/password.js"; +import assetPath from "../services/asset_path.js"; +import appPath from "../services/app_path.js"; +import ValidationError from "../errors/validation_error.js"; import { Request, Response } from 'express'; import { AppRequest } from './route-interface'; @@ -102,7 +102,7 @@ function logout(req: AppRequest, res: Response) { } -export = { +export default { loginPage, setPasswordPage, setPassword, diff --git a/src/routes/routes.ts b/src/routes/routes.ts index 55cad4cd5..578df6cfe 100644 --- a/src/routes/routes.ts +++ b/src/routes/routes.ts @@ -1,75 +1,75 @@ "use strict"; -import utils = require('../services/utils'); -import multer = require('multer'); -import log = require('../services/log'); -import express = require('express'); +import utils from "../services/utils.js"; +import multer from "multer"; +import log from "../services/log.js"; +import express from "express"; const router = express.Router(); -import auth = require('../services/auth'); -import cls = require('../services/cls'); -import sql = require('../services/sql'); -import entityChangesService = require('../services/entity_changes'); -import csurf = require('csurf'); +import auth from "../services/auth.js"; +import cls from "../services/cls.js"; +import sql from "../services/sql.js"; +import entityChangesService from "../services/entity_changes.js"; +import csurf from "csurf"; import { createPartialContentHandler } from "express-partial-content"; -import rateLimit = require("express-rate-limit"); -import AbstractBeccaEntity = require('../becca/entities/abstract_becca_entity'); -import NotFoundError = require('../errors/not_found_error'); -import ValidationError = require('../errors/validation_error'); +import rateLimit from "express-rate-limit"; +import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; +import NotFoundError from "../errors/not_found_error.js"; +import ValidationError from "../errors/validation_error.js"; // page routes -import setupRoute = require('./setup'); -import loginRoute = require('./login'); -import indexRoute = require('./index'); +import setupRoute from "./setup.js"; +import loginRoute from "./login.js"; +import indexRoute from "./index.js"; // API routes -import treeApiRoute = require('./api/tree'); -import notesApiRoute = require('./api/notes'); -import branchesApiRoute = require('./api/branches'); -import attachmentsApiRoute = require('./api/attachments'); -import autocompleteApiRoute = require('./api/autocomplete'); -import cloningApiRoute = require('./api/cloning'); -import revisionsApiRoute = require('./api/revisions'); -import recentChangesApiRoute = require('./api/recent_changes'); -import optionsApiRoute = require('./api/options'); -import passwordApiRoute = require('./api/password'); -import syncApiRoute = require('./api/sync'); -import loginApiRoute = require('./api/login'); -import recentNotesRoute = require('./api/recent_notes'); -import appInfoRoute = require('./api/app_info'); -import exportRoute = require('./api/export'); -import importRoute = require('./api/import'); -import setupApiRoute = require('./api/setup'); -import sqlRoute = require('./api/sql'); -import databaseRoute = require('./api/database'); -import imageRoute = require('./api/image'); -import attributesRoute = require('./api/attributes'); -import scriptRoute = require('./api/script'); -import senderRoute = require('./api/sender'); -import filesRoute = require('./api/files'); -import searchRoute = require('./api/search'); -import bulkActionRoute = require('./api/bulk_action'); -import specialNotesRoute = require('./api/special_notes'); -import noteMapRoute = require('./api/note_map'); -import clipperRoute = require('./api/clipper'); -import similarNotesRoute = require('./api/similar_notes'); -import keysRoute = require('./api/keys'); -import backendLogRoute = require('./api/backend_log'); -import statsRoute = require('./api/stats'); -import fontsRoute = require('./api/fonts'); -import etapiTokensApiRoutes = require('./api/etapi_tokens'); -import relationMapApiRoute = require('./api/relation-map'); -import otherRoute = require('./api/other'); -import shareRoutes = require('../share/routes'); +import treeApiRoute from "./api/tree.js"; +import notesApiRoute from "./api/notes.js"; +import branchesApiRoute from "./api/branches.js"; +import attachmentsApiRoute from "./api/attachments.js"; +import autocompleteApiRoute from "./api/autocomplete.js"; +import cloningApiRoute from "./api/cloning.js"; +import revisionsApiRoute from "./api/revisions.js"; +import recentChangesApiRoute from "./api/recent_changes.js"; +import optionsApiRoute from "./api/options.js"; +import passwordApiRoute from "./api/password.js"; +import syncApiRoute from "./api/sync.js"; +import loginApiRoute from "./api/login.js"; +import recentNotesRoute from "./api/recent_notes.js"; +import appInfoRoute from "./api/app_info.js"; +import exportRoute from "./api/export.js"; +import importRoute from "./api/import.js"; +import setupApiRoute from "./api/setup.js"; +import sqlRoute from "./api/sql.js"; +import databaseRoute from "./api/database.js"; +import imageRoute from "./api/image.js"; +import attributesRoute from "./api/attributes.js"; +import scriptRoute from "./api/script.js"; +import senderRoute from "./api/sender.js"; +import filesRoute from "./api/files.js"; +import searchRoute from "./api/search.js"; +import bulkActionRoute from "./api/bulk_action.js"; +import specialNotesRoute from "./api/special_notes.js"; +import noteMapRoute from "./api/note_map.js"; +import clipperRoute from "./api/clipper.js"; +import similarNotesRoute from "./api/similar_notes.js"; +import keysRoute from "./api/keys.js"; +import backendLogRoute from "./api/backend_log.js"; +import statsRoute from "./api/stats.js"; +import fontsRoute from "./api/fonts.js"; +import etapiTokensApiRoutes from "./api/etapi_tokens.js"; +import relationMapApiRoute from "./api/relation-map.js"; +import otherRoute from "./api/other.js"; +import shareRoutes from "../share/routes.js"; -import etapiAuthRoutes = require('../etapi/auth'); -import etapiAppInfoRoutes = require('../etapi/app_info'); -import etapiAttachmentRoutes = require('../etapi/attachments'); -import etapiAttributeRoutes = require('../etapi/attributes'); -import etapiBranchRoutes = require('../etapi/branches'); -import etapiNoteRoutes = require('../etapi/notes'); -import etapiSpecialNoteRoutes = require('../etapi/special_notes'); -import etapiSpecRoute = require('../etapi/spec'); -import etapiBackupRoute = require('../etapi/backup'); +import etapiAuthRoutes from "../etapi/auth.js"; +import etapiAppInfoRoutes from "../etapi/app_info.js"; +import etapiAttachmentRoutes from "../etapi/attachments.js"; +import etapiAttributeRoutes from "../etapi/attributes.js"; +import etapiBranchRoutes from "../etapi/branches.js"; +import etapiNoteRoutes from "../etapi/notes.js"; +import etapiSpecialNoteRoutes from "../etapi/special_notes.js"; +import etapiSpecRoute from "../etapi/spec.js"; +import etapiBackupRoute from "../etapi/backup.js"; import { AppRequest, AppRequestHandler } from './route-interface'; const csrfMiddleware = csurf({ @@ -106,7 +106,7 @@ function register(app: express.Application) { route(GET, '/login', [auth.checkAppInitialized, auth.checkPasswordSet], loginRoute.loginPage); route(GET, '/set-password', [auth.checkAppInitialized, auth.checkPasswordNotSet], loginRoute.setPasswordPage); - const loginRateLimiter = rateLimit.rateLimit({ + const loginRateLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 10, // limit each IP to 10 requests per windowMs skipSuccessfulRequests: true // successful auth to rate-limited ETAPI routes isn't counted. However, successful auth to /login is still counted! @@ -517,6 +517,6 @@ function createUploadMiddleware() { return multer(multerOptions).single('upload'); } -export = { +export default { register }; diff --git a/src/routes/session_parser.ts b/src/routes/session_parser.ts index 431476f15..ee9918152 100644 --- a/src/routes/session_parser.ts +++ b/src/routes/session_parser.ts @@ -1,7 +1,8 @@ -import session = require("express-session"); -import sessionSecret = require('../services/session_secret'); -import dataDir = require('../services/data_dir'); -const FileStore = require('session-file-store')(session); +import session from "express-session"; +import sessionFileStore from "session-file-store"; +import sessionSecret from "../services/session_secret.js"; +import dataDir from "../services/data_dir.js"; +const FileStore = sessionFileStore(session); const sessionParser = session({ secret: sessionSecret, @@ -19,4 +20,4 @@ const sessionParser = session({ }) }); -export = sessionParser; +export default sessionParser; diff --git a/src/routes/setup.ts b/src/routes/setup.ts index 1d3521f4a..2d6c43e0d 100644 --- a/src/routes/setup.ts +++ b/src/routes/setup.ts @@ -1,10 +1,10 @@ "use strict"; -import sqlInit = require('../services/sql_init'); -import setupService = require('../services/setup'); -import utils = require('../services/utils'); -import assetPath = require('../services/asset_path'); -import appPath = require('../services/app_path'); +import sqlInit from "../services/sql_init.js"; +import setupService from "../services/setup.js"; +import utils from "../services/utils.js"; +import assetPath from "../services/asset_path.js"; +import appPath from "../services/app_path.js"; import { Request, Response } from 'express'; function setupPage(req: Request, res: Response) { @@ -38,6 +38,6 @@ function setupPage(req: Request, res: Response) { }); } -export = { +export default { setupPage }; diff --git a/src/services/anonymization.ts b/src/services/anonymization.ts index 4e17058a7..8c34122b6 100644 --- a/src/services/anonymization.ts +++ b/src/services/anonymization.ts @@ -1,10 +1,10 @@ -import BUILTIN_ATTRIBUTES = require('./builtin_attributes'); -import fs = require("fs-extra"); -import dataDir = require('./data_dir'); -import dateUtils = require('./date_utils'); -import Database = require("better-sqlite3"); -import sql = require('./sql'); -import path = require("path"); +import BUILTIN_ATTRIBUTES from "./builtin_attributes.js"; +import fs from "fs-extra"; +import dataDir from "./data_dir.js"; +import dateUtils from "./date_utils.js"; +import Database from "better-sqlite3"; +import sql from "./sql.js"; +import path from "path"; function getFullAnonymizationScript() { // we want to delete all non-builtin attributes because they can contain sensitive names and values @@ -90,7 +90,7 @@ function getExistingAnonymizedDatabases() { })); } -export = { +export default { getFullAnonymizationScript, createAnonymizedCopy, getExistingAnonymizedDatabases diff --git a/src/services/app_icon.ts b/src/services/app_icon.ts index 7a2a7dedf..c6361687c 100644 --- a/src/services/app_icon.ts +++ b/src/services/app_icon.ts @@ -1,12 +1,12 @@ "use strict"; -import path = require('path'); -import resourceDir = require('./resource_dir'); -import log = require('./log'); -import os = require('os'); -import fs = require('fs'); -import config = require('./config'); -import utils = require('./utils'); +import path from "path"; +import resourceDir from "./resource_dir.js"; +import log from "./log.js"; +import os from "os"; +import fs from "fs"; +import config from "./config.js"; +import utils from "./utils.js"; const template = `[Desktop Entry] Type=Application @@ -68,6 +68,6 @@ function getExePath() { return path.resolve(resourceDir.ELECTRON_APP_ROOT_DIR, 'trilium'); } -export = { +export default { installLocalAppIcon }; diff --git a/src/services/app_info.ts b/src/services/app_info.ts index 92bf2dee1..359a40355 100644 --- a/src/services/app_info.ts +++ b/src/services/app_info.ts @@ -1,14 +1,14 @@ "use strict"; -import build = require('./build'); -import packageJson = require('../../package.json'); -import dataDir = require('./data_dir'); +import build from "./build.js"; +import packageJson from "../../package.json"; +import dataDir from "./data_dir.js"; const APP_DB_VERSION = 228; const SYNC_VERSION = 32; const CLIPPER_PROTOCOL_VERSION = "1.0"; -export = { +export default { appVersion: packageJson.version, dbVersion: APP_DB_VERSION, nodeVersion: process.version, diff --git a/src/services/app_path.ts b/src/services/app_path.ts index 3bfa7de40..6d5e02231 100644 --- a/src/services/app_path.ts +++ b/src/services/app_path.ts @@ -1,6 +1,6 @@ -import assetPath = require('./asset_path'); -import env = require('./env'); +import assetPath from "./asset_path.js"; +import env from "./env.js"; -export = env.isDev() +export default env.isDev() ? assetPath + "/app" : assetPath + "/app-dist"; diff --git a/src/services/asset_path.ts b/src/services/asset_path.ts index 53ffebba9..72a21fdb9 100644 --- a/src/services/asset_path.ts +++ b/src/services/asset_path.ts @@ -1,3 +1,3 @@ -import packageJson = require('../../package.json'); +import packageJson from "../../package.json"; -export = `assets/v${packageJson.version}`; +export default `assets/v${packageJson.version}`; diff --git a/src/services/attribute_formatter.ts b/src/services/attribute_formatter.ts index a7b4b7500..cdc642878 100644 --- a/src/services/attribute_formatter.ts +++ b/src/services/attribute_formatter.ts @@ -47,6 +47,6 @@ function formatValue(val: string) { } } -export = { +export default { formatAttrForSearch }; diff --git a/src/services/attributes.ts b/src/services/attributes.ts index 0ae77dc36..960482c4c 100644 --- a/src/services/attributes.ts +++ b/src/services/attributes.ts @@ -1,12 +1,12 @@ "use strict"; -import searchService = require('./search/services/search'); -import sql = require('./sql'); -import becca = require('../becca/becca'); -import BAttribute = require('../becca/entities/battribute'); -import attributeFormatter = require('./attribute_formatter'); -import BUILTIN_ATTRIBUTES = require('./builtin_attributes'); -import BNote = require('../becca/entities/bnote'); +import searchService from "./search/services/search.js"; +import sql from "./sql.js"; +import becca from "../becca/becca.js"; +import BAttribute from "../becca/entities/battribute.js"; +import attributeFormatter from "./attribute_formatter.js"; +import BUILTIN_ATTRIBUTES from "./builtin_attributes.js"; +import BNote from "../becca/entities/bnote.js"; import { AttributeRow } from '../becca/entities/rows'; const ATTRIBUTE_TYPES = ['label', 'relation']; @@ -110,7 +110,7 @@ function isAttributeDangerous(type: string, name: string): boolean { ); } -export = { +export default { getNotesWithLabel, getNoteWithLabel, createLabel, diff --git a/src/services/auth.ts b/src/services/auth.ts index 39f2b430e..68864a860 100644 --- a/src/services/auth.ts +++ b/src/services/auth.ts @@ -1,12 +1,12 @@ "use strict"; -import etapiTokenService = require('./etapi_tokens'); -import log = require('./log'); -import sqlInit = require('./sql_init'); -import utils = require('./utils'); -import passwordEncryptionService = require('./encryption/password_encryption'); -import config = require('./config'); -import passwordService = require('./encryption/password'); +import etapiTokenService from "./etapi_tokens.js"; +import log from "./log.js"; +import sqlInit from "./sql_init.js"; +import utils from "./utils.js"; +import passwordEncryptionService from "./encryption/password_encryption.js"; +import config from "./config.js"; +import passwordService from "./encryption/password.js"; import type { NextFunction, Request, Response } from 'express'; import { AppRequest } from '../routes/route-interface'; @@ -126,7 +126,7 @@ function checkCredentials(req: AppRequest, res: Response, next: NextFunction) { } } -export = { +export default { checkAuth, checkApiAuth, checkAppInitialized, diff --git a/src/services/backend_script_api.ts b/src/services/backend_script_api.ts index 29acac388..6d31a31b0 100644 --- a/src/services/backend_script_api.ts +++ b/src/services/backend_script_api.ts @@ -1,35 +1,35 @@ -import log = require('./log'); -import noteService = require('./notes'); -import sql = require('./sql'); -import utils = require('./utils'); -import attributeService = require('./attributes'); -import dateNoteService = require('./date_notes'); -import treeService = require('./tree'); -import config = require('./config'); -import axios = require('axios'); -import dayjs = require('dayjs'); -import xml2js = require('xml2js'); -import cloningService = require('./cloning'); -import appInfo = require('./app_info'); -import searchService = require('./search/services/search'); -import SearchContext = require('./search/search_context'); -import becca = require('../becca/becca'); -import ws = require('./ws'); -import SpacedUpdate = require('./spaced_update'); -import specialNotesService = require('./special_notes'); -import branchService = require('./branches'); -import exportService = require('./export/zip'); -import syncMutex = require('./sync_mutex'); -import backupService = require('./backup'); -import optionsService = require('./options'); -import BNote = require('../becca/entities/bnote'); -import AbstractBeccaEntity = require('../becca/entities/abstract_becca_entity'); -import BBranch = require('../becca/entities/bbranch'); -import BAttribute = require('../becca/entities/battribute'); -import BAttachment = require('../becca/entities/battachment'); -import BRevision = require('../becca/entities/brevision'); -import BEtapiToken = require('../becca/entities/betapi_token'); -import BOption = require('../becca/entities/boption'); +import log from "./log.js"; +import noteService from "./notes.js"; +import sql from "./sql.js"; +import utils from "./utils.js"; +import attributeService from "./attributes.js"; +import dateNoteService from "./date_notes.js"; +import treeService from "./tree.js"; +import config from "./config.js"; +import axios from "axios"; +import dayjs from "dayjs"; +import xml2js from "xml2js"; +import cloningService from "./cloning.js"; +import appInfo from "./app_info.js"; +import searchService from "./search/services/search.js"; +import SearchContext from "./search/search_context.js"; +import becca from "../becca/becca.js"; +import ws from "./ws.js"; +import SpacedUpdate from "./spaced_update.js"; +import specialNotesService from "./special_notes.js"; +import branchService from "./branches.js"; +import exportService from "./export/zip.js"; +import syncMutex from "./sync_mutex.js"; +import backupService from "./backup.js"; +import optionsService from "./options.js"; +import BNote from "../becca/entities/bnote.js"; +import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; +import BBranch from "../becca/entities/bbranch.js"; +import BAttribute from "../becca/entities/battribute.js"; +import BAttachment from "../becca/entities/battachment.js"; +import BRevision from "../becca/entities/brevision.js"; +import BEtapiToken from "../becca/entities/betapi_token.js"; +import BOption from "../becca/entities/boption.js"; import { AttributeRow, AttributeType, NoteType } from '../becca/entities/rows'; import Becca from '../becca/becca-interface'; import { NoteParams } from './note-interface'; @@ -651,6 +651,6 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) { } } -export = BackendScriptApi as any as { +export default BackendScriptApi as any as { new (currentNote: BNote, apiParams: ApiParams): Api }; diff --git a/src/services/backend_script_api_interface.ts b/src/services/backend_script_api_interface.ts index 5ffdf56c5..a315a1d24 100644 --- a/src/services/backend_script_api_interface.ts +++ b/src/services/backend_script_api_interface.ts @@ -1,6 +1,6 @@ import { Request, Response } from "express"; -import AbstractBeccaEntity = require("../becca/entities/abstract_becca_entity"); -import BNote = require("../becca/entities/bnote"); +import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; +import BNote from "../becca/entities/bnote.js"; export interface ApiParams { startNote?: BNote | null; diff --git a/src/services/backup.ts b/src/services/backup.ts index 3000c9c9a..f9cad0a02 100644 --- a/src/services/backup.ts +++ b/src/services/backup.ts @@ -1,14 +1,14 @@ "use strict"; -import dateUtils = require('./date_utils'); -import optionService = require('./options'); -import fs = require('fs-extra'); -import dataDir = require('./data_dir'); -import log = require('./log'); -import syncMutexService = require('./sync_mutex'); -import cls = require('./cls'); -import sql = require('./sql'); -import path = require('path'); +import dateUtils from "./date_utils.js"; +import optionService from "./options.js"; +import fs from "fs-extra"; +import dataDir from "./data_dir.js"; +import log from "./log.js"; +import syncMutexService from "./sync_mutex.js"; +import cls from "./cls.js"; +import sql from "./sql.js"; +import path from "path"; type BackupType = ("daily" | "weekly" | "monthly"); @@ -75,7 +75,7 @@ if (!fs.existsSync(dataDir.BACKUP_DIR)) { fs.mkdirSync(dataDir.BACKUP_DIR, 0o700); } -export = { +export default { getExistingBackups, backupNow, regularBackup diff --git a/src/services/blob.ts b/src/services/blob.ts index 41d23adc5..3226b88af 100644 --- a/src/services/blob.ts +++ b/src/services/blob.ts @@ -1,7 +1,7 @@ -import becca = require('../becca/becca'); -import NotFoundError = require('../errors/not_found_error'); -import protectedSessionService = require('./protected_session'); -import utils = require('./utils'); +import becca from "../becca/becca.js"; +import NotFoundError from "../errors/not_found_error.js"; +import protectedSessionService from "./protected_session.js"; +import utils from "./utils.js"; import type { Blob } from "./blob-interface"; function getBlobPojo(entityName: string, entityId: string, opts?: { preview: boolean }) { @@ -54,7 +54,7 @@ function calculateContentHash({blobId, content}: Blob) { return utils.hash(`${blobId}|${content.toString()}`); } -export = { +export default { getBlobPojo, processContent, calculateContentHash diff --git a/src/services/branches.ts b/src/services/branches.ts index 8e6971560..88454c4ab 100644 --- a/src/services/branches.ts +++ b/src/services/branches.ts @@ -1,6 +1,6 @@ -import treeService = require('./tree'); -import sql = require('./sql'); -import BBranch = require('../becca/entities/bbranch.js'); +import treeService from "./tree.js"; +import sql from "./sql.js"; +import BBranch from "../becca/entities/bbranch.js"; function moveBranchToNote(branchToMove: BBranch, targetParentNoteId: string) { if (branchToMove.parentNoteId === targetParentNoteId) { @@ -44,7 +44,7 @@ function moveBranchToBranch(branchToMove: BBranch, targetParentBranch: BBranch, return res; } -export = { +export default { moveBranchToBranch, moveBranchToNote }; diff --git a/src/services/build.ts b/src/services/build.ts index 71e95ea49..4fd5c6288 100644 --- a/src/services/build.ts +++ b/src/services/build.ts @@ -1,4 +1,4 @@ -export = { +export default { buildDate: "2024-07-21T10:25:01Z", buildRevision: "715a952148ae6e83fda0886f5ceec8dc329972ae" }; diff --git a/src/services/builtin_attributes.ts b/src/services/builtin_attributes.ts index 6ccabb4e1..649647b77 100644 --- a/src/services/builtin_attributes.ts +++ b/src/services/builtin_attributes.ts @@ -1,4 +1,4 @@ -export = [ +export default [ // label names { type: 'label', name: 'inbox' }, { type: 'label', name: 'disableVersioning' }, diff --git a/src/services/bulk_actions.ts b/src/services/bulk_actions.ts index 8abc11460..64c180405 100644 --- a/src/services/bulk_actions.ts +++ b/src/services/bulk_actions.ts @@ -1,10 +1,10 @@ -import log = require('./log'); -import becca = require('../becca/becca'); -import cloningService = require('./cloning'); -import branchService = require('./branches'); -import utils = require('./utils'); -import eraseService = require("./erase"); -import BNote = require('../becca/entities/bnote'); +import log from "./log.js"; +import becca from "../becca/becca.js"; +import cloningService from "./cloning.js"; +import branchService from "./branches.js"; +import utils from "./utils.js"; +import eraseService from "./erase.js"; +import BNote from "../becca/entities/bnote.js"; interface Action { labelName: string; @@ -111,7 +111,7 @@ const ACTION_HANDLERS: Record = { res = branchService.moveBranchToNote(note.getParentBranches()[0], action.targetParentNoteId); } - if (!res.success) { + if ("success" in res && !res.success) { log.info(`Moving/cloning note ${note.noteId} to ${action.targetParentNoteId} failed with error ${JSON.stringify(res)}`); } }, @@ -172,6 +172,6 @@ function executeActions(note: BNote, searchResultNoteIds: string[] | Set } } -export = { +export default { executeActions }; diff --git a/src/services/cloning.ts b/src/services/cloning.ts index 36c61a653..1176ff37a 100644 --- a/src/services/cloning.ts +++ b/src/services/cloning.ts @@ -1,18 +1,28 @@ "use strict"; -const sql = require('./sql'); -const eventChangesService = require('./entity_changes'); -const treeService = require('./tree'); -const BBranch = require('../becca/entities/bbranch'); -const becca = require('../becca/becca'); -const log = require('./log'); +import sql from './sql'; +import eventChangesService from './entity_changes'; +import treeService from './tree'; +import BBranch from '../becca/entities/bbranch'; +import becca from '../becca/becca'; +import log from './log'; -function cloneNoteToParentNote(noteId: string, parentNoteId: string, prefix: string | null = null) { +export interface CloneResponse { + success: boolean; + message?: string; + branchId?: string; + notePath?: string; +} + +function cloneNoteToParentNote(noteId: string, parentNoteId: string, prefix: string | null = null): CloneResponse { if (!(noteId in becca.notes) || !(parentNoteId in becca.notes)) { return { success: false, message: 'Note cannot be cloned because either the cloned note or the intended parent is deleted.' }; } const parentNote = becca.getNote(parentNoteId); + if (!parentNote) { + return { success: false, message: 'Note cannot be cloned because the parent note could not be found.' }; + } if (parentNote.type === 'search') { return { @@ -31,7 +41,7 @@ function cloneNoteToParentNote(noteId: string, parentNoteId: string, prefix: str noteId: noteId, parentNoteId: parentNoteId, prefix: prefix, - isExpanded: 0 + isExpanded: false }).save(); log.info(`Cloned note '${noteId}' to a new parent note '${parentNoteId}' with prefix '${prefix}'`); @@ -43,7 +53,7 @@ function cloneNoteToParentNote(noteId: string, parentNoteId: string, prefix: str }; } -function cloneNoteToBranch(noteId: string, parentBranchId: string, prefix: string) { +function cloneNoteToBranch(noteId: string, parentBranchId: string, prefix?: string) { const parentBranch = becca.getBranch(parentBranchId); if (!parentBranch) { @@ -67,6 +77,9 @@ function ensureNoteIsPresentInParent(noteId: string, parentNoteId: string, prefi const parentNote = becca.getNote(parentNoteId); + if (!parentNote) { + return { branch: null, success: false, message: "Can't find parent note." }; + } if (parentNote.type === 'search') { return { branch: null, success: false, message: "Can't clone into a search note" }; } @@ -81,7 +94,7 @@ function ensureNoteIsPresentInParent(noteId: string, parentNoteId: string, prefi noteId: noteId, parentNoteId: parentNoteId, prefix: prefix, - isExpanded: 0 + isExpanded: false }).save(); log.info(`Ensured note '${noteId}' is in parent note '${parentNoteId}' with prefix '${branch.prefix}'`); @@ -90,7 +103,7 @@ function ensureNoteIsPresentInParent(noteId: string, parentNoteId: string, prefi } function ensureNoteIsAbsentFromParent(noteId: string, parentNoteId: string) { - const branchId = sql.getValue(`SELECT branchId FROM branches WHERE noteId = ? AND parentNoteId = ? AND isDeleted = 0`, [noteId, parentNoteId]); + const branchId = sql.getValue(`SELECT branchId FROM branches WHERE noteId = ? AND parentNoteId = ? AND isDeleted = 0`, [noteId, parentNoteId]); const branch = becca.getBranch(branchId); if (branch) { @@ -137,13 +150,13 @@ function cloneNoteAfter(noteId: string, afterBranchId: string) { if (!(noteId in becca.notes)) { return { success: false, message: `Note to be cloned '${noteId}' is deleted or does not exist.` }; - } else if (!(afterNote.parentNoteId in becca.notes)) { - return { success: false, message: `After note '${afterNote.parentNoteId}' is deleted or does not exist.` }; + } else if (!afterNote || !(afterNote.parentNoteId in becca.notes)) { + return { success: false, message: `After note '${afterNote?.parentNoteId}' is deleted or does not exist.` }; } const parentNote = becca.getNote(afterNote.parentNoteId); - if (parentNote.type === 'search') { + if (!parentNote || parentNote.type === 'search') { return { success: false, message: "Can't clone into a search note" @@ -167,7 +180,7 @@ function cloneNoteAfter(noteId: string, afterBranchId: string) { noteId: noteId, parentNoteId: afterNote.parentNoteId, notePosition: afterNote.notePosition + 10, - isExpanded: 0 + isExpanded: false }).save(); log.info(`Cloned note '${noteId}' into parent note '${afterNote.parentNoteId}' after note '${afterNote.noteId}', branch '${afterBranchId}'`); @@ -175,7 +188,7 @@ function cloneNoteAfter(noteId: string, afterBranchId: string) { return { success: true, branchId: branch.branchId }; } -export = { +export default { cloneNoteToBranch, cloneNoteToParentNote, ensureNoteIsPresentInParent, diff --git a/src/services/cls.ts b/src/services/cls.ts index d119c8a93..e40038640 100644 --- a/src/services/cls.ts +++ b/src/services/cls.ts @@ -1,4 +1,4 @@ -import clsHooked = require('cls-hooked'); +import clsHooked from "cls-hooked"; import { EntityChange } from './entity_changes_interface'; const namespace = clsHooked.createNamespace("trilium"); @@ -96,7 +96,7 @@ function ignoreEntityChangeIds() { namespace.set('ignoreEntityChangeIds', true); } -export = { +export default { init, wrap, get, diff --git a/src/services/config.ts b/src/services/config.ts index f0437a2d1..a5469efb5 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -1,10 +1,10 @@ "use strict"; -import ini = require('ini'); -import fs = require('fs'); -import dataDir = require('./data_dir'); -import path = require('path'); -import resourceDir = require('./resource_dir'); +import ini from "ini"; +import fs from "fs"; +import dataDir from "./data_dir.js"; +import path from "path"; +import resourceDir from "./resource_dir.js"; const configSampleFilePath = path.resolve(resourceDir.RESOURCE_DIR, "config-sample.ini"); @@ -16,4 +16,4 @@ if (!fs.existsSync(dataDir.CONFIG_INI_PATH)) { const config = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, 'utf-8')); -export = config; +export default config; diff --git a/src/services/consistency_checks.ts b/src/services/consistency_checks.ts index 1ec432883..82e4e2216 100644 --- a/src/services/consistency_checks.ts +++ b/src/services/consistency_checks.ts @@ -1,19 +1,19 @@ "use strict"; -import sql = require('./sql'); -import sqlInit = require('./sql_init'); -import log = require('./log'); -import ws = require('./ws'); -import syncMutexService = require('./sync_mutex'); -import cls = require('./cls'); -import entityChangesService = require('./entity_changes'); -import optionsService = require('./options'); -import BBranch = require('../becca/entities/bbranch'); -import becca = require('../becca/becca'); -import utils = require('../services/utils'); -import eraseService = require('../services/erase'); -import sanitizeAttributeName = require('./sanitize_attribute_name'); -import noteTypesService = require('../services/note_types'); +import sql from "./sql.js"; +import sqlInit from "./sql_init.js"; +import log from "./log.js"; +import ws from "./ws.js"; +import syncMutexService from "./sync_mutex.js"; +import cls from "./cls.js"; +import entityChangesService from "./entity_changes.js"; +import optionsService from "./options.js"; +import BBranch from "../becca/entities/bbranch.js"; +import becca from "../becca/becca.js"; +import utils from "../services/utils.js"; +import eraseService from "../services/erase.js"; +import sanitizeAttributeName from "./sanitize_attribute_name.js"; +import noteTypesService from "../services/note_types.js"; import { BranchRow } from '../becca/entities/rows'; import { EntityChange } from './entity_changes_interface'; const noteTypes = noteTypesService.getNoteTypeNames(); @@ -913,7 +913,7 @@ sqlInit.dbReady.then(() => { setTimeout(cls.wrap(runPeriodicChecks), 4 * 1000); }); -export = { +export default { runOnDemandChecks, runEntityChangesChecks }; diff --git a/src/services/content_hash.ts b/src/services/content_hash.ts index 2067e177f..4e5ffc568 100644 --- a/src/services/content_hash.ts +++ b/src/services/content_hash.ts @@ -1,9 +1,9 @@ "use strict"; -import sql = require('./sql'); -import utils = require('./utils'); -import log = require('./log'); -import eraseService = require('./erase'); +import sql from "./sql.js"; +import utils from "./utils.js"; +import log from "./log.js"; +import eraseService from "./erase.js"; type SectorHash = Record; @@ -80,7 +80,7 @@ function checkContentHashes(otherHashes: Record) { return failedChecks; } -export = { +export default { getEntityHashes, checkContentHashes }; diff --git a/src/services/data_dir.ts b/src/services/data_dir.ts index 1b267850a..7009b918f 100644 --- a/src/services/data_dir.ts +++ b/src/services/data_dir.ts @@ -8,9 +8,9 @@ * - as a fallback if the previous step fails, we'll use home dir */ -import os = require('os'); -import fs = require('fs'); -import path = require('path'); +import os from "os"; +import fs from "fs"; +import path from "path"; function getAppDataDir() { let appDataDir = os.homedir(); // fallback if OS is not recognized @@ -68,7 +68,7 @@ const LOG_DIR = process.env.TRILIUM_LOG_DIR || `${DIR_SEP}log`; const ANONYMIZED_DB_DIR = process.env.TRILIUM_ANONYMIZED_DB_DIR || `${DIR_SEP}anonymized-db`; const CONFIG_INI_PATH = process.env.TRILIUM_CONFIG_INI_PATH || `${DIR_SEP}config.ini`; -export = { +export default { TRILIUM_DATA_DIR, DOCUMENT_PATH, BACKUP_DIR, diff --git a/src/services/date_notes.ts b/src/services/date_notes.ts index 989106939..465757328 100644 --- a/src/services/date_notes.ts +++ b/src/services/date_notes.ts @@ -1,14 +1,14 @@ "use strict"; -import noteService = require('./notes'); -import attributeService = require('./attributes'); -import dateUtils = require('./date_utils'); -import sql = require('./sql'); -import protectedSessionService = require('./protected_session'); -import searchService = require('../services/search/services/search'); -import SearchContext = require('../services/search/search_context'); -import hoistedNoteService = require('./hoisted_note'); -import BNote = require('../becca/entities/bnote'); +import noteService from "./notes.js"; +import attributeService from "./attributes.js"; +import dateUtils from "./date_utils.js"; +import sql from "./sql.js"; +import protectedSessionService from "./protected_session.js"; +import searchService from "../services/search/services/search.js"; +import SearchContext from "../services/search/search_context.js"; +import hoistedNoteService from "./hoisted_note.js"; +import BNote from "../becca/entities/bnote.js"; const CALENDAR_ROOT_LABEL = 'calendarRoot'; const YEAR_LABEL = 'yearNote'; @@ -226,7 +226,7 @@ function getWeekNote(dateStr: string, options: WeekNoteOpts = {}, rootNote: BNot return getDayNote(dateStr, rootNote); } -export = { +export default { getRootCalendarNote, getYearNote, getMonthNote, diff --git a/src/services/date_utils.ts b/src/services/date_utils.ts index 88b6ecb69..7c882e55e 100644 --- a/src/services/date_utils.ts +++ b/src/services/date_utils.ts @@ -1,5 +1,5 @@ -import dayjs = require('dayjs'); -import cls = require('./cls'); +import dayjs from "dayjs"; +import cls from "./cls.js"; const LOCAL_DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSSZZ'; const UTC_DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ssZ'; @@ -95,7 +95,7 @@ function validateUtcDateTime(str: string | undefined) { } } -export = { +export default { utcNowDateTime, localNowDateTime, localNowDate, diff --git a/src/services/encryption/data_encryption.ts b/src/services/encryption/data_encryption.ts index b82a0e8c6..2088db6bf 100644 --- a/src/services/encryption/data_encryption.ts +++ b/src/services/encryption/data_encryption.ts @@ -1,7 +1,7 @@ "use strict"; -import crypto = require('crypto'); -import log = require('../log'); +import crypto from "crypto"; +import log from "../log.js"; function arraysIdentical(a: any[] | Buffer, b: any[] | Buffer) { let i = a.length; @@ -112,7 +112,7 @@ function decryptString(dataKey: Buffer, cipherText: string) { return buffer.toString('utf-8'); } -export = { +export default { encrypt, decrypt, decryptString diff --git a/src/services/encryption/my_scrypt.ts b/src/services/encryption/my_scrypt.ts index c80632bc0..658f4f230 100644 --- a/src/services/encryption/my_scrypt.ts +++ b/src/services/encryption/my_scrypt.ts @@ -1,7 +1,7 @@ "use strict"; -import optionService = require('../options'); -import crypto = require('crypto'); +import optionService from "../options.js"; +import crypto from "crypto"; function getVerificationHash(password: crypto.BinaryLike) { const salt = optionService.getOption('passwordVerificationSalt'); @@ -22,7 +22,7 @@ function getScryptHash(password: crypto.BinaryLike, salt: crypto.BinaryLike) { return hashed; } -export = { +export default { getVerificationHash, getPasswordDerivedKey }; diff --git a/src/services/encryption/password.ts b/src/services/encryption/password.ts index 4d6bf66a3..89ed7add8 100644 --- a/src/services/encryption/password.ts +++ b/src/services/encryption/password.ts @@ -1,10 +1,10 @@ "use strict"; -import sql = require('../sql'); -import optionService = require('../options'); -import myScryptService = require('./my_scrypt'); -import utils = require('../utils'); -import passwordEncryptionService = require('./password_encryption'); +import sql from "../sql.js"; +import optionService from "../options.js"; +import myScryptService from "./my_scrypt.js"; +import utils from "../utils.js"; +import passwordEncryptionService from "./password_encryption.js"; function isPasswordSet() { return !!sql.getValue("SELECT value FROM options WHERE name = 'passwordVerificationHash'"); @@ -78,7 +78,7 @@ function resetPassword() { }; } -export = { +export default { isPasswordSet, changePassword, setPassword, diff --git a/src/services/encryption/password_encryption.ts b/src/services/encryption/password_encryption.ts index 36420d03d..de4277d58 100644 --- a/src/services/encryption/password_encryption.ts +++ b/src/services/encryption/password_encryption.ts @@ -1,7 +1,7 @@ -import optionService = require('../options'); -import myScryptService = require('./my_scrypt'); -import utils = require('../utils'); -import dataEncryptionService = require('./data_encryption'); +import optionService from "../options.js"; +import myScryptService from "./my_scrypt.js"; +import utils from "../utils.js"; +import dataEncryptionService from "./data_encryption.js"; function verifyPassword(password: string) { const givenPasswordHash = utils.toBase64(myScryptService.getVerificationHash(password)); @@ -33,7 +33,7 @@ function getDataKey(password: string) { return decryptedDataKey; } -export = { +export default { verifyPassword, getDataKey, setDataKey diff --git a/src/services/entity_changes.ts b/src/services/entity_changes.ts index 91f84f834..06c380f38 100644 --- a/src/services/entity_changes.ts +++ b/src/services/entity_changes.ts @@ -1,13 +1,14 @@ -import sql = require('./sql'); -import dateUtils = require('./date_utils'); -import log = require('./log'); -import cls = require('./cls'); -import utils = require('./utils'); -import instanceId = require('./instance_id'); -import becca = require('../becca/becca'); -import blobService = require('../services/blob'); +import sql from "./sql.js"; +import dateUtils from "./date_utils.js"; +import log from "./log.js"; +import cls from "./cls.js"; +import utils from "./utils.js"; +import instanceId from "./instance_id.js"; +import becca from "../becca/becca.js"; +import blobService from "../services/blob.js"; import { EntityChange } from './entity_changes_interface'; import type { Blob } from "./blob-interface"; +import eventService from "./events.js"; let maxEntityChangeId = 0; @@ -57,8 +58,6 @@ function putNoteReorderingEntityChange(parentNoteId: string, componentId?: strin instanceId }); - const eventService = require('./events'); - eventService.emit(eventService.ENTITY_CHANGED, { entityName: 'note_reordering', entity: sql.getMap(`SELECT branchId, notePosition FROM branches WHERE isDeleted = 0 AND parentNoteId = ?`, [parentNoteId]) @@ -193,7 +192,7 @@ function recalculateMaxEntityChangeId() { maxEntityChangeId = sql.getValue("SELECT COALESCE(MAX(id), 0) FROM entity_changes"); } -export = { +export default { putNoteReorderingEntityChange, putEntityChangeForOtherInstances, putEntityChangeWithForcedChange, diff --git a/src/services/env.ts b/src/services/env.ts index 23c94ee0f..28f39fea6 100644 --- a/src/services/env.ts +++ b/src/services/env.ts @@ -2,6 +2,6 @@ function isDev() { return !!(process.env.TRILIUM_ENV && process.env.TRILIUM_ENV === 'dev'); } -export = { +export default { isDev }; \ No newline at end of file diff --git a/src/services/erase.ts b/src/services/erase.ts index 6e6804f3d..5b7261ec9 100644 --- a/src/services/erase.ts +++ b/src/services/erase.ts @@ -1,11 +1,11 @@ -import sql = require("./sql"); -import revisionService = require("./revisions"); -import log = require("./log"); -import entityChangesService = require("./entity_changes"); -import optionService = require("./options"); -import dateUtils = require("./date_utils"); -import sqlInit = require("./sql_init"); -import cls = require("./cls"); +import sql from "./sql.js"; +import revisionService from "./revisions.js"; +import log from "./log.js"; +import entityChangesService from "./entity_changes.js"; +import optionService from "./options.js"; +import dateUtils from "./date_utils.js"; +import sqlInit from "./sql_init.js"; +import cls from "./cls.js"; import { EntityChange } from "./entity_changes_interface"; function eraseNotes(noteIdsToErase: string[]) { @@ -186,7 +186,7 @@ sqlInit.dbReady.then(() => { setInterval(cls.wrap(() => eraseScheduledAttachments()), 3600 * 1000); }); -export = { +export default { eraseDeletedNotesNow, eraseUnusedAttachmentsNow, eraseNotesWithDeleteId, diff --git a/src/services/etapi_tokens.ts b/src/services/etapi_tokens.ts index 2989d3923..7f8d1cd2f 100644 --- a/src/services/etapi_tokens.ts +++ b/src/services/etapi_tokens.ts @@ -1,7 +1,7 @@ -import becca = require('../becca/becca'); -import utils = require('./utils'); -import BEtapiToken = require('../becca/entities/betapi_token'); -import crypto = require("crypto"); +import becca from "../becca/becca.js"; +import utils from "./utils.js"; +import BEtapiToken from "../becca/entities/betapi_token.js"; +import crypto from "crypto"; function getTokens() { return becca.getEtapiTokens(); @@ -114,7 +114,7 @@ function deleteToken(etapiTokenId: string) { etapiToken.markAsDeletedSimple(); } -export = { +export default { getTokens, createToken, renameToken, diff --git a/src/services/events.ts b/src/services/events.ts index 0eda326b9..8b64d5af0 100644 --- a/src/services/events.ts +++ b/src/services/events.ts @@ -1,4 +1,4 @@ -const log = require('./log'); +import log from "./log"; const NOTE_TITLE_CHANGED = "NOTE_TITLE_CHANGED"; const ENTER_PROTECTED_SESSION = "ENTER_PROTECTED_SESSION"; @@ -59,7 +59,7 @@ function emit(eventType: string, data?: any) { } } -export = { +export default { subscribe, subscribeBeccaLoader, emit, diff --git a/src/services/export/md.ts b/src/services/export/md.ts index 3e6754c1c..84af6f56f 100644 --- a/src/services/export/md.ts +++ b/src/services/export/md.ts @@ -1,7 +1,7 @@ "use strict"; -import TurndownService = require('turndown'); -import turndownPluginGfm = require('joplin-turndown-plugin-gfm'); +import TurndownService from "turndown"; +import turndownPluginGfm from "joplin-turndown-plugin-gfm"; let instance: TurndownService | null = null; @@ -14,6 +14,6 @@ function toMarkdown(content: string) { return instance.turndown(content); } -export = { +export default { toMarkdown }; diff --git a/src/services/export/opml.ts b/src/services/export/opml.ts index 63bdf14fd..c67e1378c 100644 --- a/src/services/export/opml.ts +++ b/src/services/export/opml.ts @@ -1,9 +1,9 @@ "use strict"; -import utils = require('../utils'); -import becca = require('../../becca/becca'); -import TaskContext = require('../task_context'); -import BBranch = require('../../becca/entities/bbranch'); +import utils from "../utils.js"; +import becca from "../../becca/becca.js"; +import TaskContext from "../task_context.js"; +import BBranch from "../../becca/entities/bbranch.js"; import { Response } from 'express'; function exportToOpml(taskContext: TaskContext, branch: BBranch, version: string, res: Response) { @@ -98,6 +98,6 @@ function escapeXmlAttribute(text: string) { .replace(/'/g, '''); } -export = { +export default { exportToOpml }; diff --git a/src/services/export/single.ts b/src/services/export/single.ts index b0f46e6e8..5e68de203 100644 --- a/src/services/export/single.ts +++ b/src/services/export/single.ts @@ -1,12 +1,12 @@ "use strict"; -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 mimeTypes from "mime-types"; +import html from "html"; +import utils from "../utils.js"; +import mdService from "./md.js"; +import becca from "../../becca/becca.js"; +import TaskContext from "../task_context.js"; +import BBranch from "../../becca/entities/bbranch.js"; import { Response } from 'express'; function exportSingleNote(taskContext: TaskContext, branch: BBranch, format: "html" | "markdown", res: Response) { @@ -125,6 +125,6 @@ function inlineAttachments(content: string) { return content; } -export = { +export default { exportSingleNote }; diff --git a/src/services/export/zip.ts b/src/services/export/zip.ts index b4093c848..d198b0c92 100644 --- a/src/services/export/zip.ts +++ b/src/services/export/zip.ts @@ -1,26 +1,26 @@ "use strict"; -import html = require('html'); -import dateUtils = require('../date_utils'); -import path = require('path'); -import mimeTypes = require('mime-types'); -import mdService = require('./md'); -import packageInfo = require('../../../package.json'); -import utils = require('../utils'); -import protectedSessionService = require('../protected_session'); -import sanitize = require("sanitize-filename"); -import fs = require("fs"); -import becca = require('../../becca/becca'); -const RESOURCE_DIR = require('../../services/resource_dir').RESOURCE_DIR; -import archiver = require('archiver'); -import log = require('../log'); -import TaskContext = require('../task_context'); -import ValidationError = require('../../errors/validation_error'); -import NoteMeta = require('../meta/note_meta'); -import AttachmentMeta = require('../meta/attachment_meta'); -import AttributeMeta = require('../meta/attribute_meta'); -import BBranch = require('../../becca/entities/bbranch'); +import html from "html"; +import dateUtils from "../date_utils.js"; +import path from "path"; +import mimeTypes from "mime-types"; +import mdService from "./md.js"; +import packageInfo from "../../../package.json"; +import utils from "../utils.js"; +import protectedSessionService from "../protected_session.js"; +import sanitize from "sanitize-filename"; +import fs from "fs"; +import becca from "../../becca/becca.js"; +import archiver from "archiver"; +import log from "../log.js"; +import TaskContext from "../task_context.js"; +import ValidationError from "../../errors/validation_error.js"; +import NoteMeta from "../meta/note_meta.js"; +import AttachmentMeta from "../meta/attachment_meta.js"; +import AttributeMeta from "../meta/attribute_meta.js"; +import BBranch from "../../becca/entities/bbranch.js"; import { Response } from 'express'; +import { RESOURCE_DIR } from "../resource_dir.js"; async function exportToZip(taskContext: TaskContext, branch: BBranch, format: "html" | "markdown", res: Response | fs.WriteStream, setHeaders = true) { if (!['html', 'markdown'].includes(format)) { @@ -582,7 +582,7 @@ async function exportToZipFile(noteId: string, format: "markdown" | "html", zipF log.info(`Exported '${noteId}' with format '${format}' to '${zipFilePath}'`); } -export = { +export default { exportToZip, exportToZipFile }; diff --git a/src/services/handlers.ts b/src/services/handlers.ts index 9e10b778a..dca0fba8e 100644 --- a/src/services/handlers.ts +++ b/src/services/handlers.ts @@ -1,13 +1,13 @@ -import eventService = require('./events'); -import scriptService = require('./script'); -import treeService = require('./tree'); -import noteService = require('./notes'); -import becca = require('../becca/becca'); -import BAttribute = require('../becca/entities/battribute'); -import hiddenSubtreeService = require('./hidden_subtree'); -import oneTimeTimer = require('./one_time_timer'); -import BNote = require('../becca/entities/bnote'); -import AbstractBeccaEntity = require('../becca/entities/abstract_becca_entity'); +import eventService from "./events.js"; +import scriptService from "./script.js"; +import treeService from "./tree.js"; +import noteService from "./notes.js"; +import becca from "../becca/becca.js"; +import BAttribute from "../becca/entities/battribute.js"; +import hiddenSubtreeService from "./hidden_subtree.js"; +import oneTimeTimer from "./one_time_timer.js"; +import BNote from "../becca/entities/bnote.js"; +import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; import { DefinitionObject } from './promoted_attribute_definition_interface'; type Handler = (definition: DefinitionObject, note: BNote, targetNote: BNote) => void; @@ -249,6 +249,6 @@ eventService.subscribe(eventService.ENTITY_DELETED, ({ entityName, entity }) => } }); -export = { +export default { runAttachedRelations }; diff --git a/src/services/hidden_subtree.ts b/src/services/hidden_subtree.ts index 5478aed1c..f9979e734 100644 --- a/src/services/hidden_subtree.ts +++ b/src/services/hidden_subtree.ts @@ -1,10 +1,10 @@ -import BAttribute = require("../becca/entities/battribute"); +import BAttribute from "../becca/entities/battribute.js"; import { AttributeType, NoteType } from "../becca/entities/rows"; -import becca = require('../becca/becca'); -import noteService = require('./notes'); -import log = require('./log'); -import migrationService = require('./migration'); +import becca from "../becca/becca.js"; +import noteService from "./notes.js"; +import log from "./log.js"; +import migrationService from "./migration.js"; const LBTPL_ROOT = "_lbTplRoot"; const LBTPL_BASE = "_lbTplBase"; @@ -362,7 +362,7 @@ function checkHiddenSubtreeRecursively(parentNoteId: string, item: Item) { } } -export = { +export default { checkHiddenSubtree, LBTPL_ROOT, LBTPL_BASE, diff --git a/src/services/hoisted_note.ts b/src/services/hoisted_note.ts index fca423269..798889c46 100644 --- a/src/services/hoisted_note.ts +++ b/src/services/hoisted_note.ts @@ -1,5 +1,5 @@ -import cls = require('./cls'); -import becca = require('../becca/becca'); +import cls from "./cls.js"; +import becca from "../becca/becca.js"; function getHoistedNoteId() { return cls.getHoistedNoteId(); @@ -33,7 +33,7 @@ function getWorkspaceNote() { } } -export = { +export default { getHoistedNoteId, getWorkspaceNote, isHoistedInHiddenSubtree diff --git a/src/services/host.ts b/src/services/host.ts index 3daef1504..d8a394e6d 100644 --- a/src/services/host.ts +++ b/src/services/host.ts @@ -1,3 +1,3 @@ -import config = require('./config'); +import config from "./config.js"; -export = process.env.TRILIUM_HOST || config['Network']['host'] || '0.0.0.0'; +export default process.env.TRILIUM_HOST || config['Network']['host'] || '0.0.0.0'; diff --git a/src/services/html_sanitizer.ts b/src/services/html_sanitizer.ts index 8e82edd3c..ec76883b8 100644 --- a/src/services/html_sanitizer.ts +++ b/src/services/html_sanitizer.ts @@ -1,5 +1,5 @@ -import sanitizeHtml = require('sanitize-html'); -import sanitizeUrl = require('@braintree/sanitize-url'); +import sanitizeHtml from "sanitize-html"; +import sanitizeUrl from "@braintree/sanitize-url"; // intended mainly as protection against XSS via import // secondarily, it (partly) protects against "CSS takeover" @@ -47,7 +47,7 @@ function sanitize(dirtyHtml: string) { }); } -export = { +export default { sanitize, sanitizeUrl: (url: string) => { return sanitizeUrl.sanitizeUrl(url).trim(); diff --git a/src/services/image.ts b/src/services/image.ts index 0a95b87d6..5bef79ac9 100644 --- a/src/services/image.ts +++ b/src/services/image.ts @@ -1,17 +1,17 @@ "use strict"; -import becca = require('../becca/becca'); -import log = require('./log'); -import protectedSessionService = require('./protected_session'); -import noteService = require('./notes'); -import optionService = require('./options'); -import sql = require('./sql'); -import jimp = require('jimp'); -import imageType = require('image-type'); -import sanitizeFilename = require('sanitize-filename'); -import isSvg = require('is-svg'); -import isAnimated = require('is-animated'); -import htmlSanitizer = require('./html_sanitizer'); +import becca from "../becca/becca.js"; +import log from "./log.js"; +import protectedSessionService from "./protected_session.js"; +import noteService from "./notes.js"; +import optionService from "./options.js"; +import sql from "./sql.js"; +import jimp from "jimp"; +import imageType from "image-type"; +import sanitizeFilename from "sanitize-filename"; +import isSvg from "is-svg"; +import isAnimated from "is-animated"; +import htmlSanitizer from "./html_sanitizer.js"; async function processImage(uploadBuffer: Buffer, originalName: string, shrinkImageSwitch: boolean) { const compressImages = optionService.getOptionBool("compressImages"); @@ -156,7 +156,6 @@ function saveImageToAttachment(noteId: string, uploadBuffer: Buffer, originalNam setTimeout(() => { sql.transactional(() => { const note = becca.getNoteOrThrow(noteId); - const noteService = require('../services/notes'); noteService.asyncPostProcessContent(note, note.getContent()); // to mark an unused attachment for deletion }); }, 5000); @@ -234,7 +233,7 @@ async function resize(buffer: Buffer, quality: number) { return resultBuffer; } -export = { +export default { saveImage, saveImageToAttachment, updateImage diff --git a/src/services/import/enex.ts b/src/services/import/enex.ts index 5e715a0ca..739b418c3 100644 --- a/src/services/import/enex.ts +++ b/src/services/import/enex.ts @@ -1,17 +1,18 @@ -import sax = require("sax"); -import stream = require('stream'); +import sax from "sax"; +import stream from "stream"; import { Throttle } from 'stream-throttle'; -import log = require('../log'); -import utils = require('../utils'); -import sql = require('../sql'); -import noteService = require('../notes'); -import imageService = require('../image'); -import protectedSessionService = require('../protected_session'); -import htmlSanitizer = require('../html_sanitizer'); -import sanitizeAttributeName = require('../sanitize_attribute_name'); -import TaskContext = require("../task_context"); -import BNote = require("../../becca/entities/bnote"); +import log from "../log.js"; +import utils from "../utils.js"; +import sql from "../sql.js"; +import noteService from "../notes.js"; +import imageService from "../image.js"; +import protectedSessionService from "../protected_session.js"; +import htmlSanitizer from "../html_sanitizer.js"; +import sanitizeAttributeName from "../sanitize_attribute_name.js"; +import TaskContext from "../task_context.js"; +import BNote from "../../becca/entities/bnote.js"; import { File } from "./common"; +import { AttributeType } from "../../becca/entities/rows.js"; /** * date format is e.g. 20181121T193703Z or 2013-04-14T16:19:00.000Z (Mac evernote, see #3496) @@ -29,7 +30,7 @@ function parseDate(text: string) { } interface Attribute { - type: string; + type: AttributeType; name: string; value: string; } @@ -409,4 +410,4 @@ function importEnex(taskContext: TaskContext, file: File, parentNote: BNote): Pr }); } -export = { importEnex }; +export default { importEnex }; diff --git a/src/services/import/markdown.ts b/src/services/import/markdown.ts index 941bdbd31..b5a022d1e 100644 --- a/src/services/import/markdown.ts +++ b/src/services/import/markdown.ts @@ -1,8 +1,8 @@ "use strict"; -import marked = require("marked"); -import htmlSanitizer = require('../html_sanitizer'); -import importUtils = require('./utils'); +import marked from "marked"; +import htmlSanitizer from "../html_sanitizer.js"; +import importUtils from "./utils.js"; function renderToHtml(content: string, title: string) { const html = marked.parse(content, { @@ -12,6 +12,6 @@ function renderToHtml(content: string, title: string) { return htmlSanitizer.sanitize(h1Handled); } -export = { +export default { renderToHtml }; diff --git a/src/services/import/mime.ts b/src/services/import/mime.ts index dd4c96244..0dd1ecc84 100644 --- a/src/services/import/mime.ts +++ b/src/services/import/mime.ts @@ -1,7 +1,7 @@ "use strict"; -import mimeTypes = require('mime-types'); -import path = require('path'); +import mimeTypes from "mime-types"; +import path from "path"; import { TaskData } from '../task_context_interface'; const CODE_MIME_TYPES: Record = { @@ -110,7 +110,7 @@ function normalizeMimeType(mime: string) { return undefined; } -export = { +export default { getMime, getType, normalizeMimeType diff --git a/src/services/import/opml.ts b/src/services/import/opml.ts index 78da6764c..32a633746 100644 --- a/src/services/import/opml.ts +++ b/src/services/import/opml.ts @@ -1,11 +1,11 @@ "use strict"; -import noteService = require('../../services/notes'); -import xml2js = require("xml2js"); -import protectedSessionService = require('../protected_session'); -import htmlSanitizer = require('../html_sanitizer'); -import TaskContext = require('../task_context'); -import BNote = require('../../becca/entities/bnote'); +import noteService from "../../services/notes.js"; +import xml2js from "xml2js"; +import protectedSessionService from "../protected_session.js"; +import htmlSanitizer from "../html_sanitizer.js"; +import TaskContext from "../task_context.js"; +import BNote from "../../becca/entities/bnote.js"; const parseString = xml2js.parseString; interface OpmlXml { @@ -108,6 +108,6 @@ function toHtml(text: string) { return `

${text.replace(/(?:\r\n|\r|\n)/g, '

')}

`; } -export = { +export default { importOpml }; diff --git a/src/services/import/single.ts b/src/services/import/single.ts index 2c13386a1..be6c4adcc 100644 --- a/src/services/import/single.ts +++ b/src/services/import/single.ts @@ -1,16 +1,16 @@ "use strict"; -import BNote = require("../../becca/entities/bnote"); -import TaskContext = require("../task_context"); +import BNote from "../../becca/entities/bnote.js"; +import TaskContext from "../task_context.js"; -import noteService = require('../../services/notes'); -import imageService = require('../../services/image'); -import protectedSessionService = require('../protected_session'); -import markdownService = require('./markdown'); -import mimeService = require('./mime'); -import utils = require('../../services/utils'); -import importUtils = require('./utils'); -import htmlSanitizer = require('../html_sanitizer'); +import noteService from "../../services/notes.js"; +import imageService from "../../services/image.js"; +import protectedSessionService from "../protected_session.js"; +import markdownService from "./markdown.js"; +import mimeService from "./mime.js"; +import utils from "../../services/utils.js"; +import importUtils from "./utils.js"; +import htmlSanitizer from "../html_sanitizer.js"; import { File } from "./common"; function importSingleFile(taskContext: TaskContext, file: File, parentNote: BNote) { @@ -191,7 +191,7 @@ function importAttachment(taskContext: TaskContext, file: File, parentNote: BNot } } -export = { +export default { importSingleFile, importAttachment }; diff --git a/src/services/import/utils.ts b/src/services/import/utils.ts index 8b06f2167..b85700230 100644 --- a/src/services/import/utils.ts +++ b/src/services/import/utils.ts @@ -11,6 +11,6 @@ function handleH1(content: string, title: string) { return content; } -export = { +export default { handleH1 }; diff --git a/src/services/import/zip.ts b/src/services/import/zip.ts index 0c4008ddf..6855760af 100644 --- a/src/services/import/zip.ts +++ b/src/services/import/zip.ts @@ -1,24 +1,24 @@ "use strict"; -import BAttribute = require('../../becca/entities/battribute'); -import utils = require('../../services/utils'); -import log = require('../../services/log'); -import noteService = require('../../services/notes'); -import attributeService = require('../../services/attributes'); -import BBranch = require('../../becca/entities/bbranch'); -import path = require('path'); -import protectedSessionService = require('../protected_session'); -import mimeService = require('./mime'); -import treeService = require('../tree'); -import yauzl = require("yauzl"); -import htmlSanitizer = require('../html_sanitizer'); -import becca = require('../../becca/becca'); -import BAttachment = require('../../becca/entities/battachment'); -import markdownService = require('./markdown'); -import TaskContext = require('../task_context'); -import BNote = require('../../becca/entities/bnote'); -import NoteMeta = require('../meta/note_meta'); -import AttributeMeta = require('../meta/attribute_meta'); +import BAttribute from "../../becca/entities/battribute.js"; +import utils from "../../services/utils.js"; +import log from "../../services/log.js"; +import noteService from "../../services/notes.js"; +import attributeService from "../../services/attributes.js"; +import BBranch from "../../becca/entities/bbranch.js"; +import path from "path"; +import protectedSessionService from "../protected_session.js"; +import mimeService from "./mime.js"; +import treeService from "../tree.js"; +import yauzl from "yauzl"; +import htmlSanitizer from "../html_sanitizer.js"; +import becca from "../../becca/becca.js"; +import BAttachment from "../../becca/entities/battachment.js"; +import markdownService from "./markdown.js"; +import TaskContext from "../task_context.js"; +import BNote from "../../becca/entities/bnote.js"; +import NoteMeta from "../meta/note_meta.js"; +import AttributeMeta from "../meta/attribute_meta.js"; import { Stream } from 'stream'; import { ALLOWED_NOTE_TYPES, NoteType } from '../../becca/entities/rows'; @@ -656,6 +656,6 @@ function resolveNoteType(type: string | undefined): NoteType { } } -export = { +export default { importZip }; diff --git a/src/services/instance_id.ts b/src/services/instance_id.ts index 6e0eb503c..047325e6c 100644 --- a/src/services/instance_id.ts +++ b/src/services/instance_id.ts @@ -1,5 +1,5 @@ -import utils = require('./utils'); +import utils from "./utils.js"; const instanceId = utils.randomString(12); -export = instanceId; +export default instanceId; diff --git a/src/services/keyboard_actions.ts b/src/services/keyboard_actions.ts index 715c62684..6753388ac 100644 --- a/src/services/keyboard_actions.ts +++ b/src/services/keyboard_actions.ts @@ -1,8 +1,8 @@ "use strict"; -import optionService = require('./options'); -import log = require('./log'); -import utils = require('./utils'); +import optionService from "./options.js"; +import log from "./log.js"; +import utils from "./utils.js"; import { KeyboardShortcut } from './keyboard_actions_interface'; const isMac = process.platform === "darwin"; @@ -637,7 +637,7 @@ function getKeyboardActions() { return actions; } -export = { +export default { DEFAULT_KEYBOARD_ACTIONS, getKeyboardActions }; diff --git a/src/services/log.ts b/src/services/log.ts index 1e8d0b9e1..9bd97a2a7 100644 --- a/src/services/log.ts +++ b/src/services/log.ts @@ -1,9 +1,9 @@ "use strict"; import { Request, Response } from "express"; -import fs = require("fs"); -import dataDir = require('./data_dir'); -import cls = require('./cls'); +import fs from "fs"; +import dataDir from "./data_dir.js"; +import cls from "./cls.js"; if (!fs.existsSync(dataDir.LOG_DIR)) { fs.mkdirSync(dataDir.LOG_DIR, 0o700); @@ -50,7 +50,7 @@ function checkDate(millisSinceMidnight: number) { return millisSinceMidnight; } -function log(str: string) { +function log(str: string | Error) { const bundleNoteId = cls.get("bundleNoteId"); if (bundleNoteId) { @@ -66,11 +66,11 @@ function log(str: string) { console.log(str); } -function info(message: string) { +function info(message: string | Error) { log(message); } -function error(message: string) { +function error(message: string | Error) { log(`ERROR: ${message}`); } @@ -117,7 +117,7 @@ function formatDate() { return `${pad(todaysMidnight.getFullYear())}-${pad(todaysMidnight.getMonth() + 1)}-${pad(todaysMidnight.getDate())}`; } -export = { +export default { info, error, request diff --git a/src/services/meta/attachment_meta.ts b/src/services/meta/attachment_meta.ts index 8c237ab21..6fef1989a 100644 --- a/src/services/meta/attachment_meta.ts +++ b/src/services/meta/attachment_meta.ts @@ -7,4 +7,4 @@ interface AttachmentMeta { dataFileName: string; } -export = AttachmentMeta; +export default AttachmentMeta; diff --git a/src/services/meta/attribute_meta.ts b/src/services/meta/attribute_meta.ts index de79df913..c2f8764aa 100644 --- a/src/services/meta/attribute_meta.ts +++ b/src/services/meta/attribute_meta.ts @@ -9,4 +9,4 @@ interface AttributeMeta { position?: number; } -export = AttributeMeta; +export default AttributeMeta; diff --git a/src/services/meta/note_meta.ts b/src/services/meta/note_meta.ts index b3012f29a..a613c4781 100644 --- a/src/services/meta/note_meta.ts +++ b/src/services/meta/note_meta.ts @@ -1,5 +1,5 @@ -import AttachmentMeta = require("./attachment_meta"); -import AttributeMeta = require("./attribute_meta"); +import AttachmentMeta from "./attachment_meta.js"; +import AttributeMeta from "./attribute_meta.js"; interface NoteMeta { noteId?: string; @@ -23,4 +23,4 @@ interface NoteMeta { children?: NoteMeta[]; } -export = NoteMeta; +export default NoteMeta; diff --git a/src/services/migration.ts b/src/services/migration.ts index ca647c539..4e1f82473 100644 --- a/src/services/migration.ts +++ b/src/services/migration.ts @@ -1,11 +1,11 @@ -import backupService = require('./backup'); -import sql = require('./sql'); -import fs = require('fs-extra'); -import log = require('./log'); -import utils = require('./utils'); -import resourceDir = require('./resource_dir'); -import appInfo = require('./app_info'); -import cls = require('./cls'); +import backupService from "./backup.js"; +import sql from "./sql.js"; +import fs from "fs-extra"; +import log from "./log.js"; +import utils from "./utils.js"; +import resourceDir from "./resource_dir.js"; +import appInfo from "./app_info.js"; +import cls from "./cls.js"; interface MigrationInfo { dbVersion: number; @@ -143,7 +143,7 @@ async function migrateIfNecessary() { } } -export = { +export default { migrateIfNecessary, isDbUpToDate }; diff --git a/src/services/note_types.ts b/src/services/note_types.ts index 54d9d1f44..3828241bd 100644 --- a/src/services/note_types.ts +++ b/src/services/note_types.ts @@ -26,7 +26,7 @@ function getDefaultMimeForNoteType(typeName: string) { return typeRec.defaultMime; } -export = { +export default { getNoteTypeNames: () => noteTypes.map(nt => nt.type), getDefaultMimeForNoteType }; diff --git a/src/services/notes.ts b/src/services/notes.ts index 2e099392e..20df9948a 100644 --- a/src/services/notes.ts +++ b/src/services/notes.ts @@ -1,31 +1,32 @@ -import sql = require('./sql'); -import optionService = require('./options'); -import dateUtils = require('./date_utils'); -import entityChangesService = require('./entity_changes'); -import eventService = require('./events'); -import cls = require('../services/cls'); -import protectedSessionService = require('../services/protected_session'); -import log = require('../services/log'); -import utils = require('../services/utils'); -import revisionService = require('./revisions'); -import request = require('./request'); -import path = require('path'); -import url = require('url'); -import becca = require('../becca/becca'); -import BBranch = require('../becca/entities/bbranch'); -import BNote = require('../becca/entities/bnote'); -import BAttribute = require('../becca/entities/battribute'); -import BAttachment = require('../becca/entities/battachment'); -import dayjs = require("dayjs"); -import htmlSanitizer = require('./html_sanitizer'); -import ValidationError = require('../errors/validation_error'); -import noteTypesService = require('./note_types'); -import fs = require("fs"); -import ws = require('./ws'); -import html2plaintext = require('html2plaintext'); +import sql from "./sql.js"; +import optionService from "./options.js"; +import dateUtils from "./date_utils.js"; +import entityChangesService from "./entity_changes.js"; +import eventService from "./events.js"; +import cls from "../services/cls.js"; +import protectedSessionService from "../services/protected_session.js"; +import log from "../services/log.js"; +import utils from "../services/utils.js"; +import revisionService from "./revisions.js"; +import request from "./request.js"; +import path from "path"; +import url from "url"; +import becca from "../becca/becca.js"; +import BBranch from "../becca/entities/bbranch.js"; +import BNote from "../becca/entities/bnote.js"; +import BAttribute from "../becca/entities/battribute.js"; +import BAttachment from "../becca/entities/battachment.js"; +import dayjs from "dayjs"; +import htmlSanitizer from "./html_sanitizer.js"; +import ValidationError from "../errors/validation_error.js"; +import noteTypesService from "./note_types.js"; +import fs from "fs"; +import ws from "./ws.js"; +import html2plaintext from "html2plaintext"; import { AttachmentRow, AttributeRow, BranchRow, NoteRow, NoteType } from '../becca/entities/rows'; -import TaskContext = require('./task_context'); +import TaskContext from "./task_context.js"; import { NoteParams } from './note-interface'; +import imageService from "./image.js"; interface FoundLink { name: "imageLink" | "internalLink" | "includeNoteLink" | "relationMapLink", @@ -466,7 +467,7 @@ async function downloadImage(noteId: string, imageUrl: string) { const unescapedUrl = utils.unescapeHtml(imageUrl); try { - let imageBuffer; + let imageBuffer: Buffer; if (imageUrl.toLowerCase().startsWith("file://")) { imageBuffer = await new Promise((res, rej) => { @@ -487,10 +488,13 @@ async function downloadImage(noteId: string, imageUrl: string) { const parsedUrl = url.parse(unescapedUrl); const title = path.basename(parsedUrl.pathname || ""); - const imageService = require('../services/image'); const attachment = imageService.saveImageToAttachment(noteId, imageBuffer, title, true, true); - - imageUrlToAttachmentIdMapping[imageUrl] = attachment.attachmentId; + + if (attachment.attachmentId) { + imageUrlToAttachmentIdMapping[imageUrl] = attachment.attachmentId; + } else { + log.error(`Download of '${imageUrl}' due to no attachment ID.`); + } log.info(`Download of '${imageUrl}' succeeded and was saved as image attachment '${attachment.attachmentId}' of note '${noteId}'`); } @@ -520,7 +524,6 @@ function downloadImages(noteId: string, content: string) { const imageBase64 = url.substr(inlineImageMatch[0].length); const imageBuffer = Buffer.from(imageBase64, 'base64'); - const imageService = require('../services/image'); const attachment = imageService.saveImageToAttachment(noteId, imageBuffer, "inline image", true, true); const encodedTitle = encodeURIComponent(attachment.title); @@ -1037,7 +1040,7 @@ function getNoteIdMapping(origNote: BNote) { return noteIdMapping; } -export = { +export default { createNewNote, createNewNoteWithTarget, updateNoteData, diff --git a/src/services/one_time_timer.ts b/src/services/one_time_timer.ts index 033a8b3c1..f2f514568 100644 --- a/src/services/one_time_timer.ts +++ b/src/services/one_time_timer.ts @@ -20,6 +20,6 @@ function scheduleExecution(name: string, milliseconds: number, cb: () => void) { }, milliseconds); } -export = { +export default { scheduleExecution }; diff --git a/src/services/options.ts b/src/services/options.ts index b658e4ff7..bd9b289ad 100644 --- a/src/services/options.ts +++ b/src/services/options.ts @@ -1,6 +1,7 @@ -import becca = require('../becca/becca'); +import becca from "../becca/becca.js"; +import BOption from "../becca/entities/boption.js"; import { OptionRow } from '../becca/entities/rows'; -import sql = require('./sql'); +import sql from "./sql.js"; function getOptionOrNull(name: string): string | null { let option; @@ -68,10 +69,7 @@ function setOption(name: string, value: string | number | boolean) { } } -function createOption(name: string, value: string | number, isSynced: boolean) { - // to avoid circular dependency, need to find a better solution - const BOption = require('../becca/entities/boption'); - +function createOption(name: string, value: string, isSynced: boolean) { new BOption({ name: name, value: value, @@ -93,7 +91,7 @@ function getOptionMap() { return map; } -export = { +export default { getOption, getOptionInt, getOptionBool, diff --git a/src/services/options_init.ts b/src/services/options_init.ts index e2ba1520a..4edaa70d7 100644 --- a/src/services/options_init.ts +++ b/src/services/options_init.ts @@ -1,9 +1,9 @@ -import optionService = require('./options'); -import appInfo = require('./app_info'); -import utils = require('./utils'); -import log = require('./log'); -import dateUtils = require('./date_utils'); -import keyboardActions = require('./keyboard_actions'); +import optionService from "./options.js"; +import appInfo from "./app_info.js"; +import utils from "./utils.js"; +import log from "./log.js"; +import dateUtils from "./date_utils.js"; +import keyboardActions from "./keyboard_actions.js"; import { KeyboardShortcutWithRequiredActionName } from './keyboard_actions_interface'; function initDocumentOptions() { @@ -132,7 +132,7 @@ function getKeyboardDefaultOptions() { })); } -export = { +export default { initDocumentOptions, initNotSyncedOptions, initStartupOptions diff --git a/src/services/port.ts b/src/services/port.ts index c37992d42..ffb2e2bf2 100644 --- a/src/services/port.ts +++ b/src/services/port.ts @@ -1,7 +1,7 @@ -import config = require('./config'); -import utils = require('./utils'); -import env = require('./env'); -import dataDir = require('./data_dir'); +import config from "./config.js"; +import utils from "./utils.js"; +import env from "./env.js"; +import dataDir from "./data_dir.js"; function parseAndValidate(portStr: string, source: string) { const portNum = parseInt(portStr); @@ -24,4 +24,4 @@ if (process.env.TRILIUM_PORT) { port = parseAndValidate(config['Network']['port'] || '3000', `Network.port in ${dataDir.CONFIG_INI_PATH}`); } -export = port; +export default port; diff --git a/src/services/promoted_attribute_definition_parser.ts b/src/services/promoted_attribute_definition_parser.ts index 228c96093..6e9ca3d13 100644 --- a/src/services/promoted_attribute_definition_parser.ts +++ b/src/services/promoted_attribute_definition_parser.ts @@ -37,6 +37,6 @@ function parse(value: string): DefinitionObject { return defObj; } -export = { +export default { parse }; diff --git a/src/services/protected_session.ts b/src/services/protected_session.ts index 6c1d6c223..f29b73d17 100644 --- a/src/services/protected_session.ts +++ b/src/services/protected_session.ts @@ -1,7 +1,7 @@ "use strict"; -import log = require('./log'); -import dataEncryptionService = require('./encryption/data_encryption'); +import log from "./log.js"; +import dataEncryptionService from "./encryption/data_encryption.js"; let dataKey: Buffer | null = null; @@ -70,7 +70,7 @@ function checkProtectedSessionExpiration() { } } -export = { +export default { setDataKey, resetDataKey, isProtectedSessionAvailable, diff --git a/src/services/request.ts b/src/services/request.ts index d4a17ad4e..fe057024c 100644 --- a/src/services/request.ts +++ b/src/services/request.ts @@ -1,9 +1,9 @@ "use strict"; -import utils = require('./utils'); -import log = require('./log'); -import url = require('url'); -import syncOptions = require('./sync_options'); +import utils from "./utils.js"; +import log from "./log.js"; +import url from "url"; +import syncOptions from "./sync_options.js"; import { ExecOpts } from './request_interface'; // this service provides abstraction over node's HTTP/HTTPS and electron net.client APIs @@ -137,7 +137,7 @@ function exec(opts: ExecOpts): Promise { }); } -function getImage(imageUrl: string) { +function getImage(imageUrl: string): Promise { const proxyConf = syncOptions.getSyncProxy(); const opts: ClientOpts = { method: 'GET', @@ -149,7 +149,7 @@ function getImage(imageUrl: string) { const proxyAgent = getProxyAgent(opts); const parsedTargetUrl = url.parse(opts.url); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { try { const request = client.request({ method: opts.method, @@ -181,8 +181,7 @@ function getImage(imageUrl: string) { }); request.end(undefined); - } - catch (e: any) { + } catch (e: any) { reject(generateError(opts, e.message)); } }); @@ -202,8 +201,8 @@ function getProxyAgent(opts: ClientOpts) { } const AgentClass = HTTP === protocol - ? require("http-proxy-agent").HttpProxyAgent - : require("https-proxy-agent").HttpsProxyAgent; + ? require('http-proxy-agent').HttpProxyAgent + : require('https-proxy-agent').HttpsProxyAgent; return new AgentClass(opts.proxy); } @@ -233,7 +232,7 @@ function generateError(opts: { return new Error(`Request to ${opts.method} ${opts.url} failed, error: ${message}`); } -export = { +export default { exec, getImage }; diff --git a/src/services/resource_dir.ts b/src/services/resource_dir.ts index cba351ac8..7e194dc67 100644 --- a/src/services/resource_dir.ts +++ b/src/services/resource_dir.ts @@ -1,8 +1,8 @@ -import log = require('./log'); -import path = require('path'); -import fs = require('fs'); +import log from "./log.js"; +import path from "path"; +import fs from "fs"; -const RESOURCE_DIR = path.resolve(__dirname, "../.."); +export const RESOURCE_DIR = path.resolve(__dirname, "../.."); // where the "trilium" executable is const ELECTRON_APP_ROOT_DIR = path.resolve(RESOURCE_DIR, "../.."); @@ -20,7 +20,7 @@ if (!fs.existsSync(MIGRATIONS_DIR)) { process.exit(1); } -export = { +export default { RESOURCE_DIR, MIGRATIONS_DIR, DB_INIT_DIR, diff --git a/src/services/revisions.ts b/src/services/revisions.ts index 9cd281c13..cfe8f04c6 100644 --- a/src/services/revisions.ts +++ b/src/services/revisions.ts @@ -1,10 +1,10 @@ "use strict"; -import log = require('./log'); -import sql = require('./sql'); -import protectedSessionService = require('./protected_session'); -import dateUtils = require('./date_utils'); -import BNote = require('../becca/entities/bnote'); +import log from "./log.js"; +import sql from "./sql.js"; +import protectedSessionService from "./protected_session.js"; +import dateUtils from "./date_utils.js"; +import BNote from "../becca/entities/bnote.js"; function protectRevisions(note: BNote) { if (!protectedSessionService.isProtectedSessionAvailable()) { @@ -44,6 +44,6 @@ function protectRevisions(note: BNote) { } } -export = { +export default { protectRevisions }; diff --git a/src/services/sanitize_attribute_name.ts b/src/services/sanitize_attribute_name.ts index 62b2b03b3..635588f80 100644 --- a/src/services/sanitize_attribute_name.ts +++ b/src/services/sanitize_attribute_name.ts @@ -13,6 +13,6 @@ function sanitizeAttributeName(origName: string) { } -export = { +export default { sanitizeAttributeName }; diff --git a/src/services/scheduler.ts b/src/services/scheduler.ts index 819de0e59..6d3dac8b8 100644 --- a/src/services/scheduler.ts +++ b/src/services/scheduler.ts @@ -1,12 +1,12 @@ -import scriptService = require('./script'); -import cls = require('./cls'); -import sqlInit = require('./sql_init'); -import config = require('./config'); -import log = require('./log'); -import attributeService = require('../services/attributes'); -import protectedSessionService = require('../services/protected_session'); -import hiddenSubtreeService = require('./hidden_subtree'); -import BNote = require('../becca/entities/bnote'); +import scriptService from "./script.js"; +import cls from "./cls.js"; +import sqlInit from "./sql_init.js"; +import config from "./config.js"; +import log from "./log.js"; +import attributeService from "../services/attributes.js"; +import protectedSessionService from "../services/protected_session.js"; +import hiddenSubtreeService from "./hidden_subtree.js"; +import BNote from "../becca/entities/bnote.js"; function getRunAtHours(note: BNote): number[] { try { diff --git a/src/services/script.ts b/src/services/script.ts index 1a864353a..035f13299 100644 --- a/src/services/script.ts +++ b/src/services/script.ts @@ -1,8 +1,8 @@ -import ScriptContext = require('./script_context'); -import cls = require('./cls'); -import log = require('./log'); -import becca = require('../becca/becca'); -import BNote = require('../becca/entities/bnote'); +import ScriptContext from "./script_context.js"; +import cls from "./cls.js"; +import log from "./log.js"; +import becca from "../becca/becca.js"; +import BNote from "../becca/entities/bnote.js"; import { ApiParams } from './backend_script_api_interface'; interface Bundle { @@ -215,7 +215,7 @@ function sanitizeVariableName(str: string) { return str.replace(/[^a-z0-9_]/gim, ""); } -export = { +export default { executeNote, executeNoteNoException, executeScript, diff --git a/src/services/script_context.ts b/src/services/script_context.ts index 4de4863d0..695eb5a24 100644 --- a/src/services/script_context.ts +++ b/src/services/script_context.ts @@ -1,6 +1,6 @@ -import utils = require('./utils'); -import BackendScriptApi = require('./backend_script_api'); -import BNote = require('../becca/entities/bnote'); +import utils from "./utils.js"; +import BackendScriptApi from "./backend_script_api.js"; +import BNote from "../becca/entities/bnote.js"; import { ApiParams } from './backend_script_api_interface'; type Module = { @@ -34,4 +34,4 @@ class ScriptContext { }; } -export = ScriptContext; +export default ScriptContext; diff --git a/src/services/search/expressions/ancestor.ts b/src/services/search/expressions/ancestor.ts index 4e7380795..8016e1492 100644 --- a/src/services/search/expressions/ancestor.ts +++ b/src/services/search/expressions/ancestor.ts @@ -1,10 +1,10 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import log = require('../../log'); -import becca = require('../../../becca/becca'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import log from "../../log.js"; +import becca from "../../../becca/becca.js"; +import SearchContext from "../search_context.js"; class AncestorExp extends Expression { @@ -74,4 +74,4 @@ class AncestorExp extends Expression { } } -export = AncestorExp; +export default AncestorExp; diff --git a/src/services/search/expressions/and.ts b/src/services/search/expressions/and.ts index 82c73fe70..2a6e07877 100644 --- a/src/services/search/expressions/and.ts +++ b/src/services/search/expressions/and.ts @@ -1,9 +1,9 @@ "use strict"; -import NoteSet = require('../note_set'); -import SearchContext = require('../search_context'); -import Expression = require('./expression'); -import TrueExp = require('./true'); +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; +import Expression from "./expression.js"; +import TrueExp from "./true.js"; class AndExp extends Expression { private subExpressions: Expression[]; @@ -34,4 +34,4 @@ class AndExp extends Expression { } } -export = AndExp; +export default AndExp; diff --git a/src/services/search/expressions/attribute_exists.ts b/src/services/search/expressions/attribute_exists.ts index b1f01a1c0..625e4b2af 100644 --- a/src/services/search/expressions/attribute_exists.ts +++ b/src/services/search/expressions/attribute_exists.ts @@ -1,10 +1,10 @@ "use strict"; -import NoteSet = require("../note_set"); -import SearchContext = require("../search_context"); +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; -import becca = require('../../../becca/becca'); -import Expression = require('./expression'); +import becca from "../../../becca/becca.js"; +import Expression from "./expression.js"; class AttributeExistsExp extends Expression { @@ -48,4 +48,4 @@ class AttributeExistsExp extends Expression { } } -export = AttributeExistsExp; +export default AttributeExistsExp; diff --git a/src/services/search/expressions/child_of.ts b/src/services/search/expressions/child_of.ts index 10d31c00a..491eab3ef 100644 --- a/src/services/search/expressions/child_of.ts +++ b/src/services/search/expressions/child_of.ts @@ -1,8 +1,8 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; class ChildOfExp extends Expression { @@ -37,4 +37,4 @@ class ChildOfExp extends Expression { } } -export = ChildOfExp; +export default ChildOfExp; diff --git a/src/services/search/expressions/descendant_of.ts b/src/services/search/expressions/descendant_of.ts index 6994056c8..7a7444de8 100644 --- a/src/services/search/expressions/descendant_of.ts +++ b/src/services/search/expressions/descendant_of.ts @@ -1,9 +1,9 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import becca = require('../../../becca/becca'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import becca from "../../../becca/becca.js"; +import SearchContext from "../search_context.js"; class DescendantOfExp extends Expression { private subExpression: Expression; @@ -28,4 +28,4 @@ class DescendantOfExp extends Expression { } } -export = DescendantOfExp; +export default DescendantOfExp; diff --git a/src/services/search/expressions/expression.ts b/src/services/search/expressions/expression.ts index c74341ba2..2bff50e95 100644 --- a/src/services/search/expressions/expression.ts +++ b/src/services/search/expressions/expression.ts @@ -1,7 +1,7 @@ "use strict"; -import NoteSet = require("../note_set"); -import SearchContext = require("../search_context"); +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; abstract class Expression { name: string; @@ -13,4 +13,4 @@ abstract class Expression { abstract execute(inputNoteSet: NoteSet, executionContext: {}, searchContext: SearchContext): NoteSet; } -export = Expression; +export default Expression; diff --git a/src/services/search/expressions/is_hidden.ts b/src/services/search/expressions/is_hidden.ts index 81bef22b3..3ceeb5570 100644 --- a/src/services/search/expressions/is_hidden.ts +++ b/src/services/search/expressions/is_hidden.ts @@ -1,8 +1,8 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; /** * Note is hidden when all its note paths start in hidden subtree (i.e., the note is not cloned into visible tree) @@ -21,4 +21,4 @@ class IsHiddenExp extends Expression { } } -export = IsHiddenExp; +export default IsHiddenExp; diff --git a/src/services/search/expressions/label_comparison.ts b/src/services/search/expressions/label_comparison.ts index b455f82ca..85ef94096 100644 --- a/src/services/search/expressions/label_comparison.ts +++ b/src/services/search/expressions/label_comparison.ts @@ -1,9 +1,9 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import becca = require('../../../becca/becca'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import becca from "../../../becca/becca.js"; +import SearchContext from "../search_context.js"; type Comparator = (value: string) => boolean; @@ -46,4 +46,4 @@ class LabelComparisonExp extends Expression { } } -export = LabelComparisonExp; +export default LabelComparisonExp; diff --git a/src/services/search/expressions/not.ts b/src/services/search/expressions/not.ts index e1b31c84e..25f61f6db 100644 --- a/src/services/search/expressions/not.ts +++ b/src/services/search/expressions/not.ts @@ -1,8 +1,8 @@ "use strict"; -import NoteSet = require('../note_set'); -import SearchContext = require('../search_context'); -import Expression = require('./expression'); +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; +import Expression from "./expression.js"; class NotExp extends Expression { private subExpression: Expression; @@ -20,4 +20,4 @@ class NotExp extends Expression { } } -export = NotExp; +export default NotExp; diff --git a/src/services/search/expressions/note_content_fulltext.ts b/src/services/search/expressions/note_content_fulltext.ts index 02626bf16..30f7b40f1 100644 --- a/src/services/search/expressions/note_content_fulltext.ts +++ b/src/services/search/expressions/note_content_fulltext.ts @@ -1,16 +1,16 @@ "use strict"; import { NoteRow } from "../../../becca/entities/rows"; -import SearchContext = require("../search_context"); +import SearchContext from "../search_context.js"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import log = require('../../log'); -import becca = require('../../../becca/becca'); -import protectedSessionService = require('../../protected_session'); -import striptags = require('striptags'); -import utils = require('../../utils'); -import sql = require("../../sql"); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import log from "../../log.js"; +import becca from "../../../becca/becca.js"; +import protectedSessionService from "../../protected_session.js"; +import striptags from "striptags"; +import utils from "../../utils.js"; +import sql from "../../sql.js"; const ALLOWED_OPERATORS = ['=', '!=', '*=*', '*=', '=*', '%=']; @@ -155,4 +155,4 @@ class NoteContentFulltextExp extends Expression { } } -export = NoteContentFulltextExp; +export default NoteContentFulltextExp; diff --git a/src/services/search/expressions/note_flat_text.ts b/src/services/search/expressions/note_flat_text.ts index f163e8a7a..d433eb991 100644 --- a/src/services/search/expressions/note_flat_text.ts +++ b/src/services/search/expressions/note_flat_text.ts @@ -1,12 +1,12 @@ "use strict"; -import BNote = require("../../../becca/entities/bnote"); -import SearchContext = require("../search_context"); +import BNote from "../../../becca/entities/bnote.js"; +import SearchContext from "../search_context.js"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import becca = require('../../../becca/becca'); -import utils = require('../../utils'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import becca from "../../../becca/becca.js"; +import utils from "../../utils.js"; class NoteFlatTextExp extends Expression { private tokens: string[]; @@ -172,4 +172,4 @@ class NoteFlatTextExp extends Expression { } } -export = NoteFlatTextExp; +export default NoteFlatTextExp; diff --git a/src/services/search/expressions/or.ts b/src/services/search/expressions/or.ts index f89e9070e..7b141129c 100644 --- a/src/services/search/expressions/or.ts +++ b/src/services/search/expressions/or.ts @@ -1,9 +1,9 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import TrueExp = require('./true'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import TrueExp from "./true.js"; +import SearchContext from "../search_context.js"; class OrExp extends Expression { private subExpressions: Expression[]; @@ -39,4 +39,4 @@ class OrExp extends Expression { } } -export = OrExp; +export default OrExp; diff --git a/src/services/search/expressions/order_by_and_limit.ts b/src/services/search/expressions/order_by_and_limit.ts index a3a37496f..9d0ff31c8 100644 --- a/src/services/search/expressions/order_by_and_limit.ts +++ b/src/services/search/expressions/order_by_and_limit.ts @@ -1,9 +1,9 @@ "use strict"; -import BNote = require("../../../becca/entities/bnote"); -import NoteSet = require("../note_set"); -import SearchContext = require("../search_context"); -import Expression = require("./expression"); +import BNote from "../../../becca/entities/bnote.js"; +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; +import Expression from "./expression.js"; interface ValueExtractor { extract: (note: BNote) => number | string | null; @@ -111,4 +111,4 @@ class OrderByAndLimitExp extends Expression { } } -export = OrderByAndLimitExp; +export default OrderByAndLimitExp; diff --git a/src/services/search/expressions/parent_of.ts b/src/services/search/expressions/parent_of.ts index bd7b9d304..8a51bbf62 100644 --- a/src/services/search/expressions/parent_of.ts +++ b/src/services/search/expressions/parent_of.ts @@ -1,8 +1,8 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; class ParentOfExp extends Expression { private subExpression: Expression; @@ -36,4 +36,4 @@ class ParentOfExp extends Expression { } } -export = ParentOfExp; +export default ParentOfExp; diff --git a/src/services/search/expressions/property_comparison.ts b/src/services/search/expressions/property_comparison.ts index 843b5a862..a6b072d09 100644 --- a/src/services/search/expressions/property_comparison.ts +++ b/src/services/search/expressions/property_comparison.ts @@ -1,8 +1,8 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import buildComparator = require('../services/build_comparator'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import buildComparator from "../services/build_comparator.js"; /** * Search string is lower cased for case-insensitive comparison. But when retrieving properties, @@ -87,4 +87,4 @@ class PropertyComparisonExp extends Expression { } } -export = PropertyComparisonExp; +export default PropertyComparisonExp; diff --git a/src/services/search/expressions/relation_where.ts b/src/services/search/expressions/relation_where.ts index 9f33dcecf..d973da0ce 100644 --- a/src/services/search/expressions/relation_where.ts +++ b/src/services/search/expressions/relation_where.ts @@ -1,9 +1,9 @@ "use strict"; -import Expression = require('./expression'); -import NoteSet = require('../note_set'); -import becca = require('../../../becca/becca'); -import SearchContext = require('../search_context'); +import Expression from "./expression.js"; +import NoteSet from "../note_set.js"; +import becca from "../../../becca/becca.js"; +import SearchContext from "../search_context.js"; class RelationWhereExp extends Expression { private relationName: string; @@ -42,4 +42,4 @@ class RelationWhereExp extends Expression { } } -export = RelationWhereExp; +export default RelationWhereExp; diff --git a/src/services/search/expressions/true.ts b/src/services/search/expressions/true.ts index a53d1afde..5858a1075 100644 --- a/src/services/search/expressions/true.ts +++ b/src/services/search/expressions/true.ts @@ -1,9 +1,9 @@ "use strict"; -import NoteSet = require("../note_set"); -import SearchContext = require("../search_context"); +import NoteSet from "../note_set.js"; +import SearchContext from "../search_context.js"; -import Expression = require('./expression'); +import Expression from "./expression.js"; class TrueExp extends Expression { execute(inputNoteSet: NoteSet, executionContext: {}, searchContext: SearchContext): NoteSet { @@ -11,4 +11,4 @@ class TrueExp extends Expression { } } -export = TrueExp; +export default TrueExp; diff --git a/src/services/search/note_set.ts b/src/services/search/note_set.ts index 47c644c38..6f56452b7 100644 --- a/src/services/search/note_set.ts +++ b/src/services/search/note_set.ts @@ -1,6 +1,6 @@ "use strict"; -import BNote = require("../../becca/entities/bnote"); +import BNote from "../../becca/entities/bnote.js"; class NoteSet { @@ -65,4 +65,4 @@ class NoteSet { } } -export = NoteSet; +export default NoteSet; diff --git a/src/services/search/search_context.ts b/src/services/search/search_context.ts index f7c1e2198..0d2bd60c2 100644 --- a/src/services/search/search_context.ts +++ b/src/services/search/search_context.ts @@ -1,6 +1,6 @@ "use strict"; -import hoistedNoteService = require('../hoisted_note'); +import hoistedNoteService from "../hoisted_note.js"; import { SearchParams } from './services/types'; class SearchContext { @@ -68,4 +68,4 @@ class SearchContext { } } -export = SearchContext; +export default SearchContext; diff --git a/src/services/search/search_result.ts b/src/services/search/search_result.ts index cf651d58e..385999053 100644 --- a/src/services/search/search_result.ts +++ b/src/services/search/search_result.ts @@ -1,7 +1,7 @@ "use strict"; -import beccaService = require('../../becca/becca_service'); -import becca = require('../../becca/becca'); +import beccaService from "../../becca/becca_service.js"; +import becca from "../../becca/becca.js"; class SearchResult { notePathArray: string[]; @@ -67,4 +67,4 @@ class SearchResult { } } -export = SearchResult; +export default SearchResult; diff --git a/src/services/search/services/build_comparator.ts b/src/services/search/services/build_comparator.ts index 460c98809..c43de1ee3 100644 --- a/src/services/search/services/build_comparator.ts +++ b/src/services/search/services/build_comparator.ts @@ -42,4 +42,4 @@ function buildComparator(operator: string, comparedValue: string) { } } -export = buildComparator; +export default buildComparator; diff --git a/src/services/search/services/handle_parens.ts b/src/services/search/services/handle_parens.ts index 30d7e03fc..a5fb1f227 100644 --- a/src/services/search/services/handle_parens.ts +++ b/src/services/search/services/handle_parens.ts @@ -1,9 +1,9 @@ -import { TokenData } from "./types"; +import { TokenData, TokenStructure } from "./types"; /** * This will create a recursive object from a list of tokens - tokens between parenthesis are grouped in a single array */ -function handleParens(tokens: (TokenData | TokenData[])[]) { +function handleParens(tokens: TokenStructure) { if (tokens.length === 0) { return []; } @@ -47,4 +47,4 @@ function handleParens(tokens: (TokenData | TokenData[])[]) { } } -export = handleParens; +export default handleParens; diff --git a/src/services/search/services/lex.ts b/src/services/search/services/lex.ts index 516cf71df..ea9c0914c 100644 --- a/src/services/search/services/lex.ts +++ b/src/services/search/services/lex.ts @@ -147,4 +147,4 @@ function lex(str: string) { } } -export = lex; +export default lex; diff --git a/src/services/search/services/parse.ts b/src/services/search/services/parse.ts index de943fdd2..f78e6a55a 100644 --- a/src/services/search/services/parse.ts +++ b/src/services/search/services/parse.ts @@ -1,28 +1,28 @@ "use strict"; -import dayjs = require("dayjs"); -import AndExp = require('../expressions/and'); -import OrExp = require('../expressions/or'); -import NotExp = require('../expressions/not'); -import ChildOfExp = require('../expressions/child_of'); -import DescendantOfExp = require('../expressions/descendant_of'); -import ParentOfExp = require('../expressions/parent_of'); -import RelationWhereExp = require('../expressions/relation_where'); -import PropertyComparisonExp = require('../expressions/property_comparison'); -import AttributeExistsExp = require('../expressions/attribute_exists'); -import LabelComparisonExp = require('../expressions/label_comparison'); -import NoteFlatTextExp = require('../expressions/note_flat_text'); -import NoteContentFulltextExp = require('../expressions/note_content_fulltext'); -import OrderByAndLimitExp = require('../expressions/order_by_and_limit'); -import AncestorExp = require('../expressions/ancestor'); -import buildComparator = require('./build_comparator'); -import ValueExtractor = require('../value_extractor'); -import utils = require('../../utils'); -import TrueExp = require('../expressions/true'); -import IsHiddenExp = require('../expressions/is_hidden'); -import SearchContext = require("../search_context"); -import { TokenData } from "./types"; -import Expression = require("../expressions/expression"); +import dayjs from "dayjs"; +import AndExp from "../expressions/and.js"; +import OrExp from "../expressions/or.js"; +import NotExp from "../expressions/not.js"; +import ChildOfExp from "../expressions/child_of.js"; +import DescendantOfExp from "../expressions/descendant_of.js"; +import ParentOfExp from "../expressions/parent_of.js"; +import RelationWhereExp from "../expressions/relation_where.js"; +import PropertyComparisonExp from "../expressions/property_comparison.js"; +import AttributeExistsExp from "../expressions/attribute_exists.js"; +import LabelComparisonExp from "../expressions/label_comparison.js"; +import NoteFlatTextExp from "../expressions/note_flat_text.js"; +import NoteContentFulltextExp from "../expressions/note_content_fulltext.js"; +import OrderByAndLimitExp from "../expressions/order_by_and_limit.js"; +import AncestorExp from "../expressions/ancestor.js"; +import buildComparator from "./build_comparator.js"; +import ValueExtractor from "../value_extractor.js"; +import utils from "../../utils.js"; +import TrueExp from "../expressions/true.js"; +import IsHiddenExp from "../expressions/is_hidden.js"; +import SearchContext from "../search_context.js"; +import { TokenData, TokenStructure } from "./types"; +import Expression from "../expressions/expression.js"; function getFulltext(_tokens: TokenData[], searchContext: SearchContext) { const tokens: string[] = _tokens.map(t => utils.removeDiacritic(t.token)); @@ -448,7 +448,7 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level function parse({fulltextTokens, expressionTokens, searchContext}: { fulltextTokens: TokenData[], - expressionTokens: (TokenData | TokenData[])[], + expressionTokens: TokenStructure, searchContext: SearchContext, originalQuery: string }) { @@ -494,4 +494,4 @@ function getAncestorExp({ancestorNoteId, ancestorDepth, includeHiddenNotes}: Sea } } -export = parse; +export default parse; diff --git a/src/services/search/services/search.ts b/src/services/search/services/search.ts index 7461d5b4e..18d70be34 100644 --- a/src/services/search/services/search.ts +++ b/src/services/search/services/search.ts @@ -1,23 +1,36 @@ "use strict"; -import normalizeString = require("normalize-strings"); -import lex = require('./lex'); -import handleParens = require('./handle_parens'); -import parse = require('./parse'); -import SearchResult = require('../search_result'); -import SearchContext = require('../search_context'); -import becca = require('../../../becca/becca'); -import beccaService = require('../../../becca/becca_service'); -import utils = require('../../utils'); -import log = require('../../log'); -import hoistedNoteService = require('../../hoisted_note'); -import BNote = require("../../../becca/entities/bnote"); -import BAttribute = require("../../../becca/entities/battribute"); -import { SearchParams, TokenData } from "./types"; -import Expression = require("../expressions/expression"); -import sql = require("../../sql"); +import normalizeString from "normalize-strings"; +import lex from "./lex.js"; +import handleParens from "./handle_parens.js"; +import parse from "./parse.js"; +import SearchResult from "../search_result.js"; +import SearchContext from "../search_context.js"; +import becca from "../../../becca/becca.js"; +import beccaService from "../../../becca/becca_service.js"; +import utils from "../../utils.js"; +import log from "../../log.js"; +import hoistedNoteService from "../../hoisted_note.js"; +import BNote from "../../../becca/entities/bnote.js"; +import BAttribute from "../../../becca/entities/battribute.js"; +import { SearchParams, TokenStructure } from "./types"; +import Expression from "../expressions/expression.js"; +import sql from "../../sql.js"; +import scriptService from "../../script.js"; -function searchFromNote(note: BNote) { +export interface SearchNoteResult { + searchResultNoteIds: string[]; + highlightedTokens: string[]; + error: string | null; +} + +export const EMPTY_RESULT: SearchNoteResult = { + searchResultNoteIds: [], + highlightedTokens: [], + error: null +}; + +function searchFromNote(note: BNote): SearchNoteResult { let searchResultNoteIds; let highlightedTokens: string[]; @@ -78,7 +91,6 @@ function searchFromRelation(note: BNote, relationName: string) { return []; } - const scriptService = require('../../script'); // TODO: to avoid circular dependency const result = scriptService.executeNote(scriptNote, {originEntity: note}); if (!Array.isArray(result)) { @@ -273,7 +285,7 @@ function parseQueryToExpression(query: string, searchContext: SearchContext) { const {fulltextQuery, fulltextTokens, expressionTokens} = lex(query); searchContext.fulltextQuery = fulltextQuery; - let structuredExpressionTokens: (TokenData | TokenData[])[]; + let structuredExpressionTokens: TokenStructure; try { structuredExpressionTokens = handleParens(expressionTokens); @@ -444,7 +456,7 @@ function formatAttribute(attr: BAttribute) { } } -export = { +export default { searchFromNote, searchNotesForAutocomplete, findResultsWithQuery, diff --git a/src/services/search/services/types.ts b/src/services/search/services/types.ts index 09450f760..2b12a3c65 100644 --- a/src/services/search/services/types.ts +++ b/src/services/search/services/types.ts @@ -1,3 +1,5 @@ +export type TokenStructure = (TokenData | TokenStructure)[]; + export interface TokenData { token: string; inQuotes?: boolean; diff --git a/src/services/search/value_extractor.ts b/src/services/search/value_extractor.ts index 4f2466f11..a6df8feda 100644 --- a/src/services/search/value_extractor.ts +++ b/src/services/search/value_extractor.ts @@ -1,6 +1,6 @@ "use strict"; -import BNote = require("../../becca/entities/bnote"); +import BNote from "../../becca/entities/bnote.js"; /** * Search string is lower cased for case-insensitive comparison. But when retrieving properties, @@ -134,4 +134,4 @@ class ValueExtractor { } } -export = ValueExtractor; +export default ValueExtractor; diff --git a/src/services/session_secret.ts b/src/services/session_secret.ts index 20b35efb2..2e67f1ed4 100644 --- a/src/services/session_secret.ts +++ b/src/services/session_secret.ts @@ -1,9 +1,9 @@ "use strict"; -import fs = require('fs'); -import crypto = require('crypto'); -import dataDir = require('./data_dir'); -import log = require('./log'); +import fs from "fs"; +import crypto from "crypto"; +import dataDir from "./data_dir.js"; +import log from "./log.js"; const sessionSecretPath = `${dataDir.TRILIUM_DATA_DIR}/session_secret.txt`; @@ -28,4 +28,4 @@ else { sessionSecret = fs.readFileSync(sessionSecretPath, ENCODING); } -export = sessionSecret; +export default sessionSecret; diff --git a/src/services/setup.ts b/src/services/setup.ts index 08b1ee806..34246483f 100644 --- a/src/services/setup.ts +++ b/src/services/setup.ts @@ -1,12 +1,12 @@ -import syncService = require('./sync'); -import log = require('./log'); -import sqlInit = require('./sql_init'); -import optionService = require('./options'); -import syncOptions = require('./sync_options'); -import request = require('./request'); -import appInfo = require('./app_info'); -import utils = require('./utils'); -import becca = require('../becca/becca'); +import syncService from "./sync.js"; +import log from "./log.js"; +import sqlInit from "./sql_init.js"; +import optionService from "./options.js"; +import syncOptions from "./sync_options.js"; +import request from "./request.js"; +import appInfo from "./app_info.js"; +import utils from "./utils.js"; +import becca from "../becca/becca.js"; import { SetupStatusResponse, SetupSyncSeedResponse } from './api-interface'; async function hasSyncServerSchemaAndSeed() { @@ -110,7 +110,7 @@ function getSyncSeedOptions() { ]; } -export = { +export default { hasSyncServerSchemaAndSeed, triggerSync, sendSeedToSyncServer, diff --git a/src/services/spaced_update.ts b/src/services/spaced_update.ts index 24417d18c..8fc5818be 100644 --- a/src/services/spaced_update.ts +++ b/src/services/spaced_update.ts @@ -74,4 +74,4 @@ class SpacedUpdate { } } -export = SpacedUpdate; +export default SpacedUpdate; diff --git a/src/services/special_notes.ts b/src/services/special_notes.ts index 65cc14c31..50ba2eccf 100644 --- a/src/services/special_notes.ts +++ b/src/services/special_notes.ts @@ -1,13 +1,13 @@ -import attributeService = require('./attributes'); -import dateNoteService = require('./date_notes'); -import becca = require('../becca/becca'); -import noteService = require('./notes'); -import dateUtils = require('./date_utils'); -import log = require('./log'); -import hoistedNoteService = require('./hoisted_note'); -import searchService = require('./search/services/search'); -import SearchContext = require('./search/search_context'); -import hiddenSubtree = require('./hidden_subtree'); +import attributeService from "./attributes.js"; +import dateNoteService from "./date_notes.js"; +import becca from "../becca/becca.js"; +import noteService from "./notes.js"; +import dateUtils from "./date_utils.js"; +import log from "./log.js"; +import hoistedNoteService from "./hoisted_note.js"; +import searchService from "./search/services/search.js"; +import SearchContext from "./search/search_context.js"; +import hiddenSubtree from "./hidden_subtree.js"; const { LBTPL_NOTE_LAUNCHER, LBTPL_CUSTOM_WIDGET, LBTPL_SPACER, LBTPL_SCRIPT } = hiddenSubtree; function getInboxNote(date: string) { @@ -287,7 +287,7 @@ function createOrUpdateScriptLauncherFromApi(opts: { return launcherNote; } -export = { +export default { getInboxNote, createSqlConsole, saveSqlConsole, diff --git a/src/services/sql.ts b/src/services/sql.ts index cb4a75df5..0d92e6209 100644 --- a/src/services/sql.ts +++ b/src/services/sql.ts @@ -4,12 +4,15 @@ * @module sql */ -import log = require('./log'); +import log from "./log.js"; import type { Statement, Database as DatabaseType, RunResult } from "better-sqlite3"; -import dataDir = require('./data_dir'); -import cls = require('./cls'); -import fs = require("fs-extra"); -import Database = require('better-sqlite3'); +import dataDir from "./data_dir.js"; +import cls from "./cls.js"; +import fs from "fs-extra"; +import Database from "better-sqlite3"; +import ws from "./ws.js"; +import becca_loader from "../becca/becca_loader.js"; +import entity_changes from "./entity_changes.js"; const dbConnection: DatabaseType = new Database(dataDir.DOCUMENT_PATH); dbConnection.pragma('journal_mode = WAL'); @@ -248,7 +251,7 @@ function transactional(func: (statement: Statement) => T) { const ret = (dbConnection.transaction(func) as any).deferred(); if (!dbConnection.inTransaction) { // i.e. transaction was really committed (and not just savepoint released) - require('./ws').sendTransactionEntityChangesToAllClients(); + ws.sendTransactionEntityChangesToAllClients(); } return ret; @@ -259,11 +262,11 @@ function transactional(func: (statement: Statement) => T) { if (entityChangeIds.length > 0) { log.info("Transaction rollback dirtied the becca, forcing reload."); - require('../becca/becca_loader').load(); + becca_loader.load(); } // the maxEntityChangeId has been incremented during failed transaction, need to recalculate - require('./entity_changes').recalculateMaxEntityChangeId(); + entity_changes.recalculateMaxEntityChangeId(); throw e; } @@ -314,7 +317,7 @@ function disableSlowQueryLogging(cb: () => T) { } } -export = { +export default { dbConnection, insert, replace, diff --git a/src/services/sql_init.ts b/src/services/sql_init.ts index 5c9937daa..2c10d97ab 100644 --- a/src/services/sql_init.ts +++ b/src/services/sql_init.ts @@ -1,16 +1,20 @@ -import log = require('./log'); -import fs = require('fs'); -import resourceDir = require('./resource_dir'); -import sql = require('./sql'); -import utils = require('./utils'); -import optionService = require('./options'); -import port = require('./port'); -import BOption = require('../becca/entities/boption'); -import TaskContext = require('./task_context'); -import migrationService = require('./migration'); -import cls = require('./cls'); -import config = require('./config'); +import log from "./log.js"; +import fs from "fs"; +import resourceDir from "./resource_dir.js"; +import sql from "./sql.js"; +import utils from "./utils.js"; +import optionService from "./options.js"; +import port from "./port.js"; +import BOption from "../becca/entities/boption.js"; +import TaskContext from "./task_context.js"; +import migrationService from "./migration.js"; +import cls from "./cls.js"; +import config from "./config.js"; import { OptionRow } from '../becca/entities/rows'; +import optionsInitService from "./options_init.js"; +import BNote from "../becca/entities/bnote.js"; +import BBranch from "../becca/entities/bbranch.js"; +import zipImportService from "./import/zip.js"; const dbReady = utils.deferred(); @@ -54,7 +58,7 @@ async function createInitialDatabase() { const schema = fs.readFileSync(`${resourceDir.DB_INIT_DIR}/schema.sql`, "utf-8"); const demoFile = fs.readFileSync(`${resourceDir.DB_INIT_DIR}/demo.zip`); - let rootNote; + let rootNote!: BNote; sql.transactional(() => { log.info("Creating database schema ..."); @@ -63,9 +67,6 @@ async function createInitialDatabase() { require('../becca/becca_loader').load(); - const BNote = require('../becca/entities/bnote'); - const BBranch = require('../becca/entities/bbranch'); - log.info("Creating root note ..."); rootNote = new BNote({ @@ -84,8 +85,6 @@ async function createInitialDatabase() { notePosition: 10 }).save(); - const optionsInitService = require('./options_init'); - optionsInitService.initDocumentOptions(); optionsInitService.initNotSyncedOptions(true, {}); optionsInitService.initStartupOptions(); @@ -96,7 +95,6 @@ async function createInitialDatabase() { const dummyTaskContext = new TaskContext("no-progress-reporting", 'import', false); - const zipImportService = require('./import/zip'); await zipImportService.importZip(dummyTaskContext, demoFile, rootNote); sql.transactional(() => { @@ -106,7 +104,6 @@ async function createInitialDatabase() { const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 ORDER BY notePosition"); - const optionService = require('./options'); optionService.setOption('openNoteContexts', JSON.stringify([ { notePath: startNoteId, @@ -184,7 +181,7 @@ function getDbSize() { log.info(`DB size: ${getDbSize()} KB`); -export = { +export default { dbReady, schemaExists, isDbInitialized, diff --git a/src/services/sync.ts b/src/services/sync.ts index 8c8183984..9f6bdeb8a 100644 --- a/src/services/sync.ts +++ b/src/services/sync.ts @@ -1,24 +1,26 @@ "use strict"; -import log = require('./log'); -import sql = require('./sql'); -import optionService = require('./options'); -import utils = require('./utils'); -import instanceId = require('./instance_id'); -import dateUtils = require('./date_utils'); -import syncUpdateService = require('./sync_update'); -import contentHashService = require('./content_hash'); -import appInfo = require('./app_info'); -import syncOptions = require('./sync_options'); -import syncMutexService = require('./sync_mutex'); -import cls = require('./cls'); -import request = require('./request'); -import ws = require('./ws'); -import entityChangesService = require('./entity_changes'); -import entityConstructor = require('../becca/entity_constructor'); -import becca = require('../becca/becca'); +import log from "./log.js"; +import sql from "./sql.js"; +import optionService from "./options.js"; +import utils from "./utils.js"; +import instanceId from "./instance_id.js"; +import dateUtils from "./date_utils.js"; +import syncUpdateService from "./sync_update.js"; +import contentHashService from "./content_hash.js"; +import appInfo from "./app_info.js"; +import syncOptions from "./sync_options.js"; +import syncMutexService from "./sync_mutex.js"; +import cls from "./cls.js"; +import request from "./request.js"; +import ws from "./ws.js"; +import entityChangesService from "./entity_changes.js"; +import entityConstructor from "../becca/entity_constructor.js"; +import becca from "../becca/becca.js"; import { EntityChange, EntityChangeRecord, EntityRow } from './entity_changes_interface'; import { CookieJar, ExecOpts } from './request_interface'; +import setupService from "./setup.js"; +import consistency_checks from "./consistency_checks.js"; let proxyToggle = true; @@ -107,8 +109,6 @@ async function sync() { } async function login() { - const setupService = require('./setup'); // circular dependency issue - if (!await setupService.hasSyncServerSchemaAndSeed()) { await setupService.sendSeedToSyncServer(); } @@ -282,8 +282,7 @@ async function checkContentHash(syncContext: SyncContext) { if (failedChecks.length > 0) { // before re-queuing sectors, make sure the entity changes are correct - const consistencyChecks = require('./consistency_checks'); - consistencyChecks.runEntityChangesChecks(); + consistency_checks.runEntityChangesChecks(); await syncRequest(syncContext, 'POST', `/api/sync/check-entity-changes`); } @@ -453,7 +452,7 @@ require('../becca/becca_loader').beccaLoaded.then(() => { getLastSyncedPush(); }); -export = { +export default { sync, login, getEntityChangeRecords, diff --git a/src/services/sync_mutex.ts b/src/services/sync_mutex.ts index 9ad0fd08c..5bdbaa36f 100644 --- a/src/services/sync_mutex.ts +++ b/src/services/sync_mutex.ts @@ -3,7 +3,7 @@ * (like consistency checks) can use this mutex to make sure sync isn't currently running. */ -const Mutex = require('async-mutex').Mutex; +import { Mutex } from "async-mutex"; const instance = new Mutex(); async function doExclusively(func: () => T) { @@ -17,6 +17,6 @@ async function doExclusively(func: () => T) { } } -export = { +export default { doExclusively }; diff --git a/src/services/sync_options.ts b/src/services/sync_options.ts index 92aea6c3f..48cf39efd 100644 --- a/src/services/sync_options.ts +++ b/src/services/sync_options.ts @@ -1,7 +1,7 @@ "use strict"; -import optionService = require('./options'); -import config = require('./config'); +import optionService from "./options.js"; +import config from "./config.js"; /* * Primary configuration for sync is in the options (document), but we allow to override @@ -14,7 +14,7 @@ function get(name: string) { return (config['Sync'] && config['Sync'][name]) || optionService.getOption(name); } -export = { +export default { // env variable is the easiest way to guarantee we won't overwrite prod data during development // after copying prod document/data directory getSyncServerHost: () => process.env.TRILIUM_SYNC_SERVER_HOST || get('syncServerHost'), diff --git a/src/services/sync_update.ts b/src/services/sync_update.ts index 61d425438..abaa2fa30 100644 --- a/src/services/sync_update.ts +++ b/src/services/sync_update.ts @@ -1,9 +1,9 @@ -import sql = require('./sql'); -import log = require('./log'); -import entityChangesService = require('./entity_changes'); -import eventService = require('./events'); -import entityConstructor = require('../becca/entity_constructor'); -import ws = require('./ws'); +import sql from "./sql.js"; +import log from "./log.js"; +import entityChangesService from "./entity_changes.js"; +import eventService from "./events.js"; +import entityConstructor from "../becca/entity_constructor.js"; +import ws from "./ws.js"; import { EntityChange, EntityChangeRecord, EntityRow } from './entity_changes_interface'; interface UpdateContext { @@ -182,6 +182,6 @@ function logUpdateContext(updateContext: UpdateContext) { log.info(message.substr(1, message.length - 2)); } -export = { +export default { updateEntities }; diff --git a/src/services/task_context.ts b/src/services/task_context.ts index 27f7d1358..5974313e8 100644 --- a/src/services/task_context.ts +++ b/src/services/task_context.ts @@ -1,7 +1,7 @@ "use strict"; import { TaskData } from './task_context_interface'; -import ws = require('./ws'); +import ws from "./ws.js"; // taskId => TaskContext const taskContexts: Record = {}; @@ -77,4 +77,4 @@ class TaskContext { } } -export = TaskContext; +export default TaskContext; diff --git a/src/services/tray.ts b/src/services/tray.ts index 70d686adb..0b6211ced 100644 --- a/src/services/tray.ts +++ b/src/services/tray.ts @@ -1,7 +1,7 @@ import { Menu, Tray } from 'electron'; -import path = require('path'); -import windowService = require('./window'); -import optionService = require('./options'); +import path from "path"; +import windowService from "./window.js"; +import optionService from "./options.js"; let tray: Tray; // `mainWindow.isVisible` doesn't work with `mainWindow.show` and `mainWindow.hide` - it returns `false` when the window @@ -106,6 +106,6 @@ function createTray() { registerVisibilityListener(); } -export = { +export default { createTray } diff --git a/src/services/tree.ts b/src/services/tree.ts index d731fe6b0..0ab72e7f7 100644 --- a/src/services/tree.ts +++ b/src/services/tree.ts @@ -1,13 +1,19 @@ "use strict"; -import sql = require('./sql'); -import log = require('./log'); -import BBranch = require('../becca/entities/bbranch'); -import entityChangesService = require('./entity_changes'); -import becca = require('../becca/becca'); -import BNote = require('../becca/entities/bnote'); +import sql from "./sql.js"; +import log from "./log.js"; +import BBranch from "../becca/entities/bbranch.js"; +import entityChangesService from "./entity_changes.js"; +import becca from "../becca/becca.js"; +import BNote from "../becca/entities/bnote.js"; -function validateParentChild(parentNoteId: string, childNoteId: string, branchId: string | null = null) { +interface ValidationResponse { + branch: BBranch | null; + success: boolean; + message?: string; +} + +function validateParentChild(parentNoteId: string, childNoteId: string, branchId: string | null = null): ValidationResponse { if (['root', '_hidden', '_share', '_lbRoot', '_lbAvailableLaunchers', '_lbVisibleLaunchers'].includes(childNoteId)) { return { branch: null, success: false, message: `Cannot change this note's location.` }; } @@ -261,7 +267,7 @@ function setNoteToParent(noteId: string, prefix: string, parentNoteId: string) { } } -export = { +export default { validateParentChild, sortNotes, sortNotesIfNeeded, diff --git a/src/services/utils.ts b/src/services/utils.ts index aef261a6a..1b75046d0 100644 --- a/src/services/utils.ts +++ b/src/services/utils.ts @@ -1,12 +1,14 @@ "use strict"; -import crypto = require('crypto'); -const randtoken = require('rand-token').generator({source: 'crypto'}); -import unescape = require('unescape'); -import escape = require('escape-html'); -import sanitize = require("sanitize-filename"); -import mimeTypes = require('mime-types'); -import path = require('path'); +import crypto from "crypto"; +import { generator } from "rand-token"; +import unescape from "unescape"; +import escape from "escape-html"; +import sanitize from "sanitize-filename"; +import mimeTypes from "mime-types"; +import path from "path"; + +const randtoken = generator({source: 'crypto'}); function newEntityId() { return randomString(12); @@ -173,7 +175,7 @@ function replaceAll(string: string, replaceWhat: string, replaceWith: string) { return string.replace(new RegExp(quotedReplaceWhat, "g"), replaceWith); } -function formatDownloadTitle(fileName: string, type: string, mime: string) { +function formatDownloadTitle(fileName: string, type: string | null, mime: string) { if (!fileName) { fileName = "untitled"; } @@ -182,7 +184,7 @@ function formatDownloadTitle(fileName: string, type: string, mime: string) { if (type === 'text') { return `${fileName}.html`; - } else if (['relationMap', 'canvas', 'search'].includes(type)) { + } else if (type && ['relationMap', 'canvas', 'search'].includes(type)) { return `${fileName}.json`; } else { if (!mime) { @@ -311,7 +313,7 @@ function isString(x: any) { return Object.prototype.toString.call(x) === "[object String]"; } -export = { +export default { randomSecureToken, randomString, md5, diff --git a/src/services/window.ts b/src/services/window.ts index ecc6395fb..bf84081fc 100644 --- a/src/services/window.ts +++ b/src/services/window.ts @@ -1,13 +1,13 @@ -import path = require('path'); -import url = require("url"); -import port = require('./port'); -import optionService = require('./options'); -import env = require('./env'); -import log = require('./log'); -import sqlInit = require('./sql_init'); -import cls = require('./cls'); -import keyboardActionsService = require('./keyboard_actions'); -import remoteMain = require("@electron/remote/main") +import path from "path"; +import url from "url"; +import port from "./port.js"; +import optionService from "./options.js"; +import env from "./env.js"; +import log from "./log.js"; +import sqlInit from "./sql_init.js"; +import cls from "./cls.js"; +import keyboardActionsService from "./keyboard_actions.js"; +import remoteMain from "@electron/remote/main" import { App, BrowserWindow, WebContents, ipcMain } from 'electron'; // Prevent the window being garbage collected @@ -100,7 +100,7 @@ function configureWebContents(webContents: WebContents, spellcheckEnabled: boole remoteMain.enable(webContents); mainWindow.webContents.setWindowOpenHandler((details) => { - require("electron").shell.openExternal(details.url); + require('electron').shell.openExternal(details.url); return { action: 'deny' } }); @@ -193,7 +193,7 @@ function getMainWindow() { return mainWindow; } -export = { +export default { createMainWindow, createSetupWindow, closeSetupWindow, diff --git a/src/services/ws.ts b/src/services/ws.ts index ec7d47187..d53f416ec 100644 --- a/src/services/ws.ts +++ b/src/services/ws.ts @@ -1,15 +1,15 @@ -import WebSocket = require('ws'); -import utils = require('./utils'); -import log = require('./log'); -import sql = require('./sql'); -import cls = require('./cls'); -import config = require('./config'); -import syncMutexService = require('./sync_mutex'); -import protectedSessionService = require('./protected_session'); -import becca = require('../becca/becca'); -import AbstractBeccaEntity = require('../becca/entities/abstract_becca_entity'); +import WebSocket from "ws"; +import utils from "./utils.js"; +import log from "./log.js"; +import sql from "./sql.js"; +import cls from "./cls.js"; +import config from "./config.js"; +import syncMutexService from "./sync_mutex.js"; +import protectedSessionService from "./protected_session.js"; +import becca from "../becca/becca.js"; +import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js"; -import env = require('./env'); +import env from "./env.js"; import { IncomingMessage, Server } from 'http'; import { EntityChange } from './entity_changes_interface'; @@ -275,7 +275,7 @@ function setLastSyncedPush(entityChangeId: number) { lastSyncedPush = entityChangeId; } -export = { +export default { init, sendMessageToAllClients, syncPushInProgress, diff --git a/src/share/content_renderer.ts b/src/share/content_renderer.ts index cb111008a..70cc5ceff 100644 --- a/src/share/content_renderer.ts +++ b/src/share/content_renderer.ts @@ -1,9 +1,9 @@ import { JSDOM } from "jsdom"; -import shaca = require('./shaca/shaca'); -import assetPath = require('../services/asset_path'); -import shareRoot = require('./share_root'); -import escapeHtml = require('escape-html'); -import SNote = require("./shaca/entities/snote"); +import shaca from "./shaca/shaca.js"; +import assetPath from "../services/asset_path.js"; +import shareRoot from "./share_root.js"; +import escapeHtml from "escape-html"; +import SNote from "./shaca/entities/snote.js"; interface Result { header: string; @@ -170,6 +170,6 @@ function renderFile(note: SNote, result: Result) { } } -export = { +export default { getContent }; diff --git a/src/share/routes.ts b/src/share/routes.ts index 97a0dd8e1..b491b5a7e 100644 --- a/src/share/routes.ts +++ b/src/share/routes.ts @@ -1,20 +1,21 @@ -import safeCompare = require('safe-compare'); -import ejs = require("ejs"); +import safeCompare from "safe-compare"; +import ejs from "ejs"; import type { Request, Response, Router } from "express"; -import shaca = require('./shaca/shaca'); -import shacaLoader = require('./shaca/shaca_loader'); -import shareRoot = require('./share_root'); -import contentRenderer = require('./content_renderer'); -import assetPath = require('../services/asset_path'); -import appPath = require('../services/app_path'); -import searchService = require('../services/search/services/search'); -import SearchContext = require('../services/search/search_context'); -import log = require('../services/log'); -import SNote = require('./shaca/entities/snote'); -import SBranch = require('./shaca/entities/sbranch'); -import SAttachment = require('./shaca/entities/sattachment'); +import shaca from "./shaca/shaca.js"; +import shacaLoader from "./shaca/shaca_loader.js"; +import shareRoot from "./share_root.js"; +import contentRenderer from "./content_renderer.js"; +import assetPath from "../services/asset_path.js"; +import appPath from "../services/app_path.js"; +import searchService from "../services/search/services/search.js"; +import SearchContext from "../services/search/search_context.js"; +import log from "../services/log.js"; +import SNote from "./shaca/entities/snote.js"; +import SBranch from "./shaca/entities/sbranch.js"; +import SAttachment from "./shaca/entities/sattachment.js"; +import utils from "../services/utils.js"; function getSharedSubTreeRoot(note: SNote): { note?: SNote; branch?: SBranch } { if (note.noteId === shareRoot.SHARE_ROOT_NOTE_ID) { @@ -249,8 +250,6 @@ function register(router: Router) { addNoIndexHeader(note, res); - const utils = require('../services/utils'); - const filename = utils.formatDownloadTitle(note.title, note.type, note.mime); res.setHeader('Content-Disposition', utils.getContentDisposition(filename)); @@ -317,8 +316,6 @@ function register(router: Router) { addNoIndexHeader(attachment.note, res); - const utils = require('../services/utils'); - const filename = utils.formatDownloadTitle(attachment.title, null, attachment.mime); res.setHeader('Content-Disposition', utils.getContentDisposition(filename)); @@ -383,6 +380,6 @@ function register(router: Router) { }); } -export = { +export default { register } diff --git a/src/share/shaca/entities/abstract_shaca_entity.ts b/src/share/shaca/entities/abstract_shaca_entity.ts index 20dba31ff..6bf7c3d63 100644 --- a/src/share/shaca/entities/abstract_shaca_entity.ts +++ b/src/share/shaca/entities/abstract_shaca_entity.ts @@ -12,4 +12,4 @@ class AbstractShacaEntity { } } -export = AbstractShacaEntity; +export default AbstractShacaEntity; diff --git a/src/share/shaca/entities/sattachment.ts b/src/share/shaca/entities/sattachment.ts index 7951fe081..7ac9c3847 100644 --- a/src/share/shaca/entities/sattachment.ts +++ b/src/share/shaca/entities/sattachment.ts @@ -1,9 +1,9 @@ "use strict"; -import sql = require('../../sql'); -import utils = require('../../../services/utils'); -import AbstractShacaEntity = require('./abstract_shaca_entity'); -import SNote = require('./snote'); +import sql from "../../sql.js"; +import utils from "../../../services/utils.js"; +import AbstractShacaEntity from "./abstract_shaca_entity.js"; +import SNote from "./snote.js"; import { Blob } from '../../../services/blob-interface'; import { SAttachmentRow } from './rows'; @@ -77,4 +77,4 @@ class SAttachment extends AbstractShacaEntity { } } -export = SAttachment; +export default SAttachment; diff --git a/src/share/shaca/entities/sattribute.ts b/src/share/shaca/entities/sattribute.ts index 6bd8418b1..189d9e6a6 100644 --- a/src/share/shaca/entities/sattribute.ts +++ b/src/share/shaca/entities/sattribute.ts @@ -1,9 +1,8 @@ "use strict"; +import AbstractShacaEntity from "./abstract_shaca_entity"; import { SAttributeRow } from "./rows"; -import SNote = require("./snote"); - -const AbstractShacaEntity = require('./abstract_shaca_entity'); +import SNote from "./snote.js"; class SAttribute extends AbstractShacaEntity { @@ -110,4 +109,4 @@ class SAttribute extends AbstractShacaEntity { } } -export = SAttribute; +export default SAttribute; diff --git a/src/share/shaca/entities/sbranch.ts b/src/share/shaca/entities/sbranch.ts index b4ff9a73b..0f2080603 100644 --- a/src/share/shaca/entities/sbranch.ts +++ b/src/share/shaca/entities/sbranch.ts @@ -1,8 +1,8 @@ "use strict"; -import AbstractShacaEntity = require('./abstract_shaca_entity'); +import AbstractShacaEntity from "./abstract_shaca_entity.js"; import { SBranchRow } from './rows'; -import SNote = require('./snote'); +import SNote from "./snote.js"; class SBranch extends AbstractShacaEntity { @@ -59,4 +59,4 @@ class SBranch extends AbstractShacaEntity { } } -export = SBranch; +export default SBranch; diff --git a/src/share/shaca/entities/snote.ts b/src/share/shaca/entities/snote.ts index 18182f1d4..755404b40 100644 --- a/src/share/shaca/entities/snote.ts +++ b/src/share/shaca/entities/snote.ts @@ -1,13 +1,13 @@ "use strict"; -import sql = require('../../sql'); -import utils = require('../../../services/utils'); -import AbstractShacaEntity = require('./abstract_shaca_entity'); -import escape = require('escape-html'); +import sql from "../../sql.js"; +import utils from "../../../services/utils.js"; +import AbstractShacaEntity from "./abstract_shaca_entity.js"; +import escape from "escape-html"; import { Blob } from '../../../services/blob-interface'; -import SAttachment = require('./sattachment'); -import SAttribute = require('./sattribute'); -import SBranch = require('./sbranch'); +import SAttachment from "./sattachment.js"; +import SAttribute from "./sattribute.js"; +import SBranch from "./sbranch.js"; import { SNoteRow } from './rows'; const LABEL = 'label'; @@ -27,7 +27,7 @@ class SNote extends AbstractShacaEntity { parentBranches: SBranch[]; parents: SNote[]; children: SNote[]; - private ownedAttributes: SAttribute[]; + ownedAttributes: SAttribute[]; private __attributeCache: SAttribute[] | null; private __inheritableAttributeCache: SAttribute[] | null; targetRelations: SAttribute[]; @@ -522,4 +522,4 @@ class SNote extends AbstractShacaEntity { } } -export = SNote; +export default SNote; diff --git a/src/share/shaca/shaca-interface.ts b/src/share/shaca/shaca-interface.ts index 9cff96eeb..f568e9cec 100644 --- a/src/share/shaca/shaca-interface.ts +++ b/src/share/shaca/shaca-interface.ts @@ -1,14 +1,14 @@ -import SAttachment = require("./entities/sattachment"); -import SAttribute = require("./entities/sattribute"); -import SBranch = require("./entities/sbranch"); -import SNote = require("./entities/snote"); +import SAttachment from "./entities/sattachment.js"; +import SAttribute from "./entities/sattribute.js"; +import SBranch from "./entities/sbranch.js"; +import SNote from "./entities/snote.js"; export default class Shaca { notes!: Record; branches!: Record; childParentToBranch!: Record; - private attributes!: Record; + attributes!: Record; attachments!: Record; aliasToNote!: Record; shareRootNote!: SNote | null; diff --git a/src/share/shaca/shaca.ts b/src/share/shaca/shaca.ts index d256b17e1..ca5201335 100644 --- a/src/share/shaca/shaca.ts +++ b/src/share/shaca/shaca.ts @@ -4,4 +4,4 @@ import Shaca from "./shaca-interface"; const shaca = new Shaca(); -export = shaca; +export default shaca; diff --git a/src/share/shaca/shaca_loader.ts b/src/share/shaca/shaca_loader.ts index 050e5e886..1789f6fc0 100644 --- a/src/share/shaca/shaca_loader.ts +++ b/src/share/shaca/shaca_loader.ts @@ -1,14 +1,14 @@ "use strict"; -import sql = require('../sql'); -import shaca = require('./shaca'); -import log = require('../../services/log'); -import SNote = require('./entities/snote'); -import SBranch = require('./entities/sbranch'); -import SAttribute = require('./entities/sattribute'); -import SAttachment = require('./entities/sattachment'); -import shareRoot = require('../share_root'); -import eventService = require('../../services/events'); +import sql from "../sql.js"; +import shaca from "./shaca.js"; +import log from "../../services/log.js"; +import SNote from "./entities/snote.js"; +import SBranch from "./entities/sbranch.js"; +import SAttribute from "./entities/sattribute.js"; +import SAttachment from "./entities/sattachment.js"; +import shareRoot from "../share_root.js"; +import eventService from "../../services/events.js"; import { SAttachmentRow, SAttributeRow, SBranchRow, SNoteRow } from './entities/rows'; function load() { @@ -92,7 +92,7 @@ eventService.subscribe([eventService.ENTITY_CREATED, eventService.ENTITY_CHANGED shaca.reset(); }); -export = { +export default { load, ensureLoad }; diff --git a/src/share/share_root.ts b/src/share/share_root.ts index a500d5ac4..453d5ae8f 100644 --- a/src/share/share_root.ts +++ b/src/share/share_root.ts @@ -1,3 +1,3 @@ -export = { +export default { SHARE_ROOT_NOTE_ID: '_share' } diff --git a/src/share/sql.ts b/src/share/sql.ts index a5465f4c2..0f39dd77d 100644 --- a/src/share/sql.ts +++ b/src/share/sql.ts @@ -1,7 +1,7 @@ "use strict"; -import Database = require('better-sqlite3'); -import dataDir = require('../services/data_dir'); +import Database from "better-sqlite3"; +import dataDir from "../services/data_dir.js"; const dbConnection = new Database(dataDir.DOCUMENT_PATH, { readonly: true }); @@ -27,7 +27,7 @@ function getColumn(query: string, params: string[] = []): T[] { return dbConnection.prepare(query).pluck().all(params) as T[]; } -export = { +export default { getRawRows, getRow, getColumn diff --git a/src/types.d.ts b/src/types.d.ts index 9fe04a204..a956b0e08 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -5,28 +5,28 @@ declare module 'unescape' { function unescape(str: string, type?: string): string; - export = unescape; + export default unescape; } declare module 'html2plaintext' { function html2plaintext(htmlText: string): string; - export = html2plaintext; + export default html2plaintext; } declare module 'normalize-strings' { function normalizeString(string: string): string; - export = normalizeString; + export default normalizeString; } declare module 'joplin-turndown-plugin-gfm' { - import TurndownService = require("turndown"); + import TurndownService from "turndown"; namespace gfm { function gfm(service: TurndownService): void; } - export = gfm; + export default gfm; } declare module 'is-animated' { function isAnimated(buffer: Buffer): boolean; - export = isAnimated; + export default isAnimated; } \ No newline at end of file diff --git a/src/www.ts b/src/www.ts index 3f9aa752e..7f0b14aa5 100644 --- a/src/www.ts +++ b/src/www.ts @@ -1,13 +1,26 @@ #!/usr/bin/env node +import app from "./app.js"; +import sessionParser from "./routes/session_parser.js"; +import fs from "fs"; +import http from "http"; +import https from "https"; +import config from "./services/config.js"; +import log from "./services/log.js"; +import appInfo from "./services/app_info.js"; +import ws from "./services/ws.js"; +import utils from "./services/utils.js"; +import port from "./services/port.js"; +import host from "./services/host.js"; +import semver from "semver"; // setup basic error handling even before requiring dependencies, since those can produce errors as well -process.on('unhandledRejection', error => { +process.on('unhandledRejection', (error: Error) => { // this makes sure that stacktrace of failed promise is printed out console.log(error); // but also try to log it into file - require('./services/log').info(error); + log.info(error); }); function exit() { @@ -18,19 +31,6 @@ function exit() { process.on('SIGINT', exit); process.on('SIGTERM', exit); -import app = require('./app'); -import sessionParser = require('./routes/session_parser'); -import fs = require('fs'); -import http = require('http'); -import https = require('https'); -import config = require('./services/config'); -import log = require('./services/log'); -import appInfo = require('./services/app_info'); -import ws = require('./services/ws'); -import utils = require('./services/utils'); -import port = require('./services/port'); -import host = require('./services/host'); -import semver = require('semver'); if (!semver.satisfies(process.version, ">=10.5.0")) { console.error("Trilium only supports node.js 10.5 and later"); @@ -54,7 +54,7 @@ function startTrilium() { * to do a complex evaluation. */ if (utils.isElectron()) { - require("electron").app.requestSingleInstanceLock(); + require('electron').app.requestSingleInstanceLock(); } log.info(JSON.stringify(appInfo, null, 2)); diff --git a/tsconfig.json b/tsconfig.json index d9bbf4378..b8e0605f4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "moduleResolution": "Node16", - "module": "Node16", + "moduleResolution": "Bundler", + "module": "ES2015", "target": "ES2018", "declaration": false, "sourceMap": true, diff --git a/webpack.config.ts b/webpack.config.ts index bd7135e24..1c67bbe84 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -1,5 +1,5 @@ -import path = require('path'); -import assetPath = require('./src/services/asset_path'); +import path from "path"; +import assetPath from "./src/services/asset_path.js"; module.exports = { mode: 'production',