Refactor migrations (#133)

* refactor: move migrations into their own class

* refactor: don't export old types

* test: fix failing test

* feat: add preform migrations function

* fix: delete creationDate prop

* chore: add ts-auto-guard

* test: make sure migrations work
This commit is contained in:
DecafDev 2024-06-25 19:58:35 -06:00 committed by GitHub
parent ee36bffcce
commit 1f52edaefb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 1351 additions and 358 deletions

BIN
bun.lockb

Binary file not shown.

View file

@ -6,6 +6,7 @@
"scripts": {
"dev": "node esbuild.config.mjs",
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
"guardgen": "ts-auto-guard",
"test": "jest --config jest.config.js"
},
"keywords": [],
@ -25,6 +26,7 @@
"jest": "^29.7.0",
"obsidian": "latest",
"svelte-preprocess": "^5.1.4",
"ts-auto-guard": "^5.0.0",
"ts-jest": "^29.1.4",
"tslib": "2.4.0",
"typescript": "4.7.4"

View file

@ -3,30 +3,16 @@ import { Plugin, TAbstractFile, TFile, TFolder } from 'obsidian';
import VaultExplorerView from './obsidian/vault-explorer-view';
import VaultExplorerSettingsTab from './obsidian/vault-explorer-settings-tab';
import { FilterRuleType, TExplorerView, VaultExplorerPluginSettings } from './types';
import { VaultExplorerPluginSettings } from './types';
import { DEFAULT_SETTINGS, HOVER_LINK_SOURCE_ID, 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/types-0.3.0';
import { VaultExplorerPluginSettings_0_5_5 } from './types/types-0.5.5';
import { preformMigrations } from './migrations';
import Logger from 'js-logger';
import { formatMessageForLogger, stringToLogLevel } from './logger';
import { LOG_LEVEL_WARN } from './logger/constants';
import { VaultExplorerPluginSettings_1_0_1 } from './types/types-1.0.1';
import { moveFocus } from './focus-utils';
import { VaultExplorerPluginSettings_1_2_0, ViewType_1_2_0 } from './types/types-1.2.0';
import { VaultExplorerPluginSettings_1_2_1 } from './types/types-1.2.1';
import { PropertyFilterGroup_1_5_0, PropertyFilter_1_5_0, VaultExplorerPluginSettings_1_5_0 } from './types/types-1.5.0';
import { VaultExplorerPluginSettings_1_6_0 } from './types/types-1.6.0';
import { loadDeviceId } from './svelte/shared/services/device-id-utils';
import License from './svelte/shared/services/license';
import { VaultExplorerPluginSettings_1_8_1 } from './types/types-1.8.1';
import { VaultExplorerPluginSettings_1_9_1 } from './types/types-1.9.1';
import { VaultExplorerPluginSettings_1_12_1 } from './types/types-1.12.1';
import { VaultExplorerPluginSettings_1_13_1 } from './types/types-1.13.1';
import { VaultExplorerPluginSettings_1_14_2 } from './types/types-1.14.2';
import { VaultExplorerPluginSettings_1_16_0, ViewType_1_16_0 } from './types/types-1.16.0';
export default class VaultExplorerPlugin extends Plugin {
settings: VaultExplorerPluginSettings = DEFAULT_SETTINGS;
@ -133,320 +119,21 @@ export default class VaultExplorerPlugin extends Plugin {
}
async loadSettings() {
let data: Record<string, unknown> | null = await this.loadData();
const loadedData: Record<string, unknown> | null = await this.loadData();
if (data !== null) {
//This will be null if the settings are from a version before 0.3.0
const settingsVersion = (data["pluginVersion"] as string) ?? null;
if (settingsVersion !== null) {
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_0_5_5 = {
...typedData,
filters: {
...typedData.filters,
properties: {
...typedData.filters.properties,
groups: []
}
}
}
data = newData as unknown as Record<string, unknown>;
}
let currentData: Record<string, unknown> = {};
if (isVersionLessThan(settingsVersion, "1.0.0")) {
console.log("Upgrading settings from version 0.5.5 to 1.0.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_0_5_5;
const newData: VaultExplorerPluginSettings_1_0_1 = {
...typedData,
logLevel: LOG_LEVEL_WARN,
filters: {
...typedData.filters,
properties: {
...typedData.filters.properties,
groups: typedData.filters.properties.groups.map(group => {
const { id, name, filters, isEnabled } = group;
return {
id,
name,
filters,
isEnabled
}
})
}
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.1.0")) {
console.log("Upgrading settings from version 1.0.1 to 1.1.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_0_1;
const newData: VaultExplorerPluginSettings_1_2_0 = {
...typedData,
views: {
currentView: typedData.currentView as unknown as ViewType_1_2_0,
order: [ViewType_1_2_0.GRID, ViewType_1_2_0.LIST]
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.2.1")) {
console.log("Upgrading settings from version 1.2.0 to 1.2.1");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_2_0;
const newData: VaultExplorerPluginSettings_1_2_1 = {
...typedData,
views: {
...typedData.views,
titleWrapping: "normal"
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.3.0")) {
console.log("Upgrading settings from version 1.2.1 to 1.3.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_2_1;
const groups = typedData.filters.properties.groups;
const updatedGroups: PropertyFilterGroup_1_5_0[] = groups.map(group => {
const updatedFilters: PropertyFilter_1_5_0[] = group.filters.map(filter => {
return {
...filter,
type: filter.type as any,
matchWhenPropertyDNE: false
}
});
return {
...group,
filters: updatedFilters
}
});
const newData: VaultExplorerPluginSettings_1_5_0 = {
...typedData,
filters: {
...typedData.filters,
properties: {
...typedData.filters.properties,
groups: updatedGroups,
}
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.6.0")) {
console.log("Upgrading settings from version 1.5.0 to 1.6.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_5_0;
const newData: VaultExplorerPluginSettings_1_6_0 = {
...typedData,
properties: {
...typedData.properties,
creationDate: "",
modifiedDate: ""
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.6.1")) {
console.log("Upgrading settings from version 1.6.0 to 1.6.1");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_6_0;
const newData: VaultExplorerPluginSettings_1_8_1 = {
...typedData,
properties: {
...typedData.properties,
createdDate: "",
modifiedDate: ""
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.9.0")) {
console.log("Upgrading settings from version 1.8.1 to 1.9.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_8_1;
const newData: VaultExplorerPluginSettings_1_9_1 = {
...typedData,
filters: {
...typedData.filters,
custom: {
selectedGroupId: typedData.filters.properties.selectedGroupId,
groups: typedData.filters.properties.groups.map(group => {
const rules = group.filters.map(filter => {
return {
...filter,
valueData: "",
type: filter.type as any
}
});
return {
...group,
rules
}
})
}
}
}
delete (newData.filters as any).properties;
for (const group of newData.filters.custom.groups as any) {
delete group.filters;
}
data = newData as unknown as Record<string, unknown>;
}
}
if (isVersionLessThan(settingsVersion, "1.10.0")) {
console.log("Upgrading settings from version 1.9.1 to 1.10.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_9_1;
const newData: VaultExplorerPluginSettings_1_12_1 = {
...typedData,
filters: {
...typedData.filters,
custom: {
...typedData.filters.custom,
groups: typedData.filters.custom.groups.map(group => {
const rules = group.rules.map(rule => {
return {
...rule,
type: FilterRuleType.PROPERTY as any,
propertyType: rule.type as any,
}
});
return {
...group,
rules
}
})
}
}
}
delete (newData.filters as any).folder;
delete (newData.filters as any).properties;
for (const group of newData.filters.custom.groups as any) {
delete group.filters;
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.13.0")) {
console.log("Upgrading settings from version 1.12.1 to 1.13.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_12_1;
const newData: VaultExplorerPluginSettings_1_13_1 = {
...typedData,
views: {
...typedData.views,
enableClockUpdates: true
},
filters: {
...typedData.filters,
custom: {
...typedData.filters.custom,
groups: typedData.filters.custom.groups.map(group => {
return {
...group,
isSticky: false
}
})
}
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.14.0")) {
console.log("Upgrading settings from version 1.13.1 to 1.14.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_13_1;
const newData: VaultExplorerPluginSettings_1_14_2 = {
...typedData,
filters: {
...typedData.filters,
search: {
isEnabled: true,
value: typedData.filters.search
},
favorites: {
isEnabled: true,
value: typedData.filters.onlyFavorites
},
timestamp: {
isEnabled: true,
value: typedData.filters.timestamp
},
sort: {
isEnabled: true,
value: typedData.filters.sort
},
custom: {
isEnabled: true,
...typedData.filters.custom
},
},
enableScrollButtons: true,
}
delete (newData.filters as any).onlyFavorites;
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.15.0")) {
console.log("Upgrading settings from version 1.14.2 to 1.15.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_14_2;
const newData: VaultExplorerPluginSettings_1_16_0 = {
...typedData,
views: {
...typedData.views,
order: [...typedData.views.order, ViewType_1_16_0.FEED],
}
}
data = newData as unknown as Record<string, unknown>;
}
if (isVersionLessThan(settingsVersion, "1.17.0")) {
console.log("Upgrading settings from version 1.16.0 to 1.17.0");
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_16_0;
const newData: VaultExplorerPluginSettings = {
...typedData,
views: {
dashboard: {
isEnabled: false
},
grid: {
isEnabled: true
},
list: {
isEnabled: true
},
table: {
isEnabled: false
},
feed: {
isEnabled: true
},
recommended: {
isEnabled: false
},
related: {
isEnabled: false
}
},
viewOrder: typedData.views.order as unknown as TExplorerView[],
enableClockUpdates: typedData.views.enableClockUpdates,
currentView: typedData.views.currentView as unknown as TExplorerView,
titleWrapping: typedData.views.titleWrapping
}
delete (newData as any).views.order;
delete (newData as any).views.currentView;
delete (newData as any).views.enableClockUpdates;
delete (newData as any).views.titleWrapping;
data = newData as unknown as Record<string, unknown>;
if (loadedData !== null) {
//This will be undefined if the settings are from a version before 0.3.0
const loadedVersion = loadedData["pluginVersion"] as string ?? null;
if (loadedVersion !== null) {
const newData = preformMigrations(loadedVersion, loadedData);
currentData = newData;
}
}
//Apply default settings. This will make it so we don't need to do migrations for just adding new settings
this.settings = Object.assign({}, DEFAULT_SETTINGS, data);
//Apply default settings
this.settings = Object.assign({}, DEFAULT_SETTINGS, currentData);
//Update the plugin version to the current version
this.settings.pluginVersion = this.manifest.version;
await this.saveSettings();

99
src/migrations/index.ts Normal file
View file

@ -0,0 +1,99 @@
import { TMigration } from "./types";
import Migrate_0_4_0 from "./migrate_0_4_0";
import Migrate_1_1_0 from "./migrate_1_1_0";
import Migrate_1_0_0 from "./migrate_1_0_0";
import Migrate_1_2_1 from "./migrate_1_2_1";
import Migrate_1_3_0 from "./migrate_1_3_0";
import Migrate_1_6_0 from "./migrate_1_6_0";
import Migrate_1_6_1 from "./migrate_1_6_1";
import Migrate_1_9_0 from "./migrate_1_9_0";
import Migrate_1_14_0 from "./migrate_1_14_0";
import Migrate_1_15_0 from "./migrate_1_15_0";
import Migrate_1_17_0 from "./migrate_1_17_0";
import Migrate_1_13_0 from "./migrate_1_13_0";
import Migrate_1_10_0 from "./migrate_1_10_0";
import { isVersionLessThan } from "src/utils";
const migrations: TMigration[] = [
{
from: "0.3.3",
to: "0.4.0",
migrate: Migrate_0_4_0,
},
{
from: "0.5.5",
to: "1.0.0",
migrate: Migrate_1_0_0,
},
{
from: "1.0.1",
to: "1.1.0",
migrate: Migrate_1_1_0,
},
{
from: "1.2.0",
to: "1.2.1",
migrate: Migrate_1_2_1,
},
{
from: "1.2.1",
to: "1.3.0",
migrate: Migrate_1_3_0,
},
{
from: "1.5.0",
to: "1.6.0",
migrate: Migrate_1_6_0,
},
{
from: "1.6.0",
to: "1.6.1",
migrate: Migrate_1_6_1,
},
{
from: "1.8.1",
to: "1.9.0",
migrate: Migrate_1_9_0,
},
{
from: "1.9.1",
to: "1.10.0",
migrate: Migrate_1_10_0,
},
{
from: "1.12.1",
to: "1.13.0",
migrate: Migrate_1_13_0,
},
{
from: "1.13.1",
to: "1.14.0",
migrate: Migrate_1_14_0,
},
{
from: "1.14.2",
to: "1.15.0",
migrate: Migrate_1_15_0,
},
{
from: "1.16.0",
to: "1.17.0",
migrate: Migrate_1_17_0,
},
];
export const preformMigrations = (settingsVersion: string, data: Record<string, unknown>) => {
let updatedData = structuredClone(data);
for (const migration of migrations) {
const { from, to } = migration;
if (isVersionLessThan(settingsVersion, to)) {
console.log(`Upgrading settings from version ${from} to ${to}`);
const migrator = new migration.migrate();
const newData = migrator.migrate(updatedData);
updatedData = newData;
}
}
return updatedData;
}

View file

@ -0,0 +1,20 @@
import { VaultExplorerPluginSettings_0_5_5 } from "src/types/types-0.5.5";
import { VaultExplorerPluginSettings_0_3_3 } from "src/types/types-0.3.3";
import MigrationInterface from "./migration_interface";
export default class Migrate_0_4_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_0_3_3;
const newData: VaultExplorerPluginSettings_0_5_5 = {
...typedData,
filters: {
...typedData.filters,
properties: {
...typedData.filters.properties,
groups: []
}
},
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,30 @@
import { VaultExplorerPluginSettings_0_5_5 } from "src/types/types-0.5.5";
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_0_1 } from "src/types/types-1.0.1";
import { LOG_LEVEL_WARN } from "src/logger/constants";
export default class Migrate_1_0_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_0_5_5;
const newData: VaultExplorerPluginSettings_1_0_1 = {
...typedData,
logLevel: LOG_LEVEL_WARN,
filters: {
...typedData.filters,
properties: {
...typedData.filters.properties,
groups: typedData.filters.properties.groups.map(group => {
const { id, name, filters, isEnabled } = group;
return {
id,
name,
filters,
isEnabled
}
})
}
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,37 @@
import { FilterRuleType_1_12_1, VaultExplorerPluginSettings_1_12_1 } from "src/types/types-1.12.1";
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_9_1 } from "src/types/types-1.9.1";
export default class Migrate_1_10_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_9_1;
const newData: VaultExplorerPluginSettings_1_12_1 = {
...typedData,
filters: {
...typedData.filters,
custom: {
...typedData.filters.custom,
groups: typedData.filters.custom.groups.map(group => {
const rules = group.rules.map(rule => {
return {
...rule,
type: FilterRuleType_1_12_1.PROPERTY as any,
propertyType: rule.type as any,
}
});
return {
...group,
rules
}
})
}
}
}
delete (newData.filters as any).folder;
delete (newData.filters as any).properties;
for (const group of newData.filters.custom.groups as any) {
delete group.filters;
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,29 @@
import { VaultExplorerPluginSettings_1_13_1 } from "src/types/types-1.13.1";
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_12_1 } from "src/types/types-1.12.1";
export default class Migrate_1_13_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_12_1;
const newData: VaultExplorerPluginSettings_1_13_1 = {
...typedData,
views: {
...typedData.views,
enableClockUpdates: true
},
filters: {
...typedData.filters,
custom: {
...typedData.filters.custom,
groups: typedData.filters.custom.groups.map(group => {
return {
...group,
isSticky: false
}
})
}
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,38 @@
import { VaultExplorerPluginSettings_1_14_2 } from "src/types/types-1.14.2";
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_13_1 } from "src/types/types-1.13.1";
export default class Migrate_1_14_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_13_1;
const newData: VaultExplorerPluginSettings_1_14_2 = {
...typedData,
filters: {
...typedData.filters,
search: {
isEnabled: true,
value: typedData.filters.search
},
favorites: {
isEnabled: true,
value: typedData.filters.onlyFavorites
},
timestamp: {
isEnabled: true,
value: typedData.filters.timestamp
},
sort: {
isEnabled: true,
value: typedData.filters.sort
},
custom: {
isEnabled: true,
...typedData.filters.custom
},
},
enableScrollButtons: true,
}
delete (newData.filters as any).onlyFavorites;
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,17 @@
import { VaultExplorerPluginSettings_1_16_0, ViewType_1_16_0 } from "src/types/types-1.16.0";
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_14_2 } from "src/types/types-1.14.2";
export default class Migrate_1_15_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_14_2;
const newData: VaultExplorerPluginSettings_1_16_0 = {
...typedData,
views: {
...typedData.views,
order: [...typedData.views.order, ViewType_1_16_0.FEED],
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,44 @@
import { TExplorerView, VaultExplorerPluginSettings } from "src/types";
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_16_0 } from "src/types/types-1.16.0";
export default class Migrate_1_17_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_16_0;
const newData: VaultExplorerPluginSettings = {
...typedData,
views: {
dashboard: {
isEnabled: false
},
grid: {
isEnabled: true
},
list: {
isEnabled: true
},
table: {
isEnabled: false
},
feed: {
isEnabled: true
},
recommended: {
isEnabled: false
},
related: {
isEnabled: false
}
},
viewOrder: typedData.views.order as unknown as TExplorerView[],
enableClockUpdates: typedData.views.enableClockUpdates,
currentView: typedData.views.currentView as unknown as TExplorerView,
titleWrapping: typedData.views.titleWrapping
}
delete (newData as any).views.order;
delete (newData as any).views.currentView;
delete (newData as any).views.enableClockUpdates;
delete (newData as any).views.titleWrapping;
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,17 @@
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_0_1 } from "src/types/types-1.0.1";
import { VaultExplorerPluginSettings_1_2_0, ViewType_1_2_0 } from "src/types/types-1.2.0";
export default class Migrate_1_1_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_0_1;
const newData: VaultExplorerPluginSettings_1_2_0 = {
...typedData,
views: {
currentView: typedData.currentView as unknown as ViewType_1_2_0,
order: [ViewType_1_2_0.GRID, ViewType_1_2_0.LIST]
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,17 @@
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_2_0 } from "src/types/types-1.2.0";
import { VaultExplorerPluginSettings_1_2_1 } from "src/types/types-1.2.1";
export default class Migrate_1_2_1 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_2_0;
const newData: VaultExplorerPluginSettings_1_2_1 = {
...typedData,
views: {
...typedData.views,
titleWrapping: "normal"
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,36 @@
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_2_1 } from "src/types/types-1.2.1";
import { PropertyFilterGroup_1_5_0, PropertyFilter_1_5_0, VaultExplorerPluginSettings_1_5_0 } from "src/types/types-1.5.0";
export default class Migrate_1_3_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_2_1;
const groups = typedData.filters.properties.groups;
const updatedGroups: PropertyFilterGroup_1_5_0[] = groups.map(group => {
const updatedFilters: PropertyFilter_1_5_0[] = group.filters.map(filter => {
return {
...filter,
type: filter.type as any,
matchWhenPropertyDNE: false
}
});
return {
...group,
filters: updatedFilters
}
});
const newData: VaultExplorerPluginSettings_1_5_0 = {
...typedData,
filters: {
...typedData.filters,
properties: {
...typedData.filters.properties,
groups: updatedGroups,
}
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,18 @@
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_5_0 } from "src/types/types-1.5.0";
import { VaultExplorerPluginSettings_1_6_0 } from "src/types/types-1.6.0";
export default class Migrate_1_6_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_5_0;
const newData: VaultExplorerPluginSettings_1_6_0 = {
...typedData,
properties: {
...typedData.properties,
creationDate: "",
modifiedDate: ""
}
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,19 @@
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_6_0 } from "src/types/types-1.6.0";
import { VaultExplorerPluginSettings_1_8_1 } from "src/types/types-1.8.1";
export default class Migrate_1_6_1 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_6_0;
const newData: VaultExplorerPluginSettings_1_8_1 = {
...typedData,
properties: {
...typedData.properties,
createdDate: "",
modifiedDate: ""
}
}
delete (newData.properties as any).creationDate;
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,36 @@
import MigrationInterface from "./migration_interface";
import { VaultExplorerPluginSettings_1_8_1 } from "src/types/types-1.8.1";
import { VaultExplorerPluginSettings_1_9_1 } from "src/types/types-1.9.1";
export default class Migrate_1_9_0 implements MigrationInterface {
migrate(data: Record<string, unknown>) {
const typedData = (data as unknown) as VaultExplorerPluginSettings_1_8_1;
const newData: VaultExplorerPluginSettings_1_9_1 = {
...typedData,
filters: {
...typedData.filters,
custom: {
selectedGroupId: typedData.filters.properties.selectedGroupId,
groups: typedData.filters.properties.groups.map(group => {
const rules = group.filters.map(filter => {
return {
...filter,
valueData: "",
type: filter.type as any
}
});
return {
...group,
rules
}
})
}
}
}
delete (newData.filters as any).properties;
for (const group of newData.filters.custom.groups as any) {
delete group.filters;
}
return newData as unknown as Record<string, unknown>;
}
}

View file

@ -0,0 +1,3 @@
export default abstract class MigrationInterface {
abstract migrate(previous: Record<string, unknown>): Record<string, unknown>;
}

7
src/migrations/types.ts Normal file
View file

@ -0,0 +1,7 @@
import MigrationInterface from "./migration_interface";
export interface TMigration {
from: string;
to: string;
migrate: new () => MigrationInterface;
}

View file

@ -313,7 +313,7 @@
if (data.length > 0 && data[0] instanceof TFile) {
const file = data[0] as TFile;
const content = await plugin.app.vault.cachedRead(file);
console.log(content);
const updatedContentForFiles = contentForFiles.map((entry) => {
if (entry.path === file.path) {
return {
@ -658,7 +658,7 @@
let filteredCustom: TFile[] = [];
$: if (frontmatterCacheTime && customFilter.groups) {
console.log("Frontmatter cache time", frontmatterCacheTime);
Logger.debug(`Frontmatter cache time: ${frontmatterCacheTime}`);
filteredCustom = files.filter((file) => {
const { name, path } = file;
const frontmatter =

643
src/types/index.guard.ts Normal file
View file

@ -0,0 +1,643 @@
/*
* Generated type guards for "index.ts".
* WARNING: Do not manually change this file.
*/
import { FilterRuleType, TextFilterCondition, NumberFilterCondition, DateFilterCondition, CheckboxFilterCondition, ListFilterCondition, ContentFilterCondition, FolderFilterCondition, FileNameFilterCondition, PropertyType, TExplorerView, VaultExplorerPluginSettings } from "./index";
export function isVaultExplorerPluginSettings(obj: unknown): obj is VaultExplorerPluginSettings {
const typedObj = obj as VaultExplorerPluginSettings
return (
(typedObj !== null &&
typeof typedObj === "object" ||
typeof typedObj === "function") &&
(typedObj["properties"] !== null &&
typeof typedObj["properties"] === "object" ||
typeof typedObj["properties"] === "function") &&
typeof typedObj["properties"]["favorite"] === "string" &&
typeof typedObj["properties"]["url"] === "string" &&
typeof typedObj["properties"]["createdDate"] === "string" &&
typeof typedObj["properties"]["modifiedDate"] === "string" &&
typeof typedObj["properties"]["custom1"] === "string" &&
typeof typedObj["properties"]["custom2"] === "string" &&
typeof typedObj["properties"]["custom3"] === "string" &&
(typedObj["filters"] !== null &&
typeof typedObj["filters"] === "object" ||
typeof typedObj["filters"] === "function") &&
(typedObj["filters"]["search"] !== null &&
typeof typedObj["filters"]["search"] === "object" ||
typeof typedObj["filters"]["search"] === "function") &&
typeof typedObj["filters"]["search"]["isEnabled"] === "boolean" &&
typeof typedObj["filters"]["search"]["value"] === "string" &&
(typedObj["filters"]["favorites"] !== null &&
typeof typedObj["filters"]["favorites"] === "object" ||
typeof typedObj["filters"]["favorites"] === "function") &&
typeof typedObj["filters"]["favorites"]["isEnabled"] === "boolean" &&
typeof typedObj["filters"]["favorites"]["value"] === "boolean" &&
(typedObj["filters"]["sort"] !== null &&
typeof typedObj["filters"]["sort"] === "object" ||
typeof typedObj["filters"]["sort"] === "function") &&
typeof typedObj["filters"]["sort"]["isEnabled"] === "boolean" &&
(typedObj["filters"]["sort"]["value"] === "file-name-asc" ||
typedObj["filters"]["sort"]["value"] === "file-name-desc" ||
typedObj["filters"]["sort"]["value"] === "modified-asc" ||
typedObj["filters"]["sort"]["value"] === "modified-desc") &&
(typedObj["filters"]["timestamp"] !== null &&
typeof typedObj["filters"]["timestamp"] === "object" ||
typeof typedObj["filters"]["timestamp"] === "function") &&
typeof typedObj["filters"]["timestamp"]["isEnabled"] === "boolean" &&
(typedObj["filters"]["timestamp"]["value"] === "created-today" ||
typedObj["filters"]["timestamp"]["value"] === "modified-today" ||
typedObj["filters"]["timestamp"]["value"] === "created-this-week" ||
typedObj["filters"]["timestamp"]["value"] === "modified-this-week" ||
typedObj["filters"]["timestamp"]["value"] === "created-2-weeks" ||
typedObj["filters"]["timestamp"]["value"] === "modified-2-weeks" ||
typedObj["filters"]["timestamp"]["value"] === "all") &&
(typedObj["filters"]["custom"] !== null &&
typeof typedObj["filters"]["custom"] === "object" ||
typeof typedObj["filters"]["custom"] === "function") &&
typeof typedObj["filters"]["custom"]["isEnabled"] === "boolean" &&
typeof typedObj["filters"]["custom"]["selectedGroupId"] === "string" &&
Array.isArray(typedObj["filters"]["custom"]["groups"]) &&
typedObj["filters"]["custom"]["groups"].every((e: any) =>
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
typeof e["name"] === "string" &&
Array.isArray(e["rules"]) &&
e["rules"].every((e: any) =>
((e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.PROPERTY &&
e["propertyType"] === PropertyType.TEXT &&
typeof e["propertyName"] === "string" &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST) ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.PROPERTY &&
e["propertyType"] === PropertyType.NUMBER &&
typeof e["propertyName"] === "string" &&
(e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST) ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.PROPERTY &&
e["propertyType"] === PropertyType.LIST &&
typeof e["propertyName"] === "string" &&
(e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST) ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.PROPERTY &&
e["propertyType"] === PropertyType.CHECKBOX &&
typeof e["propertyName"] === "string" &&
(e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST) ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.PROPERTY &&
(e["propertyType"] === PropertyType.DATE ||
e["propertyType"] === PropertyType.DATETIME) &&
typeof e["propertyName"] === "string" &&
(e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST) &&
typeof e["valueData"] === "string" ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.FOLDER &&
(e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT) &&
typeof e["includeSubfolders"] === "boolean" ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.FILE_NAME &&
(e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) ||
(e !== null &&
typeof e === "object" ||
typeof e === "function") &&
typeof e["id"] === "string" &&
(e["operator"] === "and" ||
e["operator"] === "or") &&
(e["type"] === FilterRuleType.PROPERTY ||
e["type"] === FilterRuleType.FOLDER ||
e["type"] === FilterRuleType.FILE_NAME ||
e["type"] === FilterRuleType.CONTENT) &&
(e["condition"] === TextFilterCondition.IS ||
e["condition"] === TextFilterCondition.IS_NOT ||
e["condition"] === TextFilterCondition.CONTAINS ||
e["condition"] === TextFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === TextFilterCondition.STARTS_WITH ||
e["condition"] === TextFilterCondition.ENDS_WITH ||
e["condition"] === TextFilterCondition.EXISTS ||
e["condition"] === TextFilterCondition.DOES_NOT_EXIST ||
e["condition"] === NumberFilterCondition.IS_EQUAL ||
e["condition"] === NumberFilterCondition.IS_NOT_EQUAL ||
e["condition"] === NumberFilterCondition.IS_GREATER ||
e["condition"] === NumberFilterCondition.IS_LESS ||
e["condition"] === NumberFilterCondition.IS_GREATER_OR_EQUAL ||
e["condition"] === NumberFilterCondition.IS_LESS_OR_EQUAL ||
e["condition"] === NumberFilterCondition.EXISTS ||
e["condition"] === NumberFilterCondition.DOES_NOT_EXIST ||
e["condition"] === DateFilterCondition.IS ||
e["condition"] === DateFilterCondition.IS_BEFORE ||
e["condition"] === DateFilterCondition.IS_AFTER ||
e["condition"] === DateFilterCondition.IS_ON_OR_BEFORE ||
e["condition"] === DateFilterCondition.IS_ON_OR_AFTER ||
e["condition"] === DateFilterCondition.EXISTS ||
e["condition"] === DateFilterCondition.DOES_NOT_EXIST ||
e["condition"] === CheckboxFilterCondition.IS ||
e["condition"] === CheckboxFilterCondition.IS_NOT ||
e["condition"] === CheckboxFilterCondition.EXISTS ||
e["condition"] === CheckboxFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ListFilterCondition.CONTAINS ||
e["condition"] === ListFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ListFilterCondition.EXISTS ||
e["condition"] === ListFilterCondition.DOES_NOT_EXIST ||
e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY ||
e["condition"] === FolderFilterCondition.IS ||
e["condition"] === FolderFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.IS ||
e["condition"] === FileNameFilterCondition.IS_NOT ||
e["condition"] === FileNameFilterCondition.CONTAINS ||
e["condition"] === FileNameFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === FileNameFilterCondition.STARTS_WITH ||
e["condition"] === FileNameFilterCondition.ENDS_WITH) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["value"] === "string" &&
typeof e["matchWhenPropertyDNE"] === "boolean" &&
e["type"] === FilterRuleType.CONTENT &&
(e["condition"] === ContentFilterCondition.CONTAINS ||
e["condition"] === ContentFilterCondition.DOES_NOT_CONTAIN ||
e["condition"] === ContentFilterCondition.IS_EMPTY ||
e["condition"] === ContentFilterCondition.IS_NOT_EMPTY))
) &&
typeof e["isEnabled"] === "boolean" &&
typeof e["isSticky"] === "boolean"
) &&
(typedObj["views"] !== null &&
typeof typedObj["views"] === "object" ||
typeof typedObj["views"] === "function") &&
(typedObj["views"]["dashboard"] !== null &&
typeof typedObj["views"]["dashboard"] === "object" ||
typeof typedObj["views"]["dashboard"] === "function") &&
typeof typedObj["views"]["dashboard"]["isEnabled"] === "boolean" &&
(typedObj["views"]["grid"] !== null &&
typeof typedObj["views"]["grid"] === "object" ||
typeof typedObj["views"]["grid"] === "function") &&
typeof typedObj["views"]["grid"]["isEnabled"] === "boolean" &&
(typedObj["views"]["list"] !== null &&
typeof typedObj["views"]["list"] === "object" ||
typeof typedObj["views"]["list"] === "function") &&
typeof typedObj["views"]["list"]["isEnabled"] === "boolean" &&
(typedObj["views"]["table"] !== null &&
typeof typedObj["views"]["table"] === "object" ||
typeof typedObj["views"]["table"] === "function") &&
typeof typedObj["views"]["table"]["isEnabled"] === "boolean" &&
(typedObj["views"]["feed"] !== null &&
typeof typedObj["views"]["feed"] === "object" ||
typeof typedObj["views"]["feed"] === "function") &&
typeof typedObj["views"]["feed"]["isEnabled"] === "boolean" &&
(typedObj["views"]["recommended"] !== null &&
typeof typedObj["views"]["recommended"] === "object" ||
typeof typedObj["views"]["recommended"] === "function") &&
typeof typedObj["views"]["recommended"]["isEnabled"] === "boolean" &&
(typedObj["views"]["related"] !== null &&
typeof typedObj["views"]["related"] === "object" ||
typeof typedObj["views"]["related"] === "function") &&
typeof typedObj["views"]["related"]["isEnabled"] === "boolean" &&
(typedObj["titleWrapping"] === "normal" ||
typedObj["titleWrapping"] === "break-word") &&
typeof typedObj["enableClockUpdates"] === "boolean" &&
(typedObj["currentView"] === null ||
typedObj["currentView"] === TExplorerView.DASHBOARD ||
typedObj["currentView"] === TExplorerView.GRID ||
typedObj["currentView"] === TExplorerView.LIST ||
typedObj["currentView"] === TExplorerView.FEED ||
typedObj["currentView"] === TExplorerView.TABLE ||
typedObj["currentView"] === TExplorerView.RECOMMENDED ||
typedObj["currentView"] === TExplorerView.RELATED) &&
typeof typedObj["enableScrollButtons"] === "boolean" &&
typeof typedObj["pageSize"] === "number" &&
(typedObj["pluginVersion"] === null ||
typeof typedObj["pluginVersion"] === "string") &&
Array.isArray(typedObj["viewOrder"]) &&
typedObj["viewOrder"].every((e: any) =>
(e === TExplorerView.DASHBOARD ||
e === TExplorerView.GRID ||
e === TExplorerView.LIST ||
e === TExplorerView.FEED ||
e === TExplorerView.TABLE ||
e === TExplorerView.RECOMMENDED ||
e === TExplorerView.RELATED)
) &&
typeof typedObj["logLevel"] === "string"
)
}

View file

@ -1,3 +1,4 @@
/** @see {isVaultExplorerPluginSettings} ts-auto-guard:type-guard */
export interface VaultExplorerPluginSettings {
properties: {
favorite: string;

View file

@ -22,6 +22,8 @@ export interface VaultExplorerPluginSettings_0_3_3 {
pluginVersion: string | null;
}
export { TextFilterCondition as TextFilterCondition_0_3_3 };
interface TextPropertyFilter extends BasePropertyFilter {
condition: TextFilterCondition;
value: string;

View file

@ -22,6 +22,8 @@ export interface VaultExplorerPluginSettings_0_5_5 {
pluginVersion: string | null;
}
export { TextFilterCondition as TextFilterCondition_0_5_5, PropertyFilterType as PropertyFilterType_0_5_5, NumberFilterCondition as NumberFilterCondition_0_5_5, ListFilterCondition as ListFilterCondition_0_5_5, CheckboxFilterCondition as CheckboxFilterCondition_0_5_5, DateFilterCondition as DateFilterCondition_0_5_5 };
export type FilterOperator = "and" | "or";
export enum TextFilterCondition {

View file

@ -28,16 +28,18 @@ export interface VaultExplorerPluginSettings_1_12_1 {
pluginVersion: string | null;
}
export type WordBreak = "normal" | "break-word";
export { FilterRuleType as FilterRuleType_1_12_1 };
export enum ViewType {
type WordBreak = "normal" | "break-word";
enum ViewType {
GRID = "grid",
LIST = "list",
}
export type FilterOperator = "and" | "or";
type FilterOperator = "and" | "or";
export enum TextFilterCondition {
enum TextFilterCondition {
IS = "is",
IS_NOT = "is-not",
CONTAINS = "contains",
@ -48,14 +50,14 @@ export enum TextFilterCondition {
DOES_NOT_EXIST = "does-not-exist",
}
export enum ListFilterCondition {
enum ListFilterCondition {
CONTAINS = "contains",
DOES_NOT_CONTAIN = "does-not-contain",
EXISTS = "exists",
DOES_NOT_EXIST = "does-not-exist",
}
export enum NumberFilterCondition {
enum NumberFilterCondition {
IS_EQUAL = "is-equal",
IS_NOT_EQUAL = "is-not-equal",
IS_GREATER = "is-greater",
@ -66,14 +68,14 @@ export enum NumberFilterCondition {
DOES_NOT_EXIST = "does-not-exist",
}
export enum CheckboxFilterCondition {
enum CheckboxFilterCondition {
IS = "is",
IS_NOT = "is-not",
EXISTS = "exists",
DOES_NOT_EXIST = "does-not-exist",
}
export enum DateFilterCondition {
enum DateFilterCondition {
IS = "is",
IS_BEFORE = "is-before",
IS_AFTER = "is-after",
@ -83,19 +85,19 @@ export enum DateFilterCondition {
DOES_NOT_EXIST = "does-not-exist",
}
export enum ContentFilterCondition {
enum ContentFilterCondition {
CONTAINS = "contains",
DOES_NOT_CONTAIN = "does-not-contain",
IS_EMPTY = "is-empty",
IS_NOT_EMPTY = "is-not-empty",
}
export enum FolderFilterCondition {
enum FolderFilterCondition {
IS = "is",
IS_NOT = "is-not",
}
export enum FileNameFilterCondition {
enum FileNameFilterCondition {
IS = "is",
IS_NOT = "is-not",
CONTAINS = "contains",
@ -104,10 +106,10 @@ export enum FileNameFilterCondition {
ENDS_WITH = "ends-with",
}
export type FilterCondition = TextFilterCondition | NumberFilterCondition | DateFilterCondition | CheckboxFilterCondition | ListFilterCondition | ContentFilterCondition | FolderFilterCondition | FileNameFilterCondition;
type FilterCondition = TextFilterCondition | NumberFilterCondition | DateFilterCondition | CheckboxFilterCondition | ListFilterCondition | ContentFilterCondition | FolderFilterCondition | FileNameFilterCondition;
//This matches the Obsidian property types
export enum PropertyType {
enum PropertyType {
TEXT = "text",
NUMBER = "number",
LIST = "list",
@ -116,14 +118,14 @@ export enum PropertyType {
DATETIME = "datetime",
}
export enum FilterRuleType {
enum FilterRuleType {
PROPERTY = "property",
FOLDER = "folder",
FILE_NAME = "file-name",
CONTENT = "content",
}
export enum DatePropertyFilterValue {
enum DatePropertyFilterValue {
TODAY = "today",
TOMORROW = "tomorrow",
YESTERDAY = "yesterday",
@ -144,35 +146,35 @@ interface BaseFilterRule {
matchWhenPropertyDNE: boolean;
}
export interface TextPropertyFilterRule extends BaseFilterRule {
interface TextPropertyFilterRule extends BaseFilterRule {
type: FilterRuleType.PROPERTY;
propertyType: PropertyType.TEXT;
propertyName: string;
condition: TextFilterCondition;
}
export interface NumberPropertyFilterRule extends BaseFilterRule {
interface NumberPropertyFilterRule extends BaseFilterRule {
type: FilterRuleType.PROPERTY;
propertyType: PropertyType.NUMBER;
propertyName: string;
condition: NumberFilterCondition;
}
export interface ListPropertyFilterRule extends BaseFilterRule {
interface ListPropertyFilterRule extends BaseFilterRule {
type: FilterRuleType.PROPERTY;
propertyType: PropertyType.LIST;
propertyName: string;
condition: ListFilterCondition;
}
export interface CheckboxPropertyFilterRule extends BaseFilterRule {
interface CheckboxPropertyFilterRule extends BaseFilterRule {
type: FilterRuleType.PROPERTY;
propertyType: PropertyType.CHECKBOX;
propertyName: string;
condition: CheckboxFilterCondition;
}
export interface DatePropertyFilterRule extends BaseFilterRule {
interface DatePropertyFilterRule extends BaseFilterRule {
type: FilterRuleType.PROPERTY;
propertyType: PropertyType.DATE | PropertyType.DATETIME;
propertyName: string;
@ -180,32 +182,32 @@ export interface DatePropertyFilterRule extends BaseFilterRule {
valueData: string;
}
export interface FolderFilterRule extends BaseFilterRule {
interface FolderFilterRule extends BaseFilterRule {
type: FilterRuleType.FOLDER;
condition: FolderFilterCondition;
includeSubfolders: boolean;
}
export interface FileNameFilterRule extends BaseFilterRule {
interface FileNameFilterRule extends BaseFilterRule {
type: FilterRuleType.FILE_NAME;
condition: FileNameFilterCondition;
}
export interface ContentFilterRule extends BaseFilterRule {
interface ContentFilterRule extends BaseFilterRule {
type: FilterRuleType.CONTENT;
condition: ContentFilterCondition;
}
export type FilterRule = PropertyFilterRule | FolderFilterRule | FileNameFilterRule | ContentFilterRule;
export type PropertyFilterRule = TextPropertyFilterRule | NumberPropertyFilterRule | ListPropertyFilterRule | CheckboxPropertyFilterRule | DatePropertyFilterRule;
type FilterRule = PropertyFilterRule | FolderFilterRule | FileNameFilterRule | ContentFilterRule;
type PropertyFilterRule = TextPropertyFilterRule | NumberPropertyFilterRule | ListPropertyFilterRule | CheckboxPropertyFilterRule | DatePropertyFilterRule;
export interface FilterGroup {
interface FilterGroup {
id: string;
name: string;
rules: FilterRule[];
isEnabled: boolean;
}
export type SortFilter = "file-name-asc" | "file-name-desc" | "modified-asc" | "modified-desc";
type SortFilter = "file-name-asc" | "file-name-desc" | "modified-asc" | "modified-desc";
export type TimestampFilter = "created-today" | "modified-today" | "created-this-week" | "modified-this-week" | "created-2-weeks" | "modified-2-weeks" | "all";
type TimestampFilter = "created-today" | "modified-today" | "created-this-week" | "modified-this-week" | "created-2-weeks" | "modified-2-weeks" | "all";

View file

@ -0,0 +1,189 @@
import { preformMigrations } from "src/migrations";
import { isVaultExplorerPluginSettings } from "src/types/index.guard";
import { TextFilterCondition_0_3_3, VaultExplorerPluginSettings_0_3_3 } from "src/types/types-0.3.3";
import { CheckboxFilterCondition_0_5_5, DateFilterCondition_0_5_5, ListFilterCondition_0_5_5, NumberFilterCondition_0_5_5, PropertyFilterType_0_5_5, TextFilterCondition_0_5_5, VaultExplorerPluginSettings_0_5_5 } from "src/types/types-0.5.5";
describe("preformMigrations", () => {
it("should migrate from 0.3.3 to the latest version", () => {
//Arrange
const settingsData: VaultExplorerPluginSettings_0_3_3 = {
"properties": {
"favorite": "note-123",
"url": "https://example.com",
"custom1": "custom-value-1",
"custom2": "custom-value-2",
"custom3": "custom-value-3"
},
"filters": {
"folder": "MyNotes",
"search": "project",
"onlyFavorites": true,
"sort": "file-name-asc",
"timestamp": "created-today",
"properties": {
"selectedGroupId": "group-1",
"groups": [
{
"id": "group-1",
"name": "Project Filters",
"filters": [
{
"id": "filter-1",
"propertyName": "status",
"operator": "and",
"isEnabled": true,
"condition": TextFilterCondition_0_3_3.IS,
"value": "active"
},
{
"id": "filter-2",
"propertyName": "priority",
"operator": "or",
"isEnabled": false,
"condition": TextFilterCondition_0_3_3.CONTAINS,
"value": "high"
}
],
"position": 0,
"isEnabled": true
},
{
"id": "group-2",
"name": "Personal Filters",
"filters": [
{
"id": "filter-3",
"propertyName": "tag",
"operator": "and",
"isEnabled": true,
"condition": TextFilterCondition_0_3_3.STARTS_WITH,
"value": "work"
},
{
"id": "filter-4",
"propertyName": "deadline",
"operator": "or",
"isEnabled": true,
"condition": TextFilterCondition_0_3_3.IS_NOT_EMPTY,
"value": ""
}
],
"position": 1,
"isEnabled": false
}
]
}
},
"currentView": "grid",
"pageSize": 20,
"pluginVersion": "0.3.3"
}
//Same guard clause as in main.js
if (settingsData.pluginVersion === null) return;
//Act
const result = preformMigrations(settingsData.pluginVersion, settingsData as unknown as Record<string, unknown>);
//Assert
expect(isVaultExplorerPluginSettings(result)).toBe(true);
});
it("should migrate from 0.4.0 to the latest version", () => {
//Arrange
const settingsData: VaultExplorerPluginSettings_0_5_5 = {
properties: {
favorite: "yes",
url: "https://example.com",
custom1: "customValue1",
custom2: "customValue2",
custom3: "customValue3"
},
filters: {
folder: "root",
search: "example search",
onlyFavorites: true,
sort: "file-name-asc",
timestamp: "created-today",
properties: {
selectedGroupId: "group1",
groups: [
{
id: "group1",
name: "Group 1",
filters: [
{
id: "filter1",
propertyName: "name",
operator: "and",
type: PropertyFilterType_0_5_5.TEXT,
isEnabled: true,
value: "example",
condition: TextFilterCondition_0_5_5.CONTAINS
},
{
id: "filter2",
propertyName: "size",
operator: "or",
type: PropertyFilterType_0_5_5.NUMBER,
isEnabled: true,
value: "100",
condition: NumberFilterCondition_0_5_5.IS_GREATER
}
],
position: 1,
isEnabled: true
},
{
id: "group2",
name: "Group 2",
filters: [
{
id: "filter3",
propertyName: "tags",
operator: "and",
type: PropertyFilterType_0_5_5.LIST,
isEnabled: true,
value: "important",
condition: ListFilterCondition_0_5_5.CONTAINS
},
{
id: "filter4",
propertyName: "isArchived",
operator: "or",
type: PropertyFilterType_0_5_5.CHECKBOX,
isEnabled: true,
value: "true",
condition: CheckboxFilterCondition_0_5_5.IS
},
{
id: "filter5",
propertyName: "dateCreated",
operator: "and",
type: PropertyFilterType_0_5_5.DATE,
isEnabled: true,
value: "2023-01-01",
condition: DateFilterCondition_0_5_5.IS_AFTER
}
],
position: 2,
isEnabled: true
}
]
}
},
currentView: "list",
pageSize: 20,
pluginVersion: "0.4.0"
};
//This the same guard clause as in main.js
if (settingsData.pluginVersion === null) return;
//Act
const result = preformMigrations(settingsData.pluginVersion, settingsData as unknown as Record<string, unknown>);
//Assert
expect(isVaultExplorerPluginSettings(result)).toBe(true);
});
});

View file

@ -156,9 +156,7 @@ describe('matchNumberPropertyFilter', () => {
const matchIfNull = false;
// Act & Assert
expect(() => matchNumberPropertyFilter(propertyValue, compare, condition, matchIfNull)).toThrow(
`Number filter condition not supported: ${condition}`
);
expect(() => matchNumberPropertyFilter(propertyValue, compare, condition, matchIfNull)).toThrow()
});
});
});