this repo has no description
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

first commit

Marco Bonomo f03f9c85

+1931
+10
manifest.json
··· 1 + { 2 + "id": "atproto-publisher", 3 + "name": "ATProto Publisher", 4 + "version": "0.1.0", 5 + "minAppVersion": "1.5.0", 6 + "description": "Publish Obsidian notes to ATProto custom records.", 7 + "author": "Marco Bonomo", 8 + "authorUrl": "https://marcobonomo.dev", 9 + "isDesktopOnly": false 10 + }
+1301
package-lock.json
··· 1 + { 2 + "name": "obsidian-atproto-publisher", 3 + "version": "0.1.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "obsidian-atproto-publisher", 9 + "version": "0.1.0", 10 + "dependencies": { 11 + "@atproto/api": "^0.12.7" 12 + }, 13 + "devDependencies": { 14 + "@rollup/plugin-commonjs": "^25.0.7", 15 + "@rollup/plugin-node-resolve": "^15.2.3", 16 + "@types/node": "^20.11.30", 17 + "obsidian": "latest", 18 + "rollup": "^4.22.4", 19 + "rollup-plugin-typescript2": "^0.36.0", 20 + "typescript": "^5.5.4" 21 + } 22 + }, 23 + "node_modules/@atproto/api": { 24 + "version": "0.12.29", 25 + "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.12.29.tgz", 26 + "integrity": "sha512-PyzPLjGWR0qNOMrmj3Nt3N5NuuANSgOk/33Bu3j+rFjjPrHvk9CI6iQPU6zuDaDCoyOTRJRafw8X/aMQw+ilgw==", 27 + "license": "MIT", 28 + "dependencies": { 29 + "@atproto/common-web": "^0.3.0", 30 + "@atproto/lexicon": "^0.4.0", 31 + "@atproto/syntax": "^0.3.0", 32 + "@atproto/xrpc": "^0.5.0", 33 + "await-lock": "^2.2.2", 34 + "multiformats": "^9.9.0", 35 + "tlds": "^1.234.0" 36 + } 37 + }, 38 + "node_modules/@atproto/common-web": { 39 + "version": "0.3.2", 40 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.3.2.tgz", 41 + "integrity": "sha512-Vx0JtL1/CssJbFAb0UOdvTrkbUautsDfHNOXNTcX2vyPIxH9xOameSqLLunM1hZnOQbJwyjmQCt6TV+bhnanDg==", 42 + "license": "MIT", 43 + "dependencies": { 44 + "graphemer": "^1.4.0", 45 + "multiformats": "^9.9.0", 46 + "uint8arrays": "3.0.0", 47 + "zod": "^3.23.8" 48 + } 49 + }, 50 + "node_modules/@atproto/lex-data": { 51 + "version": "0.0.8", 52 + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.8.tgz", 53 + "integrity": "sha512-1Y5tz7BkS7380QuLNXaE8GW8Xba+mRWugt8BKM4BUFYjjUZdmirU8lr72iM4XlEBrzRu8Cfvj+MbsbYaZv+IgA==", 54 + "license": "MIT", 55 + "dependencies": { 56 + "@atproto/syntax": "0.4.2", 57 + "multiformats": "^9.9.0", 58 + "tslib": "^2.8.1", 59 + "uint8arrays": "3.0.0", 60 + "unicode-segmenter": "^0.14.0" 61 + } 62 + }, 63 + "node_modules/@atproto/lex-data/node_modules/@atproto/syntax": { 64 + "version": "0.4.2", 65 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz", 66 + "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==", 67 + "license": "MIT" 68 + }, 69 + "node_modules/@atproto/lex-json": { 70 + "version": "0.0.8", 71 + "resolved": "https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.8.tgz", 72 + "integrity": "sha512-w1Qmkae1QhmNz+i1Zm3xr3jp0UPPRENmdlpU0qIrdxWDo9W4Mzkeyc3eSoa+Zs+zN8xkRSQw7RLZte/B7Ipdwg==", 73 + "license": "MIT", 74 + "dependencies": { 75 + "@atproto/lex-data": "0.0.8", 76 + "tslib": "^2.8.1" 77 + } 78 + }, 79 + "node_modules/@atproto/lexicon": { 80 + "version": "0.4.14", 81 + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.14.tgz", 82 + "integrity": "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ==", 83 + "license": "MIT", 84 + "dependencies": { 85 + "@atproto/common-web": "^0.4.2", 86 + "@atproto/syntax": "^0.4.0", 87 + "iso-datestring-validator": "^2.2.2", 88 + "multiformats": "^9.9.0", 89 + "zod": "^3.23.8" 90 + } 91 + }, 92 + "node_modules/@atproto/lexicon/node_modules/@atproto/common-web": { 93 + "version": "0.4.12", 94 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.12.tgz", 95 + "integrity": "sha512-3aCJemqM/fkHQrVPbTCHCdiVstKFI+2LkFLvUhO6XZP0EqUZa/rg/CIZBKTFUWu9I5iYiaEiXL9VwcDRpEevSw==", 96 + "license": "MIT", 97 + "dependencies": { 98 + "@atproto/lex-data": "0.0.8", 99 + "@atproto/lex-json": "0.0.8", 100 + "zod": "^3.23.8" 101 + } 102 + }, 103 + "node_modules/@atproto/lexicon/node_modules/@atproto/syntax": { 104 + "version": "0.4.2", 105 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz", 106 + "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==", 107 + "license": "MIT" 108 + }, 109 + "node_modules/@atproto/syntax": { 110 + "version": "0.3.4", 111 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.3.4.tgz", 112 + "integrity": "sha512-8CNmi5DipOLaVeSMPggMe7FCksVag0aO6XZy9WflbduTKM4dFZVCs4686UeMLfGRXX+X966XgwECHoLYrovMMg==", 113 + "license": "MIT" 114 + }, 115 + "node_modules/@atproto/xrpc": { 116 + "version": "0.5.0", 117 + "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.5.0.tgz", 118 + "integrity": "sha512-swu+wyOLvYW4l3n+VAuJbHcPcES+tin2Lsrp8Bw5aIXIICiuFn1YMFlwK9JwVUzTH21Py1s1nHEjr4CJeElJog==", 119 + "license": "MIT", 120 + "dependencies": { 121 + "@atproto/lexicon": "^0.4.0", 122 + "zod": "^3.21.4" 123 + } 124 + }, 125 + "node_modules/@codemirror/state": { 126 + "version": "6.5.0", 127 + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", 128 + "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", 129 + "dev": true, 130 + "license": "MIT", 131 + "peer": true, 132 + "dependencies": { 133 + "@marijn/find-cluster-break": "^1.0.0" 134 + } 135 + }, 136 + "node_modules/@codemirror/view": { 137 + "version": "6.38.6", 138 + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", 139 + "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", 140 + "dev": true, 141 + "license": "MIT", 142 + "peer": true, 143 + "dependencies": { 144 + "@codemirror/state": "^6.5.0", 145 + "crelt": "^1.0.6", 146 + "style-mod": "^4.1.0", 147 + "w3c-keyname": "^2.2.4" 148 + } 149 + }, 150 + "node_modules/@jridgewell/sourcemap-codec": { 151 + "version": "1.5.5", 152 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 153 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 154 + "dev": true, 155 + "license": "MIT" 156 + }, 157 + "node_modules/@marijn/find-cluster-break": { 158 + "version": "1.0.2", 159 + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", 160 + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", 161 + "dev": true, 162 + "license": "MIT", 163 + "peer": true 164 + }, 165 + "node_modules/@rollup/plugin-commonjs": { 166 + "version": "25.0.8", 167 + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", 168 + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", 169 + "dev": true, 170 + "license": "MIT", 171 + "dependencies": { 172 + "@rollup/pluginutils": "^5.0.1", 173 + "commondir": "^1.0.1", 174 + "estree-walker": "^2.0.2", 175 + "glob": "^8.0.3", 176 + "is-reference": "1.2.1", 177 + "magic-string": "^0.30.3" 178 + }, 179 + "engines": { 180 + "node": ">=14.0.0" 181 + }, 182 + "peerDependencies": { 183 + "rollup": "^2.68.0||^3.0.0||^4.0.0" 184 + }, 185 + "peerDependenciesMeta": { 186 + "rollup": { 187 + "optional": true 188 + } 189 + } 190 + }, 191 + "node_modules/@rollup/plugin-node-resolve": { 192 + "version": "15.3.1", 193 + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", 194 + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", 195 + "dev": true, 196 + "license": "MIT", 197 + "dependencies": { 198 + "@rollup/pluginutils": "^5.0.1", 199 + "@types/resolve": "1.20.2", 200 + "deepmerge": "^4.2.2", 201 + "is-module": "^1.0.0", 202 + "resolve": "^1.22.1" 203 + }, 204 + "engines": { 205 + "node": ">=14.0.0" 206 + }, 207 + "peerDependencies": { 208 + "rollup": "^2.78.0||^3.0.0||^4.0.0" 209 + }, 210 + "peerDependenciesMeta": { 211 + "rollup": { 212 + "optional": true 213 + } 214 + } 215 + }, 216 + "node_modules/@rollup/pluginutils": { 217 + "version": "5.3.0", 218 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", 219 + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", 220 + "dev": true, 221 + "license": "MIT", 222 + "dependencies": { 223 + "@types/estree": "^1.0.0", 224 + "estree-walker": "^2.0.2", 225 + "picomatch": "^4.0.2" 226 + }, 227 + "engines": { 228 + "node": ">=14.0.0" 229 + }, 230 + "peerDependencies": { 231 + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 232 + }, 233 + "peerDependenciesMeta": { 234 + "rollup": { 235 + "optional": true 236 + } 237 + } 238 + }, 239 + "node_modules/@rollup/rollup-android-arm-eabi": { 240 + "version": "4.56.0", 241 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", 242 + "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", 243 + "cpu": [ 244 + "arm" 245 + ], 246 + "dev": true, 247 + "license": "MIT", 248 + "optional": true, 249 + "os": [ 250 + "android" 251 + ] 252 + }, 253 + "node_modules/@rollup/rollup-android-arm64": { 254 + "version": "4.56.0", 255 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", 256 + "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", 257 + "cpu": [ 258 + "arm64" 259 + ], 260 + "dev": true, 261 + "license": "MIT", 262 + "optional": true, 263 + "os": [ 264 + "android" 265 + ] 266 + }, 267 + "node_modules/@rollup/rollup-darwin-arm64": { 268 + "version": "4.56.0", 269 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", 270 + "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", 271 + "cpu": [ 272 + "arm64" 273 + ], 274 + "dev": true, 275 + "license": "MIT", 276 + "optional": true, 277 + "os": [ 278 + "darwin" 279 + ] 280 + }, 281 + "node_modules/@rollup/rollup-darwin-x64": { 282 + "version": "4.56.0", 283 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", 284 + "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", 285 + "cpu": [ 286 + "x64" 287 + ], 288 + "dev": true, 289 + "license": "MIT", 290 + "optional": true, 291 + "os": [ 292 + "darwin" 293 + ] 294 + }, 295 + "node_modules/@rollup/rollup-freebsd-arm64": { 296 + "version": "4.56.0", 297 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", 298 + "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", 299 + "cpu": [ 300 + "arm64" 301 + ], 302 + "dev": true, 303 + "license": "MIT", 304 + "optional": true, 305 + "os": [ 306 + "freebsd" 307 + ] 308 + }, 309 + "node_modules/@rollup/rollup-freebsd-x64": { 310 + "version": "4.56.0", 311 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", 312 + "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", 313 + "cpu": [ 314 + "x64" 315 + ], 316 + "dev": true, 317 + "license": "MIT", 318 + "optional": true, 319 + "os": [ 320 + "freebsd" 321 + ] 322 + }, 323 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 324 + "version": "4.56.0", 325 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", 326 + "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", 327 + "cpu": [ 328 + "arm" 329 + ], 330 + "dev": true, 331 + "license": "MIT", 332 + "optional": true, 333 + "os": [ 334 + "linux" 335 + ] 336 + }, 337 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 338 + "version": "4.56.0", 339 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", 340 + "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", 341 + "cpu": [ 342 + "arm" 343 + ], 344 + "dev": true, 345 + "license": "MIT", 346 + "optional": true, 347 + "os": [ 348 + "linux" 349 + ] 350 + }, 351 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 352 + "version": "4.56.0", 353 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", 354 + "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", 355 + "cpu": [ 356 + "arm64" 357 + ], 358 + "dev": true, 359 + "license": "MIT", 360 + "optional": true, 361 + "os": [ 362 + "linux" 363 + ] 364 + }, 365 + "node_modules/@rollup/rollup-linux-arm64-musl": { 366 + "version": "4.56.0", 367 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", 368 + "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", 369 + "cpu": [ 370 + "arm64" 371 + ], 372 + "dev": true, 373 + "license": "MIT", 374 + "optional": true, 375 + "os": [ 376 + "linux" 377 + ] 378 + }, 379 + "node_modules/@rollup/rollup-linux-loong64-gnu": { 380 + "version": "4.56.0", 381 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", 382 + "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", 383 + "cpu": [ 384 + "loong64" 385 + ], 386 + "dev": true, 387 + "license": "MIT", 388 + "optional": true, 389 + "os": [ 390 + "linux" 391 + ] 392 + }, 393 + "node_modules/@rollup/rollup-linux-loong64-musl": { 394 + "version": "4.56.0", 395 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", 396 + "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", 397 + "cpu": [ 398 + "loong64" 399 + ], 400 + "dev": true, 401 + "license": "MIT", 402 + "optional": true, 403 + "os": [ 404 + "linux" 405 + ] 406 + }, 407 + "node_modules/@rollup/rollup-linux-ppc64-gnu": { 408 + "version": "4.56.0", 409 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", 410 + "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", 411 + "cpu": [ 412 + "ppc64" 413 + ], 414 + "dev": true, 415 + "license": "MIT", 416 + "optional": true, 417 + "os": [ 418 + "linux" 419 + ] 420 + }, 421 + "node_modules/@rollup/rollup-linux-ppc64-musl": { 422 + "version": "4.56.0", 423 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", 424 + "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", 425 + "cpu": [ 426 + "ppc64" 427 + ], 428 + "dev": true, 429 + "license": "MIT", 430 + "optional": true, 431 + "os": [ 432 + "linux" 433 + ] 434 + }, 435 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 436 + "version": "4.56.0", 437 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", 438 + "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", 439 + "cpu": [ 440 + "riscv64" 441 + ], 442 + "dev": true, 443 + "license": "MIT", 444 + "optional": true, 445 + "os": [ 446 + "linux" 447 + ] 448 + }, 449 + "node_modules/@rollup/rollup-linux-riscv64-musl": { 450 + "version": "4.56.0", 451 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", 452 + "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", 453 + "cpu": [ 454 + "riscv64" 455 + ], 456 + "dev": true, 457 + "license": "MIT", 458 + "optional": true, 459 + "os": [ 460 + "linux" 461 + ] 462 + }, 463 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 464 + "version": "4.56.0", 465 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", 466 + "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", 467 + "cpu": [ 468 + "s390x" 469 + ], 470 + "dev": true, 471 + "license": "MIT", 472 + "optional": true, 473 + "os": [ 474 + "linux" 475 + ] 476 + }, 477 + "node_modules/@rollup/rollup-linux-x64-gnu": { 478 + "version": "4.56.0", 479 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", 480 + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", 481 + "cpu": [ 482 + "x64" 483 + ], 484 + "dev": true, 485 + "license": "MIT", 486 + "optional": true, 487 + "os": [ 488 + "linux" 489 + ] 490 + }, 491 + "node_modules/@rollup/rollup-linux-x64-musl": { 492 + "version": "4.56.0", 493 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", 494 + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", 495 + "cpu": [ 496 + "x64" 497 + ], 498 + "dev": true, 499 + "license": "MIT", 500 + "optional": true, 501 + "os": [ 502 + "linux" 503 + ] 504 + }, 505 + "node_modules/@rollup/rollup-openbsd-x64": { 506 + "version": "4.56.0", 507 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", 508 + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", 509 + "cpu": [ 510 + "x64" 511 + ], 512 + "dev": true, 513 + "license": "MIT", 514 + "optional": true, 515 + "os": [ 516 + "openbsd" 517 + ] 518 + }, 519 + "node_modules/@rollup/rollup-openharmony-arm64": { 520 + "version": "4.56.0", 521 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", 522 + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", 523 + "cpu": [ 524 + "arm64" 525 + ], 526 + "dev": true, 527 + "license": "MIT", 528 + "optional": true, 529 + "os": [ 530 + "openharmony" 531 + ] 532 + }, 533 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 534 + "version": "4.56.0", 535 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", 536 + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", 537 + "cpu": [ 538 + "arm64" 539 + ], 540 + "dev": true, 541 + "license": "MIT", 542 + "optional": true, 543 + "os": [ 544 + "win32" 545 + ] 546 + }, 547 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 548 + "version": "4.56.0", 549 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", 550 + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", 551 + "cpu": [ 552 + "ia32" 553 + ], 554 + "dev": true, 555 + "license": "MIT", 556 + "optional": true, 557 + "os": [ 558 + "win32" 559 + ] 560 + }, 561 + "node_modules/@rollup/rollup-win32-x64-gnu": { 562 + "version": "4.56.0", 563 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", 564 + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", 565 + "cpu": [ 566 + "x64" 567 + ], 568 + "dev": true, 569 + "license": "MIT", 570 + "optional": true, 571 + "os": [ 572 + "win32" 573 + ] 574 + }, 575 + "node_modules/@rollup/rollup-win32-x64-msvc": { 576 + "version": "4.56.0", 577 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", 578 + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", 579 + "cpu": [ 580 + "x64" 581 + ], 582 + "dev": true, 583 + "license": "MIT", 584 + "optional": true, 585 + "os": [ 586 + "win32" 587 + ] 588 + }, 589 + "node_modules/@types/codemirror": { 590 + "version": "5.60.8", 591 + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 592 + "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 593 + "dev": true, 594 + "license": "MIT", 595 + "dependencies": { 596 + "@types/tern": "*" 597 + } 598 + }, 599 + "node_modules/@types/estree": { 600 + "version": "1.0.8", 601 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 602 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 603 + "dev": true, 604 + "license": "MIT" 605 + }, 606 + "node_modules/@types/node": { 607 + "version": "20.19.30", 608 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", 609 + "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", 610 + "dev": true, 611 + "license": "MIT", 612 + "dependencies": { 613 + "undici-types": "~6.21.0" 614 + } 615 + }, 616 + "node_modules/@types/resolve": { 617 + "version": "1.20.2", 618 + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 619 + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 620 + "dev": true, 621 + "license": "MIT" 622 + }, 623 + "node_modules/@types/tern": { 624 + "version": "0.23.9", 625 + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 626 + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 627 + "dev": true, 628 + "license": "MIT", 629 + "dependencies": { 630 + "@types/estree": "*" 631 + } 632 + }, 633 + "node_modules/await-lock": { 634 + "version": "2.2.2", 635 + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", 636 + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 637 + "license": "MIT" 638 + }, 639 + "node_modules/balanced-match": { 640 + "version": "1.0.2", 641 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 642 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 643 + "dev": true, 644 + "license": "MIT" 645 + }, 646 + "node_modules/brace-expansion": { 647 + "version": "2.0.2", 648 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 649 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 650 + "dev": true, 651 + "license": "MIT", 652 + "dependencies": { 653 + "balanced-match": "^1.0.0" 654 + } 655 + }, 656 + "node_modules/commondir": { 657 + "version": "1.0.1", 658 + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 659 + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 660 + "dev": true, 661 + "license": "MIT" 662 + }, 663 + "node_modules/crelt": { 664 + "version": "1.0.6", 665 + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", 666 + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", 667 + "dev": true, 668 + "license": "MIT", 669 + "peer": true 670 + }, 671 + "node_modules/deepmerge": { 672 + "version": "4.3.1", 673 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 674 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 675 + "dev": true, 676 + "license": "MIT", 677 + "engines": { 678 + "node": ">=0.10.0" 679 + } 680 + }, 681 + "node_modules/estree-walker": { 682 + "version": "2.0.2", 683 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 684 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 685 + "dev": true, 686 + "license": "MIT" 687 + }, 688 + "node_modules/find-cache-dir": { 689 + "version": "3.3.2", 690 + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", 691 + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", 692 + "dev": true, 693 + "license": "MIT", 694 + "dependencies": { 695 + "commondir": "^1.0.1", 696 + "make-dir": "^3.0.2", 697 + "pkg-dir": "^4.1.0" 698 + }, 699 + "engines": { 700 + "node": ">=8" 701 + }, 702 + "funding": { 703 + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" 704 + } 705 + }, 706 + "node_modules/find-up": { 707 + "version": "4.1.0", 708 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 709 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 710 + "dev": true, 711 + "license": "MIT", 712 + "dependencies": { 713 + "locate-path": "^5.0.0", 714 + "path-exists": "^4.0.0" 715 + }, 716 + "engines": { 717 + "node": ">=8" 718 + } 719 + }, 720 + "node_modules/fs-extra": { 721 + "version": "10.1.0", 722 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 723 + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 724 + "dev": true, 725 + "license": "MIT", 726 + "dependencies": { 727 + "graceful-fs": "^4.2.0", 728 + "jsonfile": "^6.0.1", 729 + "universalify": "^2.0.0" 730 + }, 731 + "engines": { 732 + "node": ">=12" 733 + } 734 + }, 735 + "node_modules/fs.realpath": { 736 + "version": "1.0.0", 737 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 738 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 739 + "dev": true, 740 + "license": "ISC" 741 + }, 742 + "node_modules/fsevents": { 743 + "version": "2.3.3", 744 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 745 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 746 + "dev": true, 747 + "hasInstallScript": true, 748 + "license": "MIT", 749 + "optional": true, 750 + "os": [ 751 + "darwin" 752 + ], 753 + "engines": { 754 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 755 + } 756 + }, 757 + "node_modules/function-bind": { 758 + "version": "1.1.2", 759 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 760 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 761 + "dev": true, 762 + "license": "MIT", 763 + "funding": { 764 + "url": "https://github.com/sponsors/ljharb" 765 + } 766 + }, 767 + "node_modules/glob": { 768 + "version": "8.1.0", 769 + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 770 + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 771 + "deprecated": "Glob versions prior to v9 are no longer supported", 772 + "dev": true, 773 + "license": "ISC", 774 + "dependencies": { 775 + "fs.realpath": "^1.0.0", 776 + "inflight": "^1.0.4", 777 + "inherits": "2", 778 + "minimatch": "^5.0.1", 779 + "once": "^1.3.0" 780 + }, 781 + "engines": { 782 + "node": ">=12" 783 + }, 784 + "funding": { 785 + "url": "https://github.com/sponsors/isaacs" 786 + } 787 + }, 788 + "node_modules/graceful-fs": { 789 + "version": "4.2.11", 790 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 791 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 792 + "dev": true, 793 + "license": "ISC" 794 + }, 795 + "node_modules/graphemer": { 796 + "version": "1.4.0", 797 + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 798 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 799 + "license": "MIT" 800 + }, 801 + "node_modules/hasown": { 802 + "version": "2.0.2", 803 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 804 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 805 + "dev": true, 806 + "license": "MIT", 807 + "dependencies": { 808 + "function-bind": "^1.1.2" 809 + }, 810 + "engines": { 811 + "node": ">= 0.4" 812 + } 813 + }, 814 + "node_modules/inflight": { 815 + "version": "1.0.6", 816 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 817 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 818 + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 819 + "dev": true, 820 + "license": "ISC", 821 + "dependencies": { 822 + "once": "^1.3.0", 823 + "wrappy": "1" 824 + } 825 + }, 826 + "node_modules/inherits": { 827 + "version": "2.0.4", 828 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 829 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 830 + "dev": true, 831 + "license": "ISC" 832 + }, 833 + "node_modules/is-core-module": { 834 + "version": "2.16.1", 835 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 836 + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 837 + "dev": true, 838 + "license": "MIT", 839 + "dependencies": { 840 + "hasown": "^2.0.2" 841 + }, 842 + "engines": { 843 + "node": ">= 0.4" 844 + }, 845 + "funding": { 846 + "url": "https://github.com/sponsors/ljharb" 847 + } 848 + }, 849 + "node_modules/is-module": { 850 + "version": "1.0.0", 851 + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 852 + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 853 + "dev": true, 854 + "license": "MIT" 855 + }, 856 + "node_modules/is-reference": { 857 + "version": "1.2.1", 858 + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 859 + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 860 + "dev": true, 861 + "license": "MIT", 862 + "dependencies": { 863 + "@types/estree": "*" 864 + } 865 + }, 866 + "node_modules/iso-datestring-validator": { 867 + "version": "2.2.2", 868 + "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 869 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", 870 + "license": "MIT" 871 + }, 872 + "node_modules/jsonfile": { 873 + "version": "6.2.0", 874 + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", 875 + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", 876 + "dev": true, 877 + "license": "MIT", 878 + "dependencies": { 879 + "universalify": "^2.0.0" 880 + }, 881 + "optionalDependencies": { 882 + "graceful-fs": "^4.1.6" 883 + } 884 + }, 885 + "node_modules/locate-path": { 886 + "version": "5.0.0", 887 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 888 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 889 + "dev": true, 890 + "license": "MIT", 891 + "dependencies": { 892 + "p-locate": "^4.1.0" 893 + }, 894 + "engines": { 895 + "node": ">=8" 896 + } 897 + }, 898 + "node_modules/magic-string": { 899 + "version": "0.30.21", 900 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 901 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 902 + "dev": true, 903 + "license": "MIT", 904 + "dependencies": { 905 + "@jridgewell/sourcemap-codec": "^1.5.5" 906 + } 907 + }, 908 + "node_modules/make-dir": { 909 + "version": "3.1.0", 910 + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 911 + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 912 + "dev": true, 913 + "license": "MIT", 914 + "dependencies": { 915 + "semver": "^6.0.0" 916 + }, 917 + "engines": { 918 + "node": ">=8" 919 + }, 920 + "funding": { 921 + "url": "https://github.com/sponsors/sindresorhus" 922 + } 923 + }, 924 + "node_modules/make-dir/node_modules/semver": { 925 + "version": "6.3.1", 926 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 927 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 928 + "dev": true, 929 + "license": "ISC", 930 + "bin": { 931 + "semver": "bin/semver.js" 932 + } 933 + }, 934 + "node_modules/minimatch": { 935 + "version": "5.1.6", 936 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 937 + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 938 + "dev": true, 939 + "license": "ISC", 940 + "dependencies": { 941 + "brace-expansion": "^2.0.1" 942 + }, 943 + "engines": { 944 + "node": ">=10" 945 + } 946 + }, 947 + "node_modules/moment": { 948 + "version": "2.29.4", 949 + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 950 + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 951 + "dev": true, 952 + "license": "MIT", 953 + "engines": { 954 + "node": "*" 955 + } 956 + }, 957 + "node_modules/multiformats": { 958 + "version": "9.9.0", 959 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 960 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 961 + "license": "(Apache-2.0 AND MIT)" 962 + }, 963 + "node_modules/obsidian": { 964 + "version": "1.11.4", 965 + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.11.4.tgz", 966 + "integrity": "sha512-n0KD3S+VndgaByrEtEe8NELy0ya6/s+KZ7OcxA6xOm5NN4thxKpQjo6eqEudHEvfGCeT/TYToAKJzitQ1I3XTg==", 967 + "dev": true, 968 + "license": "MIT", 969 + "dependencies": { 970 + "@types/codemirror": "5.60.8", 971 + "moment": "2.29.4" 972 + }, 973 + "peerDependencies": { 974 + "@codemirror/state": "6.5.0", 975 + "@codemirror/view": "6.38.6" 976 + } 977 + }, 978 + "node_modules/once": { 979 + "version": "1.4.0", 980 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 981 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 982 + "dev": true, 983 + "license": "ISC", 984 + "dependencies": { 985 + "wrappy": "1" 986 + } 987 + }, 988 + "node_modules/p-limit": { 989 + "version": "2.3.0", 990 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 991 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 992 + "dev": true, 993 + "license": "MIT", 994 + "dependencies": { 995 + "p-try": "^2.0.0" 996 + }, 997 + "engines": { 998 + "node": ">=6" 999 + }, 1000 + "funding": { 1001 + "url": "https://github.com/sponsors/sindresorhus" 1002 + } 1003 + }, 1004 + "node_modules/p-locate": { 1005 + "version": "4.1.0", 1006 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1007 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1008 + "dev": true, 1009 + "license": "MIT", 1010 + "dependencies": { 1011 + "p-limit": "^2.2.0" 1012 + }, 1013 + "engines": { 1014 + "node": ">=8" 1015 + } 1016 + }, 1017 + "node_modules/p-try": { 1018 + "version": "2.2.0", 1019 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1020 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1021 + "dev": true, 1022 + "license": "MIT", 1023 + "engines": { 1024 + "node": ">=6" 1025 + } 1026 + }, 1027 + "node_modules/path-exists": { 1028 + "version": "4.0.0", 1029 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1030 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1031 + "dev": true, 1032 + "license": "MIT", 1033 + "engines": { 1034 + "node": ">=8" 1035 + } 1036 + }, 1037 + "node_modules/path-parse": { 1038 + "version": "1.0.7", 1039 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1040 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1041 + "dev": true, 1042 + "license": "MIT" 1043 + }, 1044 + "node_modules/picomatch": { 1045 + "version": "4.0.3", 1046 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 1047 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 1048 + "dev": true, 1049 + "license": "MIT", 1050 + "engines": { 1051 + "node": ">=12" 1052 + }, 1053 + "funding": { 1054 + "url": "https://github.com/sponsors/jonschlinkert" 1055 + } 1056 + }, 1057 + "node_modules/pkg-dir": { 1058 + "version": "4.2.0", 1059 + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 1060 + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 1061 + "dev": true, 1062 + "license": "MIT", 1063 + "dependencies": { 1064 + "find-up": "^4.0.0" 1065 + }, 1066 + "engines": { 1067 + "node": ">=8" 1068 + } 1069 + }, 1070 + "node_modules/resolve": { 1071 + "version": "1.22.11", 1072 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", 1073 + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", 1074 + "dev": true, 1075 + "license": "MIT", 1076 + "dependencies": { 1077 + "is-core-module": "^2.16.1", 1078 + "path-parse": "^1.0.7", 1079 + "supports-preserve-symlinks-flag": "^1.0.0" 1080 + }, 1081 + "bin": { 1082 + "resolve": "bin/resolve" 1083 + }, 1084 + "engines": { 1085 + "node": ">= 0.4" 1086 + }, 1087 + "funding": { 1088 + "url": "https://github.com/sponsors/ljharb" 1089 + } 1090 + }, 1091 + "node_modules/rollup": { 1092 + "version": "4.56.0", 1093 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", 1094 + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", 1095 + "dev": true, 1096 + "license": "MIT", 1097 + "dependencies": { 1098 + "@types/estree": "1.0.8" 1099 + }, 1100 + "bin": { 1101 + "rollup": "dist/bin/rollup" 1102 + }, 1103 + "engines": { 1104 + "node": ">=18.0.0", 1105 + "npm": ">=8.0.0" 1106 + }, 1107 + "optionalDependencies": { 1108 + "@rollup/rollup-android-arm-eabi": "4.56.0", 1109 + "@rollup/rollup-android-arm64": "4.56.0", 1110 + "@rollup/rollup-darwin-arm64": "4.56.0", 1111 + "@rollup/rollup-darwin-x64": "4.56.0", 1112 + "@rollup/rollup-freebsd-arm64": "4.56.0", 1113 + "@rollup/rollup-freebsd-x64": "4.56.0", 1114 + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", 1115 + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", 1116 + "@rollup/rollup-linux-arm64-gnu": "4.56.0", 1117 + "@rollup/rollup-linux-arm64-musl": "4.56.0", 1118 + "@rollup/rollup-linux-loong64-gnu": "4.56.0", 1119 + "@rollup/rollup-linux-loong64-musl": "4.56.0", 1120 + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", 1121 + "@rollup/rollup-linux-ppc64-musl": "4.56.0", 1122 + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", 1123 + "@rollup/rollup-linux-riscv64-musl": "4.56.0", 1124 + "@rollup/rollup-linux-s390x-gnu": "4.56.0", 1125 + "@rollup/rollup-linux-x64-gnu": "4.56.0", 1126 + "@rollup/rollup-linux-x64-musl": "4.56.0", 1127 + "@rollup/rollup-openbsd-x64": "4.56.0", 1128 + "@rollup/rollup-openharmony-arm64": "4.56.0", 1129 + "@rollup/rollup-win32-arm64-msvc": "4.56.0", 1130 + "@rollup/rollup-win32-ia32-msvc": "4.56.0", 1131 + "@rollup/rollup-win32-x64-gnu": "4.56.0", 1132 + "@rollup/rollup-win32-x64-msvc": "4.56.0", 1133 + "fsevents": "~2.3.2" 1134 + } 1135 + }, 1136 + "node_modules/rollup-plugin-typescript2": { 1137 + "version": "0.36.0", 1138 + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz", 1139 + "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==", 1140 + "dev": true, 1141 + "license": "MIT", 1142 + "dependencies": { 1143 + "@rollup/pluginutils": "^4.1.2", 1144 + "find-cache-dir": "^3.3.2", 1145 + "fs-extra": "^10.0.0", 1146 + "semver": "^7.5.4", 1147 + "tslib": "^2.6.2" 1148 + }, 1149 + "peerDependencies": { 1150 + "rollup": ">=1.26.3", 1151 + "typescript": ">=2.4.0" 1152 + } 1153 + }, 1154 + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { 1155 + "version": "4.2.1", 1156 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 1157 + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 1158 + "dev": true, 1159 + "license": "MIT", 1160 + "dependencies": { 1161 + "estree-walker": "^2.0.1", 1162 + "picomatch": "^2.2.2" 1163 + }, 1164 + "engines": { 1165 + "node": ">= 8.0.0" 1166 + } 1167 + }, 1168 + "node_modules/rollup-plugin-typescript2/node_modules/picomatch": { 1169 + "version": "2.3.1", 1170 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1171 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1172 + "dev": true, 1173 + "license": "MIT", 1174 + "engines": { 1175 + "node": ">=8.6" 1176 + }, 1177 + "funding": { 1178 + "url": "https://github.com/sponsors/jonschlinkert" 1179 + } 1180 + }, 1181 + "node_modules/semver": { 1182 + "version": "7.7.3", 1183 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 1184 + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 1185 + "dev": true, 1186 + "license": "ISC", 1187 + "bin": { 1188 + "semver": "bin/semver.js" 1189 + }, 1190 + "engines": { 1191 + "node": ">=10" 1192 + } 1193 + }, 1194 + "node_modules/style-mod": { 1195 + "version": "4.1.3", 1196 + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", 1197 + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", 1198 + "dev": true, 1199 + "license": "MIT", 1200 + "peer": true 1201 + }, 1202 + "node_modules/supports-preserve-symlinks-flag": { 1203 + "version": "1.0.0", 1204 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1205 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1206 + "dev": true, 1207 + "license": "MIT", 1208 + "engines": { 1209 + "node": ">= 0.4" 1210 + }, 1211 + "funding": { 1212 + "url": "https://github.com/sponsors/ljharb" 1213 + } 1214 + }, 1215 + "node_modules/tlds": { 1216 + "version": "1.261.0", 1217 + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", 1218 + "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", 1219 + "license": "MIT", 1220 + "bin": { 1221 + "tlds": "bin.js" 1222 + } 1223 + }, 1224 + "node_modules/tslib": { 1225 + "version": "2.8.1", 1226 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1227 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1228 + "license": "0BSD" 1229 + }, 1230 + "node_modules/typescript": { 1231 + "version": "5.9.3", 1232 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 1233 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 1234 + "dev": true, 1235 + "license": "Apache-2.0", 1236 + "bin": { 1237 + "tsc": "bin/tsc", 1238 + "tsserver": "bin/tsserver" 1239 + }, 1240 + "engines": { 1241 + "node": ">=14.17" 1242 + } 1243 + }, 1244 + "node_modules/uint8arrays": { 1245 + "version": "3.0.0", 1246 + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", 1247 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 1248 + "license": "MIT", 1249 + "dependencies": { 1250 + "multiformats": "^9.4.2" 1251 + } 1252 + }, 1253 + "node_modules/undici-types": { 1254 + "version": "6.21.0", 1255 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 1256 + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 1257 + "dev": true, 1258 + "license": "MIT" 1259 + }, 1260 + "node_modules/unicode-segmenter": { 1261 + "version": "0.14.5", 1262 + "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz", 1263 + "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==", 1264 + "license": "MIT" 1265 + }, 1266 + "node_modules/universalify": { 1267 + "version": "2.0.1", 1268 + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1269 + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1270 + "dev": true, 1271 + "license": "MIT", 1272 + "engines": { 1273 + "node": ">= 10.0.0" 1274 + } 1275 + }, 1276 + "node_modules/w3c-keyname": { 1277 + "version": "2.2.8", 1278 + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 1279 + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 1280 + "dev": true, 1281 + "license": "MIT", 1282 + "peer": true 1283 + }, 1284 + "node_modules/wrappy": { 1285 + "version": "1.0.2", 1286 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1287 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1288 + "dev": true, 1289 + "license": "ISC" 1290 + }, 1291 + "node_modules/zod": { 1292 + "version": "3.25.76", 1293 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 1294 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 1295 + "license": "MIT", 1296 + "funding": { 1297 + "url": "https://github.com/sponsors/colinhacks" 1298 + } 1299 + } 1300 + } 1301 + }
+22
package.json
··· 1 + { 2 + "name": "obsidian-atproto-publisher", 3 + "version": "0.1.0", 4 + "description": "Publish Obsidian notes to ATProto custom records.", 5 + "main": "main.js", 6 + "scripts": { 7 + "build": "rollup -c", 8 + "dev": "rollup -c -w" 9 + }, 10 + "dependencies": { 11 + "@atproto/api": "^0.12.7" 12 + }, 13 + "devDependencies": { 14 + "@rollup/plugin-commonjs": "^25.0.7", 15 + "@rollup/plugin-node-resolve": "^15.2.3", 16 + "@types/node": "^20.11.30", 17 + "obsidian": "latest", 18 + "rollup": "^4.22.4", 19 + "rollup-plugin-typescript2": "^0.36.0", 20 + "typescript": "^5.5.4" 21 + } 22 + }
+24
rollup.config.js
··· 1 + import resolve from "@rollup/plugin-node-resolve"; 2 + import commonjs from "@rollup/plugin-commonjs"; 3 + import typescript from "rollup-plugin-typescript2"; 4 + 5 + export default { 6 + input: "src/main.ts", 7 + output: { 8 + file: "main.js", 9 + format: "cjs", 10 + sourcemap: true, 11 + exports: "default" 12 + }, 13 + external: ["obsidian", "electron", "fs", "path", "crypto"], 14 + plugins: [ 15 + resolve({ 16 + browser: true, 17 + preferBuiltins: false 18 + }), 19 + commonjs(), 20 + typescript({ 21 + tsconfig: "./tsconfig.json" 22 + }) 23 + ] 24 + };
+559
src/main.ts
··· 1 + import { 2 + App, 3 + Notice, 4 + Plugin, 5 + PluginSettingTab, 6 + Setting, 7 + TFile, 8 + normalizePath 9 + } from "obsidian"; 10 + import { BskyAgent } from "@atproto/api"; 11 + 12 + interface AtprotoPublisherSettings { 13 + identifier: string; 14 + appPassword: string; 15 + serviceUrl: string; 16 + repoDid: string; 17 + collectionNsid: string; 18 + assetBaseUrl: string; 19 + canonicalBaseUrl: string; 20 + publishFrontmatterKey: string; 21 + slugFrontmatterKey: string; 22 + titleFrontmatterKey: string; 23 + summaryFrontmatterKey: string; 24 + tagsFrontmatterKey: string; 25 + } 26 + 27 + interface AssetReference { 28 + url: string; 29 + alt?: string; 30 + source?: string; 31 + } 32 + 33 + interface AtprotoPostRecord { 34 + $type: string; 35 + title: string; 36 + slug: string; 37 + bodyMarkdown: string; 38 + publishedAt: string; 39 + updatedAt: string; 40 + summary?: string; 41 + tags?: string[]; 42 + canonicalUrl?: string; 43 + assets?: AssetReference[]; 44 + } 45 + 46 + const DEFAULT_SETTINGS: AtprotoPublisherSettings = { 47 + identifier: "", 48 + appPassword: "", 49 + serviceUrl: "https://bsky.social", 50 + repoDid: "", 51 + collectionNsid: "com.marcobonomo.blog.post", 52 + assetBaseUrl: "", 53 + canonicalBaseUrl: "", 54 + publishFrontmatterKey: "published", 55 + slugFrontmatterKey: "slug", 56 + titleFrontmatterKey: "title", 57 + summaryFrontmatterKey: "summary", 58 + tagsFrontmatterKey: "tags" 59 + }; 60 + 61 + export default class AtprotoPublisherPlugin extends Plugin { 62 + settings!: AtprotoPublisherSettings; 63 + 64 + async onload() { 65 + await this.loadSettings(); 66 + 67 + this.addSettingTab(new AtprotoPublisherSettingTab(this.app, this)); 68 + 69 + this.addCommand({ 70 + id: "publish-current-note-atproto", 71 + name: "Publish current note to ATProto", 72 + checkCallback: (checking: boolean) => { 73 + const file = this.app.workspace.getActiveFile(); 74 + if (!file) { 75 + return false; 76 + } 77 + if (!checking) { 78 + void this.publishFile(file); 79 + } 80 + return true; 81 + } 82 + }); 83 + 84 + this.addCommand({ 85 + id: "publish-all-notes-atproto", 86 + name: "Publish all notes marked published", 87 + callback: () => { 88 + void this.publishAllPublished(); 89 + } 90 + }); 91 + } 92 + 93 + async loadSettings() { 94 + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 95 + } 96 + 97 + async saveSettings() { 98 + await this.saveData(this.settings); 99 + } 100 + 101 + private async publishAllPublished() { 102 + if (!this.validateSettings()) { 103 + return; 104 + } 105 + 106 + const files = this.app.vault.getMarkdownFiles(); 107 + const publishedFiles = files.filter((file) => this.isMarkedPublished(file)); 108 + 109 + if (publishedFiles.length === 0) { 110 + new Notice("No notes marked as published."); 111 + return; 112 + } 113 + 114 + new Notice(`Publishing ${publishedFiles.length} notes to ATProto...`); 115 + for (const file of publishedFiles) { 116 + await this.publishFile(file, true); 117 + } 118 + new Notice("ATProto publish finished."); 119 + } 120 + 121 + private async publishFile(file: TFile, suppressNotices = false) { 122 + if (!this.validateSettings()) { 123 + return; 124 + } 125 + 126 + try { 127 + const frontmatter = this.getFrontmatter(file); 128 + const slug = this.getFrontmatterString(frontmatter, this.settings.slugFrontmatterKey) ?? file.basename; 129 + const title = this.getFrontmatterString(frontmatter, this.settings.titleFrontmatterKey) ?? file.basename; 130 + const summary = this.getSummary(frontmatter); 131 + const tags = this.normalizeTags(frontmatter[this.settings.tagsFrontmatterKey]); 132 + const publishedAt = this.resolvePublishedAt(frontmatter); 133 + const canonicalUrl = this.buildCanonicalUrl(slug); 134 + 135 + const fileContent = await this.app.vault.read(file); 136 + const bodyMarkdown = this.stripFrontmatter(fileContent).trim(); 137 + if (!bodyMarkdown) { 138 + if (!suppressNotices) { 139 + new Notice("Note has no content to publish."); 140 + } 141 + return; 142 + } 143 + 144 + const assets = this.extractAssets(bodyMarkdown); 145 + const record: AtprotoPostRecord = { 146 + $type: this.settings.collectionNsid, 147 + title, 148 + slug, 149 + bodyMarkdown, 150 + publishedAt, 151 + updatedAt: new Date().toISOString() 152 + }; 153 + 154 + if (summary) { 155 + record.summary = summary; 156 + } 157 + 158 + if (tags.length > 0) { 159 + record.tags = tags; 160 + } 161 + 162 + if (canonicalUrl) { 163 + record.canonicalUrl = canonicalUrl; 164 + } 165 + 166 + if (assets.length > 0) { 167 + record.assets = assets; 168 + } 169 + 170 + const agent = await this.createAgent(); 171 + const repo = this.settings.repoDid || agent.session?.did; 172 + if (!repo) { 173 + throw new Error("Missing repo DID. Add it to settings or login to resolve it."); 174 + } 175 + 176 + const response = await agent.api.com.atproto.repo.putRecord({ 177 + repo, 178 + collection: this.settings.collectionNsid, 179 + rkey: slug, 180 + record 181 + }); 182 + 183 + const { uri, cid } = response.data; 184 + 185 + await this.app.fileManager.processFrontMatter(file, (data: Record<string, any>) => { 186 + data.atprotoUri = uri; 187 + data.atprotoCid = cid; 188 + data.atprotoCollection = this.settings.collectionNsid; 189 + data.atprotoRkey = slug; 190 + data.atprotoPublishedAt = publishedAt; 191 + data.atprotoUpdatedAt = record.updatedAt; 192 + if (!data[this.settings.slugFrontmatterKey]) { 193 + data[this.settings.slugFrontmatterKey] = slug; 194 + } 195 + }); 196 + 197 + if (!suppressNotices) { 198 + new Notice(`Published ${file.basename} to ATProto.`); 199 + } 200 + } catch (error) { 201 + const message = error instanceof Error ? error.message : "Unknown error"; 202 + new Notice(`ATProto publish failed: ${message}`); 203 + console.error("ATProto publish error", error); 204 + } 205 + } 206 + 207 + private validateSettings(): boolean { 208 + if (!this.settings.identifier || !this.settings.appPassword) { 209 + new Notice("Set your ATProto identifier and app password in settings."); 210 + return false; 211 + } 212 + 213 + if (!this.settings.serviceUrl) { 214 + new Notice("Set your ATProto service URL in settings."); 215 + return false; 216 + } 217 + 218 + if (!this.settings.collectionNsid) { 219 + new Notice("Set your ATProto collection NSID in settings."); 220 + return false; 221 + } 222 + 223 + return true; 224 + } 225 + 226 + private async createAgent(): Promise<BskyAgent> { 227 + const agent = new BskyAgent({ 228 + service: this.settings.serviceUrl 229 + }); 230 + 231 + await agent.login({ 232 + identifier: this.settings.identifier, 233 + password: this.settings.appPassword 234 + }); 235 + 236 + return agent; 237 + } 238 + 239 + private isMarkedPublished(file: TFile): boolean { 240 + const frontmatter = this.getFrontmatter(file); 241 + const value = frontmatter[this.settings.publishFrontmatterKey]; 242 + return value === true || value === "true"; 243 + } 244 + 245 + private getFrontmatter(file: TFile): Record<string, any> { 246 + return this.app.metadataCache.getFileCache(file)?.frontmatter ?? {}; 247 + } 248 + 249 + private getFrontmatterString(frontmatter: Record<string, any>, key: string): string | null { 250 + const value = frontmatter[key]; 251 + if (typeof value === "string" && value.trim().length > 0) { 252 + return value.trim(); 253 + } 254 + return null; 255 + } 256 + 257 + private getSummary(frontmatter: Record<string, any>): string | undefined { 258 + const configured = this.getFrontmatterString(frontmatter, this.settings.summaryFrontmatterKey); 259 + if (configured) { 260 + return configured; 261 + } 262 + 263 + const fallback = this.getFrontmatterString(frontmatter, "description"); 264 + return fallback ?? undefined; 265 + } 266 + 267 + private resolvePublishedAt(frontmatter: Record<string, any>): string { 268 + const stored = this.getFrontmatterString(frontmatter, "atprotoPublishedAt"); 269 + if (stored) { 270 + return stored; 271 + } 272 + 273 + const candidates = [ 274 + this.getFrontmatterString(frontmatter, "publishedAt"), 275 + this.getFrontmatterString(frontmatter, "date") 276 + ]; 277 + 278 + for (const candidate of candidates) { 279 + if (!candidate) { 280 + continue; 281 + } 282 + const parsed = this.toIso(candidate); 283 + if (parsed) { 284 + return parsed; 285 + } 286 + } 287 + 288 + return new Date().toISOString(); 289 + } 290 + 291 + private toIso(value: string): string | null { 292 + const date = new Date(value); 293 + if (Number.isNaN(date.getTime())) { 294 + return null; 295 + } 296 + return date.toISOString(); 297 + } 298 + 299 + private buildCanonicalUrl(slug: string): string | undefined { 300 + if (!this.settings.canonicalBaseUrl) { 301 + return undefined; 302 + } 303 + const base = this.ensureTrailingSlash(this.settings.canonicalBaseUrl.trim()); 304 + return new URL(slug, base).toString(); 305 + } 306 + 307 + private ensureTrailingSlash(value: string): string { 308 + if (!value.endsWith("/")) { 309 + return `${value}/`; 310 + } 311 + return value; 312 + } 313 + 314 + private stripFrontmatter(source: string): string { 315 + return source.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, ""); 316 + } 317 + 318 + private normalizeTags(value: unknown): string[] { 319 + if (!value) { 320 + return []; 321 + } 322 + if (Array.isArray(value)) { 323 + return value.map((tag) => String(tag).trim()).filter((tag) => tag.length > 0); 324 + } 325 + if (typeof value === "string") { 326 + return value 327 + .split(",") 328 + .map((tag) => tag.trim()) 329 + .filter((tag) => tag.length > 0); 330 + } 331 + return []; 332 + } 333 + 334 + private extractAssets(markdown: string): AssetReference[] { 335 + const assets = new Map<string, AssetReference>(); 336 + const markdownImageRegex = /!\[([^\]]*)\]\(([^)]+)\)/g; 337 + const wikiImageRegex = /!\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g; 338 + 339 + for (const match of markdown.matchAll(markdownImageRegex)) { 340 + const alt = match[1]?.trim(); 341 + const rawUrl = this.cleanMarkdownUrl(match[2]); 342 + const url = this.normalizeAssetUrl(rawUrl); 343 + if (!assets.has(url)) { 344 + assets.set(url, { url, alt: alt || undefined, source: rawUrl }); 345 + } 346 + } 347 + 348 + for (const match of markdown.matchAll(wikiImageRegex)) { 349 + const path = match[1]?.trim(); 350 + const alt = match[2]?.trim(); 351 + if (!path) { 352 + continue; 353 + } 354 + const url = this.normalizeAssetUrl(path); 355 + if (!assets.has(url)) { 356 + assets.set(url, { url, alt: alt || undefined, source: path }); 357 + } 358 + } 359 + 360 + return Array.from(assets.values()); 361 + } 362 + 363 + private cleanMarkdownUrl(value: string): string { 364 + const trimmed = value.trim().replace(/^<|>$/g, ""); 365 + const parts = trimmed.split(/\s+/); 366 + return parts[0]; 367 + } 368 + 369 + private normalizeAssetUrl(value: string): string { 370 + const cleaned = value.trim(); 371 + if (cleaned.startsWith("http://") || cleaned.startsWith("https://")) { 372 + return cleaned; 373 + } 374 + if (cleaned.startsWith("data:")) { 375 + return cleaned; 376 + } 377 + if (!this.settings.assetBaseUrl) { 378 + return cleaned; 379 + } 380 + 381 + const base = this.ensureTrailingSlash(this.settings.assetBaseUrl.trim()); 382 + const normalizedPath = cleaned.startsWith("/") ? cleaned.slice(1) : cleaned; 383 + const finalPath = normalizePath(normalizedPath); 384 + return encodeURI(new URL(finalPath, base).toString()); 385 + } 386 + } 387 + 388 + class AtprotoPublisherSettingTab extends PluginSettingTab { 389 + plugin: AtprotoPublisherPlugin; 390 + 391 + constructor(app: App, plugin: AtprotoPublisherPlugin) { 392 + super(app, plugin); 393 + this.plugin = plugin; 394 + } 395 + 396 + display(): void { 397 + const { containerEl } = this; 398 + containerEl.empty(); 399 + 400 + new Setting(containerEl) 401 + .setName("Identifier") 402 + .setDesc("Handle or email used to log in to the PDS.") 403 + .addText((text) => 404 + text 405 + .setPlaceholder("you.bsky.social") 406 + .setValue(this.plugin.settings.identifier) 407 + .onChange(async (value) => { 408 + this.plugin.settings.identifier = value.trim(); 409 + await this.plugin.saveSettings(); 410 + }) 411 + ); 412 + 413 + new Setting(containerEl) 414 + .setName("App password") 415 + .setDesc("Use an app password from your ATProto provider.") 416 + .addText((text) => { 417 + text.inputEl.type = "password"; 418 + text 419 + .setPlaceholder("xxxx-xxxx-xxxx-xxxx") 420 + .setValue(this.plugin.settings.appPassword) 421 + .onChange(async (value) => { 422 + this.plugin.settings.appPassword = value.trim(); 423 + await this.plugin.saveSettings(); 424 + }); 425 + }); 426 + 427 + new Setting(containerEl) 428 + .setName("Service URL") 429 + .setDesc("PDS service URL, for example https://bsky.social.") 430 + .addText((text) => 431 + text 432 + .setPlaceholder("https://bsky.social") 433 + .setValue(this.plugin.settings.serviceUrl) 434 + .onChange(async (value) => { 435 + this.plugin.settings.serviceUrl = value.trim(); 436 + await this.plugin.saveSettings(); 437 + }) 438 + ); 439 + 440 + new Setting(containerEl) 441 + .setName("Repo DID") 442 + .setDesc("Optional repo DID. Leave empty to use the logged in DID.") 443 + .addText((text) => 444 + text 445 + .setPlaceholder("did:plc:...") 446 + .setValue(this.plugin.settings.repoDid) 447 + .onChange(async (value) => { 448 + this.plugin.settings.repoDid = value.trim(); 449 + await this.plugin.saveSettings(); 450 + }) 451 + ); 452 + 453 + new Setting(containerEl) 454 + .setName("Collection NSID") 455 + .setDesc("ATProto collection namespace for blog posts.") 456 + .addText((text) => 457 + text 458 + .setPlaceholder("com.example.blog.post") 459 + .setValue(this.plugin.settings.collectionNsid) 460 + .onChange(async (value) => { 461 + this.plugin.settings.collectionNsid = value.trim(); 462 + await this.plugin.saveSettings(); 463 + }) 464 + ); 465 + 466 + new Setting(containerEl) 467 + .setName("Asset base URL") 468 + .setDesc("Base URL for local asset links in your notes.") 469 + .addText((text) => 470 + text 471 + .setPlaceholder("https://assets.example.com/") 472 + .setValue(this.plugin.settings.assetBaseUrl) 473 + .onChange(async (value) => { 474 + this.plugin.settings.assetBaseUrl = value.trim(); 475 + await this.plugin.saveSettings(); 476 + }) 477 + ); 478 + 479 + new Setting(containerEl) 480 + .setName("Canonical base URL") 481 + .setDesc("Base URL used to build canonical URLs for posts.") 482 + .addText((text) => 483 + text 484 + .setPlaceholder("https://example.com/blog/") 485 + .setValue(this.plugin.settings.canonicalBaseUrl) 486 + .onChange(async (value) => { 487 + this.plugin.settings.canonicalBaseUrl = value.trim(); 488 + await this.plugin.saveSettings(); 489 + }) 490 + ); 491 + 492 + containerEl.createEl("h3", { text: "Frontmatter keys" }); 493 + 494 + new Setting(containerEl) 495 + .setName("Published flag") 496 + .setDesc("Frontmatter key used to mark notes as publishable.") 497 + .addText((text) => 498 + text 499 + .setPlaceholder("published") 500 + .setValue(this.plugin.settings.publishFrontmatterKey) 501 + .onChange(async (value) => { 502 + this.plugin.settings.publishFrontmatterKey = value.trim() || "published"; 503 + await this.plugin.saveSettings(); 504 + }) 505 + ); 506 + 507 + new Setting(containerEl) 508 + .setName("Slug key") 509 + .setDesc("Frontmatter key for the post slug.") 510 + .addText((text) => 511 + text 512 + .setPlaceholder("slug") 513 + .setValue(this.plugin.settings.slugFrontmatterKey) 514 + .onChange(async (value) => { 515 + this.plugin.settings.slugFrontmatterKey = value.trim() || "slug"; 516 + await this.plugin.saveSettings(); 517 + }) 518 + ); 519 + 520 + new Setting(containerEl) 521 + .setName("Title key") 522 + .setDesc("Frontmatter key for the post title.") 523 + .addText((text) => 524 + text 525 + .setPlaceholder("title") 526 + .setValue(this.plugin.settings.titleFrontmatterKey) 527 + .onChange(async (value) => { 528 + this.plugin.settings.titleFrontmatterKey = value.trim() || "title"; 529 + await this.plugin.saveSettings(); 530 + }) 531 + ); 532 + 533 + new Setting(containerEl) 534 + .setName("Summary key") 535 + .setDesc("Frontmatter key used for the summary field.") 536 + .addText((text) => 537 + text 538 + .setPlaceholder("summary") 539 + .setValue(this.plugin.settings.summaryFrontmatterKey) 540 + .onChange(async (value) => { 541 + this.plugin.settings.summaryFrontmatterKey = value.trim() || "summary"; 542 + await this.plugin.saveSettings(); 543 + }) 544 + ); 545 + 546 + new Setting(containerEl) 547 + .setName("Tags key") 548 + .setDesc("Frontmatter key used for tags.") 549 + .addText((text) => 550 + text 551 + .setPlaceholder("tags") 552 + .setValue(this.plugin.settings.tagsFrontmatterKey) 553 + .onChange(async (value) => { 554 + this.plugin.settings.tagsFrontmatterKey = value.trim() || "tags"; 555 + await this.plugin.saveSettings(); 556 + }) 557 + ); 558 + } 559 + }
styles.css

This is a binary file and will not be displayed.

+15
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2020", 4 + "module": "ESNext", 5 + "moduleResolution": "Node", 6 + "strict": true, 7 + "noImplicitAny": true, 8 + "esModuleInterop": true, 9 + "forceConsistentCasingInFileNames": true, 10 + "skipLibCheck": true, 11 + "types": ["node", "obsidian"], 12 + "outDir": "dist" 13 + }, 14 + "include": ["src/**/*.ts"] 15 + }