From 5df539f0a49c65be7521bbde163387e5b54510d4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 3 Dec 2025 20:44:48 +0200 Subject: [PATCH] refactor(dayjs): relocate all plugins and imports to commons --- apps/client/package.json | 4 +--- apps/client/src/services/date_notes.ts | 2 +- .../src/services/frontend_script_api.ts | 2 +- apps/client/src/services/utils.ts | 2 +- apps/client/src/widgets/buttons/calendar.ts | 9 +------ .../src/widgets/watched_file_update_status.ts | 2 +- apps/server/package.json | 1 - apps/server/src/becca/entities/bnote.ts | 4 +--- apps/server/src/routes/login.spec.ts | 2 +- .../server/src/services/backend_script_api.ts | 13 +--------- apps/server/src/services/date_notes.spec.ts | 2 +- apps/server/src/services/date_notes.ts | 12 +--------- apps/server/src/services/date_utils.ts | 2 +- apps/server/src/services/import/enex.ts | 2 +- apps/server/src/services/notes.ts | 2 +- .../src/services/search/services/parse.ts | 2 +- packages/commons/package.json | 4 ++++ packages/commons/src/index.ts | 1 + packages/commons/src/lib/dayjs.ts | 24 +++++++++++++++++++ pnpm-lock.yaml | 24 +++++++++---------- 20 files changed, 56 insertions(+), 60 deletions(-) create mode 100644 packages/commons/src/lib/dayjs.ts diff --git a/apps/client/package.json b/apps/client/package.json index 95b8ca1f3..9af6a8497 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -37,9 +37,7 @@ "bootstrap": "5.3.8", "boxicons": "2.1.4", "clsx": "2.1.1", - "color": "5.0.3", - "dayjs": "1.11.19", - "dayjs-plugin-utc": "0.1.2", + "color": "5.0.3", "debounce": "3.0.0", "draggabilly": "3.0.0", "force-graph": "1.51.0", diff --git a/apps/client/src/services/date_notes.ts b/apps/client/src/services/date_notes.ts index 51d8e68a2..340ebf7f8 100644 --- a/apps/client/src/services/date_notes.ts +++ b/apps/client/src/services/date_notes.ts @@ -1,4 +1,4 @@ -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import type { FNoteRow } from "../entities/fnote.js"; import froca from "./froca.js"; import server from "./server.js"; diff --git a/apps/client/src/services/frontend_script_api.ts b/apps/client/src/services/frontend_script_api.ts index 251edd188..8a1497cd9 100644 --- a/apps/client/src/services/frontend_script_api.ts +++ b/apps/client/src/services/frontend_script_api.ts @@ -17,7 +17,7 @@ import shortcutService from "./shortcuts.js"; import dialogService from "./dialog.js"; import type FNote from "../entities/fnote.js"; import { t } from "./i18n.js"; -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import type NoteContext from "../components/note_context.js"; import type Component from "../components/component.js"; import { formatLogMessage } from "@triliumnext/commons"; diff --git a/apps/client/src/services/utils.ts b/apps/client/src/services/utils.ts index 3febb37c2..2045cd4d7 100644 --- a/apps/client/src/services/utils.ts +++ b/apps/client/src/services/utils.ts @@ -1,4 +1,4 @@ -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import type { ViewScope } from "./link.js"; import FNote from "../entities/fnote"; diff --git a/apps/client/src/widgets/buttons/calendar.ts b/apps/client/src/widgets/buttons/calendar.ts index f03a4da3a..296699882 100644 --- a/apps/client/src/widgets/buttons/calendar.ts +++ b/apps/client/src/widgets/buttons/calendar.ts @@ -7,17 +7,10 @@ import toastService from "../../services/toast.js"; import options from "../../services/options.js"; import { Dropdown } from "bootstrap"; import type { EventData } from "../../components/app_context.js"; -import dayjs, { Dayjs } from "dayjs"; -import isoWeek from "dayjs/plugin/isoWeek.js"; -import utc from "dayjs/plugin/utc.js"; -import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; +import { dayjs, type Dayjs } from "@triliumnext/commons"; import "../../stylesheets/calendar.css"; import type { AttributeRow, OptionDefinitions } from "@triliumnext/commons"; -dayjs.extend(utc); -dayjs.extend(isSameOrAfter); -dayjs.extend(isoWeek); - const MONTHS = [ t("calendar.january"), t("calendar.february"), diff --git a/apps/client/src/widgets/watched_file_update_status.ts b/apps/client/src/widgets/watched_file_update_status.ts index efec3d2af..4e3a93c81 100644 --- a/apps/client/src/widgets/watched_file_update_status.ts +++ b/apps/client/src/widgets/watched_file_update_status.ts @@ -2,7 +2,7 @@ import { t } from "../services/i18n.js"; import NoteContextAwareWidget from "./note_context_aware_widget.js"; import server from "../services/server.js"; import fileWatcher from "../services/file_watcher.js"; -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import type { EventData } from "../components/app_context.js"; import type FNote from "../entities/fnote.js"; diff --git a/apps/server/package.json b/apps/server/package.json index 97f13c3f7..cb58201be 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -76,7 +76,6 @@ "compression": "1.8.1", "cookie-parser": "1.4.7", "csrf-csrf": "3.2.2", - "dayjs": "1.11.19", "debounce": "3.0.0", "debug": "4.4.3", "ejs": "3.1.10", diff --git a/apps/server/src/becca/entities/bnote.ts b/apps/server/src/becca/entities/bnote.ts index a2ff4c282..006a7c3d4 100644 --- a/apps/server/src/becca/entities/bnote.ts +++ b/apps/server/src/becca/entities/bnote.ts @@ -11,8 +11,7 @@ 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.js"; +import { dayjs } from "@triliumnext/commons"; import eventService from "../../services/events.js"; import type { AttachmentRow, AttributeType, CloneResponse, NoteRow, NoteType, RevisionRow } from "@triliumnext/commons"; import type BBranch from "./bbranch.js"; @@ -22,7 +21,6 @@ import searchService from "../../services/search/services/search.js"; import cloningService from "../../services/cloning.js"; import noteService from "../../services/notes.js"; import handlers from "../../services/handlers.js"; -dayjs.extend(utc); const LABEL = "label"; const RELATION = "relation"; diff --git a/apps/server/src/routes/login.spec.ts b/apps/server/src/routes/login.spec.ts index 85754d63c..07451ec43 100644 --- a/apps/server/src/routes/login.spec.ts +++ b/apps/server/src/routes/login.spec.ts @@ -1,7 +1,7 @@ import { beforeAll, describe, expect, it } from "vitest"; import supertest, { type Response } from "supertest"; import type { Application } from "express"; -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import { type SQLiteSessionStore } from "./session_parser.js"; import { SessionData } from "express-session"; import cls from "../services/cls.js"; diff --git a/apps/server/src/services/backend_script_api.ts b/apps/server/src/services/backend_script_api.ts index f7ee60e39..b322926ef 100644 --- a/apps/server/src/services/backend_script_api.ts +++ b/apps/server/src/services/backend_script_api.ts @@ -7,7 +7,7 @@ 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 { dayjs } from "@triliumnext/commons"; import xml2js from "xml2js"; import * as cheerio from "cheerio"; import cloningService from "./cloning.js"; @@ -37,17 +37,6 @@ import type Becca from "../becca/becca-interface.js"; import type { NoteParams } from "./note-interface.js"; import type { ApiParams } from "./backend_script_api_interface.js"; -// Dayjs plugins -import isSameOrBefore from "dayjs/plugin/isSameOrBefore"; -import isSameOrAfter from "dayjs/plugin/isSameOrAfter"; -import isBetween from "dayjs/plugin/isBetween"; -import advancedFormat from "dayjs/plugin/advancedFormat.js"; - -dayjs.extend(isSameOrBefore); -dayjs.extend(isSameOrAfter); -dayjs.extend(isBetween); -dayjs.extend(advancedFormat); - /** * A whole number * @typedef {number} int diff --git a/apps/server/src/services/date_notes.spec.ts b/apps/server/src/services/date_notes.spec.ts index 3bfccd394..576bd53c3 100644 --- a/apps/server/src/services/date_notes.spec.ts +++ b/apps/server/src/services/date_notes.spec.ts @@ -1,4 +1,4 @@ -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import { describe, expect, it, vi } from 'vitest'; import type BNote from "../becca/entities/bnote.js"; diff --git a/apps/server/src/services/date_notes.ts b/apps/server/src/services/date_notes.ts index 7b8849b2d..304c3a5c1 100644 --- a/apps/server/src/services/date_notes.ts +++ b/apps/server/src/services/date_notes.ts @@ -1,27 +1,17 @@ import type BNote from "../becca/entities/bnote.js"; -import type { Dayjs } from "dayjs"; -import advancedFormat from "dayjs/plugin/advancedFormat.js"; import attributeService from "./attributes.js"; import cloningService from "./cloning.js"; -import dayjs from "dayjs"; +import { dayjs, Dayjs } from "@triliumnext/commons"; import hoistedNoteService from "./hoisted_note.js"; -import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; import noteService from "./notes.js"; import optionService from "./options.js"; import protectedSessionService from "./protected_session.js"; -import quarterOfYear from "dayjs/plugin/quarterOfYear.js"; import searchContext from "../services/search/search_context.js"; import searchService from "../services/search/services/search.js"; import sql from "./sql.js"; import { t } from "i18next"; import { ordinal } from "./i18n.js"; -import isoWeek from "dayjs/plugin/isoWeek.js"; - -dayjs.extend(isSameOrAfter); -dayjs.extend(quarterOfYear); -dayjs.extend(advancedFormat); -dayjs.extend(isoWeek); const CALENDAR_ROOT_LABEL = "calendarRoot"; const YEAR_LABEL = "yearNote"; diff --git a/apps/server/src/services/date_utils.ts b/apps/server/src/services/date_utils.ts index 89b39f456..0cbe69cfa 100644 --- a/apps/server/src/services/date_utils.ts +++ b/apps/server/src/services/date_utils.ts @@ -1,4 +1,4 @@ -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import cls from "./cls.js"; const LOCAL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss.SSSZZ"; diff --git a/apps/server/src/services/import/enex.ts b/apps/server/src/services/import/enex.ts index 94104104a..5f9166fce 100644 --- a/apps/server/src/services/import/enex.ts +++ b/apps/server/src/services/import/enex.ts @@ -1,4 +1,4 @@ -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import sax from "sax"; import stream from "stream"; import { Throttle } from "stream-throttle"; diff --git a/apps/server/src/services/notes.ts b/apps/server/src/services/notes.ts index ae8b24c0b..4964a5797 100644 --- a/apps/server/src/services/notes.ts +++ b/apps/server/src/services/notes.ts @@ -16,7 +16,7 @@ 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 { dayjs } from "@triliumnext/commons"; import htmlSanitizer from "./html_sanitizer.js"; import ValidationError from "../errors/validation_error.js"; import noteTypesService from "./note_types.js"; diff --git a/apps/server/src/services/search/services/parse.ts b/apps/server/src/services/search/services/parse.ts index 03986b9ac..e6381af30 100644 --- a/apps/server/src/services/search/services/parse.ts +++ b/apps/server/src/services/search/services/parse.ts @@ -1,6 +1,6 @@ "use strict"; -import dayjs from "dayjs"; +import { dayjs } from "@triliumnext/commons"; import AndExp from "../expressions/and.js"; import OrExp from "../expressions/or.js"; import NotExp from "../expressions/not.js"; diff --git a/packages/commons/package.json b/packages/commons/package.json index ceeaf6bd4..ebed17ef6 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -10,5 +10,9 @@ "name": "Trilium Notes Team", "email": "contact@eliandoran.me", "url": "https://triliumnotes.org" + }, + "dependencies": { + "dayjs": "1.11.19", + "dayjs-plugin-utc": "0.1.2" } } \ No newline at end of file diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index c74cd758f..6fb65baac 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -11,3 +11,4 @@ export * from "./lib/shared_constants.js"; export * from "./lib/ws_api.js"; export * from "./lib/attribute_names.js"; export * from "./lib/utils.js"; +export * from "./lib/dayjs.js"; diff --git a/packages/commons/src/lib/dayjs.ts b/packages/commons/src/lib/dayjs.ts new file mode 100644 index 000000000..a75e0d1ea --- /dev/null +++ b/packages/commons/src/lib/dayjs.ts @@ -0,0 +1,24 @@ +import { default as dayjs, type Dayjs } from "dayjs"; + +//#region Plugins +import advancedFormat from "dayjs/plugin/advancedFormat.js"; +import isBetween from "dayjs/plugin/isBetween.js"; +import isoWeek from "dayjs/plugin/isoWeek.js"; +import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; +import isSameOrBefore from "dayjs/plugin/isSameOrBefore.js"; +import quarterOfYear from "dayjs/plugin/quarterOfYear.js"; +import utc from "dayjs/plugin/utc.js"; + +dayjs.extend(advancedFormat); +dayjs.extend(isBetween); +dayjs.extend(isoWeek); +dayjs.extend(isSameOrAfter); +dayjs.extend(isSameOrBefore); +dayjs.extend(quarterOfYear); +dayjs.extend(utc); +//#endregion + +export { + dayjs, + Dayjs +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f51386c6..e9647fbf5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -226,12 +226,6 @@ importers: color: specifier: 5.0.3 version: 5.0.3 - dayjs: - specifier: 1.11.19 - version: 1.11.19 - dayjs-plugin-utc: - specifier: 0.1.2 - version: 0.1.2 debounce: specifier: 3.0.0 version: 3.0.0 @@ -636,9 +630,6 @@ importers: csrf-csrf: specifier: 3.2.2 version: 3.2.2 - dayjs: - specifier: 1.11.19 - version: 1.11.19 debounce: specifier: 3.0.0 version: 3.0.0 @@ -1328,7 +1319,14 @@ importers: specifier: 9.39.1 version: 9.39.1 - packages/commons: {} + packages/commons: + dependencies: + dayjs: + specifier: 1.11.19 + version: 1.11.19 + dayjs-plugin-utc: + specifier: 0.1.2 + version: 0.1.2 packages/express-partial-content: dependencies: @@ -15150,6 +15148,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15214,8 +15214,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-watchdog': 47.2.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15719,6 +15717,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-widget': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-mention@47.2.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: