From 5a93cef1bfec7d4d8853d5a7ed84fbc3e10e4309 Mon Sep 17 00:00:00 2001 From: Andrea Alberti Date: Fri, 9 Aug 2024 10:59:23 +0200 Subject: [PATCH] Refactoring code for maintaining versions. --- legacy_settings/data_1_0.json | 6 + legacy_settings/data_1_3.json | 19 +++ legacy_settings/data_1_4.json | 235 ++++++++++++++++++++++++++++++++++ src/defaults.ts | 21 +-- src/defaults_legacy.ts | 22 ++++ src/main.ts | 51 +++++--- src/manageAnnotations.ts | 6 +- src/settings_tab.ts | 4 +- src/types.ts | 63 +-------- src/types_legacy.ts | 72 +++++++++++ 10 files changed, 396 insertions(+), 103 deletions(-) create mode 100644 legacy_settings/data_1_0.json create mode 100644 legacy_settings/data_1_3.json create mode 100644 legacy_settings/data_1_4.json create mode 100644 src/defaults_legacy.ts create mode 100644 src/types_legacy.ts diff --git a/legacy_settings/data_1_0.json b/legacy_settings/data_1_0.json new file mode 100644 index 0000000..27832c9 --- /dev/null +++ b/legacy_settings/data_1_0.json @@ -0,0 +1,6 @@ +{ + "dataview-recent-files": "markdown:\nMy own plugin to show the recently modified files.\n[[2024-06-13 Survey group culture]]\n\n![[00 Meta/Misc/Test.jpg]]\n\n[[2024-08-05 Review Cs-based Rydberg quantum computers]]", + "dataview": "Super-useful plugin that allows querying the notes to provide database functionality. 🔥🔥🔥", + "highlightr-plugin": "Allows highlighting the markdown text.", + "obsidian-completr": "Allows auto-completion of commands. Very useful." +} \ No newline at end of file diff --git a/legacy_settings/data_1_3.json b/legacy_settings/data_1_3.json new file mode 100644 index 0000000..97e3096 --- /dev/null +++ b/legacy_settings/data_1_3.json @@ -0,0 +1,19 @@ +{ + "annotations": + { + "dataview-recent-files": "markdown:\nMy own plugin to show the recently modified files.\n[[2024-06-13 Survey group culture]]\n\n![[00 Meta/Misc/Test.jpg]]\n\n[[2024-08-05 Review Cs-based Rydberg quantum computers]]", + "dataview": "Super-useful plugin that allows querying the notes to provide database functionality. 🔥🔥🔥", + "highlightr-plugin": "Allows highlighting the markdown text.", + "obsidian-completr": "Allows auto-completion of commands. Very useful." + }, + "plugins_annotations_uuid": "FAA70013-38E9-4FDF-B06A-F899F6487C19", + "hide_placeholders": true, + "delete_placeholder_string_on_insertion": true, + "label_mobile": "Annotation: ", + "label_desktop": "Personal annotation: ", + "label_placeholder": "Add your personal comment about ${plugin_name} here...", + "editable": true, + "automatic_remove": false, + "markdown_file_path": "00 Meta/Misc/Plugins annotations.md", + "markdown_notes": false +} \ No newline at end of file diff --git a/legacy_settings/data_1_4.json b/legacy_settings/data_1_4.json new file mode 100644 index 0000000..f79a670 --- /dev/null +++ b/legacy_settings/data_1_4.json @@ -0,0 +1,235 @@ +{ + "annotations": + { + "dataview-recent-files": + { + "name": "Dataview Recent Files", + "anno": "markdown:\nMy own plugin to show the recently modified files.\n[[2024-06-13 Survey group culture]]\n\n![[00 Meta/Misc/Test.jpg]]\n\n[[2024-08-05 Review Cs-based Rydberg quantum computers]]" + }, + "dataview": + { + "name": "Dataview", + "anno": "Super-useful plugin that allows querying the notes to provide database functionality. 🔥🔥🔥" + }, + "highlightr-plugin": + { + "name": "Highlightr", + "anno": "Allows highlighting the markdown text." + }, + "obsidian-completr": + { + "name": "Completr", + "anno": "Allows auto-completion of commands. Very useful." + }, + "find-unlinked-files": + { + "name": "Find orphaned files and broken links", + "anno": "Very useful to find orphaned files and broken links." + }, + "homepage": + { + "name": "Homepage", + "anno": "Useful to show a customized homepage." + }, + "obsidian-icon-folder": + { + "name": "Iconize", + "anno": "Useful to customize icons." + }, + "import-attachments-plus": + { + "name": "Import Attachments+", + "anno": "My own plugin to import attachments by moving them into the vault." + }, + "obsidian-languagetool-plugin": + { + "name": "LanguageTool Integration", + "anno": "Very useful as spell checker." + }, + "languagetool": + { + "name": "LanguageTool Checker", + "anno": "It is claimed to be better but it does not work. It is still in beta function." + }, + "number-headings-obsidian": + { + "name": "Number Headings", + "anno": "Very useful to add numbers to the headings." + }, + "pdf-plus": + { + "name": "PDF++", + "anno": "Very useful to comment PDF documents in Obsidian." + }, + "templater-obsidian": + { + "name": "Templater", + "anno": "Very useful to define templates." + }, + "obsidian-tasks-plugin": + { + "name": "Tasks", + "anno": "Not really useful. Never used so far." + }, + "obsidian-style-settings": + { + "name": "Style Settings", + "anno": "Super useful to customize the style with CCS and be able to modify the settings from Obsidian." + }, + "obsidian-smart-typography": + { + "name": "Smart Typography", + "anno": "Semi useful to improve typography of symbols." + }, + "wikilinks-to-mdlinks-obsidian": + { + "name": "Wikilinks to MDLinks", + "anno": "Not really needed. It converts Wikilinks to MD links." + }, + "webpage-html-export": + { + "name": "Webpage HTML Export", + "anno": "Super useful to export in HTML. It is a bit clunky to load. It is per default disabled, unless I need it." + }, + "frontmatter-modified-date": + { + "name": "Update modified date", + "anno": "Very useful to update the property `modified date`." + }, + "supercharged-links-obsidian": + { + "name": "Supercharged Links", + "anno": "The idea is very nice but then the MD notes are not really readable outside of Obsidian. Disabled for now." + }, + "tag-wrangler": + { + "name": "Tag Wrangler", + "anno": "Very useful to rename tags across all notes." + }, + "sheets": + { + "name": "Sheets Extended", + "anno": "Useful to extend tables and merge cells." + }, + "obsidian-html-plugin": + { + "name": "HTML Reader", + "anno": "It allows opening HTML files in Obsidian." + }, + "obsidian-advanced-uri": + { + "name": "Advanced URI", + "anno": "Very useful to copy URI." + }, + "callout-manager": + { + "name": "Callout Manager", + "anno": "Offers a GUI to customize callouts." + }, + "obsidian-file-path-to-uri": + { + "name": "File path to URI", + "anno": "Not really needed. It converts a file path to a URI." + }, + "obsidian-text-expander-js": + { + "name": "Inline Scripts", + "anno": "Quite powerful to run inline scripts, and replace predefined macros. However, not really used." + }, + "omnisearch": + { + "name": "Omnisearch", + "anno": "Powerful tool to search through the vault." + }, + "obsidian-outliner": + { + "name": "Outliner", + "anno": "Very handy to operate on outlines." + }, + "url-into-selection": + { + "name": "Paste URL into selection", + "anno": "Not really needed. It causes more confusion when pasting on existing selected text." + }, + "periodic-notes": + { + "name": "Periodic Notes", + "anno": "Manages daily notes. Just used for daily notes." + }, + "settings-search": + { + "name": "Settings Search", + "anno": "Adds a search field with a fuzzy search functionality to search through Obsidian settings." + }, + "text-extractor": + { + "name": "Text Extractor", + "anno": "I did not really test it how good it works." + }, + "file-explorer-note-count": + { + "name": "File Explorer Note Count", + "anno": "Very useful to display the number of notes in the various folders." + }, + "plugins-annotations": + { + "name": "Plugins Annotations", + "anno": "My own plugin to take notes about installed plugins." + }, + "editing-toolbar": + { + "name": "Editing Toolbar", + "anno": "Nice toolbar shown above the notes. Quite handy." + }, + "obsidian-spaced-repetition": + { + "name": "Spaced Repetition", + "anno": "Super effective plugin to learn flashcards." + }, + "table-editor-obsidian": + { + "name": "Advanced Tables", + "anno": "A must to operate on tables in Obsidian. 🚀🚀🚀" + }, + "settings-management": + { + "name": "Settings Management", + "anno": "Enhanced settings with multiple configurations." + }, + "obsidian-admonition": + { + "name": "Admonition", + "anno": "Improve callouts 🖋️. They can be entered as `codeblocks`." + }, + "obsidian-divide-and-conquer": + { + "name": "Divide & Conquer", + "anno": "Plugin useful to debug problems with plugins. Generally, it can be left disabled." + }, + "js-engine": + { + "name": "JS Engine", + "anno": "Allows executing Javascript dynamically in the note." + }, + "plugin-reloader": + { + "name": "Plugin Reloader", + "anno": "Allows reloading a specific plugin without restarting Obsidian. Hotkeys configurable." + }, + "obsidian-kanban": + { + "name": "Kanban", + "anno": "Plugin for the Kanban 🗓️ organization." + } + }, + "plugins_annotations_uuid": "B265C5B2-A6AD-4194-9E4C-C1327DB1EA18", + "hide_placeholders": true, + "delete_placeholder_string_on_insertion": true, + "label_mobile": "Annotation: ", + "label_desktop": "Personal annotation: ", + "label_placeholder": "Add your personal comment about ${plugin_name} here...", + "editable": true, + "automatic_remove": false, + "markdown_file_path": "00 Meta/Misc/Plugins annotations.md", + "markdown_notes": false +} \ No newline at end of file diff --git a/src/defaults.ts b/src/defaults.ts index 9b30a2f..094fa24 100644 --- a/src/defaults.ts +++ b/src/defaults.ts @@ -1,22 +1,5 @@ // defaults.ts -import { PluginsAnnotationsSettingsWithoutNames, PluginsAnnotationsSettings } from './types'; +// import { PluginsAnnotationsSettings_1_4_0 } from './types_legacy'; -export const DEFAULT_SETTINGS: PluginsAnnotationsSettings = { - annotations: {}, - plugins_annotations_uuid: 'B265C5B2-A6AD-4194-9E4C-C1327DB1EA18', - hide_placeholders: false, - delete_placeholder_string_on_insertion: false, - label_mobile: 'Annotation: ', - label_desktop: 'Personal annotation: ', - label_placeholder : "Add your personal comment about ${plugin_name} here...", - editable: true, - automatic_remove: false, - markdown_file_path: '', -} - -export const DEFAULT_SETTINGS_WITHOUT_NAMES: PluginsAnnotationsSettingsWithoutNames = { - ...DEFAULT_SETTINGS, - annotations: {}, // Override the annotations property with the appropriate type - plugins_annotations_uuid: 'FAA70013-38E9-4FDF-B06A-F899F6487C19', -}; \ No newline at end of file +export const a = 1; \ No newline at end of file diff --git a/src/defaults_legacy.ts b/src/defaults_legacy.ts new file mode 100644 index 0000000..fa4474c --- /dev/null +++ b/src/defaults_legacy.ts @@ -0,0 +1,22 @@ +// defaults.ts + +import { PluginsAnnotationsSettings_1_3_0, PluginsAnnotationsSettings_1_4_0 } from './types_legacy'; + +export const DEFAULT_SETTINGS_1_4_0: PluginsAnnotationsSettings_1_4_0 = { + annotations: {}, + plugins_annotations_uuid: 'B265C5B2-A6AD-4194-9E4C-C1327DB1EA18', + hide_placeholders: false, + delete_placeholder_string_on_insertion: false, + label_mobile: 'Annotation: ', + label_desktop: 'Personal annotation: ', + label_placeholder : "Add your personal comment about ${plugin_name} here...", + editable: true, + automatic_remove: false, + markdown_file_path: '', +} + +export const DEFAULT_SETTINGS_1_3_0: PluginsAnnotationsSettings_1_3_0 = { + ...DEFAULT_SETTINGS_1_4_0, + annotations: {}, // Override the annotations property with the appropriate type + plugins_annotations_uuid: 'FAA70013-38E9-4FDF-B06A-F899F6487C19', +}; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index b38ef9a..47fada0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,14 +14,15 @@ import { // App, } from 'obsidian'; import { around } from 'monkey-around'; -import { PluginAnnotationDict, PluginsAnnotationsSettingsWithoutNames, isPluginAnnotationDictWithoutNames, isPluginsAnnotationsSettings, isPluginsAnnotationsSettingsWithoutNames, PluginsAnnotationsSettings, AnnotationType } from './types'; -import { DEFAULT_SETTINGS, DEFAULT_SETTINGS_WITHOUT_NAMES } from './defaults'; +import { AnnotationType } from './types'; +import { PluginAnnotationDict_1_4_0, isPluginsAnnotationsSettings_1_4_0, PluginsAnnotationsSettings_1_4_0, PluginsAnnotationsSettings_1_3_0, isPluginAnnotationDictFormat_1_3_0, isSettingsFormat_1_3_0} from 'types_legacy' +import { DEFAULT_SETTINGS_1_3_0, DEFAULT_SETTINGS_1_4_0 } from './defaults_legacy'; import { PluginsAnnotationsSettingTab } from 'settings_tab' import * as path from 'path'; import { readAnnotationsFromFile, writeAnnotationsToFile } from 'manageAnnotations'; export default class PluginsAnnotations extends Plugin { - settings: PluginsAnnotationsSettings = {...DEFAULT_SETTINGS}; + settings: PluginsAnnotationsSettings_1_4_0 = {...DEFAULT_SETTINGS_1_4_0}; pluginNameToIdMap: Record = {}; pluginIdToNameMap: Record = {}; @@ -62,42 +63,54 @@ export default class PluginsAnnotations extends Plugin { this.pluginNameToIdMap = this.constructPluginNameToIdMap(); this.pluginIdToNameMap = this.generateInvertedMap(this.pluginNameToIdMap); + // Set to true when the settings are updated to the new format + let wasUpdated = false; + // Nested function to handle different versions of settings const getSettingsFromData = (data: unknown): unknown => { - if (isPluginsAnnotationsSettings(data)) { - const settings: PluginsAnnotationsSettings = data; + + // type: AnnotationType.markdown, + + if (isPluginsAnnotationsSettings_1_4_0(data)) { + const settings: PluginsAnnotationsSettings_1_4_0 = data; return settings; - } else if (isPluginsAnnotationsSettingsWithoutNames(data)) { // previous versions where the name of the plugins was not stored + } else if (isSettingsFormat_1_3_0(data)) { // previous versions where the name of the plugins was not stored // Upgrade annotations format - const upgradedAnnotations: PluginAnnotationDict = {}; + const upgradedAnnotations: PluginAnnotationDict_1_4_0 = {}; for (const pluginId in data.annotations) { const annotation = data.annotations[pluginId]; upgradedAnnotations[pluginId] = { name: this.pluginIdToNameMap[pluginId] || pluginId, anno: annotation, - type: AnnotationType.markdown, }; } - const oldSettings: PluginsAnnotationsSettingsWithoutNames = data; + const oldSettings: PluginsAnnotationsSettings_1_3_0 = data; // Update the data with the new format - const newSettings: PluginsAnnotationsSettings = { + const newSettings: PluginsAnnotationsSettings_1_4_0 = { ...oldSettings, annotations: upgradedAnnotations, - plugins_annotations_uuid: DEFAULT_SETTINGS.plugins_annotations_uuid, + plugins_annotations_uuid: DEFAULT_SETTINGS_1_4_0.plugins_annotations_uuid, }; + wasUpdated = true; return getSettingsFromData(newSettings); } else { - // Very first version of the plugin -- no options were stored, only the dictionary of annotations - const newSettings: PluginsAnnotationsSettingsWithoutNames = { ...DEFAULT_SETTINGS_WITHOUT_NAMES }; - newSettings.annotations = isPluginAnnotationDictWithoutNames(data) ? data : DEFAULT_SETTINGS_WITHOUT_NAMES.annotations; + // Very first version of the plugin 1.0 -- no options were stored, only the dictionary of annotations + const newSettings: PluginsAnnotationsSettings_1_3_0 = { ...DEFAULT_SETTINGS_1_3_0 }; + newSettings.annotations = isPluginAnnotationDictFormat_1_3_0(data) ? data : DEFAULT_SETTINGS_1_3_0.annotations; + wasUpdated = true; return getSettingsFromData(newSettings); } }; // Merge loaded settings with default settings - this.settings = Object.assign({}, DEFAULT_SETTINGS, getSettingsFromData(await this.loadData())); + this.settings = Object.assign({}, DEFAULT_SETTINGS_1_4_0, getSettingsFromData(await this.loadData())); + + if(wasUpdated) { + console.log("SAVED"); + this.debouncedSaveAnnotations(); + } if(this.settings.markdown_file_path!=='') { readAnnotationsFromFile(this); @@ -121,7 +134,7 @@ export default class PluginsAnnotations extends Plugin { } else return ""; } - async saveSettings(settings:PluginsAnnotationsSettings) { + async saveSettings(settings:PluginsAnnotationsSettings_1_4_0) { try { await this.saveData(settings); } catch (error) { @@ -459,7 +472,7 @@ export default class PluginsAnnotations extends Plugin { this.settings.annotations[pluginId] = { anno: annotation_text, name: pluginName, - type: AnnotationType.markdown, + // type: AnnotationType.markdown, }; annotation_div.classList.remove('plugin-comment-placeholder'); isPlaceholder = false; @@ -631,9 +644,9 @@ export default class PluginsAnnotations extends Plugin { this.disconnectObservers(); } - getUninstalledPlugins(): PluginAnnotationDict { + getUninstalledPlugins(): PluginAnnotationDict_1_4_0 { const installedPluginIds = new Set(Object.keys(this.app.plugins.manifests)); - const uninstalledPlugins: PluginAnnotationDict = {}; + const uninstalledPlugins: PluginAnnotationDict_1_4_0 = {}; for (const pluginId in this.settings.annotations) { if (!installedPluginIds.has(pluginId)) { diff --git a/src/manageAnnotations.ts b/src/manageAnnotations.ts index 2d7a184..0b2ecc3 100644 --- a/src/manageAnnotations.ts +++ b/src/manageAnnotations.ts @@ -4,7 +4,7 @@ import PluginsAnnotations from "main"; import { Platform, TFile } from "obsidian"; import { createFolderIfNotExists, joinPaths, makePosixPathOScompatible, parseFilePath, showConfirmationDialog } from "utils"; import { parse, SyntaxError } from "./peggy.mjs"; -import { PluginAnnotationDict } from "types"; +import { PluginAnnotationDict_1_4_0 } from "types_legacy"; export async function handleMarkdownFilePathChange(plugin: PluginsAnnotations, filepath: string): Promise { const file = plugin.app.vault.getAbstractFileByPath(filepath); @@ -74,7 +74,7 @@ export async function readAnnotationsFromFile(plugin: PluginsAnnotations): Promi const md_content = await plugin.app.vault.read(file); try { - const md_content_parsed = parse(md_content) as PluginAnnotationDict; + const md_content_parsed = parse(md_content) as PluginAnnotationDict_1_4_0; plugin.settings.annotations = md_content_parsed; } catch(error) { if (error instanceof SyntaxError) { @@ -103,6 +103,8 @@ export async function writeAnnotationsToFile(plugin: PluginsAnnotations) { content.push(`# ${annotations[pluginId].name}\n\n\n\n${annotations[pluginId].anno}\n\n`); } + console.log(content.join('\n')); + try { let file = plugin.app.vault.getFileByPath(filePath); if (!file) { diff --git a/src/settings_tab.ts b/src/settings_tab.ts index cd13c50..225ec24 100644 --- a/src/settings_tab.ts +++ b/src/settings_tab.ts @@ -3,7 +3,7 @@ import PluginsAnnotations from "main"; import { handleMarkdownFilePathChange } from "manageAnnotations"; import { AbstractInputSuggest, App, Platform, PluginSettingTab, prepareFuzzySearch, SearchResult, Setting, TFile } from "obsidian"; -import { PluginAnnotationDict } from "types"; +import { PluginAnnotationDict_1_4_0 } from "types_legacy"; import { parseFilePath } from "utils"; class FileSuggestion extends AbstractInputSuggest { @@ -56,7 +56,7 @@ export class PluginsAnnotationsSettingTab extends PluginSettingTab { } createUninstalledPluginSettings(containerEl: HTMLElement) { - const uninstalledPlugins:PluginAnnotationDict = this.plugin.getUninstalledPlugins(); + const uninstalledPlugins:PluginAnnotationDict_1_4_0 = this.plugin.getUninstalledPlugins(); const heading = new Setting(containerEl).setName('Personal annotations of no longer installed community plugins').setHeading(); const headingEl = heading.settingEl; diff --git a/src/types.ts b/src/types.ts index 284f4fb..1b778c3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,38 +1,8 @@ // types.ts -import { DEFAULT_SETTINGS, DEFAULT_SETTINGS_WITHOUT_NAMES } from './defaults'; +import { DEFAULT_SETTINGS_1_4_0 } from './defaults_legacy'; -export interface PluginAnnotation { - name: string; // extended name of the plugin - anno: string; // personal annontation - type: AnnotationType; // type of annotation -} - -export interface PluginAnnotationDict { - [pluginId: string]: PluginAnnotation; -} - -export interface PluginsAnnotationsSettings { - annotations: PluginAnnotationDict; - plugins_annotations_uuid: string; - hide_placeholders: boolean; - delete_placeholder_string_on_insertion: boolean; - label_mobile: string; - label_desktop: string; - label_placeholder: string; - editable: boolean; - automatic_remove: boolean; - markdown_file_path: string; -} - -export function isPluginsAnnotationsSettings(s:unknown): s is PluginsAnnotationsSettings { - if (typeof s !== 'object' || s === null) { - return false; - } - return 'annotations' in s - && 'plugins_annotations_uuid' in s - && (s as PluginsAnnotationsSettings).plugins_annotations_uuid === DEFAULT_SETTINGS.plugins_annotations_uuid; -} +// type: AnnotationType; // type of annotation export enum AnnotationType { text = 'text', @@ -40,32 +10,6 @@ export enum AnnotationType { markdown = 'markdown', } -// For backward compatibility only with version 'FAA70013-38E9-4FDF-B06A-F899F6487C19' -export function isPluginAnnotationDictWithoutNames(d: unknown): d is PluginAnnotationDictWithoutNames { - if (typeof d !== 'object' || d === null) { - return false; - } - return Object.values(d).every(value => typeof value === 'string'); -} - -export interface PluginAnnotationDictWithoutNames { - [pluginId: string]: string; -} -// Extend the original interface and override the annotations property -export interface PluginsAnnotationsSettingsWithoutNames extends Omit { - annotations: PluginAnnotationDictWithoutNames; -} - -export function isPluginsAnnotationsSettingsWithoutNames(s:unknown): s is PluginsAnnotationsSettingsWithoutNames { - if (typeof s !== 'object' || s === null) { - return false; - } - - return 'annotations' in s - && 'plugins_annotations_uuid' in s - && (s as PluginsAnnotationsSettingsWithoutNames).plugins_annotations_uuid === DEFAULT_SETTINGS_WITHOUT_NAMES.plugins_annotations_uuid; -} - export interface ParsedPath { dir: string, base: string, @@ -73,6 +17,3 @@ export interface ParsedPath { ext: string, path: string } - -// For backward compatibility only with very first version (no UUID assigned) -export type PluginsAnnotationsSettingsWithoutOptions = string[]; diff --git a/src/types_legacy.ts b/src/types_legacy.ts new file mode 100644 index 0000000..4256bfc --- /dev/null +++ b/src/types_legacy.ts @@ -0,0 +1,72 @@ +// types_legacy.ts + +import { DEFAULT_SETTINGS_1_3_0, DEFAULT_SETTINGS_1_4_0 } from "defaults_legacy"; + +/* VERSION 1.4 */ + +export interface PluginAnnotation_1_4_0 { + name: string; // extended name of the plugin + anno: string; // personal annontation +} + +export interface PluginAnnotationDict_1_4_0 { + [pluginId: string]: PluginAnnotation_1_4_0; +} + +export interface PluginsAnnotationsSettings_1_4_0 { + annotations: PluginAnnotationDict_1_4_0; + plugins_annotations_uuid: string; + hide_placeholders: boolean; + delete_placeholder_string_on_insertion: boolean; + label_mobile: string; + label_desktop: string; + label_placeholder: string; + editable: boolean; + automatic_remove: boolean; + markdown_file_path: string; +} + +export function isPluginsAnnotationsSettings_1_4_0(s:unknown): s is PluginsAnnotationsSettings_1_4_0 { + if (typeof s !== 'object' || s === null) { + return false; + } + return 'annotations' in s + && 'plugins_annotations_uuid' in s + && (s as PluginsAnnotationsSettings_1_4_0).plugins_annotations_uuid === DEFAULT_SETTINGS_1_4_0.plugins_annotations_uuid; +} + + +/* VERSION 1.3 */ + +// For backward compatibility only with version 1.3.0 'FAA70013-38E9-4FDF-B06A-F899F6487C19' +export function isPluginAnnotationDictFormat_1_3_0(d: unknown): d is PluginAnnotationDict_1_3_0 { + if (typeof d !== 'object' || d === null) { + return false; + } + return Object.values(d).every(value => typeof value === 'string'); +} + +export interface PluginAnnotationDict_1_3_0 { + [pluginId: string]: string; +} + +// Extend the original interface and override the annotations property +export interface PluginsAnnotationsSettings_1_3_0 extends Omit { + annotations: PluginAnnotationDict_1_3_0; +} + +export function isSettingsFormat_1_3_0(s:unknown): s is PluginsAnnotationsSettings_1_3_0 { + if (typeof s !== 'object' || s === null) { + return false; + } + + return 'annotations' in s + && 'plugins_annotations_uuid' in s + && (s as PluginsAnnotationsSettings_1_3_0).plugins_annotations_uuid === DEFAULT_SETTINGS_1_3_0.plugins_annotations_uuid; +} + +/* VERSION 1.0 */ + +// For backward compatibility only with very first version 1.0 (no UUID assigned) +// In this version, no options were provided, just the list of annotations. +export type PluginsAnnotationsSettings_1_0_0 = string[];