Merge remote-tracking branch 'upstream/v4' into v4

This commit is contained in:
Tomoya Matsuura(MacBookPro) 2023-08-25 09:07:19 +09:00
commit f37b157ff4
24 changed files with 384 additions and 311 deletions

View File

@ -1,6 +1,9 @@
name: Build and Test name: Build and Test
on: on:
pull_request:
branches:
- v4
push: push:
branches: branches:
- v4 - v4

0
content/.gitkeep Normal file
View File

404
package-lock.json generated
View File

@ -1,23 +1,23 @@
{ {
"name": "@jackyzha0/quartz", "name": "@jackyzha0/quartz",
"version": "4.0.8", "version": "4.0.10",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@jackyzha0/quartz", "name": "@jackyzha0/quartz",
"version": "4.0.8", "version": "4.0.10",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@clack/prompts": "^0.6.3", "@clack/prompts": "^0.6.3",
"@floating-ui/dom": "^1.4.0", "@floating-ui/dom": "^1.4.0",
"@napi-rs/simple-git": "^0.1.8", "@napi-rs/simple-git": "0.1.9",
"async-mutex": "^0.4.0", "async-mutex": "^0.4.0",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"chokidar": "^3.5.3", "chokidar": "^3.5.3",
"cli-spinner": "^0.2.10", "cli-spinner": "^0.2.10",
"d3": "^7.8.5", "d3": "^7.8.5",
"esbuild-sass-plugin": "^2.9.0", "esbuild-sass-plugin": "^2.12.0",
"flexsearch": "0.7.21", "flexsearch": "0.7.21",
"github-slugger": "^2.0.0", "github-slugger": "^2.0.0",
"globby": "^13.1.4", "globby": "^13.1.4",
@ -27,7 +27,7 @@
"hast-util-to-string": "^2.0.0", "hast-util-to-string": "^2.0.0",
"is-absolute-url": "^4.0.1", "is-absolute-url": "^4.0.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"lightningcss": "^1.21.5", "lightningcss": "1.21.7",
"mdast-util-find-and-replace": "^2.2.2", "mdast-util-find-and-replace": "^2.2.2",
"mdast-util-to-hast": "^12.3.0", "mdast-util-to-hast": "^12.3.0",
"mdast-util-to-string": "^3.2.0", "mdast-util-to-string": "^3.2.0",
@ -77,7 +77,7 @@
"@types/workerpool": "^6.4.0", "@types/workerpool": "^6.4.0",
"@types/ws": "^8.5.5", "@types/ws": "^8.5.5",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"esbuild": "^0.18.11", "esbuild": "0.19.2",
"prettier": "^3.0.0", "prettier": "^3.0.0",
"tsx": "^3.12.7", "tsx": "^3.12.7",
"typescript": "^5.0.4" "typescript": "^5.0.4"
@ -540,9 +540,9 @@
} }
}, },
"node_modules/@esbuild/android-arm": { "node_modules/@esbuild/android-arm": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz",
"integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -555,9 +555,9 @@
} }
}, },
"node_modules/@esbuild/android-arm64": { "node_modules/@esbuild/android-arm64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz",
"integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -570,9 +570,9 @@
} }
}, },
"node_modules/@esbuild/android-x64": { "node_modules/@esbuild/android-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz",
"integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -585,9 +585,9 @@
} }
}, },
"node_modules/@esbuild/darwin-arm64": { "node_modules/@esbuild/darwin-arm64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz",
"integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -600,9 +600,9 @@
} }
}, },
"node_modules/@esbuild/darwin-x64": { "node_modules/@esbuild/darwin-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz",
"integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -615,9 +615,9 @@
} }
}, },
"node_modules/@esbuild/freebsd-arm64": { "node_modules/@esbuild/freebsd-arm64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz",
"integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -630,9 +630,9 @@
} }
}, },
"node_modules/@esbuild/freebsd-x64": { "node_modules/@esbuild/freebsd-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz",
"integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -645,9 +645,9 @@
} }
}, },
"node_modules/@esbuild/linux-arm": { "node_modules/@esbuild/linux-arm": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz",
"integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -660,9 +660,9 @@
} }
}, },
"node_modules/@esbuild/linux-arm64": { "node_modules/@esbuild/linux-arm64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz",
"integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -675,9 +675,9 @@
} }
}, },
"node_modules/@esbuild/linux-ia32": { "node_modules/@esbuild/linux-ia32": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz",
"integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -690,9 +690,9 @@
} }
}, },
"node_modules/@esbuild/linux-loong64": { "node_modules/@esbuild/linux-loong64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz",
"integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==",
"cpu": [ "cpu": [
"loong64" "loong64"
], ],
@ -705,9 +705,9 @@
} }
}, },
"node_modules/@esbuild/linux-mips64el": { "node_modules/@esbuild/linux-mips64el": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz",
"integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==",
"cpu": [ "cpu": [
"mips64el" "mips64el"
], ],
@ -720,9 +720,9 @@
} }
}, },
"node_modules/@esbuild/linux-ppc64": { "node_modules/@esbuild/linux-ppc64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz",
"integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@ -735,9 +735,9 @@
} }
}, },
"node_modules/@esbuild/linux-riscv64": { "node_modules/@esbuild/linux-riscv64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz",
"integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -750,9 +750,9 @@
} }
}, },
"node_modules/@esbuild/linux-s390x": { "node_modules/@esbuild/linux-s390x": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz",
"integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@ -765,9 +765,9 @@
} }
}, },
"node_modules/@esbuild/linux-x64": { "node_modules/@esbuild/linux-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz",
"integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -780,9 +780,9 @@
} }
}, },
"node_modules/@esbuild/netbsd-x64": { "node_modules/@esbuild/netbsd-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz",
"integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -795,9 +795,9 @@
} }
}, },
"node_modules/@esbuild/openbsd-x64": { "node_modules/@esbuild/openbsd-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz",
"integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -810,9 +810,9 @@
} }
}, },
"node_modules/@esbuild/sunos-x64": { "node_modules/@esbuild/sunos-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz",
"integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -825,9 +825,9 @@
} }
}, },
"node_modules/@esbuild/win32-arm64": { "node_modules/@esbuild/win32-arm64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz",
"integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -840,9 +840,9 @@
} }
}, },
"node_modules/@esbuild/win32-ia32": { "node_modules/@esbuild/win32-ia32": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz",
"integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -855,9 +855,9 @@
} }
}, },
"node_modules/@esbuild/win32-x64": { "node_modules/@esbuild/win32-x64": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz",
"integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -899,30 +899,30 @@
} }
}, },
"node_modules/@napi-rs/simple-git": { "node_modules/@napi-rs/simple-git": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.9.tgz",
"integrity": "sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==", "integrity": "sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==",
"engines": { "engines": {
"node": ">= 10" "node": ">= 10"
}, },
"optionalDependencies": { "optionalDependencies": {
"@napi-rs/simple-git-android-arm-eabi": "0.1.8", "@napi-rs/simple-git-android-arm-eabi": "0.1.9",
"@napi-rs/simple-git-android-arm64": "0.1.8", "@napi-rs/simple-git-android-arm64": "0.1.9",
"@napi-rs/simple-git-darwin-arm64": "0.1.8", "@napi-rs/simple-git-darwin-arm64": "0.1.9",
"@napi-rs/simple-git-darwin-x64": "0.1.8", "@napi-rs/simple-git-darwin-x64": "0.1.9",
"@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.8", "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.9",
"@napi-rs/simple-git-linux-arm64-gnu": "0.1.8", "@napi-rs/simple-git-linux-arm64-gnu": "0.1.9",
"@napi-rs/simple-git-linux-arm64-musl": "0.1.8", "@napi-rs/simple-git-linux-arm64-musl": "0.1.9",
"@napi-rs/simple-git-linux-x64-gnu": "0.1.8", "@napi-rs/simple-git-linux-x64-gnu": "0.1.9",
"@napi-rs/simple-git-linux-x64-musl": "0.1.8", "@napi-rs/simple-git-linux-x64-musl": "0.1.9",
"@napi-rs/simple-git-win32-arm64-msvc": "0.1.8", "@napi-rs/simple-git-win32-arm64-msvc": "0.1.9",
"@napi-rs/simple-git-win32-x64-msvc": "0.1.8" "@napi-rs/simple-git-win32-x64-msvc": "0.1.9"
} }
}, },
"node_modules/@napi-rs/simple-git-android-arm-eabi": { "node_modules/@napi-rs/simple-git-android-arm-eabi": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.9.tgz",
"integrity": "sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==", "integrity": "sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -935,9 +935,9 @@
} }
}, },
"node_modules/@napi-rs/simple-git-android-arm64": { "node_modules/@napi-rs/simple-git-android-arm64": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.9.tgz",
"integrity": "sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==", "integrity": "sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -950,9 +950,9 @@
} }
}, },
"node_modules/@napi-rs/simple-git-darwin-arm64": { "node_modules/@napi-rs/simple-git-darwin-arm64": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.9.tgz",
"integrity": "sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==", "integrity": "sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -965,9 +965,9 @@
} }
}, },
"node_modules/@napi-rs/simple-git-darwin-x64": { "node_modules/@napi-rs/simple-git-darwin-x64": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.9.tgz",
"integrity": "sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==", "integrity": "sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -980,9 +980,9 @@
} }
}, },
"node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.9.tgz",
"integrity": "sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==", "integrity": "sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -995,13 +995,12 @@
} }
}, },
"node_modules/@napi-rs/simple-git-linux-arm64-gnu": { "node_modules/@napi-rs/simple-git-linux-arm64-gnu": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.9.tgz",
"integrity": "sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==", "integrity": "sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"hasInstallScript": true,
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -1011,13 +1010,12 @@
} }
}, },
"node_modules/@napi-rs/simple-git-linux-arm64-musl": { "node_modules/@napi-rs/simple-git-linux-arm64-musl": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.9.tgz",
"integrity": "sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==", "integrity": "sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"hasInstallScript": true,
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -1027,13 +1025,12 @@
} }
}, },
"node_modules/@napi-rs/simple-git-linux-x64-gnu": { "node_modules/@napi-rs/simple-git-linux-x64-gnu": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.9.tgz",
"integrity": "sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==", "integrity": "sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"hasInstallScript": true,
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -1043,13 +1040,12 @@
} }
}, },
"node_modules/@napi-rs/simple-git-linux-x64-musl": { "node_modules/@napi-rs/simple-git-linux-x64-musl": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.9.tgz",
"integrity": "sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==", "integrity": "sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"hasInstallScript": true,
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -1059,9 +1055,9 @@
} }
}, },
"node_modules/@napi-rs/simple-git-win32-arm64-msvc": { "node_modules/@napi-rs/simple-git-win32-arm64-msvc": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.9.tgz",
"integrity": "sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==", "integrity": "sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1074,9 +1070,9 @@
} }
}, },
"node_modules/@napi-rs/simple-git-win32-x64-msvc": { "node_modules/@napi-rs/simple-git-win32-x64-msvc": {
"version": "0.1.8", "version": "0.1.9",
"resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.9.tgz",
"integrity": "sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==", "integrity": "sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2441,9 +2437,9 @@
} }
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.18.11", "version": "0.19.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz",
"integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==",
"hasInstallScript": true, "hasInstallScript": true,
"bin": { "bin": {
"esbuild": "bin/esbuild" "esbuild": "bin/esbuild"
@ -2452,40 +2448,40 @@
"node": ">=12" "node": ">=12"
}, },
"optionalDependencies": { "optionalDependencies": {
"@esbuild/android-arm": "0.18.11", "@esbuild/android-arm": "0.19.2",
"@esbuild/android-arm64": "0.18.11", "@esbuild/android-arm64": "0.19.2",
"@esbuild/android-x64": "0.18.11", "@esbuild/android-x64": "0.19.2",
"@esbuild/darwin-arm64": "0.18.11", "@esbuild/darwin-arm64": "0.19.2",
"@esbuild/darwin-x64": "0.18.11", "@esbuild/darwin-x64": "0.19.2",
"@esbuild/freebsd-arm64": "0.18.11", "@esbuild/freebsd-arm64": "0.19.2",
"@esbuild/freebsd-x64": "0.18.11", "@esbuild/freebsd-x64": "0.19.2",
"@esbuild/linux-arm": "0.18.11", "@esbuild/linux-arm": "0.19.2",
"@esbuild/linux-arm64": "0.18.11", "@esbuild/linux-arm64": "0.19.2",
"@esbuild/linux-ia32": "0.18.11", "@esbuild/linux-ia32": "0.19.2",
"@esbuild/linux-loong64": "0.18.11", "@esbuild/linux-loong64": "0.19.2",
"@esbuild/linux-mips64el": "0.18.11", "@esbuild/linux-mips64el": "0.19.2",
"@esbuild/linux-ppc64": "0.18.11", "@esbuild/linux-ppc64": "0.19.2",
"@esbuild/linux-riscv64": "0.18.11", "@esbuild/linux-riscv64": "0.19.2",
"@esbuild/linux-s390x": "0.18.11", "@esbuild/linux-s390x": "0.19.2",
"@esbuild/linux-x64": "0.18.11", "@esbuild/linux-x64": "0.19.2",
"@esbuild/netbsd-x64": "0.18.11", "@esbuild/netbsd-x64": "0.19.2",
"@esbuild/openbsd-x64": "0.18.11", "@esbuild/openbsd-x64": "0.19.2",
"@esbuild/sunos-x64": "0.18.11", "@esbuild/sunos-x64": "0.19.2",
"@esbuild/win32-arm64": "0.18.11", "@esbuild/win32-arm64": "0.19.2",
"@esbuild/win32-ia32": "0.18.11", "@esbuild/win32-ia32": "0.19.2",
"@esbuild/win32-x64": "0.18.11" "@esbuild/win32-x64": "0.19.2"
} }
}, },
"node_modules/esbuild-sass-plugin": { "node_modules/esbuild-sass-plugin": {
"version": "2.10.0", "version": "2.12.0",
"resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.10.0.tgz", "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.12.0.tgz",
"integrity": "sha512-STv849QGT8g77RRFmroSt4VBVKjv+dypKcO4aWz8IP4G5JbRH0KC0+B8ODuzlUNu9R5MbkGcev/62RDP/JcZ2Q==", "integrity": "sha512-+k/5WM/Yf/Ur7ahn6XXxEPwa/lmuacLO7vrCIAJuvQapX1CiIHtlX/nc2eiMoJ6P6RvqZhKpQvIiwgYJonzHtw==",
"dependencies": { "dependencies": {
"resolve": "^1.22.2", "resolve": "^1.22.2",
"sass": "^1.63.0" "sass": "^1.65.1"
}, },
"peerDependencies": { "peerDependencies": {
"esbuild": "^0.18.0" "esbuild": "^0.19.1"
} }
}, },
"node_modules/escalade": { "node_modules/escalade": {
@ -3147,9 +3143,9 @@
} }
}, },
"node_modules/immutable": { "node_modules/immutable": {
"version": "4.3.0", "version": "4.3.3",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz",
"integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA=="
}, },
"node_modules/inline-style-parser": { "node_modules/inline-style-parser": {
"version": "0.1.1", "version": "0.1.1",
@ -3412,9 +3408,9 @@
} }
}, },
"node_modules/lightningcss": { "node_modules/lightningcss": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.7.tgz",
"integrity": "sha512-/pEUPeih2EwIx9n4T82aOG6CInN83tl/mWlw6B5gWLf36UplQi1L+5p3FUHsdt4fXVfOkkh9KIaM3owoq7ss8A==", "integrity": "sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==",
"dependencies": { "dependencies": {
"detect-libc": "^1.0.3" "detect-libc": "^1.0.3"
}, },
@ -3426,20 +3422,21 @@
"url": "https://opencollective.com/parcel" "url": "https://opencollective.com/parcel"
}, },
"optionalDependencies": { "optionalDependencies": {
"lightningcss-darwin-arm64": "1.21.5", "lightningcss-darwin-arm64": "1.21.7",
"lightningcss-darwin-x64": "1.21.5", "lightningcss-darwin-x64": "1.21.7",
"lightningcss-linux-arm-gnueabihf": "1.21.5", "lightningcss-freebsd-x64": "1.21.7",
"lightningcss-linux-arm64-gnu": "1.21.5", "lightningcss-linux-arm-gnueabihf": "1.21.7",
"lightningcss-linux-arm64-musl": "1.21.5", "lightningcss-linux-arm64-gnu": "1.21.7",
"lightningcss-linux-x64-gnu": "1.21.5", "lightningcss-linux-arm64-musl": "1.21.7",
"lightningcss-linux-x64-musl": "1.21.5", "lightningcss-linux-x64-gnu": "1.21.7",
"lightningcss-win32-x64-msvc": "1.21.5" "lightningcss-linux-x64-musl": "1.21.7",
"lightningcss-win32-x64-msvc": "1.21.7"
} }
}, },
"node_modules/lightningcss-darwin-arm64": { "node_modules/lightningcss-darwin-arm64": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.7.tgz",
"integrity": "sha512-z05hyLX85WY0UfhkFUOrWEFqD69lpVAmgl3aDzMKlIZJGygbhbegqb4PV8qfUrKKNBauut/qVNPKZglhTaDDxA==", "integrity": "sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3456,9 +3453,9 @@
} }
}, },
"node_modules/lightningcss-darwin-x64": { "node_modules/lightningcss-darwin-x64": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.7.tgz",
"integrity": "sha512-MSJhmej/U9MrdPxDk7+FWhO8+UqVoZUHG4VvKT5RQ4RJtqtANTiWiI97LvoVNMtdMnHaKs1Pkji6wHUFxjJsHQ==", "integrity": "sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3474,10 +3471,29 @@
"url": "https://opencollective.com/parcel" "url": "https://opencollective.com/parcel"
} }
}, },
"node_modules/lightningcss-freebsd-x64": {
"version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.21.7.tgz",
"integrity": "sha512-RMfNzJWXCSfPnL55fcLWEAadcY6QUFT0S8NceNKYzp1KiCZtkJIy6RQ5SaVxPzRqd3iMsahUf5sfnG8N1UQSNQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": { "node_modules/lightningcss-linux-arm-gnueabihf": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.7.tgz",
"integrity": "sha512-xN6+5/JsMrbZHL1lPl+MiNJ3Xza12ueBKPepiyDCFQzlhFRTj7D0LG+cfNTzPBTO8KcYQynLpl1iBB8LGp3Xtw==", "integrity": "sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -3494,9 +3510,9 @@
} }
}, },
"node_modules/lightningcss-linux-arm64-gnu": { "node_modules/lightningcss-linux-arm64-gnu": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.7.tgz",
"integrity": "sha512-KfzFNhC4XTbmG3ma/xcTs/IhCwieW89XALIusKmnV0N618ZDXEB0XjWOYQRCXeK9mfqPdbTBpurEHV/XZtkniQ==", "integrity": "sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3513,9 +3529,9 @@
} }
}, },
"node_modules/lightningcss-linux-arm64-musl": { "node_modules/lightningcss-linux-arm64-musl": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.7.tgz",
"integrity": "sha512-bc0GytQO5Mn9QM6szaZ+31fQHNdidgpM1sSCwzPItz8hg3wOvKl8039rU0veMJV3ZgC9z0ypNRceLrSHeRHmXw==", "integrity": "sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3532,9 +3548,9 @@
} }
}, },
"node_modules/lightningcss-linux-x64-gnu": { "node_modules/lightningcss-linux-x64-gnu": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.7.tgz",
"integrity": "sha512-JwMbgypPQgc2kW2av3OwzZ8cbrEuIiDiXPJdXRE6aVxu67yHauJawQLqJKTGUhiAhy6iLDG8Wg0a3/ziL+m+Kw==", "integrity": "sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3551,9 +3567,9 @@
} }
}, },
"node_modules/lightningcss-linux-x64-musl": { "node_modules/lightningcss-linux-x64-musl": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.7.tgz",
"integrity": "sha512-Ib8b6IQ/OR/VrPU6YBgy4T3QnuHY7DUa95O+nz+cwrTkMSN6fuHcTcIaz4t8TJ6HI5pl3uxUOZjmtls2pyQWow==", "integrity": "sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3570,9 +3586,9 @@
} }
}, },
"node_modules/lightningcss-win32-x64-msvc": { "node_modules/lightningcss-win32-x64-msvc": {
"version": "1.21.5", "version": "1.21.7",
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.5.tgz", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.7.tgz",
"integrity": "sha512-A8cSi8lUpBeVmoF+DqqW7cd0FemDbCuKr490IXdjyeI+KL8adpSKUs8tcqO0OXPh1EoDqK7JNkD/dELmd4Iz5g==", "integrity": "sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -5159,9 +5175,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/sass": { "node_modules/sass": {
"version": "1.63.6", "version": "1.66.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz",
"integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==",
"dependencies": { "dependencies": {
"chokidar": ">=3.0.0 <4.0.0", "chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0", "immutable": "^4.0.0",

View File

@ -2,7 +2,7 @@
"name": "@jackyzha0/quartz", "name": "@jackyzha0/quartz",
"description": "🌱 publish your digital garden and notes as a website", "description": "🌱 publish your digital garden and notes as a website",
"private": true, "private": true,
"version": "4.0.8", "version": "4.0.10",
"type": "module", "type": "module",
"author": "jackyzha0 <j.zhao2k19@gmail.com>", "author": "jackyzha0 <j.zhao2k19@gmail.com>",
"license": "MIT", "license": "MIT",
@ -12,6 +12,7 @@
"url": "https://github.com/jackyzha0/quartz.git" "url": "https://github.com/jackyzha0/quartz.git"
}, },
"scripts": { "scripts": {
"docs": "npx quartz build --serve -d docs",
"check": "tsc --noEmit && npx prettier . --check", "check": "tsc --noEmit && npx prettier . --check",
"format": "npx prettier . --write", "format": "npx prettier . --write",
"test": "tsx ./quartz/util/path.test.ts", "test": "tsx ./quartz/util/path.test.ts",
@ -34,13 +35,13 @@
"dependencies": { "dependencies": {
"@clack/prompts": "^0.6.3", "@clack/prompts": "^0.6.3",
"@floating-ui/dom": "^1.4.0", "@floating-ui/dom": "^1.4.0",
"@napi-rs/simple-git": "^0.1.8", "@napi-rs/simple-git": "0.1.9",
"async-mutex": "^0.4.0", "async-mutex": "^0.4.0",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"chokidar": "^3.5.3", "chokidar": "^3.5.3",
"cli-spinner": "^0.2.10", "cli-spinner": "^0.2.10",
"d3": "^7.8.5", "d3": "^7.8.5",
"esbuild-sass-plugin": "^2.9.0", "esbuild-sass-plugin": "^2.12.0",
"flexsearch": "0.7.21", "flexsearch": "0.7.21",
"github-slugger": "^2.0.0", "github-slugger": "^2.0.0",
"globby": "^13.1.4", "globby": "^13.1.4",
@ -50,7 +51,7 @@
"hast-util-to-string": "^2.0.0", "hast-util-to-string": "^2.0.0",
"is-absolute-url": "^4.0.1", "is-absolute-url": "^4.0.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"lightningcss": "^1.21.5", "lightningcss": "1.21.7",
"mdast-util-find-and-replace": "^2.2.2", "mdast-util-find-and-replace": "^2.2.2",
"mdast-util-to-hast": "^12.3.0", "mdast-util-to-hast": "^12.3.0",
"mdast-util-to-string": "^3.2.0", "mdast-util-to-string": "^3.2.0",
@ -97,7 +98,7 @@
"@types/workerpool": "^6.4.0", "@types/workerpool": "^6.4.0",
"@types/ws": "^8.5.5", "@types/ws": "^8.5.5",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"esbuild": "^0.18.11", "esbuild": "0.19.2",
"prettier": "^3.0.0", "prettier": "^3.0.0",
"tsx": "^3.12.7", "tsx": "^3.12.7",
"typescript": "^5.0.4" "typescript": "^5.0.4"

View File

@ -11,6 +11,7 @@ const config: QuartzConfig = {
}, },
baseUrl: "garden.matsuuratomoya.com", baseUrl: "garden.matsuuratomoya.com",
ignorePatterns: ["private", "templates"], ignorePatterns: ["private", "templates"],
defaultDateType: "created",
theme: { theme: {
typography: { typography: {
header: "Schibsted Grotesk", header: "Schibsted Grotesk",

View File

@ -162,7 +162,6 @@ yargs(hideBin(process.argv))
label: "Symlink an existing folder", label: "Symlink an existing folder",
hint: "don't select this unless you know what you are doing!", hint: "don't select this unless you know what you are doing!",
}, },
{ value: "keep", label: "Keep the existing files" },
], ],
}), }),
) )
@ -176,6 +175,7 @@ yargs(hideBin(process.argv))
} }
} }
await fs.promises.unlink(path.join(contentFolder, ".gitkeep"))
if (setupStrategy === "copy" || setupStrategy === "symlink") { if (setupStrategy === "copy" || setupStrategy === "symlink") {
const originalFolder = escapePath( const originalFolder = escapePath(
exitIfCancel( exitIfCancel(
@ -205,8 +205,6 @@ yargs(hideBin(process.argv))
await fs.promises.symlink(originalFolder, contentFolder, "dir") await fs.promises.symlink(originalFolder, contentFolder, "dir")
} }
} else if (setupStrategy === "new") { } else if (setupStrategy === "new") {
await rmContentFolder()
await fs.promises.mkdir(contentFolder)
await fs.promises.writeFile( await fs.promises.writeFile(
path.join(contentFolder, "index.md"), path.join(contentFolder, "index.md"),
`--- `---
@ -219,7 +217,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
) )
} }
// get a prefered link resolution strategy // get a preferred link resolution strategy
const linkResolutionStrategy = exitIfCancel( const linkResolutionStrategy = exitIfCancel(
await select({ await select({
message: `Choose how Quartz should resolve links in your content. You can change this later in \`quartz.config.ts\`.`, message: `Choose how Quartz should resolve links in your content. You can change this later in \`quartz.config.ts\`.`,
@ -393,13 +391,19 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
}) })
const buildMutex = new Mutex() const buildMutex = new Mutex()
const timeoutIds = new Set() let lastBuildMs = 0
let firstBuild = true let cleanupBuild = null
const build = async (clientRefresh) => { const build = async (clientRefresh) => {
const buildStart = new Date().getTime()
lastBuildMs = buildStart
const release = await buildMutex.acquire() const release = await buildMutex.acquire()
if (firstBuild) { if (lastBuildMs > buildStart) {
firstBuild = false release()
} else { return
}
if (cleanupBuild) {
await cleanupBuild()
console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) console.log(chalk.yellow("Detected a source code change, doing a hard rebuild..."))
} }
@ -408,6 +412,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
console.log(`Reason: ${chalk.grey(err)}`) console.log(`Reason: ${chalk.grey(err)}`)
process.exit(1) process.exit(1)
}) })
release()
if (argv.bundleInfo) { if (argv.bundleInfo) {
const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs" const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs"
@ -423,15 +428,8 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
// bypass module cache // bypass module cache
// https://github.com/nodejs/modules/issues/307 // https://github.com/nodejs/modules/issues/307
const { default: buildQuartz } = await import(cacheFile + `?update=${randomUUID()}`) const { default: buildQuartz } = await import(cacheFile + `?update=${randomUUID()}`)
await buildQuartz(argv, clientRefresh) cleanupBuild = await buildQuartz(argv, buildMutex, clientRefresh)
clientRefresh() clientRefresh()
release()
}
const rebuild = (clientRefresh) => {
timeoutIds.forEach((id) => clearTimeout(id))
timeoutIds.clear()
timeoutIds.add(setTimeout(() => build(clientRefresh), 250))
} }
if (argv.serve) { if (argv.serve) {
@ -459,6 +457,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
req.url = req.url?.slice(argv.baseDir.length) req.url = req.url?.slice(argv.baseDir.length)
const serve = async () => { const serve = async () => {
const release = await buildMutex.acquire()
await serveHandler(req, res, { await serveHandler(req, res, {
public: argv.output, public: argv.output,
directoryListing: false, directoryListing: false,
@ -473,6 +472,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
const statusString = const statusString =
status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`) status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`)
console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`)) console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`))
release()
} }
const redirect = (newFp) => { const redirect = (newFp) => {
@ -539,7 +539,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
ignoreInitial: true, ignoreInitial: true,
}) })
.on("all", async () => { .on("all", async () => {
rebuild(clientRefresh) build(clientRefresh)
}) })
} else { } else {
await build(() => {}) await build(() => {})

View File

@ -18,7 +18,7 @@ import { trace } from "./util/trace"
import { options } from "./util/sourcemap" import { options } from "./util/sourcemap"
import { Mutex } from "async-mutex" import { Mutex } from "async-mutex"
async function buildQuartz(argv: Argv, clientRefresh: () => void) { async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) {
const ctx: BuildCtx = { const ctx: BuildCtx = {
argv, argv,
cfg, cfg,
@ -38,13 +38,14 @@ async function buildQuartz(argv: Argv, clientRefresh: () => void) {
console.log(` Emitters: ${pluginNames("emitters").join(", ")}`) console.log(` Emitters: ${pluginNames("emitters").join(", ")}`)
} }
const release = await mut.acquire()
perf.addEvent("clean") perf.addEvent("clean")
await rimraf(output) await rimraf(output)
console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`)
perf.addEvent("glob") perf.addEvent("glob")
const allFiles = await glob("**/*.*", argv.directory, cfg.configuration.ignorePatterns) const allFiles = await glob("**/*.*", argv.directory, cfg.configuration.ignorePatterns)
const fps = allFiles.filter((fp) => fp.endsWith(".md")) const fps = allFiles.filter((fp) => fp.endsWith(".md")).sort()
console.log( console.log(
`Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`,
) )
@ -56,15 +57,17 @@ async function buildQuartz(argv: Argv, clientRefresh: () => void) {
const filteredContent = filterContent(ctx, parsedFiles) const filteredContent = filterContent(ctx, parsedFiles)
await emitContent(ctx, filteredContent) await emitContent(ctx, filteredContent)
console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)) console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`))
release()
if (argv.serve) { if (argv.serve) {
return startServing(ctx, parsedFiles, clientRefresh) return startServing(ctx, mut, parsedFiles, clientRefresh)
} }
} }
// setup watcher for rebuilds // setup watcher for rebuilds
async function startServing( async function startServing(
ctx: BuildCtx, ctx: BuildCtx,
mut: Mutex,
initialContent: ProcessedContent[], initialContent: ProcessedContent[],
clientRefresh: () => void, clientRefresh: () => void,
) { ) {
@ -78,8 +81,7 @@ async function startServing(
} }
const initialSlugs = ctx.allSlugs const initialSlugs = ctx.allSlugs
const buildMutex = new Mutex() let lastBuildMs = 0
const timeoutIds: Set<ReturnType<typeof setTimeout>> = new Set()
const toRebuild: Set<FilePath> = new Set() const toRebuild: Set<FilePath> = new Set()
const toRemove: Set<FilePath> = new Set() const toRemove: Set<FilePath> = new Set()
const trackedAssets: Set<FilePath> = new Set() const trackedAssets: Set<FilePath> = new Set()
@ -109,49 +111,50 @@ async function startServing(
} }
// debounce rebuilds every 250ms // debounce rebuilds every 250ms
timeoutIds.add(
setTimeout(async () => {
const release = await buildMutex.acquire()
timeoutIds.forEach((id) => clearTimeout(id))
timeoutIds.clear()
const perf = new PerfTimer() const buildStart = new Date().getTime()
console.log(chalk.yellow("Detected change, rebuilding...")) lastBuildMs = buildStart
try { const release = await mut.acquire()
const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) if (lastBuildMs > buildStart) {
release()
return
}
const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] const perf = new PerfTimer()
.filter((fp) => !toRemove.has(fp)) console.log(chalk.yellow("Detected change, rebuilding..."))
.map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) try {
const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp))
ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])]
const parsedContent = await parseMarkdown(ctx, filesToRebuild) .filter((fp) => !toRemove.has(fp))
for (const content of parsedContent) { .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath))
const [_tree, vfile] = content
contentMap.set(vfile.data.filePath!, content)
}
for (const fp of toRemove) { ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])]
contentMap.delete(fp) const parsedContent = await parseMarkdown(ctx, filesToRebuild)
} for (const content of parsedContent) {
const [_tree, vfile] = content
contentMap.set(vfile.data.filePath!, content)
}
// TODO: we can probably traverse the link graph to figure out what's safe to delete here for (const fp of toRemove) {
// instead of just deleting everything contentMap.delete(fp)
await rimraf(argv.output) }
const parsedFiles = [...contentMap.values()]
const filteredContent = filterContent(ctx, parsedFiles)
await emitContent(ctx, filteredContent)
console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`))
} catch {
console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`))
}
clientRefresh() const parsedFiles = [...contentMap.values()]
toRebuild.clear() const filteredContent = filterContent(ctx, parsedFiles)
toRemove.clear() // TODO: we can probably traverse the link graph to figure out what's safe to delete here
release() // instead of just deleting everything
}, 250), await rimraf(argv.output)
) await emitContent(ctx, filteredContent)
console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`))
} catch {
console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`))
}
clientRefresh()
toRebuild.clear()
toRemove.clear()
release()
} }
const watcher = chokidar.watch(".", { const watcher = chokidar.watch(".", {
@ -164,11 +167,15 @@ async function startServing(
.on("add", (fp) => rebuild(fp, "add")) .on("add", (fp) => rebuild(fp, "add"))
.on("change", (fp) => rebuild(fp, "change")) .on("change", (fp) => rebuild(fp, "change"))
.on("unlink", (fp) => rebuild(fp, "delete")) .on("unlink", (fp) => rebuild(fp, "delete"))
return async () => {
await watcher.close()
}
} }
export default async (argv: Argv, clientRefresh: () => void) => { export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => {
try { try {
return await buildQuartz(argv, clientRefresh) return await buildQuartz(argv, mut, clientRefresh)
} catch (err) { } catch (err) {
trace("\nExiting Quartz due to a fatal error", err as Error) trace("\nExiting Quartz due to a fatal error", err as Error)
} }

View File

@ -1,3 +1,4 @@
import { ValidDateType } from "./components/Date"
import { QuartzComponent } from "./components/types" import { QuartzComponent } from "./components/types"
import { PluginTypes } from "./plugins/types" import { PluginTypes } from "./plugins/types"
import { Theme } from "./util/theme" import { Theme } from "./util/theme"
@ -22,6 +23,8 @@ export interface GlobalConfiguration {
analytics: Analytics analytics: Analytics
/** Glob patterns to not search */ /** Glob patterns to not search */
ignorePatterns: string[] ignorePatterns: string[]
/** Whether to use created, modified, or published as the default type of date */
defaultDateType: ValidDateType
/** Base URL to use for CNAME files, sitemaps, and RSS feeds that require an absolute URL. /** Base URL to use for CNAME files, sitemaps, and RSS feeds that require an absolute URL.
* Quartz will avoid using this as much as possible and use relative URLs most of the time * Quartz will avoid using this as much as possible and use relative URLs most of the time
*/ */

View File

@ -1,15 +1,16 @@
import { formatDate } from "./Date" import { formatDate, getDate } from "./Date"
import { QuartzComponentConstructor, QuartzComponentProps } from "./types" import { QuartzComponentConstructor, QuartzComponentProps } from "./types"
import readingTime from "reading-time" import readingTime from "reading-time"
export default (() => { export default (() => {
function ContentMetadata({ fileData }: QuartzComponentProps) { function ContentMetadata({ cfg, fileData }: QuartzComponentProps) {
const text = fileData.text const text = fileData.text
if (text) { if (text) {
const segments: string[] = [] const segments: string[] = []
const { text: timeTaken, words: _words } = readingTime(text) const { text: timeTaken, words: _words } = readingTime(text)
if (fileData.dates?.modified) {
segments.push(formatDate(fileData.dates.modified)) if (fileData.dates) {
segments.push(formatDate(getDate(cfg, fileData)!))
} }
segments.push(timeTaken) segments.push(timeTaken)

View File

@ -1,7 +1,21 @@
import { GlobalConfiguration } from "../cfg"
import { QuartzPluginData } from "../plugins/vfile"
interface Props { interface Props {
date: Date date: Date
} }
export type ValidDateType = keyof Required<QuartzPluginData>["dates"]
export function getDate(cfg: GlobalConfiguration, data: QuartzPluginData): Date | undefined {
if (!cfg.defaultDateType) {
throw new Error(
`Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`,
)
}
return data.dates?.[cfg.defaultDateType]
}
export function formatDate(d: Date): string { export function formatDate(d: Date): string {
return d.toLocaleDateString("en-US", { return d.toLocaleDateString("en-US", {
year: "numeric", year: "numeric",

View File

@ -1,31 +1,36 @@
import { FullSlug, resolveRelative } from "../util/path" import { FullSlug, resolveRelative } from "../util/path"
import { QuartzPluginData } from "../plugins/vfile" import { QuartzPluginData } from "../plugins/vfile"
import { Date } from "./Date" import { Date, getDate } from "./Date"
import { QuartzComponentProps } from "./types" import { QuartzComponentProps } from "./types"
import { GlobalConfiguration } from "../cfg"
export function byDateAndAlphabetical(f1: QuartzPluginData, f2: QuartzPluginData): number { export function byDateAndAlphabetical(
if (f1.dates && f2.dates) { cfg: GlobalConfiguration,
// sort descending by last modified ): (f1: QuartzPluginData, f2: QuartzPluginData) => number {
return f2.dates.modified.getTime() - f1.dates.modified.getTime() return (f1, f2) => {
} else if (f1.dates && !f2.dates) { if (f1.dates && f2.dates) {
// prioritize files with dates // sort descending
return -1 return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime()
} else if (!f1.dates && f2.dates) { } else if (f1.dates && !f2.dates) {
return 1 // prioritize files with dates
return -1
} else if (!f1.dates && f2.dates) {
return 1
}
// otherwise, sort lexographically by title
const f1Title = f1.frontmatter?.title.toLowerCase() ?? ""
const f2Title = f2.frontmatter?.title.toLowerCase() ?? ""
return f1Title.localeCompare(f2Title)
} }
// otherwise, sort lexographically by title
const f1Title = f1.frontmatter?.title.toLowerCase() ?? ""
const f2Title = f2.frontmatter?.title.toLowerCase() ?? ""
return f1Title.localeCompare(f2Title)
} }
type Props = { type Props = {
limit?: number limit?: number
} & QuartzComponentProps } & QuartzComponentProps
export function PageList({ fileData, allFiles, limit }: Props) { export function PageList({ cfg, fileData, allFiles, limit }: Props) {
let list = allFiles.sort(byDateAndAlphabetical) let list = allFiles.sort(byDateAndAlphabetical(cfg))
if (limit) { if (limit) {
list = list.slice(0, limit) list = list.slice(0, limit)
} }
@ -41,7 +46,7 @@ export function PageList({ fileData, allFiles, limit }: Props) {
<div class="section"> <div class="section">
{page.dates && ( {page.dates && (
<p class="meta"> <p class="meta">
<Date date={page.dates.modified} /> <Date date={getDate(cfg, page)!} />
</p> </p>
)} )}
<div class="desc"> <div class="desc">

View File

@ -3,7 +3,8 @@ import { FullSlug, SimpleSlug, resolveRelative } from "../util/path"
import { QuartzPluginData } from "../plugins/vfile" import { QuartzPluginData } from "../plugins/vfile"
import { byDateAndAlphabetical } from "./PageList" import { byDateAndAlphabetical } from "./PageList"
import style from "./styles/recentNotes.scss" import style from "./styles/recentNotes.scss"
import { Date } from "./Date" import { Date, getDate } from "./Date"
import { GlobalConfiguration } from "../cfg"
interface Options { interface Options {
title: string title: string
@ -13,18 +14,18 @@ interface Options {
sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number
} }
const defaultOptions: Options = { const defaultOptions = (cfg: GlobalConfiguration): Options => ({
title: "Recent Notes", title: "Recent Notes",
limit: 3, limit: 3,
linkToMore: false, linkToMore: false,
filter: () => true, filter: () => true,
sort: byDateAndAlphabetical, sort: byDateAndAlphabetical(cfg),
} })
export default ((userOpts?: Partial<Options>) => { export default ((userOpts?: Partial<Options>) => {
const opts = { ...defaultOptions, ...userOpts }
function RecentNotes(props: QuartzComponentProps) { function RecentNotes(props: QuartzComponentProps) {
const { allFiles, fileData, displayClass } = props const { allFiles, fileData, displayClass, cfg } = props
const opts = { ...defaultOptions(cfg), ...userOpts }
const pages = allFiles.filter(opts.filter).sort(opts.sort) const pages = allFiles.filter(opts.filter).sort(opts.sort)
const remaining = Math.max(0, pages.length - opts.limit) const remaining = Math.max(0, pages.length - opts.limit)
return ( return (
@ -47,7 +48,7 @@ export default ((userOpts?: Partial<Options>) => {
</div> </div>
{page.dates && ( {page.dates && (
<p class="meta"> <p class="meta">
<Date date={page.dates.modified} /> <Date date={getDate(cfg, page)!} />
</p> </p>
)} )}
<ul class="tags"> <ul class="tags">

View File

@ -44,7 +44,8 @@ TagList.css = `
a.tag-link { a.tag-link {
border-radius: 8px; border-radius: 8px;
background-color: var(--highlight); background-color: var(--highlight);
padding: 0.2rem 0.5rem; padding: 0.2rem 0.4rem;
margin: 0 0.1rem;
} }
` `

View File

@ -33,7 +33,9 @@ function FolderContent(props: QuartzComponentProps) {
return ( return (
<div class="popover-hint"> <div class="popover-hint">
<article>{content}</article> <article>
<p>{content}</p>
</article>
<p>{allPagesInFolder.length} items under this folder.</p> <p>{allPagesInFolder.length} items under this folder.</p>
<div> <div>
<PageList {...listProps} /> <PageList {...listProps} />

View File

@ -37,7 +37,9 @@ function TagContent(props: QuartzComponentProps) {
return ( return (
<div class="popover-hint"> <div class="popover-hint">
<article>{content}</article> <article>
<p>{content}</p>
</article>
<p>Found {tags.length} total tags.</p> <p>Found {tags.length} total tags.</p>
<div> <div>
{tags.map((tag) => { {tags.map((tag) => {

View File

@ -64,7 +64,7 @@ async function navigate(url: URL, isBack: boolean = false) {
// scroll into place and add history // scroll into place and add history
if (!isBack) { if (!isBack) {
if (url.hash) { if (url.hash) {
const el = document.getElementById(url.hash.substring(1)) const el = document.getElementById(decodeURIComponent(url.hash.substring(1)))
el?.scrollIntoView() el?.scrollIntoView()
} else { } else {
window.scrollTo({ top: 0 }) window.scrollTo({ top: 0 })
@ -79,7 +79,9 @@ async function navigate(url: URL, isBack: boolean = false) {
// delay setting the url until now // delay setting the url until now
// at this point everything is loaded so changing the url should resolve to the correct addresses // at this point everything is loaded so changing the url should resolve to the correct addresses
history.pushState({}, "", url) if (!isBack) {
history.pushState({}, "", url)
}
notifyNav(getFullSlug(window)) notifyNav(getFullSlug(window))
delete announcer.dataset.persist delete announcer.dataset.persist
} }

View File

@ -34,6 +34,7 @@
border-radius: 5px; border-radius: 5px;
box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25); box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25);
overflow: auto; overflow: auto;
white-space: normal;
} }
h1 { h1 {

View File

@ -1,4 +1,5 @@
import { GlobalConfiguration } from "../../cfg" import { GlobalConfiguration } from "../../cfg"
import { getDate } from "../../components/Date"
import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path" import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path"
import { QuartzEmitterPlugin } from "../types" import { QuartzEmitterPlugin } from "../types"
import path from "path" import path from "path"
@ -22,7 +23,7 @@ interface Options {
const defaultOptions: Options = { const defaultOptions: Options = {
enableSiteMap: true, enableSiteMap: true,
enableRSS: true, enableRSS: true,
includeEmptyFiles: false, includeEmptyFiles: true,
} }
function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string {
@ -41,26 +42,26 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex): string {
const base = cfg.baseUrl ?? "" const base = cfg.baseUrl ?? ""
const root = `https://${base}` const root = `https://${base}`
const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `<items> const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `<item>
<title>${content.title}</title> <title>${content.title}</title>
<link>${root}/${slug}</link> <link>${root}/${slug}</link>
<guid>${root}/${slug}</guid> <guid>${root}/${slug}</guid>
<description>${content.description}</description> <description>${content.description}</description>
<pubDate>${content.date?.toUTCString()}</pubDate> <pubDate>${content.date?.toUTCString()}</pubDate>
</items>` </item>`
const items = Array.from(idx) const items = Array.from(idx)
.map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) .map(([slug, content]) => createURLEntry(simplifySlug(slug), content))
.join("") .join("")
return `<rss xmlns:atom="http://www.w3.org/2005/atom" version="2.0"> return `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel> <channel>
<title>${cfg.pageTitle}</title> <title>${cfg.pageTitle}</title>
<link>${root}</link> <link>${root}</link>
<description>Recent content on ${cfg.pageTitle}</description> <description>Recent content on ${cfg.pageTitle}</description>
<generator>Quartz -- quartz.jzhao.xyz</generator> <generator>Quartz -- quartz.jzhao.xyz</generator>
<atom:link href="${root}/index.xml" rel="self" type="application/rss+xml"/> ${items}
</channel> </channel>
${items}
</rss>` </rss>`
} }
@ -74,7 +75,7 @@ export const ContentIndex: QuartzEmitterPlugin<Partial<Options>> = (opts) => {
const linkIndex: ContentIndex = new Map() const linkIndex: ContentIndex = new Map()
for (const [_tree, file] of content) { for (const [_tree, file] of content) {
const slug = file.data.slug! const slug = file.data.slug!
const date = file.data.dates?.modified ?? new Date() const date = getDate(ctx.cfg.configuration, file.data) ?? new Date()
if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) { if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) {
linkIndex.set(slug, { linkIndex.set(slug, {
title: file.data.frontmatter?.title!, title: file.data.frontmatter?.title!,

View File

@ -41,7 +41,7 @@ export const FrontMatter: QuartzTransformerPlugin<Partial<Options> | undefined>
} }
// slug them all!! // slug them all!!
data.tags = data.tags?.map((tag: string) => slugTag(tag)) ?? [] data.tags = [...new Set(data.tags?.map((tag: string) => slugTag(tag)))] ?? []
// fill in frontmatter // fill in frontmatter
file.data.frontmatter = { file.data.frontmatter = {

View File

@ -60,11 +60,17 @@ export const CrawlLinks: QuartzTransformerPlugin<Partial<Options> | undefined> =
dest, dest,
transformOptions, transformOptions,
) )
// url.resolve is considered legacy
// WHATWG equivalent https://nodejs.dev/en/api/v18/url/#urlresolvefrom-to
const url = new URL(dest, `https://base.com/${curSlug}`) const url = new URL(dest, `https://base.com/${curSlug}`)
const canonicalDest = url.pathname const canonicalDest = url.pathname
const [destCanonical, _destAnchor] = splitAnchor(canonicalDest) const [destCanonical, _destAnchor] = splitAnchor(canonicalDest)
const simple = decodeURI(simplifySlug(destCanonical as FullSlug)) as SimpleSlug
// need to decodeURIComponent here as WHATWG URL percent-encodes everything
const simple = decodeURIComponent(
simplifySlug(destCanonical as FullSlug),
) as SimpleSlug
outgoing.add(simple) outgoing.add(simple)
} }

View File

@ -116,7 +116,7 @@ const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/)
const calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm") const calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm")
// (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line // (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line
// #(\w+) -> tag itself is # followed by a string of alpha-numeric characters // #(\w+) -> tag itself is # followed by a string of alpha-numeric characters
const tagRegex = new RegExp(/(?:^| )#([\w-_\/]+)/, "g") const tagRegex = new RegExp(/(?:^| )#(\p{L}+)/, "gu")
export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options> | undefined> = ( export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options> | undefined> = (
userOpts, userOpts,
@ -382,8 +382,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>
plugins.push(() => { plugins.push(() => {
return (tree: Root, file) => { return (tree: Root, file) => {
const base = pathToRoot(file.data.slug!) const base = pathToRoot(file.data.slug!)
findAndReplace(tree, tagRegex, (value: string, tag: string) => { findAndReplace(tree, tagRegex, (_value: string, tag: string) => {
if (file.data.frontmatter) { if (file.data.frontmatter && !file.data.frontmatter.tags.includes(tag)) {
file.data.frontmatter.tags.push(tag) file.data.frontmatter.tags.push(tag)
} }
@ -398,7 +398,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>
children: [ children: [
{ {
type: "text", type: "text",
value, value: `#${tag}`,
}, },
], ],
} }

View File

@ -2,7 +2,7 @@ import { QuartzTransformerPlugin } from "../types"
import { Root } from "mdast" import { Root } from "mdast"
import { visit } from "unist-util-visit" import { visit } from "unist-util-visit"
import { toString } from "mdast-util-to-string" import { toString } from "mdast-util-to-string"
import { slug as slugAnchor } from "github-slugger" import Slugger from "github-slugger"
export interface Options { export interface Options {
maxDepth: 1 | 2 | 3 | 4 | 5 | 6 maxDepth: 1 | 2 | 3 | 4 | 5 | 6
@ -34,6 +34,7 @@ export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefin
return async (tree: Root, file) => { return async (tree: Root, file) => {
const display = file.data.frontmatter?.enableToc ?? opts.showByDefault const display = file.data.frontmatter?.enableToc ?? opts.showByDefault
if (display) { if (display) {
const slugAnchor = new Slugger()
const toc: TocEntry[] = [] const toc: TocEntry[] = []
let highestDepth: number = opts.maxDepth let highestDepth: number = opts.maxDepth
visit(tree, "heading", (node) => { visit(tree, "heading", (node) => {
@ -43,7 +44,7 @@ export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefin
toc.push({ toc.push({
depth: node.depth, depth: node.depth,
text, text,
slug: slugAnchor(text), slug: slugAnchor.slug(text),
}) })
} }
}) })

View File

@ -27,6 +27,11 @@ section {
border-radius: 5px; border-radius: 5px;
} }
::selection {
background: color-mix(in srgb, var(--tertiary) 75%, transparent);
color: var(--darkgray);
}
p, p,
ul, ul,
text, text,

View File

@ -52,7 +52,7 @@ export function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {
let slug = withoutFileExt let slug = withoutFileExt
.split("/") .split("/")
.map((segment) => segment.replace(/\s/g, "-")) // slugify all segments .map((segment) => segment.replace(/\s/g, "-").replace(/%/g, "-percent")) // slugify all segments
.join("/") // always use / as sep .join("/") // always use / as sep
.replace(/\/$/, "") // remove trailing slash .replace(/\/$/, "") // remove trailing slash