From e00c5ce2c2c08609626ec20a3e9bfff3f3d4c37e Mon Sep 17 00:00:00 2001 From: mProjectsCode Date: Fri, 23 Sep 2022 19:10:19 +0200 Subject: [PATCH] Start of #48 --- esbuild.config.mjs | 18 +- package-lock.json | 380 +++++++++++++++++- package.json | 4 + src/main.ts | 22 +- src/settings/ModelPropertyConversionRule.ts | 27 -- src/settings/ModelPropertyMapper.ts | 130 ------ src/settings/PropertyBindingsComponent.svelte | 74 ++++ src/settings/PropertyMapper.ts | 98 +++++ src/settings/PropertyMapping.ts | 75 ++++ src/settings/Settings.ts | 75 ++++ src/utils/MediaTypeManager.ts | 2 + src/utils/Utils.ts | 4 + tsconfig.json | 51 +-- 13 files changed, 764 insertions(+), 196 deletions(-) delete mode 100644 src/settings/ModelPropertyConversionRule.ts delete mode 100644 src/settings/ModelPropertyMapper.ts create mode 100644 src/settings/PropertyBindingsComponent.svelte create mode 100644 src/settings/PropertyMapper.ts create mode 100644 src/settings/PropertyMapping.ts diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 645372f..09c99bc 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,9 +1,11 @@ -import esbuild from "esbuild"; -import process from "process"; -import builtins from 'builtin-modules' +import esbuild from 'esbuild'; +import process from 'process'; +import builtins from 'builtin-modules'; +import esbuildSvelte from 'esbuild-svelte'; +import sveltePreprocess from 'svelte-preprocess'; const banner = -`/* + `/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ @@ -45,8 +47,14 @@ esbuild.build({ format: 'cjs', watch: !prod, target: 'es2016', - logLevel: "info", + logLevel: 'info', sourcemap: prod ? false : 'inline', treeShaking: true, outfile: 'main.js', + plugins: [ + esbuildSvelte({ + compilerOptions: { css: true }, + preprocess: sveltePreprocess(), + }), + ], }).catch(() => process.exit(1)); diff --git a/package-lock.json b/package-lock.json index c15d2d7..1ec9025 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-media-db-plugin", - "version": "0.3.1", + "version": "0.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "obsidian-media-db-plugin", - "version": "0.3.1", + "version": "0.3.2", "license": "GPL-3.0", "dependencies": { "ts-node": "^10.8.1", @@ -14,15 +14,19 @@ }, "devDependencies": { "@popperjs/core": "^2.11.5", + "@tsconfig/svelte": "^3.0.0", "@types/jest": "^28.1.3", "@types/node": "^16.11.6", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "builtin-modules": "^3.2.0", "esbuild": "0.13.12", + "esbuild-svelte": "^0.7.1", "jest": "^28.1.2", "jest-fetch-mock": "^3.0.3", "obsidian": "latest", + "svelte": "^3.50.1", + "svelte-preprocess": "^4.10.7", "ts-jest": "^28.0.5", "tslib": "2.3.1", "typescript": "4.4.4" @@ -1177,6 +1181,12 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, + "node_modules/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -1293,6 +1303,21 @@ "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", "dev": true }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1806,6 +1831,15 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2022,6 +2056,15 @@ "node": ">=0.10.0" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -2106,6 +2149,12 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, "node_modules/esbuild": { "version": "0.13.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", @@ -2317,6 +2366,19 @@ "sunos" ] }, + "node_modules/esbuild-svelte": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/esbuild-svelte/-/esbuild-svelte-0.7.1.tgz", + "integrity": "sha512-83vRAJ2OmoKxmK+rLFZVmyv5bJ8ahsYQwJ2RGmNAlHBIHq4ENUwA/hiwA2+AohrWD1BgZnGPMj8DL3l0I0xkug==", + "dev": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "esbuild": ">=0.9.6", + "svelte": ">=3.43.0" + } + }, "node_modules/esbuild-windows-32": { "version": "0.13.12", "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz", @@ -3882,6 +3944,15 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3957,6 +4028,15 @@ "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3969,6 +4049,24 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/moment": { "version": "2.29.2", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", @@ -4469,6 +4567,30 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -4526,6 +4648,21 @@ "node": ">=8" } }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4545,6 +4682,12 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4629,6 +4772,18 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4684,6 +4839,81 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svelte": { + "version": "3.50.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.50.1.tgz", + "integrity": "sha512-bS4odcsdj5D5jEg6riZuMg5NKelzPtmsCbD9RG+8umU03TeNkdWnP6pqbCm0s8UQNBkqk29w/Bdubn3C+HWSwA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -6048,6 +6278,12 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, + "@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, "@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -6164,6 +6400,21 @@ "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", "dev": true }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -6505,6 +6756,12 @@ "node-int64": "^0.4.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -6669,6 +6926,12 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -6732,6 +6995,12 @@ "is-arrayish": "^0.2.1" } }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, "esbuild": { "version": "0.13.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", @@ -6855,6 +7124,13 @@ "dev": true, "optional": true }, + "esbuild-svelte": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/esbuild-svelte/-/esbuild-svelte-0.7.1.tgz", + "integrity": "sha512-83vRAJ2OmoKxmK+rLFZVmyv5bJ8ahsYQwJ2RGmNAlHBIHq4ENUwA/hiwA2+AohrWD1BgZnGPMj8DL3l0I0xkug==", + "dev": true, + "requires": {} + }, "esbuild-windows-32": { "version": "0.13.12", "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz", @@ -8040,6 +8316,15 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -8099,6 +8384,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8108,6 +8399,21 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, "moment": { "version": "2.29.2", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", @@ -8455,6 +8761,29 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -8497,6 +8826,18 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8513,6 +8854,12 @@ "source-map": "^0.6.0" } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -8578,6 +8925,15 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8615,6 +8971,26 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "svelte": { + "version": "3.50.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.50.1.tgz", + "integrity": "sha512-bS4odcsdj5D5jEg6riZuMg5NKelzPtmsCbD9RG+8umU03TeNkdWnP6pqbCm0s8UQNBkqk29w/Bdubn3C+HWSwA==", + "dev": true + }, + "svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "requires": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", diff --git a/package.json b/package.json index 6e5a9db..e5c0d4d 100644 --- a/package.json +++ b/package.json @@ -14,15 +14,19 @@ "license": "GPL-3.0", "devDependencies": { "@popperjs/core": "^2.11.5", + "@tsconfig/svelte": "^3.0.0", "@types/jest": "^28.1.3", "@types/node": "^16.11.6", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "builtin-modules": "^3.2.0", "esbuild": "0.13.12", + "esbuild-svelte": "^0.7.1", "jest": "^28.1.2", "jest-fetch-mock": "^3.0.3", "obsidian": "latest", + "svelte": "^3.50.1", + "svelte-preprocess": "^4.10.7", "ts-jest": "^28.0.5", "tslib": "2.3.1", "typescript": "4.4.4" diff --git a/src/main.ts b/src/main.ts index 40cfb5e..cdbb942 100644 --- a/src/main.ts +++ b/src/main.ts @@ -13,7 +13,7 @@ import {MusicBrainzAPI} from './api/apis/MusicBrainzAPI'; import {MediaTypeManager} from './utils/MediaTypeManager'; import {SteamAPI} from './api/apis/SteamAPI'; import {BoardGameGeekAPI} from './api/apis/BoardGameGeekAPI'; -import {ModelPropertyMapper} from './settings/ModelPropertyMapper'; +import {PropertyMapper} from './settings/PropertyMapper'; import {YAMLConverter} from './utils/YAMLConverter'; import {MediaDbFolderImportModal} from './modals/MediaDbFolderImportModal'; @@ -21,7 +21,7 @@ export default class MediaDbPlugin extends Plugin { settings: MediaDbPluginSettings; apiManager: APIManager; mediaTypeManager: MediaTypeManager; - modelPropertyMapper: ModelPropertyMapper; + modelPropertyMapper: PropertyMapper; frontMatterRexExpPattern: string = '^(---)\\n[\\s\\S]*?\\n---'; @@ -30,6 +30,9 @@ export default class MediaDbPlugin extends Plugin { // register the settings tab this.addSettingTab(new MediaDbSettingTab(this.app, this)); + // TESTING + this.settings.propertyMappings = DEFAULT_SETTINGS.propertyMappings; + this.apiManager = new APIManager(); // register APIs @@ -42,7 +45,7 @@ export default class MediaDbPlugin extends Plugin { // this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data this.mediaTypeManager = new MediaTypeManager(this.settings); - this.modelPropertyMapper = new ModelPropertyMapper(this.settings); + this.modelPropertyMapper = new PropertyMapper(this); // add icon to the left ribbon @@ -188,7 +191,7 @@ export default class MediaDbPlugin extends Plugin { let fileContent = await this.generateMediaDbNoteContents(mediaTypeModel, attachFile); - console.log("Inside createMediaDbNote", fileContent) + console.log('Inside createMediaDbNote', fileContent); await this.createNote(this.mediaTypeManager.getFileName(mediaTypeModel), fileContent); } catch (e) { console.warn(e); @@ -200,9 +203,9 @@ export default class MediaDbPlugin extends Plugin { let fileMetadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject()); let fileContent = ''; - ({ fileMetadata, fileContent } = await this.attachFile(fileMetadata, fileContent, attachFile)); - console.log("Inside createYAML", attachFile); - ({ fileMetadata, fileContent } = await this.attachTemplate(fileMetadata, fileContent, await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app))); + ({fileMetadata, fileContent} = await this.attachFile(fileMetadata, fileContent, attachFile)); + console.log('Inside createYAML', attachFile); + ({fileMetadata, fileContent} = await this.attachTemplate(fileMetadata, fileContent, await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app))); fileContent = `---\n${this.settings.useCustomYamlStringifier ? YAMLConverter.toYaml(fileMetadata) : stringifyYaml(fileMetadata)}---` + fileContent; return fileContent; @@ -226,7 +229,7 @@ export default class MediaDbPlugin extends Plugin { const regExp = new RegExp('^(---)\\n[\\s\\S]*\\n---'); attachFileContent = attachFileContent.replace(regExp, ''); fileContent += attachFileContent; - console.log("Inside attachfile", fileContent) + console.log('Inside attachfile', fileContent); return {fileMetadata: fileMetadata, fileContent: fileContent}; } @@ -488,12 +491,13 @@ export default class MediaDbPlugin extends Plugin { } async loadSettings() { + console.log(DEFAULT_SETTINGS); this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } async saveSettings() { this.mediaTypeManager.updateTemplates(this.settings); - this.modelPropertyMapper.updateConversionRules(this.settings); + //this.modelPropertyMapper.updateConversionRules(this.settings); await this.saveData(this.settings); } diff --git a/src/settings/ModelPropertyConversionRule.ts b/src/settings/ModelPropertyConversionRule.ts deleted file mode 100644 index d749918..0000000 --- a/src/settings/ModelPropertyConversionRule.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {containsOnlyLettersAndUnderscores} from '../utils/Utils'; - -export class ModelPropertyConversionRule { - property: string; - newProperty: string; - - constructor(conversionRule: string) { - const conversionRuleParts = conversionRule.split('->'); - if (conversionRuleParts.length !== 2) { - throw Error(`Conversion rule "${conversionRule}" may only have exactly one "->"`); - } - - let property = conversionRuleParts[0].trim(); - let newProperty = conversionRuleParts[1].trim(); - - if (!property || !containsOnlyLettersAndUnderscores(property)) { - throw Error(`Error in conversion rule "${conversionRule}": property may not be empty and only contain letters and underscores.`); - } - - if (!newProperty || !containsOnlyLettersAndUnderscores(newProperty)) { - throw Error(`Error in conversion rule "${conversionRule}": new property may not be empty and only contain letters and underscores.`); - } - - this.property = property; - this.newProperty = newProperty; - } -} diff --git a/src/settings/ModelPropertyMapper.ts b/src/settings/ModelPropertyMapper.ts deleted file mode 100644 index 39b8b51..0000000 --- a/src/settings/ModelPropertyMapper.ts +++ /dev/null @@ -1,130 +0,0 @@ -import {MediaType} from '../utils/MediaType'; -import {MediaDbPluginSettings} from './Settings'; -import {ModelPropertyConversionRule} from './ModelPropertyConversionRule'; - -export class ModelPropertyMapper { - conversionRulesMap: Map; - - constructor(settings: MediaDbPluginSettings) { - this.updateConversionRules(settings); - } - - updateConversionRules(settings: MediaDbPluginSettings) { - this.conversionRulesMap = new Map(); - this.conversionRulesMap.set(MediaType.Movie, settings.moviePropertyConversionRules); - this.conversionRulesMap.set(MediaType.Series, settings.seriesPropertyConversionRules); - this.conversionRulesMap.set(MediaType.Game, settings.gamePropertyConversionRules); - this.conversionRulesMap.set(MediaType.Wiki, settings.wikiPropertyConversionRules); - this.conversionRulesMap.set(MediaType.MusicRelease, settings.musicReleasePropertyConversionRules); - this.conversionRulesMap.set(MediaType.BoardGame, settings.boardgamePropertyConversionRules); - } - - /** - * Converts an object using the conversion rules for its type. - * Returns an unaltered object if object.type is null or undefined or if there are no conversion rules for the type. - * - * @param obj - */ - convertObject(obj: object): object { - if (!obj.hasOwnProperty('type')) { - return obj; - } - - // @ts-ignore - // get conversion rules from settings corresponding to the object type - const conversionRulesString: string = this.conversionRulesMap.get(obj['type']); - if (!conversionRulesString) { - return obj; - } - - // parse the conversion rules - const conversionRules: ModelPropertyConversionRule[] = []; - for (const conversionRuleString of conversionRulesString.split('\n')) { - if (conversionRuleString) { - conversionRules.push(new ModelPropertyConversionRule(conversionRuleString)); - } - } - - const newObj: object = {}; - - for (const [key, value] of Object.entries(obj)) { - // property 'type' can not be remapped - if (key === 'type') { - // @ts-ignore - newObj[key] = value; - continue; - } - - let hasConversionRule = false; - for (const conversionRule of conversionRules) { - if (conversionRule.property === key) { - hasConversionRule = true; - // if the conversion rule maps to 'x', then that means it should be ignored - if (conversionRule.newProperty.toLowerCase() !== 'x') { - // @ts-ignore - newObj[conversionRule.newProperty] = value; - } - } - } - if (!hasConversionRule) { - // @ts-ignore - newObj[key] = value; - } - } - - return newObj; - } - - /** - * Converts an object back using the conversion rules for its type. - * Returns an unaltered object if object.type is null or undefined or if there are no conversion rules for the type. - * - * @param obj - */ - convertObjectBack(obj: object): object { - if (!obj.hasOwnProperty('type')) { - return obj; - } - - // @ts-ignore - // get conversion rules from settings corresponding to the object type - const conversionRulesString: string = this.conversionRulesMap.get(obj['type']); - if (!conversionRulesString) { - return obj; - } - - const conversionRules: ModelPropertyConversionRule[] = []; - // parse the conversion rules - for (const conversionRuleString of conversionRulesString.split('\n')) { - if (conversionRuleString) { - conversionRules.push(new ModelPropertyConversionRule(conversionRuleString)); - } - } - - const originalObj: object = {}; - - for (const [key, value] of Object.entries(obj)) { - // property 'type' can not be remapped - if (key === 'type') { - // @ts-ignore - originalObj[key] = value; - continue; - } - - let hasConversionRule = false; - for (const conversionRule of conversionRules) { - if (conversionRule.newProperty === key) { - hasConversionRule = true; - // @ts-ignore - originalObj[conversionRule.property] = value; - } - } - if (!hasConversionRule) { - // @ts-ignore - originalObj[key] = value; - } - } - - return originalObj; - } -} diff --git a/src/settings/PropertyBindingsComponent.svelte b/src/settings/PropertyBindingsComponent.svelte new file mode 100644 index 0000000..26770e3 --- /dev/null +++ b/src/settings/PropertyBindingsComponent.svelte @@ -0,0 +1,74 @@ + + + + +
+ { #each models as model } +
{capitalizeFirstLetter(model.type)}
+
+ { #each model.properties as property } +
+
+
{property.property}
+
+ {#if property.locked} +
+ property can not be remapped +
+ {:else} + + + {#if property.mapping === PropertyMappingOption.Map} +
+ -> +
+
+ +
+ {/if} + {/if} +
+ { /each } +
+ { /each } + +
{JSON.stringify(models, null, 4)}
+
diff --git a/src/settings/PropertyMapper.ts b/src/settings/PropertyMapper.ts new file mode 100644 index 0000000..66da472 --- /dev/null +++ b/src/settings/PropertyMapper.ts @@ -0,0 +1,98 @@ +import {PropertyMappingOption} from './PropertyMapping'; +import {MEDIA_TYPES} from '../utils/MediaTypeManager'; +import MediaDbPlugin from '../main'; + +export class PropertyMapper { + plugin: MediaDbPlugin; + + constructor(plugin: MediaDbPlugin) { + this.plugin = plugin; + } + + /** + * Converts an object using the conversion rules for its type. + * Returns an unaltered object if object.type is null or undefined or if there are no conversion rules for the type. + * + * @param obj + */ + convertObject(obj: object): object { + if (!obj.hasOwnProperty('type')) { + return obj; + } + + // @ts-ignore + if (MEDIA_TYPES.contains(obj.type)) { + return obj; + } + + // @ts-ignore + const propertyMappings = this.plugin.settings.propertyMappings.find(x => x.type === obj.type).properties; + + const newObj: object = {}; + + for (const [key, value] of Object.entries(obj)) { + for (const propertyMapping of propertyMappings) { + if (propertyMapping.property === key) { + if (propertyMapping.mapping === PropertyMappingOption.Map) { + // @ts-ignore + newObj[propertyMapping.newProperty] = value; + } else if (propertyMapping.mapping === PropertyMappingOption.Remove) { + + } else if (propertyMapping.mapping === PropertyMappingOption.None) { + // @ts-ignore + newObj[key] = value; + } + break; + } + } + } + + return newObj; + } + + /** + * Converts an object back using the conversion rules for its type. + * Returns an unaltered object if object.type is null or undefined or if there are no conversion rules for the type. + * + * @param obj + */ + convertObjectBack(obj: object): object { + if (!obj.hasOwnProperty('type')) { + return obj; + } + + // @ts-ignore + if (MEDIA_TYPES.contains(obj.type)) { + return obj; + } + + // @ts-ignore + const propertyMappings = this.plugin.settings.propertyMappings.find(x => x.type === obj.type).properties; + + const originalObj: object = {}; + + objLoop: for (const [key, value] of Object.entries(obj)) { + // first try if it is a normal property + for (const propertyMapping of propertyMappings) { + if (propertyMapping.property === key) { + // @ts-ignore + originalObj[key] = value; + + continue objLoop; + } + } + + // otherwise see if it is a mapped property + for (const propertyMapping of propertyMappings) { + if (propertyMapping.newProperty === key) { + // @ts-ignore + originalObj[propertyMapping.property] = value; + + continue objLoop; + } + } + } + + return originalObj; + } +} diff --git a/src/settings/PropertyMapping.ts b/src/settings/PropertyMapping.ts new file mode 100644 index 0000000..582718f --- /dev/null +++ b/src/settings/PropertyMapping.ts @@ -0,0 +1,75 @@ +import {containsOnlyLettersAndUnderscores} from '../utils/Utils'; +import {MediaType} from '../utils/MediaType'; + +export enum PropertyMappingOption { + None = 'none', + Map = 'remap', + Remove = 'remove', +} + +export const propertyMappingOptions = [PropertyMappingOption.None, PropertyMappingOption.Map, PropertyMappingOption.Remove]; + +export interface PropertyMappingModel { + type: MediaType, + properties: PropertyMapping[], +} + +export class PropertyMapping { + property: string; + newProperty: string; + locked: boolean; + mapping: PropertyMappingOption; + + constructor(property: string, newProperty: string, mapping: PropertyMappingOption, locked?: boolean) { + this.property = property; + this.newProperty = newProperty; + this.mapping = mapping; + this.locked = locked ?? false; + + /* + const conversionRuleParts = conversionRule.split('->'); + if (conversionRuleParts.length !== 2) { + throw Error(`Conversion rule "${conversionRule}" may only have exactly one "->"`); + } + + let property = conversionRuleParts[0].trim(); + let newProperty = conversionRuleParts[1].trim(); + + if (!property || !containsOnlyLettersAndUnderscores(property)) { + throw Error(`Error in conversion rule "${conversionRule}": property may not be empty and only contain letters and underscores.`); + } + + if (!newProperty || !containsOnlyLettersAndUnderscores(newProperty)) { + throw Error(`Error in conversion rule "${conversionRule}": new property may not be empty and only contain letters and underscores.`); + } + + this.property = property; + this.newProperty = newProperty; + + */ + } + + validate(): string { + if (!this.property || !containsOnlyLettersAndUnderscores(this.property)) { + return `Error in conversion rule "${this.toString()}": property may not be empty and only contain letters and underscores.`; + } + + if (!this.newProperty || !containsOnlyLettersAndUnderscores(this.newProperty)) { + return `Error in conversion rule "${this.toString()}": new property may not be empty and only contain letters and underscores.`; + } + + return ''; + } + + toString(): string { + if (this.mapping === PropertyMappingOption.None) { + return this.property; + } else if (this.mapping === PropertyMappingOption.Map) { + return `${this.property} -> ${this.newProperty}`; + } else if (this.mapping === PropertyMappingOption.Remove) { + return `remove ${this.property}`; + } + + return this.property; + } +} diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index b030311..b35ab04 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -3,6 +3,9 @@ import {App, PluginSettingTab, Setting} from 'obsidian'; import MediaDbPlugin from '../main'; import {FolderSuggest} from './suggesters/FolderSuggest'; import {FileSuggest} from './suggesters/FileSuggest'; +import PropertyBindingsComponent from './PropertyBindingsComponent.svelte'; +import {PropertyMapping, PropertyMappingModel, PropertyMappingOption} from './PropertyMapping'; +import {MediaType} from '../utils/MediaType'; export interface MediaDbPluginSettings { @@ -34,6 +37,8 @@ export interface MediaDbPluginSettings { musicReleasePropertyConversionRules: string, boardgamePropertyConversionRules: string, + propertyMappings: PropertyMappingModel[], + } export const DEFAULT_SETTINGS: MediaDbPluginSettings = { @@ -64,6 +69,60 @@ export const DEFAULT_SETTINGS: MediaDbPluginSettings = { musicReleasePropertyConversionRules: '', boardgamePropertyConversionRules: '', + propertyMappings: [ + { + type: MediaType.Movie, + properties: [ + new PropertyMapping('type', '', PropertyMappingOption.None, true), + new PropertyMapping('subType', '', PropertyMappingOption.None), + new PropertyMapping('title', '', PropertyMappingOption.None), + new PropertyMapping('englishTitle', '', PropertyMappingOption.None), + new PropertyMapping('year', '', PropertyMappingOption.None), + new PropertyMapping('dataSource', '', PropertyMappingOption.None, true), + new PropertyMapping('url', '', PropertyMappingOption.None), + new PropertyMapping('id', '', PropertyMappingOption.None, true), + + new PropertyMapping('genres', '', PropertyMappingOption.None), + new PropertyMapping('producer', '', PropertyMappingOption.None), + new PropertyMapping('duration', '', PropertyMappingOption.None), + new PropertyMapping('onlineRating', '', PropertyMappingOption.None), + new PropertyMapping('image', '', PropertyMappingOption.None), + new PropertyMapping('released', '', PropertyMappingOption.None), + new PropertyMapping('premiere', '', PropertyMappingOption.None), + new PropertyMapping('watched', '', PropertyMappingOption.None), + new PropertyMapping('lastWatched', '', PropertyMappingOption.None), + new PropertyMapping('personalRating', '', PropertyMappingOption.None), + ], + }, + { + type: MediaType.Series, + properties: [ + new PropertyMapping('type', '', PropertyMappingOption.None, true), + new PropertyMapping('subType', '', PropertyMappingOption.None), + new PropertyMapping('title', '', PropertyMappingOption.None), + new PropertyMapping('englishTitle', '', PropertyMappingOption.None), + new PropertyMapping('year', '', PropertyMappingOption.None), + new PropertyMapping('dataSource', '', PropertyMappingOption.None, true), + new PropertyMapping('url', '', PropertyMappingOption.None), + new PropertyMapping('id', '', PropertyMappingOption.None, true), + + new PropertyMapping('genres', '', PropertyMappingOption.None), + new PropertyMapping('studios', '', PropertyMappingOption.None), + new PropertyMapping('episodes', '', PropertyMappingOption.None), + new PropertyMapping('duration', '', PropertyMappingOption.None), + new PropertyMapping('onlineRating', '', PropertyMappingOption.None), + new PropertyMapping('image', '', PropertyMappingOption.None), + new PropertyMapping('released', '', PropertyMappingOption.None), + new PropertyMapping('airing', '', PropertyMappingOption.None), + new PropertyMapping('airedFrom', '', PropertyMappingOption.None), + new PropertyMapping('airedTo', '', PropertyMappingOption.None), + new PropertyMapping('watched', '', PropertyMappingOption.None), + new PropertyMapping('lastWatched', '', PropertyMappingOption.None), + new PropertyMapping('personalRating', '', PropertyMappingOption.None), + ], + }, + ], + }; export class MediaDbSettingTab extends PluginSettingTab { @@ -298,6 +357,7 @@ export class MediaDbSettingTab extends PluginSettingTab { containerEl.createEl('h3', {text: 'Property Mappings'}); // region Property Mappings + /* new Setting(containerEl) .setName('Movie model property mappings') .setDesc('Mappings for the property names of a movie.') @@ -369,8 +429,23 @@ export class MediaDbSettingTab extends PluginSettingTab { this.plugin.saveSettings(); }); }); + + */ // endregion + console.log(this.plugin.settings.propertyMappings); + + new PropertyBindingsComponent({ + target: this.containerEl, + props: { + models: this.plugin.settings.propertyMappings, + save: (models: PropertyMappingModel[]) => { + this.plugin.settings.propertyMappings = models; + this.plugin.saveSettings(); + }, + }, + }); + } } diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index 9d576b0..08a4f1e 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -10,6 +10,8 @@ import {WikiModel} from '../models/WikiModel'; import {MusicReleaseModel} from '../models/MusicReleaseModel'; import {BoardGameModel} from '../models/BoardGameModel'; +export const MEDIA_TYPES = [MediaType.Movie, MediaType.Series, MediaType.Game, MediaType.Wiki, MediaType.MusicRelease, MediaType.BoardGame]; + export class MediaTypeManager { mediaFileNameTemplateMap: Map; mediaTemplateMap: Map; diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index fda6c35..feb99d6 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -172,3 +172,7 @@ export function mod(n: number, m: number): number { return ((n % m) + m) % m; } +export function capitalizeFirstLetter(string: string): string { + return string.charAt(0).toUpperCase() + string.slice(1); +} + diff --git a/tsconfig.json b/tsconfig.json index 732e408..9300189 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,30 @@ { - "compilerOptions": { - "baseUrl": ".", - "inlineSourceMap": true, - "inlineSources": true, - "module": "ESNext", - "target": "ES6", - "allowJs": true, - "noImplicitAny": true, - "moduleResolution": "node", - "importHelpers": true, - "isolatedModules": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "lib": [ - "DOM", - "ES5", - "ES6", - "ES7" - ] - }, - "include": [ - "**/*.ts" - ] + "compilerOptions": { + "types": [ + "svelte", + "node", + "jest" + ], + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "lib": [ + "DOM", + "ES5", + "ES6", + "ES7" + ] + }, + "include": [ + "**/*.ts" + ] }