From bd85493cd8d95d2e64f28b831cbd8a0de17a864c Mon Sep 17 00:00:00 2001 From: blue-monk Date: Sun, 14 Apr 2024 20:39:16 +0900 Subject: [PATCH 01/53] chore: ignore testdata/ folder in .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3978273..07c1495 100644 --- a/.gitignore +++ b/.gitignore @@ -130,4 +130,6 @@ dist .pnp.* output/* -!output/.gitkeep \ No newline at end of file +!output/.gitkeep + +testdata/* From 85a444a8742b149a5fda5064743fd1d10b583d0c Mon Sep 17 00:00:00 2001 From: blue-monk Date: Sun, 14 Apr 2024 23:16:15 +0900 Subject: [PATCH 02/53] chore: update all dependencies and tsconfig.json, fix errors due to meow library spec changes (alias -> shortFlag) --- package.json | 16 +- src/index.mts | 2 +- tsconfig.json | 4 +- yarn.lock | 492 +++++++------------------------------------------- 4 files changed, 72 insertions(+), 442 deletions(-) diff --git a/package.json b/package.json index 3a7b664..e99a6e1 100644 --- a/package.json +++ b/package.json @@ -18,15 +18,15 @@ "author": "", "license": "ISC", "devDependencies": { - "@types/node": "^17.0.32", - "@types/turndown": "^5.0.1", - "ts-node": "^10.7.0", - "typescript": "^4.8.0-dev.20220512" + "@types/node": "^20.12.7", + "@types/turndown": "^5.0.4", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" }, "dependencies": { - "fast-glob": "^3.2.11", - "fs-extra": "^10.1.0", - "meow": "^10.1.2", - "turndown": "^7.1.1" + "fast-glob": "^3.3.2", + "fs-extra": "^11.2.0", + "meow": "^13.2.0", + "turndown": "^7.1.3" } } diff --git a/src/index.mts b/src/index.mts index 201694a..048f141 100644 --- a/src/index.mts +++ b/src/index.mts @@ -16,7 +16,7 @@ const cli = meow(` flags: { output: { type: 'string', - alias: 'o', + shortFlag: 'o', }, }, }); diff --git a/tsconfig.json b/tsconfig.json index 93ae9cd..a6fc68f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,10 @@ { "compilerOptions": { "outDir": "dist", - "module": "esnext", + "module": "NodeNext", "target": "ES2020", "esModuleInterop": true, - "moduleResolution": "Node", + "moduleResolution": "NodeNext", "lib": [ "ESNext", "DOM" diff --git a/yarn.lock b/yarn.lock index 052c05e..4f8ff61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,38 +2,30 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@babel/highlight" "^7.16.7" + "@jridgewell/trace-mapping" "0.3.9" -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@babel/highlight@^7.16.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" - integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -76,25 +68,17 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@types/minimist@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/node@^17.0.32": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.32.tgz#51d59d7a90ef2d0ae961791e0900cad2393a0149" - integrity sha512-eAIcfAvhf/BkHcf4pkLJ7ECpBAhh9kcxRBpip9cTiO+hf+aJrsxYxBeS6OXvOd9WqNAJmavXVpZvY1rBjNsXmw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/node@^20.12.7": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" -"@types/turndown@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/turndown/-/turndown-5.0.1.tgz#fcda7b02cda4c9d445be1440036df20f335b9387" - integrity sha512-N8Ad4e3oJxh9n9BiZx9cbe/0M3kqDpOTm2wzj13wdDUxDPjfjloWIJaquZzWE1cYTAHpjOH3rcTnXQdpEfS/SQ== +"@types/turndown@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/turndown/-/turndown-5.0.4.tgz#61fcdda2e539a86b1d40cb3277505f22ca76f014" + integrity sha512-28GI33lCCkU4SGH1GvjDhFgOVr+Tym4PXGBIU1buJUa6xQolniPArtUT+kv42RR2N9MsMLInkr904Aq+ESHBJg== acorn-walk@^8.1.1: version "8.2.0" @@ -106,23 +90,11 @@ acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -130,65 +102,11 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -camelcase-keys@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252" - integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== - dependencies: - camelcase "^6.3.0" - map-obj "^4.1.0" - quick-lru "^5.1.1" - type-fest "^1.2.1" - -camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decamelize@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" - integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -199,22 +117,10 @@ domino@^2.1.6: resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -fast-glob@^3.2.11: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -236,28 +142,15 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -270,47 +163,6 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-core-module@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -328,21 +180,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -352,62 +189,15 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -meow@^10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.2.tgz#62951cb69afa69594142c8250806bc30a3912e4d" - integrity sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q== - dependencies: - "@types/minimist" "^1.2.2" - camelcase-keys "^7.0.0" - decamelize "^5.0.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.2" - read-pkg-up "^8.0.0" - redent "^4.0.0" - trim-newlines "^4.0.2" - type-fest "^1.2.2" - yargs-parser "^20.2.9" +meow@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== merge2@^1.3.0: version "1.4.1" @@ -422,59 +212,6 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -min-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -normalize-package-data@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -485,38 +222,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -read-pkg-up@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" - integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== - dependencies: - find-up "^5.0.0" - read-pkg "^6.0.0" - type-fest "^1.0.1" - -read-pkg@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" - integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^3.0.2" - parse-json "^5.2.0" - type-fest "^1.0.1" - -redent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" - integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== - dependencies: - indent-string "^5.0.0" - strip-indent "^4.0.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -529,53 +234,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -semver@^7.3.4: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -strip-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" - integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== - dependencies: - min-indent "^1.0.1" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -583,17 +241,12 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -trim-newlines@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.0.2.tgz#d6aaaf6a0df1b4b536d183879a6b939489808c7c" - integrity sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew== - -ts-node@^10.7.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" - integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: - "@cspotcode/source-map-support" "0.7.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -604,60 +257,37 @@ ts-node@^10.7.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" -turndown@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.1.1.tgz#96992f2d9b40a1a03d3ea61ad31b5a5c751ef77f" - integrity sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA== +turndown@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.1.3.tgz#2890eb76c603e66bf0c9e91526582b563065c57d" + integrity sha512-Z3/iJ6IWh8VBiACWQJaA5ulPQE5E1QwvBHj00uGzdQxdRnd8fh1DPqNOJqzQDu6DkOstORrtXzf/9adB+vMtEA== dependencies: domino "^2.1.6" -type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +typescript@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== -typescript@^4.8.0-dev.20220512: - version "4.8.0-dev.20220512" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.0-dev.20220512.tgz#2f9b96bc7acb0f4190bfe6f25dbab44416841e1b" - integrity sha512-GkLFx5zji3VXVFfOhhYuFbyNRrjzmokfpp8Yq15gzjNrMIqe/dgUIl1yzMDoY5nuB0ul2Tac1+4jeAWFVf6agg== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -v8-compile-cache-lib@^3.0.0: +v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From be0773298fe29c76330a700d90fd36f71310a107 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Sun, 14 Apr 2024 23:43:02 +0900 Subject: [PATCH 03/53] refactor: modularize TurndownService-related code for better maintainability --- src/quiver-markdown.mts | 38 +--------------------------- src/transform/turndown-service.mts | 40 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 src/transform/turndown-service.mts diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index 57bb512..8e6a2ec 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -1,49 +1,13 @@ import fg from 'fast-glob' import fs from 'fs-extra' import path from 'path' -import Turndown from 'turndown' +import TurndownService from './transform/turndown-service.mjs' -let TurndownService: Turndown export function convert (qvlibrary: string, outputPath: string) { const glob = path.join(qvlibrary, '*.qvnotebook') const noteBooks = fg.sync(glob, { onlyDirectories: true }) - TurndownService = new Turndown() - - // extend turndown link rule to replace quiver-file-url - TurndownService.addRule('quiver-file-url', { - filter: function (node, options) { - return ( - options.linkStyle === 'inlined' && - node.nodeName === 'A' && - node.getAttribute('href') && - node.getAttribute('href').startsWith('quiver-file-url/') - ) - }, - replacement: function (content, node: HTMLAnchorElement, options) { - const href = node.getAttribute('href') - const fileName = href.replace('quiver-file-url/', '') - - return `[[${fileName}]]` - } - }) - - TurndownService.addRule('quiver-file-url-image', { - filter: function (node, options) { - return ( - node.nodeName === 'IMG' && - node.getAttribute('src') && - node.getAttribute('src').startsWith('quiver-image-url/') - ) - }, - replacement: function (content, node: HTMLImageElement, options) { - const src = node.getAttribute('src') - const fileName = src.replace('quiver-image-url/', '') - - return `![[${fileName}]]` - } - }) for (const notebook of noteBooks) { convertNotebook(notebook, outputPath) diff --git a/src/transform/turndown-service.mts b/src/transform/turndown-service.mts new file mode 100644 index 0000000..55a6ed3 --- /dev/null +++ b/src/transform/turndown-service.mts @@ -0,0 +1,40 @@ +import Turndown from 'turndown' + + +const TurndownService: Turndown = new Turndown() + +// extend turndown link rule to replace quiver-file-url +TurndownService.addRule('quiver-file-url', { + filter: function (node, options) { + return ( + options.linkStyle === 'inlined' && + node.nodeName === 'A' && + node.getAttribute('href') && + node.getAttribute('href').startsWith('quiver-file-url/') + ) + }, + replacement: function (content, node: HTMLAnchorElement, options) { + const href = node.getAttribute('href') + const fileName = href.replace('quiver-file-url/', '') + + return `[[${fileName}]]` + } +}) + +TurndownService.addRule('quiver-file-url-image', { + filter: function (node, options) { + return ( + node.nodeName === 'IMG' && + node.getAttribute('src') && + node.getAttribute('src').startsWith('quiver-image-url/') + ) + }, + replacement: function (content, node: HTMLImageElement, options) { + const src = node.getAttribute('src') + const fileName = src.replace('quiver-image-url/', '') + + return `![[${fileName}]]` + } +}) + +export default TurndownService From da4c4f55a5d9f8f9fe20066fd1c3b80880c34a09 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 00:02:13 +0900 Subject: [PATCH 04/53] spec-change: revise timestamp format to 'YYYY-MM-DD(ddd) HH:mm:ss' using dayjs --- package.json | 1 + src/quiver-markdown.mts | 6 ++++-- yarn.lock | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e99a6e1..06d2547 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "typescript": "^5.4.5" }, "dependencies": { + "dayjs": "^1.11.10", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "meow": "^13.2.0", diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index 8e6a2ec..b275233 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -1,6 +1,7 @@ import fg from 'fast-glob' import fs from 'fs-extra' import path from 'path' +import dayjs from "dayjs" import TurndownService from './transform/turndown-service.mjs' @@ -52,8 +53,9 @@ export function convertNotebook (notebook: string, outputPath: string) { } const formatTime = (timestamp: number) => { - const date = new Date(timestamp) - return date.toLocaleString() + + return dayjs(timestamp) + .format('YYYY-MM-DD(ddd) HH:mm:ss'); } function processMarkdownImage (markdown: string) { diff --git a/yarn.lock b/yarn.lock index 4f8ff61..c35e427 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,6 +107,11 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +dayjs@^1.11.10: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" From c70772c838ecd4f3e990e5e1076e5baef7fb951e Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 00:07:31 +0900 Subject: [PATCH 05/53] refactor: modularize formatter-related code for better maintainability --- src/quiver-markdown.mts | 8 +------- src/transform/formatter.mts | 8 ++++++++ 2 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 src/transform/formatter.mts diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index b275233..58806ba 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -1,8 +1,8 @@ import fg from 'fast-glob' import fs from 'fs-extra' import path from 'path' -import dayjs from "dayjs" import TurndownService from './transform/turndown-service.mjs' +import { formatTime } from './transform/formatter.mjs' export function convert (qvlibrary: string, outputPath: string) { @@ -52,12 +52,6 @@ export function convertNotebook (notebook: string, outputPath: string) { } } -const formatTime = (timestamp: number) => { - - return dayjs(timestamp) - .format('YYYY-MM-DD(ddd) HH:mm:ss'); -} - function processMarkdownImage (markdown: string) { return markdown.replaceAll(/(?:__|[*#])|\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { if (p2?.startsWith('quiver-image-url/')) { diff --git a/src/transform/formatter.mts b/src/transform/formatter.mts new file mode 100644 index 0000000..fc0ca62 --- /dev/null +++ b/src/transform/formatter.mts @@ -0,0 +1,8 @@ +import dayjs from "dayjs"; + + +export const formatTime = (timestamp: number) => { + + return dayjs(timestamp) + .format('YYYY-MM-DD(ddd) HH:mm:ss') +} From e355b921feee8464df626913ed0ea1ba28dd1e5d Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 10:47:43 +0900 Subject: [PATCH 06/53] refactor: modularize image-link-transform-related code for better maintainability --- src/quiver-markdown.mts | 11 +---------- src/transform/image-link-transform.mts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 src/transform/image-link-transform.mts diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index 58806ba..de331ef 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -3,6 +3,7 @@ import fs from 'fs-extra' import path from 'path' import TurndownService from './transform/turndown-service.mjs' import { formatTime } from './transform/formatter.mjs' +import { processMarkdownImage } from './transform/image-link-transform.mjs' export function convert (qvlibrary: string, outputPath: string) { @@ -52,16 +53,6 @@ export function convertNotebook (notebook: string, outputPath: string) { } } -function processMarkdownImage (markdown: string) { - return markdown.replaceAll(/(?:__|[*#])|\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { - if (p2?.startsWith('quiver-image-url/')) { - return `[[${p2.replace('quiver-image-url/', '')}]]` - } else { - return match - } - }) -} - export function convertNoteToMarkdown (note: string): { title: string, content: string } { const meta = JSON.parse(fs.readFileSync(path.join(note, 'meta.json'), 'utf8')) const content = JSON.parse(fs.readFileSync(path.join(note, 'content.json'), 'utf8')) diff --git a/src/transform/image-link-transform.mts b/src/transform/image-link-transform.mts new file mode 100644 index 0000000..09352a2 --- /dev/null +++ b/src/transform/image-link-transform.mts @@ -0,0 +1,12 @@ + + +export function processMarkdownImage(markdown: string) { + + return markdown.replaceAll(/(?:__|[*#])|\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { + if (p2?.startsWith('quiver-image-url/')) { + return `[[${p2.replace('quiver-image-url/', '')}]]` + } else { + return match + } + }) +} From b7c2d5a57eebdc3054266af4c5104fd9ef2ae676 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 10:53:48 +0900 Subject: [PATCH 07/53] refactor: rename processMarkdownImage -> transformImageLinkOnMarkdown for clarity --- src/quiver-markdown.mts | 4 ++-- src/transform/image-link-transform.mts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index de331ef..2f9428d 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -3,7 +3,7 @@ import fs from 'fs-extra' import path from 'path' import TurndownService from './transform/turndown-service.mjs' import { formatTime } from './transform/formatter.mjs' -import { processMarkdownImage } from './transform/image-link-transform.mjs' +import { transformImageLinkOnMarkdown } from './transform/image-link-transform.mjs' export function convert (qvlibrary: string, outputPath: string) { @@ -66,7 +66,7 @@ export function convertNoteToMarkdown (note: string): { title: string, content: case 'code': return `\`\`\`${cell.language}\n${cell.data}\n\`\`\`` case 'markdown': - return processMarkdownImage(cell.data) + return transformImageLinkOnMarkdown(cell.data) case 'diagram': return `\`\`\`${cell.diagramType}\n${cell.data}\n\`\`\`` case 'latex': diff --git a/src/transform/image-link-transform.mts b/src/transform/image-link-transform.mts index 09352a2..6bc6ba9 100644 --- a/src/transform/image-link-transform.mts +++ b/src/transform/image-link-transform.mts @@ -1,6 +1,6 @@ -export function processMarkdownImage(markdown: string) { +export function transformImageLinkOnMarkdown(markdown: string) { return markdown.replaceAll(/(?:__|[*#])|\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { if (p2?.startsWith('quiver-image-url/')) { From 55f90ab013d4479cb707feb075222bd31a954639 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 11:07:13 +0900 Subject: [PATCH 08/53] fix: correct image link display issues in Obsidian --- src/transform/image-link-transform.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transform/image-link-transform.mts b/src/transform/image-link-transform.mts index 6bc6ba9..13cf4ec 100644 --- a/src/transform/image-link-transform.mts +++ b/src/transform/image-link-transform.mts @@ -4,7 +4,7 @@ export function transformImageLinkOnMarkdown(markdown: string) { return markdown.replaceAll(/(?:__|[*#])|\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { if (p2?.startsWith('quiver-image-url/')) { - return `[[${p2.replace('quiver-image-url/', '')}]]` + return `[[${p2.replace('quiver-image-url/', '').replace(/ *=(\d+x\d+)$/, '|$1')}]]`; } else { return match } From 70c800bbda94161a82471d1faa7df0fdbe369f36 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 11:19:24 +0900 Subject: [PATCH 09/53] refactor: rename convertNoteToMarkdown -> transformQuiverNoteToObsidian for specificity --- src/quiver-markdown.mts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index 2f9428d..75e3fe3 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -30,7 +30,7 @@ export function convertNotebook (notebook: string, outputPath: string) { fs.ensureDirSync(notebookResourcePath) for (const note of notes) { - const { title, content } = convertNoteToMarkdown(note) + const { title, content } = transformQuiverNoteToObsidian(note) const fileName = path.join(notebookOutputPath, `${title}.md`) try { @@ -53,7 +53,7 @@ export function convertNotebook (notebook: string, outputPath: string) { } } -export function convertNoteToMarkdown (note: string): { title: string, content: string } { +export function transformQuiverNoteToObsidian (note: string): { title: string, content: string } { const meta = JSON.parse(fs.readFileSync(path.join(note, 'meta.json'), 'utf8')) const content = JSON.parse(fs.readFileSync(path.join(note, 'content.json'), 'utf8')) From fa202465084ba43d81ae6839c62e74db06c9ea94 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 11:37:25 +0900 Subject: [PATCH 10/53] refactor: modularize transformQuiverNoteToObsidian function in preparation for upcoming feature enhancements --- src/quiver-markdown.mts | 38 ++------------------------ src/quiver-to-obsidian-transform.mts | 41 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 36 deletions(-) create mode 100644 src/quiver-to-obsidian-transform.mts diff --git a/src/quiver-markdown.mts b/src/quiver-markdown.mts index 75e3fe3..726b794 100644 --- a/src/quiver-markdown.mts +++ b/src/quiver-markdown.mts @@ -1,9 +1,8 @@ import fg from 'fast-glob' import fs from 'fs-extra' import path from 'path' -import TurndownService from './transform/turndown-service.mjs' -import { formatTime } from './transform/formatter.mjs' -import { transformImageLinkOnMarkdown } from './transform/image-link-transform.mjs' + +import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' export function convert (qvlibrary: string, outputPath: string) { @@ -52,36 +51,3 @@ export function convertNotebook (notebook: string, outputPath: string) { } } } - -export function transformQuiverNoteToObsidian (note: string): { title: string, content: string } { - const meta = JSON.parse(fs.readFileSync(path.join(note, 'meta.json'), 'utf8')) - const content = JSON.parse(fs.readFileSync(path.join(note, 'content.json'), 'utf8')) - - const tags = meta.tags.length > 0 ? meta.tags.map(t => `#${t}`).join(' ') + '\n\n' : '' - - const cellsToMarkdown = content.cells.map(cell => { - switch(cell.type) { - case 'text': - return TurndownService.turndown(cell.data) - case 'code': - return `\`\`\`${cell.language}\n${cell.data}\n\`\`\`` - case 'markdown': - return transformImageLinkOnMarkdown(cell.data) - case 'diagram': - return `\`\`\`${cell.diagramType}\n${cell.data}\n\`\`\`` - case 'latex': - return `$$\n${cell.data}\n$$` - default: - throw new Error(`Unknown cell type: ${cell.type}`) - } - }).join('\n\n') - - return { - title: meta.title, - content: `${tags}${cellsToMarkdown} - - Created At: ${formatTime(meta.created_at * 1000)} - Updated At: ${formatTime(meta.updated_at * 1000)} - ` - } -} diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts new file mode 100644 index 0000000..225aa48 --- /dev/null +++ b/src/quiver-to-obsidian-transform.mts @@ -0,0 +1,41 @@ +import fs from "fs-extra"; +import path from "path"; + +import TurndownService from "./transform/turndown-service.mjs"; +import { formatTime } from './transform/formatter.mjs'; +import { transformImageLinkOnMarkdown } from './transform/image-link-transform.mjs'; + + +export function transformQuiverNoteToObsidian(note: string): { title: string; content: string} { + + const meta = JSON.parse(fs.readFileSync(path.join(note, 'meta.json'), 'utf8')) + const content = JSON.parse(fs.readFileSync(path.join(note, 'content.json'), 'utf8')) + + const tags = meta.tags.length > 0 ? meta.tags.map(t => `#${t}`).join(' ') + '\n\n' : '' + + const cellsToMarkdown = content.cells.map(cell => { + switch (cell.type) { + case 'text': + return TurndownService.turndown(cell.data) + case 'code': + return `\`\`\`${cell.language}\n${cell.data}\n\`\`\`` + case 'markdown': + return transformImageLinkOnMarkdown(cell.data) + case 'diagram': + return `\`\`\`${cell.diagramType}\n${cell.data}\n\`\`\`` + case 'latex': + return `$$\n${cell.data}\n$$` + default: + throw new Error(`Unknown cell type: ${cell.type}`) + } + }).join('\n\n') + + return { + title: meta.title, + content: `${tags}${cellsToMarkdown} + + Created At: ${formatTime(meta.created_at * 1000)} + Updated At: ${formatTime(meta.updated_at * 1000)} + ` + } +} From 5ee9a2944a42f3038d8303ad0810fd77f3b94502 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 11:50:15 +0900 Subject: [PATCH 11/53] refactor: rename quiver-markdown.mts to quiver-to-obsidian-exporter.mts to align with the repository name for consistency --- src/index.mts | 4 +++- src/{quiver-markdown.mts => quiver-to-obsidian-exporter.mts} | 0 2 files changed, 3 insertions(+), 1 deletion(-) rename src/{quiver-markdown.mts => quiver-to-obsidian-exporter.mts} (100%) diff --git a/src/index.mts b/src/index.mts index 048f141..7de29ce 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,6 +1,8 @@ #!/usr/bin/env node import meow from 'meow'; -import { convert } from './quiver-markdown.mjs'; + +import { convert } from './quiver-to-obsidian-exporter.mjs'; + const cli = meow(` Usage diff --git a/src/quiver-markdown.mts b/src/quiver-to-obsidian-exporter.mts similarity index 100% rename from src/quiver-markdown.mts rename to src/quiver-to-obsidian-exporter.mts From 49a2c579c0b92125187275b6134f0f4b53ae8ecc Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 11:59:44 +0900 Subject: [PATCH 12/53] refactor: rename convert -> exportQvlibrary in quiver-to-obsidian-exporter.mts for clarity --- src/index.mts | 4 ++-- src/quiver-to-obsidian-exporter.mts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/index.mts b/src/index.mts index 7de29ce..42ec3b0 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,7 +1,7 @@ #!/usr/bin/env node import meow from 'meow'; -import { convert } from './quiver-to-obsidian-exporter.mjs'; +import { exportQvlibrary } from './quiver-to-obsidian-exporter.mjs'; const cli = meow(` @@ -33,4 +33,4 @@ if (!cli.flags.output) { process.exit(1); } -convert(cli.input[0], cli.flags.output); +exportQvlibrary(cli.input[0], cli.flags.output); diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 726b794..a968b27 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -5,7 +5,8 @@ import path from 'path' import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' -export function convert (qvlibrary: string, outputPath: string) { +export function exportQvlibrary(qvlibrary: string, outputPath: string) { + const glob = path.join(qvlibrary, '*.qvnotebook') const noteBooks = fg.sync(glob, { onlyDirectories: true }) From a4ea89547d859941ecea6bd0bc3b3cb2ebbccb6f Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 12:52:08 +0900 Subject: [PATCH 13/53] refactor: extract functions for note output and resource copying into outputNoteAndCopyResources to enhance readability and maintainability --- src/quiver-to-obsidian-exporter.mts | 43 +++++++++++++++++------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index a968b27..299910e 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -26,29 +26,36 @@ export function convertNotebook (notebook: string, outputPath: string) { const notebookOutputPath = path.join(outputPath, notebookMeta.name) const notebookResourcePath = path.join(notebookOutputPath, `./_resources`) - fs.ensureDirSync(notebookOutputPath) - fs.ensureDirSync(notebookResourcePath) - for (const note of notes) { const { title, content } = transformQuiverNoteToObsidian(note) + outputNoteAndCopyResources(notebookOutputPath, title, content, note, notebookResourcePath) + } +} + +function outputNoteAndCopyResources(notebookOutputPath: string, title: string, content: string, note: string, notebookResourcePath: string) { - const fileName = path.join(notebookOutputPath, `${title}.md`) - try { - fs.writeFileSync(fileName, content) + fs.ensureDirSync(notebookOutputPath) + fs.ensureDirSync(notebookResourcePath) - const notebookResourceDir = path.join(note, 'resources') - if (fs.pathExistsSync(notebookResourceDir)) { - // copy every file under resources to notebook resource dir - const files = fg.sync(path.join(notebookResourceDir, '**/*')) - for (const file of files) { - const fileName = path.basename(file) - const dest = path.join(notebookResourcePath, fileName) - fs.copySync(file, dest) - } + const fileName = path.join(notebookOutputPath, `${title}.md`) + + try { + fs.writeFileSync(fileName, content) + + const notebookResourceDir = path.join(note, 'resources') + + if (fs.pathExistsSync(notebookResourceDir)) { + // copy every file under resources to notebook resource dir + const files = fg.sync(path.join(notebookResourceDir, '**/*')) + for (const file of files) { + const fileName = path.basename(file) + const dest = path.join(notebookResourcePath, fileName) + fs.copySync(file, dest) } - } catch (e) { - console.error(e) - console.error(`Invalid file name ${fileName}`) } } + catch (e) { + console.error(e) + console.error(`Invalid file name ${fileName}`) + } } From bef74f10389b49dfe1a4191afc34dc9d3e9fe6ea Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 12:55:02 +0900 Subject: [PATCH 14/53] refactor: extract functions for resource copying into copyResources to enhance readability and maintainability --- src/quiver-to-obsidian-exporter.mts | 31 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 299910e..87f137e 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -41,21 +41,28 @@ function outputNoteAndCopyResources(notebookOutputPath: string, title: string, c try { fs.writeFileSync(fileName, content) - - const notebookResourceDir = path.join(note, 'resources') - - if (fs.pathExistsSync(notebookResourceDir)) { - // copy every file under resources to notebook resource dir - const files = fg.sync(path.join(notebookResourceDir, '**/*')) - for (const file of files) { - const fileName = path.basename(file) - const dest = path.join(notebookResourcePath, fileName) - fs.copySync(file, dest) - } - } + copyResources(note, notebookResourcePath) } catch (e) { console.error(e) console.error(`Invalid file name ${fileName}`) } } + +function copyResources(note: string, notebookResourcePath: string) { + + const notebookResourceDir = path.join(note, 'resources') + + if (fs.pathExistsSync(notebookResourceDir)) { + + // copy every file under resources to notebook resource dir + const files = fg.sync(path.join(notebookResourceDir, '**/*')) + + for (const file of files) { + const fileName = path.basename(file) + const dest = path.join(notebookResourcePath, fileName) + fs.copySync(file, dest) + } + } +} + From bf06cb860146db07b6efe97431999c8bb5556357 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 12:57:33 +0900 Subject: [PATCH 15/53] refactor: apply early returns to copyResources for improved readability and maintainability --- src/quiver-to-obsidian-exporter.mts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 87f137e..f0116ed 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -53,16 +53,17 @@ function copyResources(note: string, notebookResourcePath: string) { const notebookResourceDir = path.join(note, 'resources') - if (fs.pathExistsSync(notebookResourceDir)) { + if (!fs.pathExistsSync(notebookResourceDir)) { + return + } - // copy every file under resources to notebook resource dir - const files = fg.sync(path.join(notebookResourceDir, '**/*')) + // copy every file under resources to notebook resource dir + const files = fg.sync(path.join(notebookResourceDir, '**/*')) - for (const file of files) { - const fileName = path.basename(file) - const dest = path.join(notebookResourcePath, fileName) - fs.copySync(file, dest) - } + for (const file of files) { + const fileName = path.basename(file) + const dest = path.join(notebookResourcePath, fileName) + fs.copySync(file, dest) } } From a9b2596a40c93191914ba7c993fc4bb70edd5343 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 13:15:40 +0900 Subject: [PATCH 16/53] refactor: rename function parameters and local variables for clarity --- src/quiver-to-obsidian-exporter.mts | 33 +++++++++++++++-------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index f0116ed..2987609 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -18,40 +18,41 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string) { export function convertNotebook (notebook: string, outputPath: string) { + const notebookMeta = JSON.parse(fs.readFileSync(path.join(notebook, 'meta.json'), 'utf8')) const glob = path.join(notebook, '*.qvnote') - const notes = fg.sync(glob, { onlyDirectories: true }) + const quiverNotePaths = fg.sync(glob, { onlyDirectories: true }) - const notebookOutputPath = path.join(outputPath, notebookMeta.name) - const notebookResourcePath = path.join(notebookOutputPath, `./_resources`) + const obsidianNoteDirPath = path.join(outputPath, notebookMeta.name) + const obsidianAttachmentFolderPath = path.join(obsidianNoteDirPath, `./_resources`) - for (const note of notes) { - const { title, content } = transformQuiverNoteToObsidian(note) - outputNoteAndCopyResources(notebookOutputPath, title, content, note, notebookResourcePath) + for (const quiverNotePath of quiverNotePaths) { + const { title, content } = transformQuiverNoteToObsidian(quiverNotePath) + outputNoteAndCopyResources(obsidianNoteDirPath, title, content, quiverNotePath, obsidianAttachmentFolderPath) } } -function outputNoteAndCopyResources(notebookOutputPath: string, title: string, content: string, note: string, notebookResourcePath: string) { +function outputNoteAndCopyResources(obsidianNoteDirPath: string, title: string, content: string, quiverNotePath: string, obsidianAttachmentFolderPath: string) { - fs.ensureDirSync(notebookOutputPath) - fs.ensureDirSync(notebookResourcePath) + fs.ensureDirSync(obsidianNoteDirPath) + fs.ensureDirSync(obsidianAttachmentFolderPath) - const fileName = path.join(notebookOutputPath, `${title}.md`) + const destFilePath = path.join(obsidianNoteDirPath, `${title}.md`) try { - fs.writeFileSync(fileName, content) - copyResources(note, notebookResourcePath) + fs.writeFileSync(destFilePath, content) + copyResources(quiverNotePath, obsidianAttachmentFolderPath) } catch (e) { console.error(e) - console.error(`Invalid file name ${fileName}`) + console.error(`Invalid file name ${destFilePath}`) } } -function copyResources(note: string, notebookResourcePath: string) { +function copyResources(quiverNotePath: string, obsidianAttachmentFolderPath: string) { - const notebookResourceDir = path.join(note, 'resources') + const notebookResourceDir = path.join(quiverNotePath, 'resources') if (!fs.pathExistsSync(notebookResourceDir)) { return @@ -62,7 +63,7 @@ function copyResources(note: string, notebookResourcePath: string) { for (const file of files) { const fileName = path.basename(file) - const dest = path.join(notebookResourcePath, fileName) + const dest = path.join(obsidianAttachmentFolderPath, fileName) fs.copySync(file, dest) } } From 2e490705d2f567afd43a11f1fba169926a98f8fd Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 13:27:04 +0900 Subject: [PATCH 17/53] refactor: reorder parameters of outputNoteAndCopyResources function for logical grouping --- src/quiver-to-obsidian-exporter.mts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 2987609..c42557c 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -29,11 +29,11 @@ export function convertNotebook (notebook: string, outputPath: string) { for (const quiverNotePath of quiverNotePaths) { const { title, content } = transformQuiverNoteToObsidian(quiverNotePath) - outputNoteAndCopyResources(obsidianNoteDirPath, title, content, quiverNotePath, obsidianAttachmentFolderPath) + outputNoteAndCopyResources(quiverNotePath, obsidianNoteDirPath, title, content, obsidianAttachmentFolderPath) } } -function outputNoteAndCopyResources(obsidianNoteDirPath: string, title: string, content: string, quiverNotePath: string, obsidianAttachmentFolderPath: string) { +function outputNoteAndCopyResources(quiverNotePath: string, obsidianNoteDirPath: string, title: string, content: string, obsidianAttachmentFolderPath: string) { fs.ensureDirSync(obsidianNoteDirPath) fs.ensureDirSync(obsidianAttachmentFolderPath) From ac34628f56bc961cca0831e974dd7f978fbe89d5 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 13:33:11 +0900 Subject: [PATCH 18/53] refactor: rename function parameters and local variables for clarity --- src/quiver-to-obsidian-exporter.mts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index c42557c..8fda757 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -8,20 +8,20 @@ import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mj export function exportQvlibrary(qvlibrary: string, outputPath: string) { const glob = path.join(qvlibrary, '*.qvnotebook') - const noteBooks = fg.sync(glob, { onlyDirectories: true }) + const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) - for (const notebook of noteBooks) { - convertNotebook(notebook, outputPath) + for (const quiverNotebook of quiverNoteBooks) { + convertNotebook(quiverNotebook, outputPath) } } -export function convertNotebook (notebook: string, outputPath: string) { +export function convertNotebook(quiverNotebook: string, outputPath: string) { - const notebookMeta = JSON.parse(fs.readFileSync(path.join(notebook, 'meta.json'), 'utf8')) + const notebookMeta = JSON.parse(fs.readFileSync(path.join(quiverNotebook, 'meta.json'), 'utf8')) - const glob = path.join(notebook, '*.qvnote') + const glob = path.join(quiverNotebook, '*.qvnote') const quiverNotePaths = fg.sync(glob, { onlyDirectories: true }) const obsidianNoteDirPath = path.join(outputPath, notebookMeta.name) From 031da173d82bc49ac4192bff6fcd6a7527cfa8f7 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 14:44:33 +0900 Subject: [PATCH 19/53] fix: sanitize invalid characters in Quiver note titles for Obsidian compatibility --- src/quiver-to-obsidian-transform.mts | 3 ++- src/transform/title-sanitizer.mts | 39 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/transform/title-sanitizer.mts diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index 225aa48..e162414 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -4,6 +4,7 @@ import path from "path"; import TurndownService from "./transform/turndown-service.mjs"; import { formatTime } from './transform/formatter.mjs'; import { transformImageLinkOnMarkdown } from './transform/image-link-transform.mjs'; +import { sanitizeTitle } from './transform/title-sanitizer.mjs' export function transformQuiverNoteToObsidian(note: string): { title: string; content: string} { @@ -31,7 +32,7 @@ export function transformQuiverNoteToObsidian(note: string): { title: string; co }).join('\n\n') return { - title: meta.title, + title: sanitizeTitle(meta.title), content: `${tags}${cellsToMarkdown} Created At: ${formatTime(meta.created_at * 1000)} diff --git a/src/transform/title-sanitizer.mts b/src/transform/title-sanitizer.mts new file mode 100644 index 0000000..cd6ee22 --- /dev/null +++ b/src/transform/title-sanitizer.mts @@ -0,0 +1,39 @@ + + +/** + * Sanitizes input string for use as an Obsidian note title. + * + * Removes or replaces characters that are not allowed in Obsidian titles. + * The following characters are not allowed in Obsidian titles: + * `/`, `:`, `\`, `#`, `^`, `[`, `]`, `|` + * + * @param title The original title string to be sanitized. + * @returns The sanitized title string. + */ +export function sanitizeTitle(title: string): string { + + return [ + [/\//g, "/"], + [/:/g, ":"], + [/\\/g, "¥"], + [/#/g, "#"], + [/\^/g, "~"], + [/\[/g, "["], + [/]/g, "]"], + [/\|/g, "|"], + ].reduce((title: string, pair: [RegExp, string]): string => { + return title.replace(pair[0], pair[1]); + }, sanitizeTime(sanitizeDate(title))); +} + +function sanitizeDate(title: string): string { + + const regExp = /(\d{4})\/(\d{2})\/(\d{2})/g; + return title.replace(regExp, "$1-$2-$3"); +} + +function sanitizeTime(title: string): string { + + const regExp = /(\d{2}):(\d{2}):(\d{2})/g; + return title.replace(regExp, "$1:$2:$3"); +} From 7bb8f9fe234eb76c34be121e8910f5af9f201254 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 14:49:45 +0900 Subject: [PATCH 20/53] refactor: rename function parameters and local variables for clarity --- src/quiver-to-obsidian-transform.mts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index e162414..df2b726 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -7,14 +7,14 @@ import { transformImageLinkOnMarkdown } from './transform/image-link-transform.m import { sanitizeTitle } from './transform/title-sanitizer.mjs' -export function transformQuiverNoteToObsidian(note: string): { title: string; content: string} { +export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: string; content: string} { - const meta = JSON.parse(fs.readFileSync(path.join(note, 'meta.json'), 'utf8')) - const content = JSON.parse(fs.readFileSync(path.join(note, 'content.json'), 'utf8')) + const quiverMeta = JSON.parse(fs.readFileSync(path.join(quiverNotePath, 'meta.json'), 'utf8')) + const quiverContent = JSON.parse(fs.readFileSync(path.join(quiverNotePath, 'content.json'), 'utf8')) - const tags = meta.tags.length > 0 ? meta.tags.map(t => `#${t}`).join(' ') + '\n\n' : '' + const tags = quiverMeta.tags.length > 0 ? quiverMeta.tags.map(t => `#${t}`).join(' ') + '\n\n' : '' - const cellsToMarkdown = content.cells.map(cell => { + const cellsToMarkdown = quiverContent.cells.map(cell => { switch (cell.type) { case 'text': return TurndownService.turndown(cell.data) @@ -32,11 +32,11 @@ export function transformQuiverNoteToObsidian(note: string): { title: string; co }).join('\n\n') return { - title: sanitizeTitle(meta.title), + title: sanitizeTitle(quiverMeta.title), content: `${tags}${cellsToMarkdown} - Created At: ${formatTime(meta.created_at * 1000)} - Updated At: ${formatTime(meta.updated_at * 1000)} + Created At: ${formatTime(quiverMeta.created_at * 1000)} + Updated At: ${formatTime(quiverMeta.updated_at * 1000)} ` } } From 34ff38692624824b07c0f6aa07471bacdab29fc9 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 15:15:59 +0900 Subject: [PATCH 21/53] feat: output tags and timestamps as YAML front matter in Obsidian and refactor content generation into a separate function --- src/quiver-to-obsidian-transform.mts | 32 +++++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index df2b726..a715d8d 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -12,9 +12,7 @@ export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: const quiverMeta = JSON.parse(fs.readFileSync(path.join(quiverNotePath, 'meta.json'), 'utf8')) const quiverContent = JSON.parse(fs.readFileSync(path.join(quiverNotePath, 'content.json'), 'utf8')) - const tags = quiverMeta.tags.length > 0 ? quiverMeta.tags.map(t => `#${t}`).join(' ') + '\n\n' : '' - - const cellsToMarkdown = quiverContent.cells.map(cell => { + const transformedContent = quiverContent.cells.map(cell => { switch (cell.type) { case 'text': return TurndownService.turndown(cell.data) @@ -33,10 +31,28 @@ export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: return { title: sanitizeTitle(quiverMeta.title), - content: `${tags}${cellsToMarkdown} - - Created At: ${formatTime(quiverMeta.created_at * 1000)} - Updated At: ${formatTime(quiverMeta.updated_at * 1000)} - ` + content: makeObsidianContent(quiverMeta, transformedContent), } } + +function makeObsidianContent(quiverMeta: any, transformedContent: any): string { + + const tags = quiverMeta.tags.length > 0 ? quiverMeta.tags.map((tag: string) => ` - ${tag}`).join('\n') : ''; + + return `${makeYamlFrontMatter(tags, quiverMeta)} + +${transformedContent} +`; +} + +function makeYamlFrontMatter(tags: string, quiverMeta: any): string { + + return `--- +tags: +${tags} +origin: Quiver +created-at: ${formatTime(quiverMeta.created_at * 1000)} +updated-at: ${formatTime(quiverMeta.updated_at * 1000)} +--- +`; +} From a87cdd10e0ff0c296e04d9dc3b89bdf50a8928fc Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 15:34:50 +0900 Subject: [PATCH 22/53] refactor: rename formatTime -> formatTimestamp in formatter.mts for clarity --- src/quiver-to-obsidian-transform.mts | 6 +++--- src/transform/formatter.mts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index a715d8d..1fb0f47 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -2,7 +2,7 @@ import fs from "fs-extra"; import path from "path"; import TurndownService from "./transform/turndown-service.mjs"; -import { formatTime } from './transform/formatter.mjs'; +import { formatTimestamp } from './transform/formatter.mjs'; import { transformImageLinkOnMarkdown } from './transform/image-link-transform.mjs'; import { sanitizeTitle } from './transform/title-sanitizer.mjs' @@ -51,8 +51,8 @@ function makeYamlFrontMatter(tags: string, quiverMeta: any): string { tags: ${tags} origin: Quiver -created-at: ${formatTime(quiverMeta.created_at * 1000)} -updated-at: ${formatTime(quiverMeta.updated_at * 1000)} +created-at: ${formatTimestamp(quiverMeta.created_at * 1000)} +updated-at: ${formatTimestamp(quiverMeta.updated_at * 1000)} --- `; } diff --git a/src/transform/formatter.mts b/src/transform/formatter.mts index fc0ca62..2849ba4 100644 --- a/src/transform/formatter.mts +++ b/src/transform/formatter.mts @@ -1,7 +1,7 @@ import dayjs from "dayjs"; -export const formatTime = (timestamp: number) => { +export const formatTimestamp = (timestamp: number) => { return dayjs(timestamp) .format('YYYY-MM-DD(ddd) HH:mm:ss') From f19fd69191b75e6dd77436d8c2956120c644d15a Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 15:48:46 +0900 Subject: [PATCH 23/53] feat: add assertion for Quiver qvlibrary path to check if it exists as a directory --- src/assertions.mts | 15 +++++++++++++++ src/index.mts | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/assertions.mts diff --git a/src/assertions.mts b/src/assertions.mts new file mode 100644 index 0000000..12d94b1 --- /dev/null +++ b/src/assertions.mts @@ -0,0 +1,15 @@ +import fs from "fs-extra"; + + +export function assertValidQvlibraryPath(qvlibraryPath: string) { + + if (!fs.existsSync(qvlibraryPath)) { + console.log(`The specified qvlibraryPath does not exist. [qvlibraryPath=${qvlibraryPath}]`); + process.exit(2); + } + + if (!fs.statSync(qvlibraryPath).isDirectory()) { + console.log(`The specified qvlibraryPath is not a directory. [qvlibraryPath=${qvlibraryPath}]`); + process.exit(2); + } +} diff --git a/src/index.mts b/src/index.mts index 42ec3b0..059b028 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,6 +1,7 @@ #!/usr/bin/env node import meow from 'meow'; +import { assertValidQvlibraryPath } from './assertions.mjs'; import { exportQvlibrary } from './quiver-to-obsidian-exporter.mjs'; @@ -33,4 +34,9 @@ if (!cli.flags.output) { process.exit(1); } -exportQvlibrary(cli.input[0], cli.flags.output); +const qvlibraryPath = cli.input[0] +assertValidQvlibraryPath(qvlibraryPath); + +const outputPath = cli.flags.output + +exportQvlibrary(qvlibraryPath, outputPath); From 82fab92d3cf3fbcdb409419f852ceb87b2204483 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 17:44:37 +0900 Subject: [PATCH 24/53] refactor: rename path import to pathModule to avoid confusion with path variables (preparing to use 'path' as a variable name) --- src/quiver-to-obsidian-exporter.mts | 22 +++++++++++----------- src/quiver-to-obsidian-transform.mts | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 8fda757..4c68602 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -1,13 +1,13 @@ import fg from 'fast-glob' import fs from 'fs-extra' -import path from 'path' +import pathModule from 'path' import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' export function exportQvlibrary(qvlibrary: string, outputPath: string) { - const glob = path.join(qvlibrary, '*.qvnotebook') + const glob = pathModule.join(qvlibrary, '*.qvnotebook') const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) @@ -19,13 +19,13 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string) { export function convertNotebook(quiverNotebook: string, outputPath: string) { - const notebookMeta = JSON.parse(fs.readFileSync(path.join(quiverNotebook, 'meta.json'), 'utf8')) + const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(quiverNotebook, 'meta.json'), 'utf8')) - const glob = path.join(quiverNotebook, '*.qvnote') + const glob = pathModule.join(quiverNotebook, '*.qvnote') const quiverNotePaths = fg.sync(glob, { onlyDirectories: true }) - const obsidianNoteDirPath = path.join(outputPath, notebookMeta.name) - const obsidianAttachmentFolderPath = path.join(obsidianNoteDirPath, `./_resources`) + const obsidianNoteDirPath = pathModule.join(outputPath, notebookMeta.name) + const obsidianAttachmentFolderPath = pathModule.join(obsidianNoteDirPath, `./_resources`) for (const quiverNotePath of quiverNotePaths) { const { title, content } = transformQuiverNoteToObsidian(quiverNotePath) @@ -38,7 +38,7 @@ function outputNoteAndCopyResources(quiverNotePath: string, obsidianNoteDirPath: fs.ensureDirSync(obsidianNoteDirPath) fs.ensureDirSync(obsidianAttachmentFolderPath) - const destFilePath = path.join(obsidianNoteDirPath, `${title}.md`) + const destFilePath = pathModule.join(obsidianNoteDirPath, `${title}.md`) try { fs.writeFileSync(destFilePath, content) @@ -52,18 +52,18 @@ function outputNoteAndCopyResources(quiverNotePath: string, obsidianNoteDirPath: function copyResources(quiverNotePath: string, obsidianAttachmentFolderPath: string) { - const notebookResourceDir = path.join(quiverNotePath, 'resources') + const notebookResourceDir = pathModule.join(quiverNotePath, 'resources') if (!fs.pathExistsSync(notebookResourceDir)) { return } // copy every file under resources to notebook resource dir - const files = fg.sync(path.join(notebookResourceDir, '**/*')) + const files = fg.sync(pathModule.join(notebookResourceDir, '**/*')) for (const file of files) { - const fileName = path.basename(file) - const dest = path.join(obsidianAttachmentFolderPath, fileName) + const fileName = pathModule.basename(file) + const dest = pathModule.join(obsidianAttachmentFolderPath, fileName) fs.copySync(file, dest) } } diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index 1fb0f47..07f0e9f 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -1,5 +1,5 @@ import fs from "fs-extra"; -import path from "path"; +import pathModule from "path"; import TurndownService from "./transform/turndown-service.mjs"; import { formatTimestamp } from './transform/formatter.mjs'; @@ -9,8 +9,8 @@ import { sanitizeTitle } from './transform/title-sanitizer.mjs' export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: string; content: string} { - const quiverMeta = JSON.parse(fs.readFileSync(path.join(quiverNotePath, 'meta.json'), 'utf8')) - const quiverContent = JSON.parse(fs.readFileSync(path.join(quiverNotePath, 'content.json'), 'utf8')) + const quiverMeta = JSON.parse(fs.readFileSync(pathModule.join(quiverNotePath, 'meta.json'), 'utf8')) + const quiverContent = JSON.parse(fs.readFileSync(pathModule.join(quiverNotePath, 'content.json'), 'utf8')) const transformedContent = quiverContent.cells.map(cell => { switch (cell.type) { From f36709c2b6e9cf66c7d75a67046d2328955ae194 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 18:40:40 +0900 Subject: [PATCH 25/53] feat: add path manipulation extension methods to String class --- src/extensions/String+Path.mts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/extensions/String+Path.mts diff --git a/src/extensions/String+Path.mts b/src/extensions/String+Path.mts new file mode 100644 index 0000000..743c403 --- /dev/null +++ b/src/extensions/String+Path.mts @@ -0,0 +1,18 @@ + + +declare global { + interface String { + lastPathComponent(): string; + } +} + + +if (!String.prototype.lastPathComponent) { + String.prototype.lastPathComponent = function () { + + const pathComponents = this.split('/'); + return pathComponents[pathComponents.length - 1]; + }; +} + +export {}; From a1b36aa3eb4e93be31822637a14ac6dc9ff00f10 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 18:45:19 +0900 Subject: [PATCH 26/53] feat: implement a logging module for centralized application logging --- src/logger.mts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/logger.mts diff --git a/src/logger.mts b/src/logger.mts new file mode 100644 index 0000000..03f7954 --- /dev/null +++ b/src/logger.mts @@ -0,0 +1,25 @@ + + +export type LogConfig = { + isVerbose: boolean; +}; + + +export const createLogger = (config: LogConfig) => { + return { + + debugNotebookPathsByUUID: (notebookPathsByUUID: Map) => { + if (!config.isVerbose) return; + debugNotebookPathsByUUID(notebookPathsByUUID); + }, + }; +}; + + +const debugNotebookPathsByUUID = (notebookPathsByUUID: Map) => { + + console.log(`==== contents of notebookPathsByUUID ====`); + notebookPathsByUUID.forEach((value, key) => { + console.log(`Key: ${key}, Value: ${value}`); + }); +} From 583fc01650a11d4767aaa29094dc07af83cabd2d Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 18:53:01 +0900 Subject: [PATCH 27/53] feat: implement logging to investigate file states in qvlibrary with initial fixed settings --- src/index.mts | 2 +- src/quiver-to-obsidian-exporter.mts | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/index.mts b/src/index.mts index 059b028..898c7b7 100644 --- a/src/index.mts +++ b/src/index.mts @@ -39,4 +39,4 @@ assertValidQvlibraryPath(qvlibraryPath); const outputPath = cli.flags.output -exportQvlibrary(qvlibraryPath, outputPath); +exportQvlibrary(qvlibraryPath, outputPath, { isVerbose: true }); diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 4c68602..b30b1bd 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -2,14 +2,25 @@ import fg from 'fast-glob' import fs from 'fs-extra' import pathModule from 'path' +import './extensions/String+Path.mjs'; import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' +import { LogConfig, createLogger } from './logger.mjs' -export function exportQvlibrary(qvlibrary: string, outputPath: string) { +export function exportQvlibrary(qvlibrary: string, outputPath: string, logConfig: LogConfig) { + + const logger = createLogger(logConfig); const glob = pathModule.join(qvlibrary, '*.qvnotebook') const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) + const notebookPathsByUUID = quiverNoteBooks.reduce((acc: Map, path: string): Map => { + const fileName = path.lastPathComponent(); + const uuid = fileName.split('.')[0]; + return acc.set(uuid, path); + }, new Map()); + + logger.debugNotebookPathsByUUID(notebookPathsByUUID) for (const quiverNotebook of quiverNoteBooks) { convertNotebook(quiverNotebook, outputPath) From 48aad62b59da6bcce98d49d0854859ab3b65b66d Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 20:50:35 +0900 Subject: [PATCH 28/53] feat(logger): add function to log command execution details and debug information --- src/logger.mts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/logger.mts b/src/logger.mts index 03f7954..a6e7172 100644 --- a/src/logger.mts +++ b/src/logger.mts @@ -8,10 +8,22 @@ export type LogConfig = { export const createLogger = (config: LogConfig) => { return { + info: (message: string) => console.log(message), + + debug: (message: string) => { + if (!config.isVerbose) return; + console.log(message) + }, + debugNotebookPathsByUUID: (notebookPathsByUUID: Map) => { if (!config.isVerbose) return; debugNotebookPathsByUUID(notebookPathsByUUID); }, + + completed: () => { + console.log('') + console.log("🎉 the export of the Quiver library to the Obsidian Vault has been completed successfully.") + }, }; }; From e5a4aa7243c6220953d94d72fcc55de24b7afc54 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 21:03:43 +0900 Subject: [PATCH 29/53] feat: preserve tree structure when exporting Quiver library to Obsidian Vault --- src/quiver-to-obsidian-exporter.mts | 59 ++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index b30b1bd..9d3e84c 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -7,13 +7,22 @@ import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mj import { LogConfig, createLogger } from './logger.mjs' +const Keys = { + children: 'children', +} as const; + + +let logger; + + export function exportQvlibrary(qvlibrary: string, outputPath: string, logConfig: LogConfig) { - const logger = createLogger(logConfig); + logger = createLogger(logConfig); const glob = pathModule.join(qvlibrary, '*.qvnotebook') const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) + logger.info('==> retrieving the qvnotebooks info under the qvlibrary.'); const notebookPathsByUUID = quiverNoteBooks.reduce((acc: Map, path: string): Map => { const fileName = path.lastPathComponent(); const uuid = fileName.split('.')[0]; @@ -22,20 +31,58 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string, logConfig logger.debugNotebookPathsByUUID(notebookPathsByUUID) - for (const quiverNotebook of quiverNoteBooks) { - convertNotebook(quiverNotebook, outputPath) - } + logger.info(`==> processing the default fixed notebooks 'Inbox' and 'Trash' in Quiver.`); + ['Inbox', 'Trash'].forEach((fixedName: string) => { + const notebookPath = notebookPathsByUUID.get(fixedName); + convertNotebook(notebookPath, outputPath, [fixedName]); + }); + + logger.info('==> retrieving the root meta.json, which stores the tree structure.'); + const treeMetaPath = pathModule.join(qvlibrary, 'meta.json'); + const treeMetaText = fs.readFileSync(treeMetaPath, 'utf8').toString(); + const treeMeta = JSON.parse(treeMetaText); + + logger.info('==> traverse the folder tree structure to convert Quiver notebooks into Obsidian .md files.'); + const rootChildren = treeMeta[Keys.children]; + traverseFolderTree(rootChildren, 0, [], outputPath, notebookPathsByUUID); + + logger.info('==> Traversal of the folder tree structure has been completed.'); + logger.completed() } +function traverseFolderTree(children: [], depth: number, pathStack: string[], outputPath: string, notebooksByUUID: Map) { + + logger.debug(" ".repeat(depth * 4) + 'traverseFolderTree called...'); + if (children === undefined) { return; } + + children.forEach((node) => { + + const uuid = node['uuid']; + logger.info(" ".repeat(depth * 4) + uuid); + + const notebookPath = notebooksByUUID.get(uuid); + if (notebookPath === undefined) { + return; + } + + logger.debug('==> retrieving the qvnotebook meta.json.'); + const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(notebookPath, 'meta.json'), 'utf8')); + + pathStack.push(notebookMeta.name); + convertNotebook(notebookPath, outputPath, pathStack); + traverseFolderTree(node[Keys.children], depth + 1, pathStack, outputPath, notebooksByUUID); + pathStack.pop(); + }) +} -export function convertNotebook(quiverNotebook: string, outputPath: string) { +export function convertNotebook(quiverNotebook: string, outputPath: string, pathStack: string[]) { const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(quiverNotebook, 'meta.json'), 'utf8')) const glob = pathModule.join(quiverNotebook, '*.qvnote') const quiverNotePaths = fg.sync(glob, { onlyDirectories: true }) - const obsidianNoteDirPath = pathModule.join(outputPath, notebookMeta.name) + const obsidianNoteDirPath = pathModule.join(outputPath, ...pathStack) const obsidianAttachmentFolderPath = pathModule.join(obsidianNoteDirPath, `./_resources`) for (const quiverNotePath of quiverNotePaths) { From 1dff578bfbce493cc6dca40fe1283263c8bbe649 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Mon, 15 Apr 2024 21:34:18 +0900 Subject: [PATCH 30/53] clean: remove code no longer needed due to previous implementation --- src/quiver-to-obsidian-exporter.mts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 9d3e84c..382bada 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -77,8 +77,6 @@ function traverseFolderTree(children: [], depth: number, pathStack: string[], ou export function convertNotebook(quiverNotebook: string, outputPath: string, pathStack: string[]) { - const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(quiverNotebook, 'meta.json'), 'utf8')) - const glob = pathModule.join(quiverNotebook, '*.qvnote') const quiverNotePaths = fg.sync(glob, { onlyDirectories: true }) From bcc2ee40c884329d2853893307305d84b9e8c2b0 Mon Sep 17 00:00:00 2001 From: Yukai Huang Date: Tue, 16 Apr 2024 11:02:52 +0800 Subject: [PATCH 31/53] chore: update package.json license to MIT --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a7b664..60d40eb 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "devDependencies": { "@types/node": "^17.0.32", "@types/turndown": "^5.0.1", From 47d495004f54a8e39e257285545237874947d482 Mon Sep 17 00:00:00 2001 From: Yukai Huang Date: Tue, 16 Apr 2024 11:03:06 +0800 Subject: [PATCH 32/53] 1.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60d40eb..382c47b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "quiver-markdown-exporter", - "version": "1.0.1", + "version": "1.0.2", "description": "Export Quiver library to Obsidian markdown files", "main": "dist/index.mjs", "files": [ From 6dbd7d64188071f07fa29b3db32a9d4ceb13d77b Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 00:57:08 +0900 Subject: [PATCH 33/53] refine(logger): update logger to fetch settings from environment variables with additional enhancements and fixes --- src/index.mts | 2 +- src/logger.mts | 41 +++++++++++++++++++----- src/quiver-to-obsidian-exporter.mts | 11 +++---- src/util/environment-variable-parser.mts | 9 ++++++ 4 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 src/util/environment-variable-parser.mts diff --git a/src/index.mts b/src/index.mts index 898c7b7..059b028 100644 --- a/src/index.mts +++ b/src/index.mts @@ -39,4 +39,4 @@ assertValidQvlibraryPath(qvlibraryPath); const outputPath = cli.flags.output -exportQvlibrary(qvlibraryPath, outputPath, { isVerbose: true }); +exportQvlibrary(qvlibraryPath, outputPath); diff --git a/src/logger.mts b/src/logger.mts index a6e7172..8335572 100644 --- a/src/logger.mts +++ b/src/logger.mts @@ -1,18 +1,35 @@ +import { parseBoolean } from './util/environment-variable-parser.mjs' -export type LogConfig = { +const isVerbose = parseBoolean(process.env.QUIVER_TO_OBSIDIAN_EXPORTER_LOGGING_VERBOSE); + + +type LogConfig = { isVerbose: boolean; + toString(): string; +}; + +const logConfig: LogConfig = { + isVerbose: isVerbose, + toString: function() { + return `LogConfig: { isVerbose: ${this.isVerbose} }`; + } }; -export const createLogger = (config: LogConfig) => { +const createLogger = (config: LogConfig) => { + + console.log(`LogConfig=${config.toString()}`) + return { - info: (message: string) => console.log(message), + error: (message: string) => console.error(message), + + info: (message: string) => console.info(message), debug: (message: string) => { if (!config.isVerbose) return; - console.log(message) + console.debug(message) }, debugNotebookPathsByUUID: (notebookPathsByUUID: Map) => { @@ -21,8 +38,8 @@ export const createLogger = (config: LogConfig) => { }, completed: () => { - console.log('') - console.log("🎉 the export of the Quiver library to the Obsidian Vault has been completed successfully.") + console.info('') + console.info("🎉 the export of the Quiver library to the Obsidian Vault has been completed successfully.") }, }; }; @@ -30,8 +47,16 @@ export const createLogger = (config: LogConfig) => { const debugNotebookPathsByUUID = (notebookPathsByUUID: Map) => { - console.log(`==== contents of notebookPathsByUUID ====`); + console.debug(`==== contents of notebookPathsByUUID ====`); notebookPathsByUUID.forEach((value, key) => { - console.log(`Key: ${key}, Value: ${value}`); + console.debug(`Key: ${key}, Value: ${value}`); }); } + + +let loggerInstance = createLogger(logConfig); + +export const getLogger = () => { + return loggerInstance; +}; + diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 382bada..f9105ae 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -2,22 +2,19 @@ import fg from 'fast-glob' import fs from 'fs-extra' import pathModule from 'path' +import { getLogger } from './logger.mjs'; import './extensions/String+Path.mjs'; import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' -import { LogConfig, createLogger } from './logger.mjs' +const logger = getLogger(); + const Keys = { children: 'children', } as const; -let logger; - - -export function exportQvlibrary(qvlibrary: string, outputPath: string, logConfig: LogConfig) { - - logger = createLogger(logConfig); +export function exportQvlibrary(qvlibrary: string, outputPath: string) { const glob = pathModule.join(qvlibrary, '*.qvnotebook') const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) diff --git a/src/util/environment-variable-parser.mts b/src/util/environment-variable-parser.mts new file mode 100644 index 0000000..b00a7a4 --- /dev/null +++ b/src/util/environment-variable-parser.mts @@ -0,0 +1,9 @@ + + +export function parseBoolean(envValue: string | undefined): boolean { + + if (!envValue) return false; + + const normalizedValue = envValue.toLowerCase(); + return normalizedValue === 'true' || normalizedValue === 'yes' || /^[1-9]\d*$/.test(normalizedValue); +} From 0a86b72328d3906d0097e76e740ce1b8059ddbad Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 01:04:19 +0900 Subject: [PATCH 34/53] chore: replace console.log with logger.error in assertions module --- src/assertions.mts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/assertions.mts b/src/assertions.mts index 12d94b1..7daabbc 100644 --- a/src/assertions.mts +++ b/src/assertions.mts @@ -1,15 +1,20 @@ import fs from "fs-extra"; +import { getLogger } from './logger.mjs'; + + +const logger = getLogger(); + export function assertValidQvlibraryPath(qvlibraryPath: string) { if (!fs.existsSync(qvlibraryPath)) { - console.log(`The specified qvlibraryPath does not exist. [qvlibraryPath=${qvlibraryPath}]`); + logger.error(`The specified qvlibraryPath does not exist. [qvlibraryPath=${qvlibraryPath}]`); process.exit(2); } if (!fs.statSync(qvlibraryPath).isDirectory()) { - console.log(`The specified qvlibraryPath is not a directory. [qvlibraryPath=${qvlibraryPath}]`); + logger.error(`The specified qvlibraryPath is not a directory. [qvlibraryPath=${qvlibraryPath}]`); process.exit(2); } } From b342ad5951720724164fa46b51ade6d34349257f Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 01:29:33 +0900 Subject: [PATCH 35/53] feat: apply Quiver notebook creation and modification timestamps to Obsidian .md files --- package.json | 3 +- .../file-timestamp-cloner.mts | 28 ++ src/quiver-to-obsidian-exporter.mts | 9 +- src/quiver-to-obsidian-transform.mts | 3 +- yarn.lock | 393 ++++++++++++++++++ 5 files changed, 431 insertions(+), 5 deletions(-) create mode 100644 src/migration-support/file-timestamp-cloner.mts diff --git a/package.json b/package.json index 06d2547..7ca53b2 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "meow": "^13.2.0", - "turndown": "^7.1.3" + "turndown": "^7.1.3", + "utimes": "^5.2.1" } } diff --git a/src/migration-support/file-timestamp-cloner.mts b/src/migration-support/file-timestamp-cloner.mts new file mode 100644 index 0000000..9d8e769 --- /dev/null +++ b/src/migration-support/file-timestamp-cloner.mts @@ -0,0 +1,28 @@ +import { utimes } from 'utimes'; + +import { getLogger } from '../logger.mjs'; + + +const logger = getLogger(); + + +export function cloneTimestamp(fileName: string, quiverMeta: any) { + + try { + utimes(fileName, { + btime: Number(quiverMeta.created_at * 1000), + mtime: Number(quiverMeta.updated_at * 1000), + atime: Number(quiverMeta.updated_at * 1000), + }, function (err) { + if (err) { + logger.error(`Error occurred while updating the file timestamp. [err=${err}, file=${fileName}]`); + } else { + logger.debug(`The timestamp of the file has been updated successfully.`); + // logger.debug(`The timestamp of the file [${fileName}] has been updated successfully.`); + } + }); + } + catch (error) { + logger.error(error); + } +} diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index f9105ae..f77f292 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -5,6 +5,7 @@ import pathModule from 'path' import { getLogger } from './logger.mjs'; import './extensions/String+Path.mjs'; import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' +import { cloneTimestamp } from './migration-support/file-timestamp-cloner.mjs'; const logger = getLogger(); @@ -81,12 +82,12 @@ export function convertNotebook(quiverNotebook: string, outputPath: string, path const obsidianAttachmentFolderPath = pathModule.join(obsidianNoteDirPath, `./_resources`) for (const quiverNotePath of quiverNotePaths) { - const { title, content } = transformQuiverNoteToObsidian(quiverNotePath) - outputNoteAndCopyResources(quiverNotePath, obsidianNoteDirPath, title, content, obsidianAttachmentFolderPath) + const { title, content, quiverMeta } = transformQuiverNoteToObsidian(quiverNotePath) + outputNoteAndCopyResources(quiverNotePath, quiverMeta, obsidianNoteDirPath, title, content, obsidianAttachmentFolderPath) } } -function outputNoteAndCopyResources(quiverNotePath: string, obsidianNoteDirPath: string, title: string, content: string, obsidianAttachmentFolderPath: string) { +function outputNoteAndCopyResources(quiverNotePath: string, quiverMeta: any, obsidianNoteDirPath: string, title: string, content: string, obsidianAttachmentFolderPath: string) { fs.ensureDirSync(obsidianNoteDirPath) fs.ensureDirSync(obsidianAttachmentFolderPath) @@ -101,6 +102,8 @@ function outputNoteAndCopyResources(quiverNotePath: string, obsidianNoteDirPath: console.error(e) console.error(`Invalid file name ${destFilePath}`) } + + cloneTimestamp(destFilePath, quiverMeta); } function copyResources(quiverNotePath: string, obsidianAttachmentFolderPath: string) { diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index 07f0e9f..60f1c10 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -7,7 +7,7 @@ import { transformImageLinkOnMarkdown } from './transform/image-link-transform.m import { sanitizeTitle } from './transform/title-sanitizer.mjs' -export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: string; content: string} { +export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: string; content: string; quiverMeta: any; } { const quiverMeta = JSON.parse(fs.readFileSync(pathModule.join(quiverNotePath, 'meta.json'), 'utf8')) const quiverContent = JSON.parse(fs.readFileSync(pathModule.join(quiverNotePath, 'content.json'), 'utf8')) @@ -32,6 +32,7 @@ export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: return { title: sanitizeTitle(quiverMeta.title), content: makeObsidianContent(quiverMeta, transformedContent), + quiverMeta: quiverMeta, } } diff --git a/yarn.lock b/yarn.lock index c35e427..8307889 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,6 +27,21 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@mapbox/node-pre-gyp@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -80,6 +95,11 @@ resolved "https://registry.yarnpkg.com/@types/turndown/-/turndown-5.0.4.tgz#61fcdda2e539a86b1d40cb3277505f22ca76f014" integrity sha512-28GI33lCCkU4SGH1GvjDhFgOVr+Tym4PXGBIU1buJUa6xQolniPArtUT+kv42RR2N9MsMLInkr904Aq+ESHBJg== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" @@ -90,11 +110,49 @@ acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -102,6 +160,26 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -112,6 +190,23 @@ dayjs@^1.11.10: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== +debug@4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -122,6 +217,11 @@ domino@^2.1.6: resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -156,6 +256,33 @@ fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -163,16 +290,59 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -194,6 +364,20 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -217,6 +401,89 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +node-addon-api@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -227,11 +494,27 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -239,6 +522,68 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -246,6 +591,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -287,11 +637,54 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utimes@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/utimes/-/utimes-5.2.1.tgz#e87679f9d6406313431830de9fbcac74ac067170" + integrity sha512-6S5mCapmzcxetOD/2UEjL0GF5e4+gB07Dh8qs63xylw5ay4XuyW6iQs70FOJo/puf10LCkvhp4jYMQSDUBYEFg== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.11" + node-addon-api "^4.3.0" + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 9c0b04e2ea47362ed9212b411b975204ba32dd66 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 16:14:26 +0900 Subject: [PATCH 36/53] feat: add support for all four Obsidian attachment folder policies --- src/index.mts | 76 ++++++++++++++++--- .../attachment-folder-treatment.mts | 54 +++++++++++++ src/quiver-to-obsidian-exporter.mts | 17 +++-- 3 files changed, 129 insertions(+), 18 deletions(-) create mode 100644 src/migration-support/attachment-folder-treatment.mts diff --git a/src/index.mts b/src/index.mts index 059b028..9038fb9 100644 --- a/src/index.mts +++ b/src/index.mts @@ -1,19 +1,29 @@ #!/usr/bin/env node import meow from 'meow'; +import { getLogger } from './logger.mjs'; import { assertValidQvlibraryPath } from './assertions.mjs'; import { exportQvlibrary } from './quiver-to-obsidian-exporter.mjs'; +import { AttachmentFolderPolicy, createAttachmentFolderPolicyWithSubfolder, createAttachmentFolderPolicyWithoutSubfolder } from './migration-support/attachment-folder-treatment.mjs'; -const cli = meow(` - Usage - $ quiver-markdown -o +const logger = getLogger(); + - Options - --output, -o Output folder +const cli = meow(` + Usage + $ quiver-markdown -o -a + or + $ quiver-markdown -o -a -n - Examples - $ quiver-markdown MyLibrary.qvlibrary -o dist + Options + --output, -o: Output folder + --attachmentFolderPolicy, -a: Attachment folder policy (vaultFolder, subfolderUnderVault, sameFolderAsEachFile, subfolderUnderEachFolder). 'subfolderUnderVault' and 'subfolderUnderEachFolder' require subfolder name. + --attachmentSubfolderName, -n: Specify the subfolder name if 'subfolderUnderVault' or 'subfolderUnderEachFolder' is selected as the attachmentFolderPolicy option. + + Examples + $ quiver-markdown MyLibrary.qvlibrary -o dist -a vaultFolder + $ quiver-markdown MyLibrary.qvlibrary -o dist -a subfolderUnderVault -n _quiver-resources `, { importMeta: import.meta, flags: { @@ -21,22 +31,68 @@ const cli = meow(` type: 'string', shortFlag: 'o', }, + attachmentFolderPolicy: { + type: 'string', + choices: ['vaultFolder', 'subfolderUnderVault', 'sameFolderAsEachFile', 'subfolderUnderEachFolder'], + shortFlag: 'a', + isRequired: true, + }, + attachmentSubfolderName: { + type: 'string', + shortFlag: 'n', + isRequired: (flags, input) => { + return (flags.attachmentFolderPolicy as string)?.startsWith('subfolder'); + }, + }, }, }); if (cli.input.length < 1) { - console.error('Please provide a qvlibrary file'); + logger.error('Please provide a qvlibrary file'); process.exit(1); } if (!cli.flags.output) { - console.error('Please provide an output folder'); + logger.error('Please provide an output folder'); process.exit(1); } +if (cli.flags.attachmentFolderPolicy.startsWith('subfolder')) { + if (!cli.flags.attachmentSubfolderName) { + logger.error(`Please provide an Attachment subfolder name with -n option (Because you specified '${cli.flags.attachmentFolderPolicy}' with -i)`); + cli.showHelp(); + } +} +else { + if (cli.flags.attachmentSubfolderName) { + logger.error(`It is not necessary to specify Attachment subfolder name (Because you specified '${cli.flags.attachmentFolderPolicy}' with -i) (or is it a mistake in specifying attachmentFolderPolicy?)`); + cli.showHelp(); + } +} + + + const qvlibraryPath = cli.input[0] assertValidQvlibraryPath(qvlibraryPath); const outputPath = cli.flags.output -exportQvlibrary(qvlibraryPath, outputPath); +const attachmentFolderPolicy = createAttachmentFolderPolicy(cli.flags.attachmentFolderPolicy, cli.flags.attachmentSubfolderName) +logger.info(`AttachmentFolderPolicy: { attachmentFolderPolicy=${cli.flags.attachmentFolderPolicy}, attachmentSubfolderName=${cli.flags.attachmentSubfolderName} }`); + +exportQvlibrary(qvlibraryPath, outputPath, attachmentFolderPolicy); + + +function createAttachmentFolderPolicy(policyType: string, subfolderName: string): AttachmentFolderPolicy { + + switch (policyType) { + case 'vaultFolder': + case 'sameFolderAsEachFile': + return createAttachmentFolderPolicyWithoutSubfolder(policyType); + case 'subfolderUnderVault': + case 'subfolderUnderEachFolder': + return createAttachmentFolderPolicyWithSubfolder(policyType, subfolderName); + default: + throw new Error(`Unknown policy type: ${policyType}`); + } +} diff --git a/src/migration-support/attachment-folder-treatment.mts b/src/migration-support/attachment-folder-treatment.mts new file mode 100644 index 0000000..eb2b316 --- /dev/null +++ b/src/migration-support/attachment-folder-treatment.mts @@ -0,0 +1,54 @@ +import pathlib from 'path' + + +const AttachmentFolderPolicyTypes = { + vaultFolder: "vaultFolder", + subfolderUnderVault: "subfolderUnderVault", + sameFolderAsEachFile: "sameFolderAsEachFile", + subfolderUnderEachFolder: "subfolderUnderEachFolder", +} as const; + +export type AttachmentFolderPolicy = + | { type: typeof AttachmentFolderPolicyTypes.vaultFolder } + | { + type: typeof AttachmentFolderPolicyTypes.subfolderUnderVault; + subfolderName: string; + } + | { type: typeof AttachmentFolderPolicyTypes.sameFolderAsEachFile } + | { + type: typeof AttachmentFolderPolicyTypes.subfolderUnderEachFolder; + subfolderName: string; + }; + + +export function createAttachmentFolderPolicyWithSubfolder( + type: + | typeof AttachmentFolderPolicyTypes.subfolderUnderVault + | typeof AttachmentFolderPolicyTypes.subfolderUnderEachFolder, + subfolderName: string +): AttachmentFolderPolicy { + return { type, subfolderName }; +} + +export function createAttachmentFolderPolicyWithoutSubfolder( + type: + | typeof AttachmentFolderPolicyTypes.vaultFolder + | typeof AttachmentFolderPolicyTypes.sameFolderAsEachFile +): AttachmentFolderPolicy { + return { type }; +} + + +export function calculateAttachmentFolderPath(rootPath: string, currentFolderPath: string, attachmentFolderPolicy: AttachmentFolderPolicy): string { + + switch (attachmentFolderPolicy.type) { + case AttachmentFolderPolicyTypes.vaultFolder: + return rootPath; + case AttachmentFolderPolicyTypes.subfolderUnderVault: + return pathlib.join(rootPath, attachmentFolderPolicy.subfolderName); + case AttachmentFolderPolicyTypes.sameFolderAsEachFile: + return currentFolderPath; + case AttachmentFolderPolicyTypes.subfolderUnderEachFolder: + return pathlib.join(currentFolderPath, attachmentFolderPolicy.subfolderName); + } +} diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index f77f292..edcb205 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -6,6 +6,7 @@ import { getLogger } from './logger.mjs'; import './extensions/String+Path.mjs'; import { transformQuiverNoteToObsidian } from './quiver-to-obsidian-transform.mjs' import { cloneTimestamp } from './migration-support/file-timestamp-cloner.mjs'; +import { AttachmentFolderPolicy, calculateAttachmentFolderPath } from './migration-support/attachment-folder-treatment.mjs' const logger = getLogger(); @@ -15,7 +16,7 @@ const Keys = { } as const; -export function exportQvlibrary(qvlibrary: string, outputPath: string) { +export function exportQvlibrary(qvlibrary: string, outputPath: string, attachmentFolderPolicy: AttachmentFolderPolicy) { const glob = pathModule.join(qvlibrary, '*.qvnotebook') const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) @@ -32,7 +33,7 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string) { logger.info(`==> processing the default fixed notebooks 'Inbox' and 'Trash' in Quiver.`); ['Inbox', 'Trash'].forEach((fixedName: string) => { const notebookPath = notebookPathsByUUID.get(fixedName); - convertNotebook(notebookPath, outputPath, [fixedName]); + convertNotebook(notebookPath, outputPath, [fixedName], attachmentFolderPolicy); }); logger.info('==> retrieving the root meta.json, which stores the tree structure.'); @@ -42,13 +43,13 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string) { logger.info('==> traverse the folder tree structure to convert Quiver notebooks into Obsidian .md files.'); const rootChildren = treeMeta[Keys.children]; - traverseFolderTree(rootChildren, 0, [], outputPath, notebookPathsByUUID); + traverseFolderTree(rootChildren, 0, [], outputPath, notebookPathsByUUID, attachmentFolderPolicy); logger.info('==> Traversal of the folder tree structure has been completed.'); logger.completed() } -function traverseFolderTree(children: [], depth: number, pathStack: string[], outputPath: string, notebooksByUUID: Map) { +function traverseFolderTree(children: [], depth: number, pathStack: string[], outputPath: string, notebooksByUUID: Map, attachmentFolderPolicy: AttachmentFolderPolicy) { logger.debug(" ".repeat(depth * 4) + 'traverseFolderTree called...'); if (children === undefined) { return; } @@ -67,19 +68,19 @@ function traverseFolderTree(children: [], depth: number, pathStack: string[], ou const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(notebookPath, 'meta.json'), 'utf8')); pathStack.push(notebookMeta.name); - convertNotebook(notebookPath, outputPath, pathStack); - traverseFolderTree(node[Keys.children], depth + 1, pathStack, outputPath, notebooksByUUID); + convertNotebook(notebookPath, outputPath, pathStack, attachmentFolderPolicy); + traverseFolderTree(node[Keys.children], depth + 1, pathStack, outputPath, notebooksByUUID, attachmentFolderPolicy); pathStack.pop(); }) } -export function convertNotebook(quiverNotebook: string, outputPath: string, pathStack: string[]) { +export function convertNotebook(quiverNotebook: string, outputPath: string, pathStack: string[], attachmentFolderPolicy: AttachmentFolderPolicy) { const glob = pathModule.join(quiverNotebook, '*.qvnote') const quiverNotePaths = fg.sync(glob, { onlyDirectories: true }) const obsidianNoteDirPath = pathModule.join(outputPath, ...pathStack) - const obsidianAttachmentFolderPath = pathModule.join(obsidianNoteDirPath, `./_resources`) + const obsidianAttachmentFolderPath = calculateAttachmentFolderPath(outputPath, obsidianNoteDirPath, attachmentFolderPolicy) for (const quiverNotePath of quiverNotePaths) { const { title, content, quiverMeta } = transformQuiverNoteToObsidian(quiverNotePath) From 1a2737b4b7c773aaf37ded831dfe60de081ed780 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 16:24:58 +0900 Subject: [PATCH 37/53] refactor: group excessive parameters into structured objects in outputNoteAndCopyResources function to improve clarity --- src/quiver-to-obsidian-exporter.mts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index edcb205..399ece8 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -84,11 +84,14 @@ export function convertNotebook(quiverNotebook: string, outputPath: string, path for (const quiverNotePath of quiverNotePaths) { const { title, content, quiverMeta } = transformQuiverNoteToObsidian(quiverNotePath) - outputNoteAndCopyResources(quiverNotePath, quiverMeta, obsidianNoteDirPath, title, content, obsidianAttachmentFolderPath) + outputNoteAndCopyResources({ quiverNotePath, quiverMeta }, { obsidianNoteDirPath, title, content, obsidianAttachmentFolderPath }) } } -function outputNoteAndCopyResources(quiverNotePath: string, quiverMeta: any, obsidianNoteDirPath: string, title: string, content: string, obsidianAttachmentFolderPath: string) { +function outputNoteAndCopyResources(srcInfo: any, destInfo: any) { + + const { quiverNotePath, quiverMeta } = srcInfo + const { obsidianNoteDirPath, title, content, obsidianAttachmentFolderPath } = destInfo fs.ensureDirSync(obsidianNoteDirPath) fs.ensureDirSync(obsidianAttachmentFolderPath) From 20b5fa00e647e73bd680f657e8bcb6dfff069fc9 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 17:32:16 +0900 Subject: [PATCH 38/53] feat: display help message when no arguments are provided --- src/index.mts | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/index.mts b/src/index.mts index 9038fb9..876bef0 100644 --- a/src/index.mts +++ b/src/index.mts @@ -10,26 +10,35 @@ import { AttachmentFolderPolicy, createAttachmentFolderPolicyWithSubfolder, crea const logger = getLogger(); -const cli = meow(` - Usage - $ quiver-markdown -o -a - or - $ quiver-markdown -o -a -n - - Options - --output, -o: Output folder - --attachmentFolderPolicy, -a: Attachment folder policy (vaultFolder, subfolderUnderVault, sameFolderAsEachFile, subfolderUnderEachFolder). 'subfolderUnderVault' and 'subfolderUnderEachFolder' require subfolder name. - --attachmentSubfolderName, -n: Specify the subfolder name if 'subfolderUnderVault' or 'subfolderUnderEachFolder' is selected as the attachmentFolderPolicy option. - - Examples - $ quiver-markdown MyLibrary.qvlibrary -o dist -a vaultFolder - $ quiver-markdown MyLibrary.qvlibrary -o dist -a subfolderUnderVault -n _quiver-resources -`, { +const helpText = ` +Usage + $ quiver-markdown -o -a + or + $ quiver-markdown -o -a -n + +Options + --output, -o: Output folder + --attachmentFolderPolicy, -a: Attachment folder policy (vaultFolder, subfolderUnderVault, sameFolderAsEachFile, subfolderUnderEachFolder). 'subfolderUnderVault' and 'subfolderUnderEachFolder' require subfolder name. + --attachmentSubfolderName, -n: Specify the subfolder name if 'subfolderUnderVault' or 'subfolderUnderEachFolder' is selected as the attachmentFolderPolicy option. + +Examples + $ quiver-markdown MyLibrary.qvlibrary -o dist -a vaultFolder + $ quiver-markdown MyLibrary.qvlibrary -o dist -a subfolderUnderVault -n _quiver-resources +` + + +const args = process.argv.slice(2) +if (args.length === 0) { + meow(helpText, { importMeta: import.meta }).showHelp(); +} + +const cli = meow(helpText, { importMeta: import.meta, flags: { output: { type: 'string', shortFlag: 'o', + isRequired: true, }, attachmentFolderPolicy: { type: 'string', @@ -49,12 +58,12 @@ const cli = meow(` if (cli.input.length < 1) { logger.error('Please provide a qvlibrary file'); - process.exit(1); + cli.showHelp(); } if (!cli.flags.output) { logger.error('Please provide an output folder'); - process.exit(1); + cli.showHelp(); } if (cli.flags.attachmentFolderPolicy.startsWith('subfolder')) { From 3b3c41b040303686c581482787edf6978795dd71 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Tue, 16 Apr 2024 20:43:32 +0900 Subject: [PATCH 39/53] feat: add progress bar for showing Quiver to Obsidian transformation progress --- package.json | 2 ++ src/logger.mts | 8 +++-- src/quiver-to-obsidian-exporter.mts | 53 ++++++++++++++++++++++++++--- yarn.lock | 12 +++++++ 4 files changed, 68 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 7ca53b2..3efede0 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,8 @@ "typescript": "^5.4.5" }, "dependencies": { + "chalk": "^5.3.0", + "cli-progress": "^3.12.0", "dayjs": "^1.11.10", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", diff --git a/src/logger.mts b/src/logger.mts index 8335572..0012623 100644 --- a/src/logger.mts +++ b/src/logger.mts @@ -24,8 +24,12 @@ const createLogger = (config: LogConfig) => { return { error: (message: string) => console.error(message), + forceInfo: (message: string) => console.info(message), - info: (message: string) => console.info(message), + info: (message: string) => { + if (!config.isVerbose) return; + console.info(message) + }, debug: (message: string) => { if (!config.isVerbose) return; @@ -39,7 +43,7 @@ const createLogger = (config: LogConfig) => { completed: () => { console.info('') - console.info("🎉 the export of the Quiver library to the Obsidian Vault has been completed successfully.") + console.info("🎉 The export of the Quiver library to the Obsidian Vault has been completed successfully.") }, }; }; diff --git a/src/quiver-to-obsidian-exporter.mts b/src/quiver-to-obsidian-exporter.mts index 399ece8..06c5d64 100644 --- a/src/quiver-to-obsidian-exporter.mts +++ b/src/quiver-to-obsidian-exporter.mts @@ -1,6 +1,8 @@ import fg from 'fast-glob' import fs from 'fs-extra' import pathModule from 'path' +import * as cliProgress from 'cli-progress' +import chalk from 'chalk' import { getLogger } from './logger.mjs'; import './extensions/String+Path.mjs'; @@ -11,6 +13,13 @@ import { AttachmentFolderPolicy, calculateAttachmentFolderPath } from './migrati const logger = getLogger(); +const progressBar = new cliProgress.SingleBar({ + format: `${chalk.green('{bar}')} | ${chalk.hex('#00BFFF')('{percentage}%')} || ${chalk.yellow('{value}/{total}')} Notebooks || Duration: ${chalk.cyan('{duration_formatted}')}`, + barCompleteChar: '\u2588', // completely filled rectangle + barIncompleteChar: '\u2591', // thin rectangle + hideCursor: true +}, cliProgress.Presets.shades_classic); + const Keys = { children: 'children', } as const; @@ -21,7 +30,7 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string, attachmen const glob = pathModule.join(qvlibrary, '*.qvnotebook') const quiverNoteBooks = fg.sync(glob, { onlyDirectories: true }) - logger.info('==> retrieving the qvnotebooks info under the qvlibrary.'); + logger.forceInfo('==> retrieving the qvnotebooks info under the qvlibrary.'); const notebookPathsByUUID = quiverNoteBooks.reduce((acc: Map, path: string): Map => { const fileName = path.lastPathComponent(); const uuid = fileName.split('.')[0]; @@ -30,23 +39,56 @@ export function exportQvlibrary(qvlibrary: string, outputPath: string, attachmen logger.debugNotebookPathsByUUID(notebookPathsByUUID) - logger.info(`==> processing the default fixed notebooks 'Inbox' and 'Trash' in Quiver.`); + logger.forceInfo(`==> processing the default fixed notebooks 'Inbox' and 'Trash' in Quiver.`); ['Inbox', 'Trash'].forEach((fixedName: string) => { const notebookPath = notebookPathsByUUID.get(fixedName); convertNotebook(notebookPath, outputPath, [fixedName], attachmentFolderPolicy); }); - logger.info('==> retrieving the root meta.json, which stores the tree structure.'); + logger.forceInfo('==> retrieving the root meta.json, which stores the tree structure.'); const treeMetaPath = pathModule.join(qvlibrary, 'meta.json'); const treeMetaText = fs.readFileSync(treeMetaPath, 'utf8').toString(); const treeMeta = JSON.parse(treeMetaText); - logger.info('==> traverse the folder tree structure to convert Quiver notebooks into Obsidian .md files.'); + const totalFileCount = totalNumberOfFile(treeMeta, notebookPathsByUUID); + logger.info(`totalFileCount=${totalFileCount}`); + + logger.forceInfo('==> traversing the folder tree structure to convert Quiver notebooks into Obsidian .md files.'); + progressBar.start(totalFileCount, 0); const rootChildren = treeMeta[Keys.children]; traverseFolderTree(rootChildren, 0, [], outputPath, notebookPathsByUUID, attachmentFolderPolicy); logger.info('==> Traversal of the folder tree structure has been completed.'); - logger.completed() + progressBar.stop(); + logger.completed(); +} + +function totalNumberOfFile(treeMeta: any, notebooksByUUID: Map): number { + + const rootChildren = treeMeta[Keys.children]; + + return traverse(rootChildren, notebooksByUUID, 0); + + function traverse(children: [], notebooksByUUID: Map, fileCount: number): number { + + if (children === undefined) { return fileCount; } + + children.forEach((node) => { + + const uuid = node['uuid']; + + const notebookPath = notebooksByUUID.get(uuid); + if (notebookPath === undefined) { + return; + } + + fileCount++; + const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(notebookPath, 'meta.json'), 'utf8')); + fileCount = traverse(node[Keys.children], notebooksByUUID, fileCount); + }) + + return fileCount; + } } function traverseFolderTree(children: [], depth: number, pathStack: string[], outputPath: string, notebooksByUUID: Map, attachmentFolderPolicy: AttachmentFolderPolicy) { @@ -68,6 +110,7 @@ function traverseFolderTree(children: [], depth: number, pathStack: string[], ou const notebookMeta = JSON.parse(fs.readFileSync(pathModule.join(notebookPath, 'meta.json'), 'utf8')); pathStack.push(notebookMeta.name); + progressBar.increment(); convertNotebook(notebookPath, outputPath, pathStack, attachmentFolderPolicy); traverseFolderTree(node[Keys.children], depth + 1, pathStack, outputPath, notebooksByUUID, attachmentFolderPolicy); pathStack.pop(); diff --git a/yarn.lock b/yarn.lock index 8307889..5e7cc5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -160,11 +160,23 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +cli-progress@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== + dependencies: + string-width "^4.2.3" + color-support@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" From 30e2f58b53d861072516be7dbde46302c6c1a328 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 01:16:11 +0900 Subject: [PATCH 40/53] chore: only log LogConfig when isVerbose is true --- src/logger.mts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/logger.mts b/src/logger.mts index 0012623..3811ed5 100644 --- a/src/logger.mts +++ b/src/logger.mts @@ -19,7 +19,9 @@ const logConfig: LogConfig = { const createLogger = (config: LogConfig) => { - console.log(`LogConfig=${config.toString()}`) + if (config.isVerbose) { + console.log(`LogConfig=${config.toString()}`) + } return { From a0133fa3438464a62c9f992b6c3e9ad0e7847baf Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 01:18:46 +0900 Subject: [PATCH 41/53] build: clean distribution folder before building --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3efede0..493d03c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "quiver-markdown": "dist/index.mjs" }, "scripts": { - "build": "tsc", + "build": "rm -rf ./dist && tsc", "prepublishOnly": "npm run build" }, "keywords": [], From 9cb18b1681e87dd7a1e462596f261b16adb481d0 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 01:22:55 +0900 Subject: [PATCH 42/53] build: specify Node.js engine version in package.json --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 493d03c..7ff3ba5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "bin": { "quiver-markdown": "dist/index.mjs" }, + "engines": { + "node": ">=21.7.3" + }, "scripts": { "build": "rm -rf ./dist && tsc", "prepublishOnly": "npm run build" From 8fe6fdffd038fb383e6ceb3336306a4d967937a1 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 01:32:01 +0900 Subject: [PATCH 43/53] chore: change app name from fork's original name and increment version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7ff3ba5..469ebba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "quiver-markdown-exporter", - "version": "1.0.1", + "name": "quiver-to-obsidian-exporter", + "version": "1.1.0", "description": "Export Quiver library to Obsidian markdown files", "main": "dist/index.mjs", "files": [ From 76a27ebcf674a46c5076c649a4ab50f3634a4029 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 01:37:29 +0900 Subject: [PATCH 44/53] chore: add repository and homepage URLs to package.json --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 469ebba..7a90b3f 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,11 @@ "name": "quiver-to-obsidian-exporter", "version": "1.1.0", "description": "Export Quiver library to Obsidian markdown files", + "repository": { + "type": "git", + "url": "https://github.com/blue-monk/quiver-to-obsidian-exporter" + }, + "homepage": "https://github.com/blue-monk/quiver-to-obsidian-exporter", "main": "dist/index.mjs", "files": [ "dist" From d32837b9451bc7bedc138e9e35b91d0a8a6f496b Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 01:57:07 +0900 Subject: [PATCH 45/53] chore: rename command from quiver-markdown to qvr2obs --- package.json | 2 +- src/index.mts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7a90b3f..3ab7615 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ ], "type": "module", "bin": { - "quiver-markdown": "dist/index.mjs" + "qvr2obs": "dist/index.mjs" }, "engines": { "node": ">=21.7.3" diff --git a/src/index.mts b/src/index.mts index 876bef0..001402b 100644 --- a/src/index.mts +++ b/src/index.mts @@ -12,9 +12,9 @@ const logger = getLogger(); const helpText = ` Usage - $ quiver-markdown -o -a + $ qvr2obs -o -a or - $ quiver-markdown -o -a -n + $ qvr2obs -o -a -n Options --output, -o: Output folder @@ -22,8 +22,8 @@ Options --attachmentSubfolderName, -n: Specify the subfolder name if 'subfolderUnderVault' or 'subfolderUnderEachFolder' is selected as the attachmentFolderPolicy option. Examples - $ quiver-markdown MyLibrary.qvlibrary -o dist -a vaultFolder - $ quiver-markdown MyLibrary.qvlibrary -o dist -a subfolderUnderVault -n _quiver-resources + $ qvr2obs MyLibrary.qvlibrary -o dist -a vaultFolder + $ qvr2obs MyLibrary.qvlibrary -o dist -a subfolderUnderVault -n _quiver-resources ` From f9f17fd35ab3aa7abfa7a3251df382cdc985d161 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 02:03:11 +0900 Subject: [PATCH 46/53] testenv: add Dockerfile and docker-compose.yml for testing --- Dockerfile | 17 +++++++++++++++++ docker-compose.yml | 9 +++++++++ testenv/.bashrc | 9 +++++++++ 3 files changed, 35 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 testenv/.bashrc diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f7622f5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM node:latest + +ENV SUT=quiver-to-obsidian-exporter-1.1.0.tgz + +RUN apt-get update && apt-get install -y \ + less \ + && rm -rf /var/lib/apt/lists/* + +COPY testenv/.bashrc /root/.bashrc + +WORKDIR /app + +COPY $SUT /app + +RUN npm install -g /app/$SUT + +CMD ["/bin/bash"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f157dd3 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +services: + app: + image: quiver-to-obsidian-exporter + build: + context: . + dockerfile: Dockerfile + volumes: + - ./testdata:/app/testdata + command: tail -f /dev/null diff --git a/testenv/.bashrc b/testenv/.bashrc new file mode 100644 index 0000000..8299883 --- /dev/null +++ b/testenv/.bashrc @@ -0,0 +1,9 @@ +# .bashrc + +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +alias ll='ls -l --color=auto' +alias lla='ls -la --color=auto' +alias datef="date '+%Y-%m-%d %H:%M:%S'" From a95079a437565122456c599143b46ab640e97f12 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 02:24:19 +0900 Subject: [PATCH 47/53] fix: correct LaTeX rendering issues --- src/quiver-to-obsidian-transform.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/quiver-to-obsidian-transform.mts b/src/quiver-to-obsidian-transform.mts index 60f1c10..e94be3a 100644 --- a/src/quiver-to-obsidian-transform.mts +++ b/src/quiver-to-obsidian-transform.mts @@ -23,7 +23,7 @@ export function transformQuiverNoteToObsidian(quiverNotePath: string): { title: case 'diagram': return `\`\`\`${cell.diagramType}\n${cell.data}\n\`\`\`` case 'latex': - return `$$\n${cell.data}\n$$` + return `${cell.data}` default: throw new Error(`Unknown cell type: ${cell.type}`) } From f24771813c6610e8bbcb0c72ba8f33c4ca6f06b2 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 03:43:31 +0900 Subject: [PATCH 48/53] docs: improve clarity of help text --- src/index.mts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.mts b/src/index.mts index 001402b..4e0da08 100644 --- a/src/index.mts +++ b/src/index.mts @@ -22,8 +22,8 @@ Options --attachmentSubfolderName, -n: Specify the subfolder name if 'subfolderUnderVault' or 'subfolderUnderEachFolder' is selected as the attachmentFolderPolicy option. Examples - $ qvr2obs MyLibrary.qvlibrary -o dist -a vaultFolder - $ qvr2obs MyLibrary.qvlibrary -o dist -a subfolderUnderVault -n _quiver-resources + $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a vaultFolder + $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a subfolderUnderVault -n _attachment ` From cdf5ee506818ee36e0f6e1e8a146a49615bf6d48 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 03:53:32 +0900 Subject: [PATCH 49/53] docs: update README with enhanced features, bug fixes, and testing procedures --- README.md | 86 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 36d6736..7b3bd4f 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,97 @@ -# Quiver Library Markdown exporter to Obsidian +# Export Quiver library to Obsidian markdown files -![npm](https://img.shields.io/npm/v/quiver-markdown-exporter) +![npm](https://img.shields.io/npm/v/quiver-to-obsidian-exporter) -A [Quiver](https://yliansoft.com/) markdown note exporter. I started to use Quiver around 2015 and 2016. But I quickly get back to Evernote. Recently I found [Obsidian](https://obsidian.md/) quite useful and migrated all of my notes to it. So I write this exporter to migrate my notes from Quiver to Obsidian. +The original repository can be found +[here](https://github.com/Yukaii/quiver-markdown-exporter) -And my Quiver notes only use a subset of Quiver features, so I can't guarantee that the exported notes are the same as the ones in Quiver. But I hope it's enough for you to get started. +--- -Some working features: +This tool facilitates migration from Quiver to Obsidian. + I've enhanced its features and corrected several bugs, as the original functionality did not fully meet my needs. + + Please note that both the repository name and the command name have been changed for clarity. + +[Quiver](https://yliansoft.com/) +[Obsidian](https://obsidian.md/) -- [Attachments](https://github.com/Yukaii/quiver-obsidian-markdown/blob/c13f42daa8af30268797b3d902ba9f844bc24873/src/quiver-markdown.mts#L24-L29) -- Images, [\[1\]](https://github.com/Yukaii/quiver-obsidian-markdown/blob/c13f42daa8af30268797b3d902ba9f844bc24873/src/quiver-markdown.mts#L32-L46), and [\[2\]](https://github.com/Yukaii/quiver-obsidian-markdown/blob/c13f42daa8af30268797b3d902ba9f844bc24873/src/quiver-markdown.mts#L95-L103A) -- [Diagrams and Markdown/Code block](https://github.com/Yukaii/quiver-obsidian-markdown/blob/c13f42daa8af30268797b3d902ba9f844bc24873/src/quiver-markdown.mts#L117-L120) ## Installation ```bash -npm install -g quiver-markdown-exporter +npm install -g quiver-to-obsidian-exporter ``` ## Usage ```bash Usage - $ quiver-markdown -o + $ qvr2obs -o -a + or + $ qvr2obs -o -a -n Options - --output, -o Output folder + --output, -o: Output folder + --attachmentFolderPolicy, -a: Attachment folder policy (vaultFolder, subfolderUnderVault, sameFolderAsEachFile, subfolderUnderEachFolder). 'subfolderUnderVault' and 'subfolderUnderEachFolder' require subfolder name. + --attachmentSubfolderName, -n: Specify the subfolder name if 'subfolderUnderVault' or 'subfolderUnderEachFolder' is selected as the attachmentFolderPolicy option. Examples - $ quiver-markdown MyLibrary.qvlibrary -o dist + $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a vaultFolder + $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a subfolderUnderVault -n _attachment +``` + + +## Changes from the Original + +### New Features + +* Output maintains the tree structure of the Quiver library (originally output was flat). +* Added support for all four Obsidian attachment folder policies. +* Converts tags, creation and modification times of notebooks into YAML front matter. +* Migrates Quiver notebooks while preserving their timestamps. +* Added a progress bar to display the transformation progress from Quiver to Obsidian. + +### Bug Fixes + +* Fixed an issue where image links in Markdown cells were not rendering in Obsidian. +* Sanitized characters in titles that are not allowed in Obsidian. +* Fixed LaTeX rendering issues to ensure correct display in Obsidian. + +### Minor Changes + +* Changed the timestamp formatter to `YYYY-MM-DD(ddd) HH:mm:ss`. +* Added a check for the existence of the qvlibrary file. +* Displays help text when executed without arguments. + +### For Developers + +* Added debug logging (controlled by the environment variable QUIVER_TO_OBSIDIAN_EXPORTER_LOGGING_VERBOSE). +* Created a Docker environment dedicated to testing. + + +## How to Test (For Developers) + +1. Prepare the `testdata` folder: + In the testdata folder, place xxx.qvlibrary in the sources directory, for example, and also provide a destination folder, etc. and use it as the location for the -o option (-o testdata/destination/MyNote) +2. `yarn run build`. +3. `npm pack`. +4. `docker compose up -d --build`. +5. Enter the Docker container: + e.g. + ``` + docker exec -it quiver-to-obsidian-exporter-app-1 /bin/bash + ``` +6. Execute the command: + e.g. + ``` + qvr2obs testdata/source/MyNote.qvlibrary -o testdata/destination/MyNote -a subfolderUnderVault -n _quiver-attachments + ``` + +If needed, enable verbose logging for debugging: ``` +export QUIVER_TO_OBSIDIAN_EXPORTER_LOGGING_VERBOSE=true +``` + ## Contributing From db613893f57a49fa1cecf33f9ce7eaaba21a23e3 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 06:00:15 +0900 Subject: [PATCH 50/53] chore: improve -n option example for better clarity --- README.md | 4 ++-- src/index.mts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7b3bd4f..46fc92a 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Options Examples $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a vaultFolder - $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a subfolderUnderVault -n _attachment + $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a subfolderUnderVault -n _attachments ``` @@ -84,7 +84,7 @@ Examples 6. Execute the command: e.g. ``` - qvr2obs testdata/source/MyNote.qvlibrary -o testdata/destination/MyNote -a subfolderUnderVault -n _quiver-attachments + qvr2obs testdata/source/MyNote.qvlibrary -o testdata/destination/MyNote -a subfolderUnderVault -n _attachments ``` If needed, enable verbose logging for debugging: diff --git a/src/index.mts b/src/index.mts index 4e0da08..c7c06f1 100644 --- a/src/index.mts +++ b/src/index.mts @@ -23,7 +23,7 @@ Options Examples $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a vaultFolder - $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a subfolderUnderVault -n _attachment + $ qvr2obs MyNote.qvlibrary -o dest/MyNote -a subfolderUnderVault -n _attachments ` From 779e894a76d28304ffee5cba4b2977afdee49074 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 06:10:41 +0900 Subject: [PATCH 51/53] docs: clarify testing environment purpose in README's How to Test section --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 46fc92a..cf239c0 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,9 @@ Examples ## How to Test (For Developers) +This testing procedure is designed for testing in a clean environment. +For routine testing, feel free to use your IDE of choice. + 1. Prepare the `testdata` folder: In the testdata folder, place xxx.qvlibrary in the sources directory, for example, and also provide a destination folder, etc. and use it as the location for the -o option (-o testdata/destination/MyNote) 2. `yarn run build`. From b8068ebdd00cf8c24e933fd1c20dc966cff10eb6 Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 11:58:42 +0900 Subject: [PATCH 52/53] docs: add tribute to original repository in README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cf239c0..c12b9ea 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ The original repository can be found [here](https://github.com/Yukaii/quiver-markdown-exporter) +This command line tool is built upon the excellent foundation of the original repository. +Thank you! --- From 8da73006d8da75aeb4468f69fed2d4354e87e85a Mon Sep 17 00:00:00 2001 From: blue-monk Date: Wed, 17 Apr 2024 12:51:55 +0900 Subject: [PATCH 53/53] docs: insert app concept image and runtime screenshots in README for better illustration --- README.md | 3 +++ app-concept-image.png | Bin 0 -> 127141 bytes app-running.png | Bin 0 -> 85030 bytes 3 files changed, 3 insertions(+) create mode 100644 app-concept-image.png create mode 100644 app-running.png diff --git a/README.md b/README.md index c12b9ea..498a650 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ This tool facilitates migration from Quiver to Obsidian. Please note that both the repository name and the command name have been changed for clarity. +![App Concept Image](app-concept-image.png) +![App Running Image](app-running.png) + [Quiver](https://yliansoft.com/) [Obsidian](https://obsidian.md/) diff --git a/app-concept-image.png b/app-concept-image.png new file mode 100644 index 0000000000000000000000000000000000000000..6657821eb2618f105b65c0d348f395492871d315 GIT binary patch literal 127141 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 JRC*cqzW^iZq8|VN literal 0 HcmV?d00001 diff --git a/app-running.png b/app-running.png new file mode 100644 index 0000000000000000000000000000000000000000..dc70dc065d7033ddbbc0437b2f7ad0fddecd0d24 GIT binary patch literal 85030 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 YW)9mU!x744cmVuKODae}#XkD|4>hn0A^-pY literal 0 HcmV?d00001