From 5376c595c2d753dc437556335cbe58f15e2f6966 Mon Sep 17 00:00:00 2001 From: Trey Wallis <40307803+trey-wallis@users.noreply.github.com> Date: Sat, 25 May 2024 14:25:02 -0600 Subject: [PATCH] Feat logging (#28) * feat: add logging functionality * refactor: move into types folder * feat: add log statement for saving * refactor: use logger.warn instead of console.error --- bun.lockb | Bin 80748 -> 81095 bytes package.json | 65 +++++++++--------- src/constants.ts | 9 ++- src/logger/constants.ts | 6 ++ src/logger/index.ts | 54 +++++++++++++++ src/logger/types.ts | 10 +++ src/main.ts | 27 ++++++-- src/obsidian/vault-explorer-settings-tab.ts | 29 +++++++- .../app/services/filters/property-filter.ts | 11 +-- src/{types.ts => types/index.ts} | 1 + src/{ => types}/types-0.3.0.ts | 0 src/{ => types}/types-0.5.5.ts | 0 12 files changed, 167 insertions(+), 45 deletions(-) create mode 100644 src/logger/constants.ts create mode 100644 src/logger/index.ts create mode 100644 src/logger/types.ts rename src/{types.ts => types/index.ts} (99%) rename src/{ => types}/types-0.3.0.ts (100%) rename src/{ => types}/types-0.5.5.ts (100%) diff --git a/bun.lockb b/bun.lockb index 2a05233afc00b0b51976323d61098501076202ed..28feba7b635adcf86969c9c066d52d0c5fb80efd 100755 GIT binary patch delta 12542 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 Mk*}H?iLChl0WvgPsQ>@~ delta 12310 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 XJ7-s1jS(%k&%C?YcPAbrnZ5oCK21F$ diff --git a/package.json b/package.json index eee6355..cab47ff 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,35 @@ { - "name": "obsidian-vault-explorer", - "version": "1.0.0", - "description": "Explore your vault in visual format", - "main": "main.js", - "scripts": { - "dev": "node esbuild.config.mjs", - "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "version": "node version-bump.mjs && git add manifest.json versions.json" - }, - "keywords": [], - "author": "Trey Wallis", - "license": "MIT", - "devDependencies": { - "@tsconfig/svelte": "^5.0.4", - "@types/bun": "latest", - "@types/lodash": "^4.17.0", - "@types/node": "^16.11.6", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", - "builtin-modules": "3.3.0", - "esbuild": "0.17.3", - "esbuild-svelte": "^0.8.0", - "obsidian": "latest", - "svelte-preprocess": "^5.1.4", - "tslib": "2.4.0", - "typescript": "4.7.4" - }, - "dependencies": { - "lodash": "^4.17.21", - "nanoid": "^5.0.7", - "svelte": "^4.2.15" - } + "name": "obsidian-vault-explorer", + "version": "1.0.0", + "description": "Explore your vault in visual format", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "version": "node version-bump.mjs && git add manifest.json versions.json" + }, + "keywords": [], + "author": "Trey Wallis", + "license": "MIT", + "devDependencies": { + "@tsconfig/svelte": "^5.0.4", + "@types/bun": "latest", + "@types/lodash": "^4.17.0", + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "0.17.3", + "esbuild-svelte": "^0.8.0", + "obsidian": "latest", + "svelte-preprocess": "^5.1.4", + "tslib": "2.4.0", + "typescript": "4.7.4" + }, + "dependencies": { + "js-logger": "^1.6.1", + "lodash": "^4.17.21", + "nanoid": "^5.0.7", + "svelte": "^4.2.15" + } } diff --git a/src/constants.ts b/src/constants.ts index b9d9179..4d158e0 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,10 +1,13 @@ +import { LOG_LEVEL_WARN } from "./logger/constants"; import { generateUUID } from "./svelte/shared/services/uuid"; import { VaultExplorerPluginSettings } from "./types"; export const VAULT_EXPLORER_VIEW = "vault-explorer"; -const uuid = generateUUID(); +const groupUUID = generateUUID(); + export const DEFAULT_SETTINGS: VaultExplorerPluginSettings = { + logLevel: LOG_LEVEL_WARN, properties: { favorite: "", url: "", @@ -19,11 +22,11 @@ export const DEFAULT_SETTINGS: VaultExplorerPluginSettings = { timestamp: "all", sort: "file-name-asc", properties: { - selectedGroupId: uuid, + selectedGroupId: groupUUID, groups: [ { - id: uuid, + id: groupUUID, name: "Group 1", filters: [], isEnabled: true diff --git a/src/logger/constants.ts b/src/logger/constants.ts new file mode 100644 index 0000000..2e5f839 --- /dev/null +++ b/src/logger/constants.ts @@ -0,0 +1,6 @@ +export const LOG_LEVEL_OFF = "off"; +export const LOG_LEVEL_ERROR = "error"; +export const LOG_LEVEL_WARN = "warn"; +export const LOG_LEVEL_INFO = "info"; +export const LOG_LEVEL_DEBUG = "debug"; +export const LOG_LEVEL_TRACE = "trace"; diff --git a/src/logger/index.ts b/src/logger/index.ts new file mode 100644 index 0000000..f821c1a --- /dev/null +++ b/src/logger/index.ts @@ -0,0 +1,54 @@ +import Logger, { ILogLevel } from "js-logger"; +import { LOG_LEVEL_OFF, LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_TRACE } from "./constants"; +import { FormattedLogMessage, LogMessageHeader } from "./types"; + + +export const logLevelToString = (level: ILogLevel) => { + switch (level) { + case Logger.OFF: + return LOG_LEVEL_OFF; + case Logger.ERROR: + return LOG_LEVEL_ERROR; + case Logger.WARN: + return LOG_LEVEL_WARN; + case Logger.INFO: + return LOG_LEVEL_INFO; + case Logger.DEBUG: + return LOG_LEVEL_DEBUG; + case Logger.TRACE: + return LOG_LEVEL_TRACE; + default: + throw new Error("Unhandled log level"); + } +} + +export const stringToLogLevel = (value: string) => { + switch (value) { + case LOG_LEVEL_OFF: + return Logger.OFF; + case LOG_LEVEL_ERROR: + return Logger.ERROR; + case LOG_LEVEL_WARN: + return Logger.WARN; + case LOG_LEVEL_INFO: + return Logger.INFO; + case LOG_LEVEL_DEBUG: + return Logger.DEBUG; + case LOG_LEVEL_TRACE: + return Logger.TRACE; + default: + throw new Error(`Unhandled log level: ${value}`); + } +} + +export const formatMessageForLogger = (...args: unknown[]): FormattedLogMessage => { + const head: unknown = args[0]; + const body = args[1] as unknown as Record; + if (typeof args[0] == "object") { + const headers = head as LogMessageHeader; + const { fileName, functionName, message } = headers; + return { message: `[${fileName}:${functionName}] ${message}`, data: body }; + } else { + return { message: String(head), data: body }; + } +} diff --git a/src/logger/types.ts b/src/logger/types.ts new file mode 100644 index 0000000..1e94ff9 --- /dev/null +++ b/src/logger/types.ts @@ -0,0 +1,10 @@ +export interface FormattedLogMessage { + message: string; + data: Record | null; +} + +export interface LogMessageHeader { + fileName: string; + functionName: string; + message: string; +} diff --git a/src/main.ts b/src/main.ts index b869b50..8497c3c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,8 +8,11 @@ import { DEFAULT_SETTINGS, VAULT_EXPLORER_VIEW } from './constants'; import _ from 'lodash'; import EventManager from './event/event-manager'; import { isVersionLessThan } from './utils'; -import { VaultExplorerPluginSettings_0_3_3 } from './types-0.3.0'; -import { VaultExplorerPluginSettings_0_5_5 } from './types-0.5.5'; +import { VaultExplorerPluginSettings_0_3_3 } from './types/types-0.3.0'; +import { VaultExplorerPluginSettings_0_5_5 } from './types/types-0.5.5'; +import Logger from 'js-logger'; +import { formatMessageForLogger, stringToLogLevel } from './logger'; +import { LOG_LEVEL_WARN } from './logger/constants'; export default class VaultExplorerPlugin extends Plugin { settings: VaultExplorerPluginSettings = DEFAULT_SETTINGS; @@ -17,6 +20,20 @@ export default class VaultExplorerPlugin extends Plugin { async onload() { await this.loadSettings(); + //Setup logger + Logger.useDefaults(); + Logger.setHandler(function (messages) { + const { message, data } = formatMessageForLogger(...messages); + console.log(message); + if (data) { + console.log(data); + } + }); + + const logLevel = stringToLogLevel(this.settings.logLevel); + Logger.setLevel(logLevel); + + this.registerView( VAULT_EXPLORER_VIEW, (leaf) => new VaultExplorerView(leaf, this) @@ -106,7 +123,7 @@ export default class VaultExplorerPlugin extends Plugin { if (isVersionLessThan(settingsVersion, "0.4.0")) { console.log("Upgrading settings from version 0.3.3 to 0.4.0"); const typedData = (data as unknown) as VaultExplorerPluginSettings_0_3_3; - const newData: VaultExplorerPluginSettings = { + const newData: VaultExplorerPluginSettings_0_5_5 = { ...typedData, filters: { ...typedData.filters, @@ -124,6 +141,7 @@ export default class VaultExplorerPlugin extends Plugin { const typedData = (data as unknown) as VaultExplorerPluginSettings_0_5_5; const newData: VaultExplorerPluginSettings = { ...typedData, + logLevel: LOG_LEVEL_WARN, filters: { ...typedData.filters, properties: { @@ -153,7 +171,8 @@ export default class VaultExplorerPlugin extends Plugin { } async saveSettings() { + Logger.trace({ fileName: "main.ts", functionName: "saveSettings", message: "called" }); + Logger.debug({ fileName: "main.ts", functionName: "saveSettings", message: "Saving settings" }, this.settings); await this.saveData(this.settings); - // console.log("Settings saved"); } } diff --git a/src/obsidian/vault-explorer-settings-tab.ts b/src/obsidian/vault-explorer-settings-tab.ts index 9bad9eb..4ef377e 100644 --- a/src/obsidian/vault-explorer-settings-tab.ts +++ b/src/obsidian/vault-explorer-settings-tab.ts @@ -1,6 +1,9 @@ import { App, PluginSettingTab, Setting } from "obsidian"; import VaultExplorerPlugin from "src/main"; -import { getAllObsidianProperties, getDropdownOptionsForProperties, getObsidianPropertiesByType } from "./utils"; +import { getDropdownOptionsForProperties, getObsidianPropertiesByType } from "./utils"; +import { LOG_LEVEL_DEBUG, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_OFF, LOG_LEVEL_TRACE, LOG_LEVEL_WARN } from "src/logger/constants"; +import Logger from "js-logger"; +import { stringToLogLevel } from "src/logger"; export default class VaultExplorerSettingsTab extends PluginSettingTab { plugin: VaultExplorerPlugin; @@ -89,5 +92,29 @@ export default class VaultExplorerSettingsTab extends PluginSettingTab { await this.plugin.saveSettings(); })); + new Setting(containerEl).setName("Debugging").setHeading(); + new Setting(containerEl) + .setName("Log level") + .setDesc( + "Sets the log level. Please use trace to see all log messages." + ) + .addDropdown((cb) => { + cb.addOptions({ + [LOG_LEVEL_OFF]: "Off", + [LOG_LEVEL_ERROR]: "Error", + [LOG_LEVEL_WARN]: "Warn", + [LOG_LEVEL_INFO]: "Info", + [LOG_LEVEL_DEBUG]: "Debug", + [LOG_LEVEL_TRACE]: "Trace" + }) + cb.setValue(this.plugin.settings.logLevel).onChange( + async (value) => { + this.plugin.settings.logLevel = value; + await this.plugin.saveSettings(); + Logger.setLevel(stringToLogLevel(value)); + } + ); + }); + } } diff --git a/src/svelte/app/services/filters/property-filter.ts b/src/svelte/app/services/filters/property-filter.ts index b17170f..2ba7368 100644 --- a/src/svelte/app/services/filters/property-filter.ts +++ b/src/svelte/app/services/filters/property-filter.ts @@ -2,6 +2,7 @@ import { FrontMatterCache } from "obsidian"; import { CheckboxFilterCondition, DateFilterCondition, ListFilterCondition, NumberFilterCondition, PropertyFilterGroup } from "src/types"; import { FilterCondition, TextFilterCondition } from "src/types"; import { getBeforeMidnightMillis, getMidnightMillis, getMillis } from "../time-utils"; +import Logger from "js-logger"; //Tests //Group is enabled/disabled @@ -30,14 +31,14 @@ export const filterByProperty = (frontmatter: FrontMatterCache | undefined, grou if (type === "text") { //If the value is not a string, skip the filter if (propertyValue !== null && typeof propertyValue !== "string") { - console.error(`Property value is not a string: ${propertyValue}`); + Logger.warn(`Property value is not a string: ${propertyValue}`); return true; } const doesMatch = doesTextMatchFilter(condition, propertyValue, value); return doesMatch; } else if (type === "list") { if (propertyValue !== null && !Array.isArray(propertyValue)) { - console.error(`Property value is not an array: ${propertyValue}`); + Logger.warn(`Property value is not an array: ${propertyValue}`); return true; } const compare = value.split(",").map((v) => v.trim()); @@ -45,7 +46,7 @@ export const filterByProperty = (frontmatter: FrontMatterCache | undefined, grou return doesMatch; } else if (type === "number") { if (propertyValue !== null && typeof propertyValue !== "number") { - console.error(`Property value is not a number: ${propertyValue}`); + Logger.warn(`Property value is not a number: ${propertyValue}`); return true; } const compare = parseFloat(value); @@ -53,7 +54,7 @@ export const filterByProperty = (frontmatter: FrontMatterCache | undefined, grou return doesMatch; } else if (type === "checkbox") { if (propertyValue !== null && typeof propertyValue !== "boolean") { - console.error(`Property value is not a boolean: ${propertyValue}`); + Logger.warn(`Property value is not a boolean: ${propertyValue}`); return true; } @@ -63,7 +64,7 @@ export const filterByProperty = (frontmatter: FrontMatterCache | undefined, grou } else if (type === "date" || type === "datetime") { if (propertyValue !== null && typeof propertyValue !== "string") { - console.error(`Property value is not a string: ${propertyValue}`); + Logger.warn(`Property value is not a string: ${propertyValue}`); return true; } diff --git a/src/types.ts b/src/types/index.ts similarity index 99% rename from src/types.ts rename to src/types/index.ts index f961e27..19ad10f 100644 --- a/src/types.ts +++ b/src/types/index.ts @@ -1,4 +1,5 @@ export interface VaultExplorerPluginSettings { + logLevel: string; properties: { favorite: string; url: string; diff --git a/src/types-0.3.0.ts b/src/types/types-0.3.0.ts similarity index 100% rename from src/types-0.3.0.ts rename to src/types/types-0.3.0.ts diff --git a/src/types-0.5.5.ts b/src/types/types-0.5.5.ts similarity index 100% rename from src/types-0.5.5.ts rename to src/types/types-0.5.5.ts