Merge remote-tracking branch 'upstream/v4' into v4
This commit is contained in:
		
							
								
								
									
										3
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,9 @@ | ||||
| name: Build and Test | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - v4 | ||||
|   push: | ||||
|     branches: | ||||
|       - v4 | ||||
|   | ||||
							
								
								
									
										0
									
								
								content/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								content/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										404
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										404
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,23 +1,23 @@ | ||||
| { | ||||
|   "name": "@jackyzha0/quartz", | ||||
|   "version": "4.0.8", | ||||
|   "version": "4.0.10", | ||||
|   "lockfileVersion": 3, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "@jackyzha0/quartz", | ||||
|       "version": "4.0.8", | ||||
|       "version": "4.0.10", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "@clack/prompts": "^0.6.3", | ||||
|         "@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", | ||||
|         "chalk": "^4.1.2", | ||||
|         "chokidar": "^3.5.3", | ||||
|         "cli-spinner": "^0.2.10", | ||||
|         "d3": "^7.8.5", | ||||
|         "esbuild-sass-plugin": "^2.9.0", | ||||
|         "esbuild-sass-plugin": "^2.12.0", | ||||
|         "flexsearch": "0.7.21", | ||||
|         "github-slugger": "^2.0.0", | ||||
|         "globby": "^13.1.4", | ||||
| @@ -27,7 +27,7 @@ | ||||
|         "hast-util-to-string": "^2.0.0", | ||||
|         "is-absolute-url": "^4.0.1", | ||||
|         "js-yaml": "^4.1.0", | ||||
|         "lightningcss": "^1.21.5", | ||||
|         "lightningcss": "1.21.7", | ||||
|         "mdast-util-find-and-replace": "^2.2.2", | ||||
|         "mdast-util-to-hast": "^12.3.0", | ||||
|         "mdast-util-to-string": "^3.2.0", | ||||
| @@ -77,7 +77,7 @@ | ||||
|         "@types/workerpool": "^6.4.0", | ||||
|         "@types/ws": "^8.5.5", | ||||
|         "@types/yargs": "^17.0.24", | ||||
|         "esbuild": "^0.18.11", | ||||
|         "esbuild": "0.19.2", | ||||
|         "prettier": "^3.0.0", | ||||
|         "tsx": "^3.12.7", | ||||
|         "typescript": "^5.0.4" | ||||
| @@ -540,9 +540,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/android-arm": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", | ||||
|       "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", | ||||
|       "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", | ||||
|       "cpu": [ | ||||
|         "arm" | ||||
|       ], | ||||
| @@ -555,9 +555,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/android-arm64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", | ||||
|       "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", | ||||
|       "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -570,9 +570,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/android-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -585,9 +585,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/darwin-arm64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", | ||||
|       "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", | ||||
|       "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -600,9 +600,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/darwin-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -615,9 +615,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/freebsd-arm64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", | ||||
|       "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", | ||||
|       "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -630,9 +630,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/freebsd-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -645,9 +645,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-arm": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", | ||||
|       "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", | ||||
|       "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", | ||||
|       "cpu": [ | ||||
|         "arm" | ||||
|       ], | ||||
| @@ -660,9 +660,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-arm64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", | ||||
|       "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", | ||||
|       "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -675,9 +675,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-ia32": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", | ||||
|       "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", | ||||
|       "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", | ||||
|       "cpu": [ | ||||
|         "ia32" | ||||
|       ], | ||||
| @@ -690,9 +690,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-loong64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", | ||||
|       "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", | ||||
|       "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", | ||||
|       "cpu": [ | ||||
|         "loong64" | ||||
|       ], | ||||
| @@ -705,9 +705,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-mips64el": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", | ||||
|       "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", | ||||
|       "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", | ||||
|       "cpu": [ | ||||
|         "mips64el" | ||||
|       ], | ||||
| @@ -720,9 +720,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-ppc64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", | ||||
|       "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", | ||||
|       "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", | ||||
|       "cpu": [ | ||||
|         "ppc64" | ||||
|       ], | ||||
| @@ -735,9 +735,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-riscv64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", | ||||
|       "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", | ||||
|       "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", | ||||
|       "cpu": [ | ||||
|         "riscv64" | ||||
|       ], | ||||
| @@ -750,9 +750,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-s390x": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", | ||||
|       "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", | ||||
|       "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", | ||||
|       "cpu": [ | ||||
|         "s390x" | ||||
|       ], | ||||
| @@ -765,9 +765,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/linux-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -780,9 +780,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/netbsd-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -795,9 +795,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/openbsd-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -810,9 +810,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/sunos-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -825,9 +825,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/win32-arm64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", | ||||
|       "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", | ||||
|       "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -840,9 +840,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/win32-ia32": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", | ||||
|       "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", | ||||
|       "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", | ||||
|       "cpu": [ | ||||
|         "ia32" | ||||
|       ], | ||||
| @@ -855,9 +855,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@esbuild/win32-x64": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", | ||||
|       "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", | ||||
|       "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -899,30 +899,30 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.8.tgz", | ||||
|       "integrity": "sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.9.tgz", | ||||
|       "integrity": "sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==", | ||||
|       "engines": { | ||||
|         "node": ">= 10" | ||||
|       }, | ||||
|       "optionalDependencies": { | ||||
|         "@napi-rs/simple-git-android-arm-eabi": "0.1.8", | ||||
|         "@napi-rs/simple-git-android-arm64": "0.1.8", | ||||
|         "@napi-rs/simple-git-darwin-arm64": "0.1.8", | ||||
|         "@napi-rs/simple-git-darwin-x64": "0.1.8", | ||||
|         "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.8", | ||||
|         "@napi-rs/simple-git-linux-arm64-gnu": "0.1.8", | ||||
|         "@napi-rs/simple-git-linux-arm64-musl": "0.1.8", | ||||
|         "@napi-rs/simple-git-linux-x64-gnu": "0.1.8", | ||||
|         "@napi-rs/simple-git-linux-x64-musl": "0.1.8", | ||||
|         "@napi-rs/simple-git-win32-arm64-msvc": "0.1.8", | ||||
|         "@napi-rs/simple-git-win32-x64-msvc": "0.1.8" | ||||
|         "@napi-rs/simple-git-android-arm-eabi": "0.1.9", | ||||
|         "@napi-rs/simple-git-android-arm64": "0.1.9", | ||||
|         "@napi-rs/simple-git-darwin-arm64": "0.1.9", | ||||
|         "@napi-rs/simple-git-darwin-x64": "0.1.9", | ||||
|         "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.9", | ||||
|         "@napi-rs/simple-git-linux-arm64-gnu": "0.1.9", | ||||
|         "@napi-rs/simple-git-linux-arm64-musl": "0.1.9", | ||||
|         "@napi-rs/simple-git-linux-x64-gnu": "0.1.9", | ||||
|         "@napi-rs/simple-git-linux-x64-musl": "0.1.9", | ||||
|         "@napi-rs/simple-git-win32-arm64-msvc": "0.1.9", | ||||
|         "@napi-rs/simple-git-win32-x64-msvc": "0.1.9" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-android-arm-eabi": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz", | ||||
|       "integrity": "sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.9.tgz", | ||||
|       "integrity": "sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==", | ||||
|       "cpu": [ | ||||
|         "arm" | ||||
|       ], | ||||
| @@ -935,9 +935,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-android-arm64": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz", | ||||
|       "integrity": "sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.9.tgz", | ||||
|       "integrity": "sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -950,9 +950,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-darwin-arm64": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz", | ||||
|       "integrity": "sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.9.tgz", | ||||
|       "integrity": "sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -965,9 +965,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-darwin-x64": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz", | ||||
|       "integrity": "sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.9.tgz", | ||||
|       "integrity": "sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -980,9 +980,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz", | ||||
|       "integrity": "sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.9.tgz", | ||||
|       "integrity": "sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==", | ||||
|       "cpu": [ | ||||
|         "arm" | ||||
|       ], | ||||
| @@ -995,13 +995,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz", | ||||
|       "integrity": "sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.9.tgz", | ||||
|       "integrity": "sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
|       "hasInstallScript": true, | ||||
|       "optional": true, | ||||
|       "os": [ | ||||
|         "linux" | ||||
| @@ -1011,13 +1010,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-linux-arm64-musl": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz", | ||||
|       "integrity": "sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.9.tgz", | ||||
|       "integrity": "sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
|       "hasInstallScript": true, | ||||
|       "optional": true, | ||||
|       "os": [ | ||||
|         "linux" | ||||
| @@ -1027,13 +1025,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-linux-x64-gnu": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz", | ||||
|       "integrity": "sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.9.tgz", | ||||
|       "integrity": "sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
|       "hasInstallScript": true, | ||||
|       "optional": true, | ||||
|       "os": [ | ||||
|         "linux" | ||||
| @@ -1043,13 +1040,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-linux-x64-musl": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz", | ||||
|       "integrity": "sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.9.tgz", | ||||
|       "integrity": "sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
|       "hasInstallScript": true, | ||||
|       "optional": true, | ||||
|       "os": [ | ||||
|         "linux" | ||||
| @@ -1059,9 +1055,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz", | ||||
|       "integrity": "sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.9.tgz", | ||||
|       "integrity": "sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -1074,9 +1070,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@napi-rs/simple-git-win32-x64-msvc": { | ||||
|       "version": "0.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz", | ||||
|       "integrity": "sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==", | ||||
|       "version": "0.1.9", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.9.tgz", | ||||
|       "integrity": "sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -2441,9 +2437,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/esbuild": { | ||||
|       "version": "0.18.11", | ||||
|       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", | ||||
|       "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", | ||||
|       "version": "0.19.2", | ||||
|       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", | ||||
|       "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", | ||||
|       "hasInstallScript": true, | ||||
|       "bin": { | ||||
|         "esbuild": "bin/esbuild" | ||||
| @@ -2452,40 +2448,40 @@ | ||||
|         "node": ">=12" | ||||
|       }, | ||||
|       "optionalDependencies": { | ||||
|         "@esbuild/android-arm": "0.18.11", | ||||
|         "@esbuild/android-arm64": "0.18.11", | ||||
|         "@esbuild/android-x64": "0.18.11", | ||||
|         "@esbuild/darwin-arm64": "0.18.11", | ||||
|         "@esbuild/darwin-x64": "0.18.11", | ||||
|         "@esbuild/freebsd-arm64": "0.18.11", | ||||
|         "@esbuild/freebsd-x64": "0.18.11", | ||||
|         "@esbuild/linux-arm": "0.18.11", | ||||
|         "@esbuild/linux-arm64": "0.18.11", | ||||
|         "@esbuild/linux-ia32": "0.18.11", | ||||
|         "@esbuild/linux-loong64": "0.18.11", | ||||
|         "@esbuild/linux-mips64el": "0.18.11", | ||||
|         "@esbuild/linux-ppc64": "0.18.11", | ||||
|         "@esbuild/linux-riscv64": "0.18.11", | ||||
|         "@esbuild/linux-s390x": "0.18.11", | ||||
|         "@esbuild/linux-x64": "0.18.11", | ||||
|         "@esbuild/netbsd-x64": "0.18.11", | ||||
|         "@esbuild/openbsd-x64": "0.18.11", | ||||
|         "@esbuild/sunos-x64": "0.18.11", | ||||
|         "@esbuild/win32-arm64": "0.18.11", | ||||
|         "@esbuild/win32-ia32": "0.18.11", | ||||
|         "@esbuild/win32-x64": "0.18.11" | ||||
|         "@esbuild/android-arm": "0.19.2", | ||||
|         "@esbuild/android-arm64": "0.19.2", | ||||
|         "@esbuild/android-x64": "0.19.2", | ||||
|         "@esbuild/darwin-arm64": "0.19.2", | ||||
|         "@esbuild/darwin-x64": "0.19.2", | ||||
|         "@esbuild/freebsd-arm64": "0.19.2", | ||||
|         "@esbuild/freebsd-x64": "0.19.2", | ||||
|         "@esbuild/linux-arm": "0.19.2", | ||||
|         "@esbuild/linux-arm64": "0.19.2", | ||||
|         "@esbuild/linux-ia32": "0.19.2", | ||||
|         "@esbuild/linux-loong64": "0.19.2", | ||||
|         "@esbuild/linux-mips64el": "0.19.2", | ||||
|         "@esbuild/linux-ppc64": "0.19.2", | ||||
|         "@esbuild/linux-riscv64": "0.19.2", | ||||
|         "@esbuild/linux-s390x": "0.19.2", | ||||
|         "@esbuild/linux-x64": "0.19.2", | ||||
|         "@esbuild/netbsd-x64": "0.19.2", | ||||
|         "@esbuild/openbsd-x64": "0.19.2", | ||||
|         "@esbuild/sunos-x64": "0.19.2", | ||||
|         "@esbuild/win32-arm64": "0.19.2", | ||||
|         "@esbuild/win32-ia32": "0.19.2", | ||||
|         "@esbuild/win32-x64": "0.19.2" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/esbuild-sass-plugin": { | ||||
|       "version": "2.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.10.0.tgz", | ||||
|       "integrity": "sha512-STv849QGT8g77RRFmroSt4VBVKjv+dypKcO4aWz8IP4G5JbRH0KC0+B8ODuzlUNu9R5MbkGcev/62RDP/JcZ2Q==", | ||||
|       "version": "2.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.12.0.tgz", | ||||
|       "integrity": "sha512-+k/5WM/Yf/Ur7ahn6XXxEPwa/lmuacLO7vrCIAJuvQapX1CiIHtlX/nc2eiMoJ6P6RvqZhKpQvIiwgYJonzHtw==", | ||||
|       "dependencies": { | ||||
|         "resolve": "^1.22.2", | ||||
|         "sass": "^1.63.0" | ||||
|         "sass": "^1.65.1" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "esbuild": "^0.18.0" | ||||
|         "esbuild": "^0.19.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/escalade": { | ||||
| @@ -3147,9 +3143,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/immutable": { | ||||
|       "version": "4.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", | ||||
|       "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" | ||||
|       "version": "4.3.3", | ||||
|       "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", | ||||
|       "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==" | ||||
|     }, | ||||
|     "node_modules/inline-style-parser": { | ||||
|       "version": "0.1.1", | ||||
| @@ -3412,9 +3408,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.5.tgz", | ||||
|       "integrity": "sha512-/pEUPeih2EwIx9n4T82aOG6CInN83tl/mWlw6B5gWLf36UplQi1L+5p3FUHsdt4fXVfOkkh9KIaM3owoq7ss8A==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.7.tgz", | ||||
|       "integrity": "sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==", | ||||
|       "dependencies": { | ||||
|         "detect-libc": "^1.0.3" | ||||
|       }, | ||||
| @@ -3426,20 +3422,21 @@ | ||||
|         "url": "https://opencollective.com/parcel" | ||||
|       }, | ||||
|       "optionalDependencies": { | ||||
|         "lightningcss-darwin-arm64": "1.21.5", | ||||
|         "lightningcss-darwin-x64": "1.21.5", | ||||
|         "lightningcss-linux-arm-gnueabihf": "1.21.5", | ||||
|         "lightningcss-linux-arm64-gnu": "1.21.5", | ||||
|         "lightningcss-linux-arm64-musl": "1.21.5", | ||||
|         "lightningcss-linux-x64-gnu": "1.21.5", | ||||
|         "lightningcss-linux-x64-musl": "1.21.5", | ||||
|         "lightningcss-win32-x64-msvc": "1.21.5" | ||||
|         "lightningcss-darwin-arm64": "1.21.7", | ||||
|         "lightningcss-darwin-x64": "1.21.7", | ||||
|         "lightningcss-freebsd-x64": "1.21.7", | ||||
|         "lightningcss-linux-arm-gnueabihf": "1.21.7", | ||||
|         "lightningcss-linux-arm64-gnu": "1.21.7", | ||||
|         "lightningcss-linux-arm64-musl": "1.21.7", | ||||
|         "lightningcss-linux-x64-gnu": "1.21.7", | ||||
|         "lightningcss-linux-x64-musl": "1.21.7", | ||||
|         "lightningcss-win32-x64-msvc": "1.21.7" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-darwin-arm64": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.5.tgz", | ||||
|       "integrity": "sha512-z05hyLX85WY0UfhkFUOrWEFqD69lpVAmgl3aDzMKlIZJGygbhbegqb4PV8qfUrKKNBauut/qVNPKZglhTaDDxA==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.7.tgz", | ||||
|       "integrity": "sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -3456,9 +3453,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-darwin-x64": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.5.tgz", | ||||
|       "integrity": "sha512-MSJhmej/U9MrdPxDk7+FWhO8+UqVoZUHG4VvKT5RQ4RJtqtANTiWiI97LvoVNMtdMnHaKs1Pkji6wHUFxjJsHQ==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.7.tgz", | ||||
|       "integrity": "sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -3474,10 +3471,29 @@ | ||||
|         "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": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.5.tgz", | ||||
|       "integrity": "sha512-xN6+5/JsMrbZHL1lPl+MiNJ3Xza12ueBKPepiyDCFQzlhFRTj7D0LG+cfNTzPBTO8KcYQynLpl1iBB8LGp3Xtw==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.7.tgz", | ||||
|       "integrity": "sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==", | ||||
|       "cpu": [ | ||||
|         "arm" | ||||
|       ], | ||||
| @@ -3494,9 +3510,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-linux-arm64-gnu": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.5.tgz", | ||||
|       "integrity": "sha512-KfzFNhC4XTbmG3ma/xcTs/IhCwieW89XALIusKmnV0N618ZDXEB0XjWOYQRCXeK9mfqPdbTBpurEHV/XZtkniQ==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.7.tgz", | ||||
|       "integrity": "sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -3513,9 +3529,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-linux-arm64-musl": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.5.tgz", | ||||
|       "integrity": "sha512-bc0GytQO5Mn9QM6szaZ+31fQHNdidgpM1sSCwzPItz8hg3wOvKl8039rU0veMJV3ZgC9z0ypNRceLrSHeRHmXw==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.7.tgz", | ||||
|       "integrity": "sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==", | ||||
|       "cpu": [ | ||||
|         "arm64" | ||||
|       ], | ||||
| @@ -3532,9 +3548,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-linux-x64-gnu": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.5.tgz", | ||||
|       "integrity": "sha512-JwMbgypPQgc2kW2av3OwzZ8cbrEuIiDiXPJdXRE6aVxu67yHauJawQLqJKTGUhiAhy6iLDG8Wg0a3/ziL+m+Kw==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.7.tgz", | ||||
|       "integrity": "sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -3551,9 +3567,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-linux-x64-musl": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.5.tgz", | ||||
|       "integrity": "sha512-Ib8b6IQ/OR/VrPU6YBgy4T3QnuHY7DUa95O+nz+cwrTkMSN6fuHcTcIaz4t8TJ6HI5pl3uxUOZjmtls2pyQWow==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.7.tgz", | ||||
|       "integrity": "sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -3570,9 +3586,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lightningcss-win32-x64-msvc": { | ||||
|       "version": "1.21.5", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.5.tgz", | ||||
|       "integrity": "sha512-A8cSi8lUpBeVmoF+DqqW7cd0FemDbCuKr490IXdjyeI+KL8adpSKUs8tcqO0OXPh1EoDqK7JNkD/dELmd4Iz5g==", | ||||
|       "version": "1.21.7", | ||||
|       "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.7.tgz", | ||||
|       "integrity": "sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==", | ||||
|       "cpu": [ | ||||
|         "x64" | ||||
|       ], | ||||
| @@ -5159,9 +5175,9 @@ | ||||
|       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | ||||
|     }, | ||||
|     "node_modules/sass": { | ||||
|       "version": "1.63.6", | ||||
|       "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", | ||||
|       "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", | ||||
|       "version": "1.66.1", | ||||
|       "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", | ||||
|       "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", | ||||
|       "dependencies": { | ||||
|         "chokidar": ">=3.0.0 <4.0.0", | ||||
|         "immutable": "^4.0.0", | ||||
|   | ||||
							
								
								
									
										11
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								package.json
									
									
									
									
									
								
							| @@ -2,7 +2,7 @@ | ||||
|   "name": "@jackyzha0/quartz", | ||||
|   "description": "🌱 publish your digital garden and notes as a website", | ||||
|   "private": true, | ||||
|   "version": "4.0.8", | ||||
|   "version": "4.0.10", | ||||
|   "type": "module", | ||||
|   "author": "jackyzha0 <j.zhao2k19@gmail.com>", | ||||
|   "license": "MIT", | ||||
| @@ -12,6 +12,7 @@ | ||||
|     "url": "https://github.com/jackyzha0/quartz.git" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "docs": "npx quartz build --serve -d docs", | ||||
|     "check": "tsc --noEmit && npx prettier . --check", | ||||
|     "format": "npx prettier . --write", | ||||
|     "test": "tsx ./quartz/util/path.test.ts", | ||||
| @@ -34,13 +35,13 @@ | ||||
|   "dependencies": { | ||||
|     "@clack/prompts": "^0.6.3", | ||||
|     "@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", | ||||
|     "chalk": "^4.1.2", | ||||
|     "chokidar": "^3.5.3", | ||||
|     "cli-spinner": "^0.2.10", | ||||
|     "d3": "^7.8.5", | ||||
|     "esbuild-sass-plugin": "^2.9.0", | ||||
|     "esbuild-sass-plugin": "^2.12.0", | ||||
|     "flexsearch": "0.7.21", | ||||
|     "github-slugger": "^2.0.0", | ||||
|     "globby": "^13.1.4", | ||||
| @@ -50,7 +51,7 @@ | ||||
|     "hast-util-to-string": "^2.0.0", | ||||
|     "is-absolute-url": "^4.0.1", | ||||
|     "js-yaml": "^4.1.0", | ||||
|     "lightningcss": "^1.21.5", | ||||
|     "lightningcss": "1.21.7", | ||||
|     "mdast-util-find-and-replace": "^2.2.2", | ||||
|     "mdast-util-to-hast": "^12.3.0", | ||||
|     "mdast-util-to-string": "^3.2.0", | ||||
| @@ -97,7 +98,7 @@ | ||||
|     "@types/workerpool": "^6.4.0", | ||||
|     "@types/ws": "^8.5.5", | ||||
|     "@types/yargs": "^17.0.24", | ||||
|     "esbuild": "^0.18.11", | ||||
|     "esbuild": "0.19.2", | ||||
|     "prettier": "^3.0.0", | ||||
|     "tsx": "^3.12.7", | ||||
|     "typescript": "^5.0.4" | ||||
|   | ||||
| @@ -11,6 +11,7 @@ const config: QuartzConfig = { | ||||
|     }, | ||||
|     baseUrl: "garden.matsuuratomoya.com", | ||||
|     ignorePatterns: ["private", "templates"], | ||||
|     defaultDateType: "created", | ||||
|     theme: { | ||||
|       typography: { | ||||
|         header: "Schibsted Grotesk", | ||||
|   | ||||
| @@ -162,7 +162,6 @@ yargs(hideBin(process.argv)) | ||||
|             label: "Symlink an existing folder", | ||||
|             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") { | ||||
|       const originalFolder = escapePath( | ||||
|         exitIfCancel( | ||||
| @@ -205,8 +205,6 @@ yargs(hideBin(process.argv)) | ||||
|         await fs.promises.symlink(originalFolder, contentFolder, "dir") | ||||
|       } | ||||
|     } else if (setupStrategy === "new") { | ||||
|       await rmContentFolder() | ||||
|       await fs.promises.mkdir(contentFolder) | ||||
|       await fs.promises.writeFile( | ||||
|         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( | ||||
|       await select({ | ||||
|         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 timeoutIds = new Set() | ||||
|     let firstBuild = true | ||||
|     let lastBuildMs = 0 | ||||
|     let cleanupBuild = null | ||||
|     const build = async (clientRefresh) => { | ||||
|       const buildStart = new Date().getTime() | ||||
|       lastBuildMs = buildStart | ||||
|       const release = await buildMutex.acquire() | ||||
|       if (firstBuild) { | ||||
|         firstBuild = false | ||||
|       } else { | ||||
|       if (lastBuildMs > buildStart) { | ||||
|         release() | ||||
|         return | ||||
|       } | ||||
|  | ||||
|       if (cleanupBuild) { | ||||
|         await cleanupBuild() | ||||
|         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)}`) | ||||
|         process.exit(1) | ||||
|       }) | ||||
|       release() | ||||
|  | ||||
|       if (argv.bundleInfo) { | ||||
|         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 | ||||
|       // https://github.com/nodejs/modules/issues/307 | ||||
|       const { default: buildQuartz } = await import(cacheFile + `?update=${randomUUID()}`) | ||||
|       await buildQuartz(argv, clientRefresh) | ||||
|       cleanupBuild = await buildQuartz(argv, buildMutex, clientRefresh) | ||||
|       clientRefresh() | ||||
|       release() | ||||
|     } | ||||
|  | ||||
|     const rebuild = (clientRefresh) => { | ||||
|       timeoutIds.forEach((id) => clearTimeout(id)) | ||||
|       timeoutIds.clear() | ||||
|       timeoutIds.add(setTimeout(() => build(clientRefresh), 250)) | ||||
|     } | ||||
|  | ||||
|     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) | ||||
|  | ||||
|         const serve = async () => { | ||||
|           const release = await buildMutex.acquire() | ||||
|           await serveHandler(req, res, { | ||||
|             public: argv.output, | ||||
|             directoryListing: false, | ||||
| @@ -473,6 +472,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. | ||||
|           const statusString = | ||||
|             status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`) | ||||
|           console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`)) | ||||
|           release() | ||||
|         } | ||||
|  | ||||
|         const redirect = (newFp) => { | ||||
| @@ -539,7 +539,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. | ||||
|           ignoreInitial: true, | ||||
|         }) | ||||
|         .on("all", async () => { | ||||
|           rebuild(clientRefresh) | ||||
|           build(clientRefresh) | ||||
|         }) | ||||
|     } else { | ||||
|       await build(() => {}) | ||||
|   | ||||
| @@ -18,7 +18,7 @@ import { trace } from "./util/trace" | ||||
| import { options } from "./util/sourcemap" | ||||
| import { Mutex } from "async-mutex" | ||||
|  | ||||
| async function buildQuartz(argv: Argv, clientRefresh: () => void) { | ||||
| async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) { | ||||
|   const ctx: BuildCtx = { | ||||
|     argv, | ||||
|     cfg, | ||||
| @@ -38,13 +38,14 @@ async function buildQuartz(argv: Argv, clientRefresh: () => void) { | ||||
|     console.log(`  Emitters: ${pluginNames("emitters").join(", ")}`) | ||||
|   } | ||||
|  | ||||
|   const release = await mut.acquire() | ||||
|   perf.addEvent("clean") | ||||
|   await rimraf(output) | ||||
|   console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) | ||||
|  | ||||
|   perf.addEvent("glob") | ||||
|   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( | ||||
|     `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) | ||||
|   await emitContent(ctx, filteredContent) | ||||
|   console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)) | ||||
|   release() | ||||
|  | ||||
|   if (argv.serve) { | ||||
|     return startServing(ctx, parsedFiles, clientRefresh) | ||||
|     return startServing(ctx, mut, parsedFiles, clientRefresh) | ||||
|   } | ||||
| } | ||||
|  | ||||
| // setup watcher for rebuilds | ||||
| async function startServing( | ||||
|   ctx: BuildCtx, | ||||
|   mut: Mutex, | ||||
|   initialContent: ProcessedContent[], | ||||
|   clientRefresh: () => void, | ||||
| ) { | ||||
| @@ -78,8 +81,7 @@ async function startServing( | ||||
|   } | ||||
|  | ||||
|   const initialSlugs = ctx.allSlugs | ||||
|   const buildMutex = new Mutex() | ||||
|   const timeoutIds: Set<ReturnType<typeof setTimeout>> = new Set() | ||||
|   let lastBuildMs = 0 | ||||
|   const toRebuild: Set<FilePath> = new Set() | ||||
|   const toRemove: Set<FilePath> = new Set() | ||||
|   const trackedAssets: Set<FilePath> = new Set() | ||||
| @@ -109,49 +111,50 @@ async function startServing( | ||||
|     } | ||||
|  | ||||
|     // debounce rebuilds every 250ms | ||||
|     timeoutIds.add( | ||||
|       setTimeout(async () => { | ||||
|         const release = await buildMutex.acquire() | ||||
|         timeoutIds.forEach((id) => clearTimeout(id)) | ||||
|         timeoutIds.clear() | ||||
|  | ||||
|         const perf = new PerfTimer() | ||||
|         console.log(chalk.yellow("Detected change, rebuilding...")) | ||||
|         try { | ||||
|           const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) | ||||
|     const buildStart = new Date().getTime() | ||||
|     lastBuildMs = buildStart | ||||
|     const release = await mut.acquire() | ||||
|     if (lastBuildMs > buildStart) { | ||||
|       release() | ||||
|       return | ||||
|     } | ||||
|  | ||||
|           const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] | ||||
|             .filter((fp) => !toRemove.has(fp)) | ||||
|             .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) | ||||
|     const perf = new PerfTimer() | ||||
|     console.log(chalk.yellow("Detected change, rebuilding...")) | ||||
|     try { | ||||
|       const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) | ||||
|  | ||||
|           ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] | ||||
|           const parsedContent = await parseMarkdown(ctx, filesToRebuild) | ||||
|           for (const content of parsedContent) { | ||||
|             const [_tree, vfile] = content | ||||
|             contentMap.set(vfile.data.filePath!, content) | ||||
|           } | ||||
|       const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] | ||||
|         .filter((fp) => !toRemove.has(fp)) | ||||
|         .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) | ||||
|  | ||||
|           for (const fp of toRemove) { | ||||
|             contentMap.delete(fp) | ||||
|           } | ||||
|       ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] | ||||
|       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 | ||||
|           // instead of just deleting everything | ||||
|           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...`)) | ||||
|         } | ||||
|       for (const fp of toRemove) { | ||||
|         contentMap.delete(fp) | ||||
|       } | ||||
|  | ||||
|         clientRefresh() | ||||
|         toRebuild.clear() | ||||
|         toRemove.clear() | ||||
|         release() | ||||
|       }, 250), | ||||
|     ) | ||||
|       const parsedFiles = [...contentMap.values()] | ||||
|       const filteredContent = filterContent(ctx, parsedFiles) | ||||
|       // TODO: we can probably traverse the link graph to figure out what's safe to delete here | ||||
|       // instead of just deleting everything | ||||
|       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(".", { | ||||
| @@ -164,11 +167,15 @@ async function startServing( | ||||
|     .on("add", (fp) => rebuild(fp, "add")) | ||||
|     .on("change", (fp) => rebuild(fp, "change")) | ||||
|     .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 { | ||||
|     return await buildQuartz(argv, clientRefresh) | ||||
|     return await buildQuartz(argv, mut, clientRefresh) | ||||
|   } catch (err) { | ||||
|     trace("\nExiting Quartz due to a fatal error", err as Error) | ||||
|   } | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import { ValidDateType } from "./components/Date" | ||||
| import { QuartzComponent } from "./components/types" | ||||
| import { PluginTypes } from "./plugins/types" | ||||
| import { Theme } from "./util/theme" | ||||
| @@ -22,6 +23,8 @@ export interface GlobalConfiguration { | ||||
|   analytics: Analytics | ||||
|   /** Glob patterns to not search */ | ||||
|   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. | ||||
|    *   Quartz will avoid using this as much as possible and use relative URLs most of the time | ||||
|    */ | ||||
|   | ||||
| @@ -1,15 +1,16 @@ | ||||
| import { formatDate } from "./Date" | ||||
| import { formatDate, getDate } from "./Date" | ||||
| import { QuartzComponentConstructor, QuartzComponentProps } from "./types" | ||||
| import readingTime from "reading-time" | ||||
|  | ||||
| export default (() => { | ||||
|   function ContentMetadata({ fileData }: QuartzComponentProps) { | ||||
|   function ContentMetadata({ cfg, fileData }: QuartzComponentProps) { | ||||
|     const text = fileData.text | ||||
|     if (text) { | ||||
|       const segments: string[] = [] | ||||
|       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) | ||||
|   | ||||
| @@ -1,7 +1,21 @@ | ||||
| import { GlobalConfiguration } from "../cfg" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
|  | ||||
| interface Props { | ||||
|   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 { | ||||
|   return d.toLocaleDateString("en-US", { | ||||
|     year: "numeric", | ||||
|   | ||||
| @@ -1,31 +1,36 @@ | ||||
| import { FullSlug, resolveRelative } from "../util/path" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
| import { Date } from "./Date" | ||||
| import { Date, getDate } from "./Date" | ||||
| import { QuartzComponentProps } from "./types" | ||||
| import { GlobalConfiguration } from "../cfg" | ||||
|  | ||||
| export function byDateAndAlphabetical(f1: QuartzPluginData, f2: QuartzPluginData): number { | ||||
|   if (f1.dates && f2.dates) { | ||||
|     // sort descending by last modified | ||||
|     return f2.dates.modified.getTime() - f1.dates.modified.getTime() | ||||
|   } else if (f1.dates && !f2.dates) { | ||||
|     // prioritize files with dates | ||||
|     return -1 | ||||
|   } else if (!f1.dates && f2.dates) { | ||||
|     return 1 | ||||
| export function byDateAndAlphabetical( | ||||
|   cfg: GlobalConfiguration, | ||||
| ): (f1: QuartzPluginData, f2: QuartzPluginData) => number { | ||||
|   return (f1, f2) => { | ||||
|     if (f1.dates && f2.dates) { | ||||
|       // sort descending | ||||
|       return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime() | ||||
|     } else if (f1.dates && !f2.dates) { | ||||
|       // 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 = { | ||||
|   limit?: number | ||||
| } & QuartzComponentProps | ||||
|  | ||||
| export function PageList({ fileData, allFiles, limit }: Props) { | ||||
|   let list = allFiles.sort(byDateAndAlphabetical) | ||||
| export function PageList({ cfg, fileData, allFiles, limit }: Props) { | ||||
|   let list = allFiles.sort(byDateAndAlphabetical(cfg)) | ||||
|   if (limit) { | ||||
|     list = list.slice(0, limit) | ||||
|   } | ||||
| @@ -41,7 +46,7 @@ export function PageList({ fileData, allFiles, limit }: Props) { | ||||
|             <div class="section"> | ||||
|               {page.dates && ( | ||||
|                 <p class="meta"> | ||||
|                   <Date date={page.dates.modified} /> | ||||
|                   <Date date={getDate(cfg, page)!} /> | ||||
|                 </p> | ||||
|               )} | ||||
|               <div class="desc"> | ||||
|   | ||||
| @@ -3,7 +3,8 @@ import { FullSlug, SimpleSlug, resolveRelative } from "../util/path" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
| import { byDateAndAlphabetical } from "./PageList" | ||||
| import style from "./styles/recentNotes.scss" | ||||
| import { Date } from "./Date" | ||||
| import { Date, getDate } from "./Date" | ||||
| import { GlobalConfiguration } from "../cfg" | ||||
|  | ||||
| interface Options { | ||||
|   title: string | ||||
| @@ -13,18 +14,18 @@ interface Options { | ||||
|   sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number | ||||
| } | ||||
|  | ||||
| const defaultOptions: Options = { | ||||
| const defaultOptions = (cfg: GlobalConfiguration): Options => ({ | ||||
|   title: "Recent Notes", | ||||
|   limit: 3, | ||||
|   linkToMore: false, | ||||
|   filter: () => true, | ||||
|   sort: byDateAndAlphabetical, | ||||
| } | ||||
|   sort: byDateAndAlphabetical(cfg), | ||||
| }) | ||||
|  | ||||
| export default ((userOpts?: Partial<Options>) => { | ||||
|   const opts = { ...defaultOptions, ...userOpts } | ||||
|   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 remaining = Math.max(0, pages.length - opts.limit) | ||||
|     return ( | ||||
| @@ -47,7 +48,7 @@ export default ((userOpts?: Partial<Options>) => { | ||||
|                   </div> | ||||
|                   {page.dates && ( | ||||
|                     <p class="meta"> | ||||
|                       <Date date={page.dates.modified} /> | ||||
|                       <Date date={getDate(cfg, page)!} /> | ||||
|                     </p> | ||||
|                   )} | ||||
|                   <ul class="tags"> | ||||
|   | ||||
| @@ -44,7 +44,8 @@ TagList.css = ` | ||||
| a.tag-link { | ||||
|   border-radius: 8px; | ||||
|   background-color: var(--highlight); | ||||
|   padding: 0.2rem 0.5rem; | ||||
|   padding: 0.2rem 0.4rem; | ||||
|   margin: 0 0.1rem; | ||||
| } | ||||
| ` | ||||
|  | ||||
|   | ||||
| @@ -33,7 +33,9 @@ function FolderContent(props: QuartzComponentProps) { | ||||
|  | ||||
|   return ( | ||||
|     <div class="popover-hint"> | ||||
|       <article>{content}</article> | ||||
|       <article> | ||||
|         <p>{content}</p> | ||||
|       </article> | ||||
|       <p>{allPagesInFolder.length} items under this folder.</p> | ||||
|       <div> | ||||
|         <PageList {...listProps} /> | ||||
|   | ||||
| @@ -37,7 +37,9 @@ function TagContent(props: QuartzComponentProps) { | ||||
|  | ||||
|     return ( | ||||
|       <div class="popover-hint"> | ||||
|         <article>{content}</article> | ||||
|         <article> | ||||
|           <p>{content}</p> | ||||
|         </article> | ||||
|         <p>Found {tags.length} total tags.</p> | ||||
|         <div> | ||||
|           {tags.map((tag) => { | ||||
|   | ||||
| @@ -64,7 +64,7 @@ async function navigate(url: URL, isBack: boolean = false) { | ||||
|   // scroll into place and add history | ||||
|   if (!isBack) { | ||||
|     if (url.hash) { | ||||
|       const el = document.getElementById(url.hash.substring(1)) | ||||
|       const el = document.getElementById(decodeURIComponent(url.hash.substring(1))) | ||||
|       el?.scrollIntoView() | ||||
|     } else { | ||||
|       window.scrollTo({ top: 0 }) | ||||
| @@ -79,7 +79,9 @@ async function navigate(url: URL, isBack: boolean = false) { | ||||
|  | ||||
|   // delay setting the url until now | ||||
|   // 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)) | ||||
|   delete announcer.dataset.persist | ||||
| } | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
|     border-radius: 5px; | ||||
|     box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25); | ||||
|     overflow: auto; | ||||
|     white-space: normal; | ||||
|   } | ||||
|  | ||||
|   h1 { | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import { GlobalConfiguration } from "../../cfg" | ||||
| import { getDate } from "../../components/Date" | ||||
| import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path" | ||||
| import { QuartzEmitterPlugin } from "../types" | ||||
| import path from "path" | ||||
| @@ -22,7 +23,7 @@ interface Options { | ||||
| const defaultOptions: Options = { | ||||
|   enableSiteMap: true, | ||||
|   enableRSS: true, | ||||
|   includeEmptyFiles: false, | ||||
|   includeEmptyFiles: true, | ||||
| } | ||||
|  | ||||
| function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { | ||||
| @@ -41,26 +42,26 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex): string { | ||||
|   const base = cfg.baseUrl ?? "" | ||||
|   const root = `https://${base}` | ||||
|  | ||||
|   const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `<items> | ||||
|   const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `<item> | ||||
|     <title>${content.title}</title> | ||||
|     <link>${root}/${slug}</link> | ||||
|     <guid>${root}/${slug}</guid> | ||||
|     <description>${content.description}</description> | ||||
|     <pubDate>${content.date?.toUTCString()}</pubDate> | ||||
|   </items>` | ||||
|   </item>` | ||||
|  | ||||
|   const items = Array.from(idx) | ||||
|     .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) | ||||
|     .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> | ||||
|       <title>${cfg.pageTitle}</title> | ||||
|       <link>${root}</link> | ||||
|       <description>Recent content on ${cfg.pageTitle}</description> | ||||
|       <generator>Quartz -- quartz.jzhao.xyz</generator> | ||||
|       <atom:link href="${root}/index.xml" rel="self" type="application/rss+xml"/> | ||||
|       ${items} | ||||
|     </channel> | ||||
|     ${items} | ||||
|   </rss>` | ||||
| } | ||||
|  | ||||
| @@ -74,7 +75,7 @@ export const ContentIndex: QuartzEmitterPlugin<Partial<Options>> = (opts) => { | ||||
|       const linkIndex: ContentIndex = new Map() | ||||
|       for (const [_tree, file] of content) { | ||||
|         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 !== "")) { | ||||
|           linkIndex.set(slug, { | ||||
|             title: file.data.frontmatter?.title!, | ||||
|   | ||||
| @@ -41,7 +41,7 @@ export const FrontMatter: QuartzTransformerPlugin<Partial<Options> | undefined> | ||||
|             } | ||||
|  | ||||
|             // 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 | ||||
|             file.data.frontmatter = { | ||||
|   | ||||
| @@ -60,11 +60,17 @@ export const CrawlLinks: QuartzTransformerPlugin<Partial<Options> | undefined> = | ||||
|                     dest, | ||||
|                     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 canonicalDest = url.pathname | ||||
|                   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) | ||||
|                 } | ||||
|  | ||||
|   | ||||
| @@ -116,7 +116,7 @@ const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/) | ||||
| const calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm") | ||||
| // (?:^| )   -> 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 | ||||
| const tagRegex = new RegExp(/(?:^| )#([\w-_\/]+)/, "g") | ||||
| const tagRegex = new RegExp(/(?:^| )#(\p{L}+)/, "gu") | ||||
|  | ||||
| export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options> | undefined> = ( | ||||
|   userOpts, | ||||
| @@ -382,8 +382,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options> | ||||
|         plugins.push(() => { | ||||
|           return (tree: Root, file) => { | ||||
|             const base = pathToRoot(file.data.slug!) | ||||
|             findAndReplace(tree, tagRegex, (value: string, tag: string) => { | ||||
|               if (file.data.frontmatter) { | ||||
|             findAndReplace(tree, tagRegex, (_value: string, tag: string) => { | ||||
|               if (file.data.frontmatter && !file.data.frontmatter.tags.includes(tag)) { | ||||
|                 file.data.frontmatter.tags.push(tag) | ||||
|               } | ||||
|  | ||||
| @@ -398,7 +398,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options> | ||||
|                 children: [ | ||||
|                   { | ||||
|                     type: "text", | ||||
|                     value, | ||||
|                     value: `#${tag}`, | ||||
|                   }, | ||||
|                 ], | ||||
|               } | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import { QuartzTransformerPlugin } from "../types" | ||||
| import { Root } from "mdast" | ||||
| import { visit } from "unist-util-visit" | ||||
| import { toString } from "mdast-util-to-string" | ||||
| import { slug as slugAnchor } from "github-slugger" | ||||
| import Slugger from "github-slugger" | ||||
|  | ||||
| export interface Options { | ||||
|   maxDepth: 1 | 2 | 3 | 4 | 5 | 6 | ||||
| @@ -34,6 +34,7 @@ export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefin | ||||
|           return async (tree: Root, file) => { | ||||
|             const display = file.data.frontmatter?.enableToc ?? opts.showByDefault | ||||
|             if (display) { | ||||
|               const slugAnchor = new Slugger() | ||||
|               const toc: TocEntry[] = [] | ||||
|               let highestDepth: number = opts.maxDepth | ||||
|               visit(tree, "heading", (node) => { | ||||
| @@ -43,7 +44,7 @@ export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefin | ||||
|                   toc.push({ | ||||
|                     depth: node.depth, | ||||
|                     text, | ||||
|                     slug: slugAnchor(text), | ||||
|                     slug: slugAnchor.slug(text), | ||||
|                   }) | ||||
|                 } | ||||
|               }) | ||||
|   | ||||
| @@ -27,6 +27,11 @@ section { | ||||
|   border-radius: 5px; | ||||
| } | ||||
|  | ||||
| ::selection { | ||||
|   background: color-mix(in srgb, var(--tertiary) 75%, transparent); | ||||
|   color: var(--darkgray); | ||||
| } | ||||
|  | ||||
| p, | ||||
| ul, | ||||
| text, | ||||
|   | ||||
| @@ -52,7 +52,7 @@ export function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug { | ||||
|  | ||||
|   let slug = withoutFileExt | ||||
|     .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 | ||||
|     .replace(/\/$/, "") // remove trailing slash | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user