https://domlink.deployments.hotsocket.fyi/

proper library type stuff and the beginnings of a desktop thing

+375 -54
+7 -2
deno.json
··· 3 3 "lib": [ 4 4 "dom", 5 5 "es2017", 6 - "dom.iterable" 6 + "dom.iterable", 7 + "deno.ns" 7 8 ] 8 - } 9 + }, 10 + "exclude": [ 11 + "node_modules", 12 + "out" 13 + ] 9 14 }
+136 -38
deno.lock
··· 1 1 { 2 - "version": "4", 2 + "version": "5", 3 3 "specifiers": { 4 4 "npm:@atcute/atproto@^3.1.1": "3.1.2", 5 5 "npm:@atcute/bluesky@^3.2.0": "3.2.1", ··· 64 64 "integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==" 65 65 }, 66 66 "@esbuild/aix-ppc64@0.25.9": { 67 - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==" 67 + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", 68 + "os": ["aix"], 69 + "cpu": ["ppc64"] 68 70 }, 69 71 "@esbuild/android-arm64@0.25.9": { 70 - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==" 72 + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", 73 + "os": ["android"], 74 + "cpu": ["arm64"] 71 75 }, 72 76 "@esbuild/android-arm@0.25.9": { 73 - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==" 77 + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", 78 + "os": ["android"], 79 + "cpu": ["arm"] 74 80 }, 75 81 "@esbuild/android-x64@0.25.9": { 76 - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==" 82 + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", 83 + "os": ["android"], 84 + "cpu": ["x64"] 77 85 }, 78 86 "@esbuild/darwin-arm64@0.25.9": { 79 - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==" 87 + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", 88 + "os": ["darwin"], 89 + "cpu": ["arm64"] 80 90 }, 81 91 "@esbuild/darwin-x64@0.25.9": { 82 - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==" 92 + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", 93 + "os": ["darwin"], 94 + "cpu": ["x64"] 83 95 }, 84 96 "@esbuild/freebsd-arm64@0.25.9": { 85 - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==" 97 + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", 98 + "os": ["freebsd"], 99 + "cpu": ["arm64"] 86 100 }, 87 101 "@esbuild/freebsd-x64@0.25.9": { 88 - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==" 102 + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", 103 + "os": ["freebsd"], 104 + "cpu": ["x64"] 89 105 }, 90 106 "@esbuild/linux-arm64@0.25.9": { 91 - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==" 107 + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", 108 + "os": ["linux"], 109 + "cpu": ["arm64"] 92 110 }, 93 111 "@esbuild/linux-arm@0.25.9": { 94 - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==" 112 + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", 113 + "os": ["linux"], 114 + "cpu": ["arm"] 95 115 }, 96 116 "@esbuild/linux-ia32@0.25.9": { 97 - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==" 117 + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", 118 + "os": ["linux"], 119 + "cpu": ["ia32"] 98 120 }, 99 121 "@esbuild/linux-loong64@0.25.9": { 100 - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==" 122 + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", 123 + "os": ["linux"], 124 + "cpu": ["loong64"] 101 125 }, 102 126 "@esbuild/linux-mips64el@0.25.9": { 103 - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==" 127 + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", 128 + "os": ["linux"], 129 + "cpu": ["mips64el"] 104 130 }, 105 131 "@esbuild/linux-ppc64@0.25.9": { 106 - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==" 132 + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", 133 + "os": ["linux"], 134 + "cpu": ["ppc64"] 107 135 }, 108 136 "@esbuild/linux-riscv64@0.25.9": { 109 - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==" 137 + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", 138 + "os": ["linux"], 139 + "cpu": ["riscv64"] 110 140 }, 111 141 "@esbuild/linux-s390x@0.25.9": { 112 - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==" 142 + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", 143 + "os": ["linux"], 144 + "cpu": ["s390x"] 113 145 }, 114 146 "@esbuild/linux-x64@0.25.9": { 115 - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==" 147 + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", 148 + "os": ["linux"], 149 + "cpu": ["x64"] 116 150 }, 117 151 "@esbuild/netbsd-arm64@0.25.9": { 118 - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==" 152 + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", 153 + "os": ["netbsd"], 154 + "cpu": ["arm64"] 119 155 }, 120 156 "@esbuild/netbsd-x64@0.25.9": { 121 - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==" 157 + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", 158 + "os": ["netbsd"], 159 + "cpu": ["x64"] 122 160 }, 123 161 "@esbuild/openbsd-arm64@0.25.9": { 124 - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==" 162 + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", 163 + "os": ["openbsd"], 164 + "cpu": ["arm64"] 125 165 }, 126 166 "@esbuild/openbsd-x64@0.25.9": { 127 - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==" 167 + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", 168 + "os": ["openbsd"], 169 + "cpu": ["x64"] 128 170 }, 129 171 "@esbuild/openharmony-arm64@0.25.9": { 130 - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==" 172 + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", 173 + "os": ["openharmony"], 174 + "cpu": ["arm64"] 131 175 }, 132 176 "@esbuild/sunos-x64@0.25.9": { 133 - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==" 177 + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", 178 + "os": ["sunos"], 179 + "cpu": ["x64"] 134 180 }, 135 181 "@esbuild/win32-arm64@0.25.9": { 136 - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==" 182 + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", 183 + "os": ["win32"], 184 + "cpu": ["arm64"] 137 185 }, 138 186 "@esbuild/win32-ia32@0.25.9": { 139 - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==" 187 + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", 188 + "os": ["win32"], 189 + "cpu": ["ia32"] 140 190 }, 141 191 "@esbuild/win32-x64@0.25.9": { 142 - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==" 192 + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", 193 + "os": ["win32"], 194 + "cpu": ["x64"] 143 195 }, 144 196 "ansi-regex@5.0.1": { 145 197 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" ··· 220 272 "through2", 221 273 "untildify", 222 274 "yargs" 223 - ] 275 + ], 276 + "bin": true 224 277 }, 225 278 "core-util-is@1.0.3": { 226 279 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" ··· 259 312 }, 260 313 "esbuild@0.25.9": { 261 314 "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", 262 - "dependencies": [ 315 + "optionalDependencies": [ 263 316 "@esbuild/aix-ppc64", 264 317 "@esbuild/android-arm", 265 318 "@esbuild/android-arm64", ··· 286 339 "@esbuild/win32-arm64", 287 340 "@esbuild/win32-ia32", 288 341 "@esbuild/win32-x64" 289 - ] 342 + ], 343 + "scripts": true, 344 + "bin": true 290 345 }, 291 346 "escalade@3.2.0": { 292 347 "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" ··· 340 395 "minimatch", 341 396 "once", 342 397 "path-is-absolute" 343 - ] 398 + ], 399 + "deprecated": true 344 400 }, 345 401 "gopd@1.2.0": { 346 402 "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" ··· 358 414 ] 359 415 }, 360 416 "he@1.2.0": { 361 - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 417 + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 418 + "bin": true 362 419 }, 363 420 "html-encoding-sniffer@3.0.0": { 364 421 "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", ··· 390 447 "secure-compare", 391 448 "union", 392 449 "url-join" 393 - ] 450 + ], 451 + "bin": true 394 452 }, 395 453 "iconv-lite@0.6.3": { 396 454 "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", ··· 403 461 "dependencies": [ 404 462 "once", 405 463 "wrappy" 406 - ] 464 + ], 465 + "deprecated": true 407 466 }, 408 467 "inherits@2.0.4": { 409 468 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" ··· 421 480 "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 422 481 }, 423 482 "mime@1.6.0": { 424 - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 483 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 484 + "bin": true 425 485 }, 426 486 "minimatch@3.1.2": { 427 487 "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ··· 433 493 "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 434 494 }, 435 495 "mkdirp@1.0.4": { 436 - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 496 + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 497 + "bin": true 437 498 }, 438 499 "ms@2.1.3": { 439 500 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" ··· 455 516 ] 456 517 }, 457 518 "opener@1.5.2": { 458 - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" 519 + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", 520 + "bin": true 459 521 }, 460 522 "path-is-absolute@1.0.1": { 461 523 "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" ··· 585 647 ] 586 648 }, 587 649 "typescript@5.9.2": { 588 - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==" 650 + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", 651 + "bin": true 589 652 }, 590 653 "union@0.5.0": { 591 654 "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", ··· 640 703 "yargs-parser" 641 704 ] 642 705 } 706 + }, 707 + "remote": { 708 + "https://deno.land/std@0.224.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975", 709 + "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834", 710 + "https://deno.land/std@0.224.0/assert/assert_almost_equals.ts": "9e416114322012c9a21fa68e187637ce2d7df25bcbdbfd957cd639e65d3cf293", 711 + "https://deno.land/std@0.224.0/assert/assert_array_includes.ts": "14c5094471bc8e4a7895fc6aa5a184300d8a1879606574cb1cd715ef36a4a3c7", 712 + "https://deno.land/std@0.224.0/assert/assert_equals.ts": "3bbca947d85b9d374a108687b1a8ba3785a7850436b5a8930d81f34a32cb8c74", 713 + "https://deno.land/std@0.224.0/assert/assert_exists.ts": "43420cf7f956748ae6ed1230646567b3593cb7a36c5a5327269279c870c5ddfd", 714 + "https://deno.land/std@0.224.0/assert/assert_false.ts": "3e9be8e33275db00d952e9acb0cd29481a44fa0a4af6d37239ff58d79e8edeff", 715 + "https://deno.land/std@0.224.0/assert/assert_greater.ts": "5e57b201fd51b64ced36c828e3dfd773412c1a6120c1a5a99066c9b261974e46", 716 + "https://deno.land/std@0.224.0/assert/assert_greater_or_equal.ts": "9870030f997a08361b6f63400273c2fb1856f5db86c0c3852aab2a002e425c5b", 717 + "https://deno.land/std@0.224.0/assert/assert_instance_of.ts": "e22343c1fdcacfaea8f37784ad782683ec1cf599ae9b1b618954e9c22f376f2c", 718 + "https://deno.land/std@0.224.0/assert/assert_is_error.ts": "f856b3bc978a7aa6a601f3fec6603491ab6255118afa6baa84b04426dd3cc491", 719 + "https://deno.land/std@0.224.0/assert/assert_less.ts": "60b61e13a1982865a72726a5fa86c24fad7eb27c3c08b13883fb68882b307f68", 720 + "https://deno.land/std@0.224.0/assert/assert_less_or_equal.ts": "d2c84e17faba4afe085e6c9123a63395accf4f9e00150db899c46e67420e0ec3", 721 + "https://deno.land/std@0.224.0/assert/assert_match.ts": "ace1710dd3b2811c391946954234b5da910c5665aed817943d086d4d4871a8b7", 722 + "https://deno.land/std@0.224.0/assert/assert_not_equals.ts": "78d45dd46133d76ce624b2c6c09392f6110f0df9b73f911d20208a68dee2ef29", 723 + "https://deno.land/std@0.224.0/assert/assert_not_instance_of.ts": "3434a669b4d20cdcc5359779301a0588f941ffdc2ad68803c31eabdb4890cf7a", 724 + "https://deno.land/std@0.224.0/assert/assert_not_match.ts": "df30417240aa2d35b1ea44df7e541991348a063d9ee823430e0b58079a72242a", 725 + "https://deno.land/std@0.224.0/assert/assert_not_strict_equals.ts": "37f73880bd672709373d6dc2c5f148691119bed161f3020fff3548a0496f71b8", 726 + "https://deno.land/std@0.224.0/assert/assert_object_match.ts": "411450fd194fdaabc0089ae68f916b545a49d7b7e6d0026e84a54c9e7eed2693", 727 + "https://deno.land/std@0.224.0/assert/assert_rejects.ts": "4bee1d6d565a5b623146a14668da8f9eb1f026a4f338bbf92b37e43e0aa53c31", 728 + "https://deno.land/std@0.224.0/assert/assert_strict_equals.ts": "b4f45f0fd2e54d9029171876bd0b42dd9ed0efd8f853ab92a3f50127acfa54f5", 729 + "https://deno.land/std@0.224.0/assert/assert_string_includes.ts": "496b9ecad84deab72c8718735373feb6cdaa071eb91a98206f6f3cb4285e71b8", 730 + "https://deno.land/std@0.224.0/assert/assert_throws.ts": "c6508b2879d465898dab2798009299867e67c570d7d34c90a2d235e4553906eb", 731 + "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917", 732 + "https://deno.land/std@0.224.0/assert/equal.ts": "bddf07bb5fc718e10bb72d5dc2c36c1ce5a8bdd3b647069b6319e07af181ac47", 733 + "https://deno.land/std@0.224.0/assert/fail.ts": "0eba674ffb47dff083f02ced76d5130460bff1a9a68c6514ebe0cdea4abadb68", 734 + "https://deno.land/std@0.224.0/assert/mod.ts": "48b8cb8a619ea0b7958ad7ee9376500fe902284bb36f0e32c598c3dc34cbd6f3", 735 + "https://deno.land/std@0.224.0/assert/unimplemented.ts": "8c55a5793e9147b4f1ef68cd66496b7d5ba7a9e7ca30c6da070c1a58da723d73", 736 + "https://deno.land/std@0.224.0/assert/unreachable.ts": "5ae3dbf63ef988615b93eb08d395dda771c96546565f9e521ed86f6510c29e19", 737 + "https://deno.land/std@0.224.0/fmt/colors.ts": "508563c0659dd7198ba4bbf87e97f654af3c34eb56ba790260f252ad8012e1c5", 738 + "https://deno.land/std@0.224.0/internal/diff.ts": "6234a4b493ebe65dc67a18a0eb97ef683626a1166a1906232ce186ae9f65f4e6", 739 + "https://deno.land/std@0.224.0/internal/format.ts": "0a98ee226fd3d43450245b1844b47003419d34d210fa989900861c79820d21c2", 740 + "https://deno.land/std@0.224.0/internal/mod.ts": "534125398c8e7426183e12dc255bb635d94e06d0f93c60a297723abe69d3b22e" 643 741 }, 644 742 "workspace": { 645 743 "packageJson": {
+3 -2
package.json
··· 15 15 }, 16 16 "scripts": { 17 17 "serve": "http-server ./out -C", 18 - "build": "deno bundle --platform=browser src/* --outdir=out --sourcemap=inline && rsync -av static/ out/", 19 - "build-prod": "deno bundle --platform=browser src/* --outdir=out --minify && rsync -av static/ out/" 18 + "build": "deno bundle --platform=browser src/*.ts --outdir=out --sourcemap=inline && rsync -av static/ out/", 19 + "build-prod": "deno bundle --platform=browser src/*.ts --outdir=out --minify && rsync -av static/ out/", 20 + "test": "deno test test/**/*.ts" 20 21 } 21 22 }
+36
src/desktop.ts
··· 1 + // yeah screw it ill give the miskey thing a shot 2 + 3 + import { Body, Column, Container, Node, Row, Button } from "./domlink.ts"; 4 + import { IssueSearch } from "./issuesearch.ts"; 5 + import { Window } from "./windowing_mod.ts"; 6 + 7 + function webFrame(url: string) { 8 + const frame = document.createElement("iframe"); 9 + frame.src = url; 10 + frame.style.width = "100%"; 11 + frame.style.height = "100%"; 12 + const controls = new Row().with( 13 + "Web Frame Controls:", 14 + new Button("reload", ()=>{frame.contentWindow?.location.reload();}) 15 + ); 16 + 17 + return new Column().with( 18 + controls, 19 + new Node(frame) 20 + ).style((s)=>{ 21 + s.width = "100%"; 22 + s.height = "100%"; 23 + }); 24 + } 25 + 26 + const instantiator = new Column().with( 27 + ...[IssueSearch].map((x)=>{ 28 + return new Button(x.name, ()=>{ 29 + Body.with(new Window(x.name).with(new x())); 30 + }); 31 + }) 32 + ) 33 + 34 + Body.with( 35 + instantiator 36 + );
+14 -12
src/issuesearch.ts
··· 1 - import { Body, Button, Column, Input, Label, Link, Row, Table, TableCell, TableRow } from "./domlink.js"; 1 + import { Body, Button, Column, Input, Label, Link, Row, Table, TableCell, TableRow } from "./domlink.ts"; 2 + import { AtURI, AtURIString } from "./support/atproto.ts"; 3 + import * as Constellation from "./support/constellation.ts" 2 4 Body.with(new Link("TypeScript source here!").to("https://tangled.sh/@hotsocket.fyi/domlink/blob/main/src/issuesearch.ts")); 3 5 type issueRecord = { 4 6 body: string; ··· 72 74 statusText.text = "finding repository"; 73 75 let ownedRepos = await xcall(repoOwnerDoc.pds, "com.atproto.repo.listRecords", { repo: repoOwnerDoc.did, collection: "sh.tangled.repo" }) as recordListing<repoRecord>; 74 76 let repoRecord = ownedRepos.records.find(x=>x.value.name == repoName)!; 75 - let encodedRepoUri = encodeURIComponent(repoRecord.uri); 77 + // let encodedRepoUri = encodeURIComponent(repoRecord.uri); 76 78 statusText.text = `finding issues...`; 77 - let irsp = await (await fetch(`https://constellation.microcosm.blue/links?target=${encodedRepoUri}&collection=sh.tangled.repo.issue&path=.repo`)).json() as constellationResponse; 78 - let allIssueRefs: constellationRecordItem[] = irsp.linking_records; 79 - let nextCursor = irsp.cursor; 80 - while (allIssueRefs.length < irsp.total && nextCursor != null) { 81 - statusText.text = `finding issues... (${allIssueRefs.length}/${irsp.total})`; 82 - let rsp = await (await fetch(`https://constellation.microcosm.blue/links?target=${encodedRepoUri}&collection=sh.tangled.repo.issue&path=.repo&cursor=${nextCursor}`, {headers:{Accept:"application/json"}})).json() as constellationResponse; 83 - nextCursor = rsp.cursor; 84 - allIssueRefs = allIssueRefs.concat(rsp.linking_records); 85 - if (nextCursor == null) break; 86 - } 79 + const allIssueRefs = await Constellation.links(AtURI.fromString(repoRecord.uri as AtURIString), "sh.tangled.repo.issue", ".repo"); 80 + // let allIssueRefs: constellationRecordItem[] = irsp.linking_records; 81 + // let nextCursor = irsp.cursor; 82 + // while (allIssueRefs.length < irsp.total && nextCursor != null) { 83 + // statusText.text = `finding issues... (${allIssueRefs.length}/${irsp.total})`; 84 + // let rsp = await (await fetch(`https://constellation.microcosm.blue/links?target=${encodedRepoUri}&collection=sh.tangled.repo.issue&path=.repo&cursor=${nextCursor}`, {headers:{Accept:"application/json"}})).json() as constellationResponse; 85 + // nextCursor = rsp.cursor; 86 + // allIssueRefs = allIssueRefs.concat(rsp.linking_records); 87 + // if (nextCursor == null) break; 88 + // } 87 89 allIssues = (await Promise.all(allIssueRefs.map(async (issueRef) => { 88 90 let rsp = await Promise.race([(xcall(SLINGSHOT, "com.atproto.repo.getRecord", { 89 91 repo: issueRef.did,
+59
src/support/atproto.ts
··· 1 + // skinny atproto types file for supporting constellation.ts 2 + 3 + /** Type used to imply that a parameter will be run through {@link ValidateNSID} */ 4 + export type NSID = string; 5 + const NSIDExpression = /^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z0-9]{0,62})?)$/; 6 + export function ValidateNSID(nsid: string): string | null { 7 + return NSIDExpression.test(nsid) ? nsid : null; 8 + } 9 + 10 + export type AtURIString = `at://${string}/${string}/${string}`; 11 + export function ValidateDID(did: string): string | null { 12 + const parts = did.split(":"); 13 + const isValid = parts.length == 3 && parts[0] == "did" && (parts[1] == "plc" || parts[1] == "web") && parts[2].length > 0; 14 + return isValid ? did : null; 15 + } 16 + export class AtURI { 17 + readonly authority: string | null; 18 + readonly collection: string | null; 19 + readonly rkey: string | null; 20 + static fromString(uri: AtURIString): AtURI { 21 + const parts = uri.split("/").slice(2); 22 + return new AtURI(ValidateDID(parts[0]), ValidateNSID(parts[1]), parts[2]); 23 + } 24 + constructor(authority: string | null, collection: string | null, rkey: string | null) { 25 + this.authority = authority; 26 + this.collection = collection; 27 + this.rkey = rkey; 28 + } 29 + /** 30 + * Converts URI to at:// URI. 31 + * @returns The string form of this URI, unless if any parts are specified without any preceding elements. 32 + * @example ``` 33 + * // Invalid collection NSID, returns null. 34 + * new AtURI("at://did:web:example.com/cheese/abc123").toString() 35 + * // Invalid 'authority' DID, returns null. 36 + * new AtURI("at://not-a-did/com.example.nsid").toString() 37 + * // All good and happy, returns the string fed in. 38 + * new AtURI("at://did:web:example.com/com.example.nsid/abc123").toString() 39 + * ``` 40 + */ 41 + toString(): string | null { 42 + let ret: (string|null)[] = ["at://"]; 43 + // using `?? ""` to have a "bad" value to find 44 + if (this.authority) { 45 + ret.push(this.authority ?? ""); 46 + } else ret.push(null); 47 + if (this.collection) { 48 + if (ret.indexOf(null) != -1) {return null;} 49 + ret.push("/"); 50 + ret.push(this.collection ?? ""); 51 + } else ret.push(null); 52 + if (this.rkey) { 53 + if (ret.indexOf(null) != -1) {return null;} 54 + ret.push("/"); 55 + ret.push(this.rkey ?? ""); 56 + } 57 + return ret.join(""); 58 + } 59 + }
+40
src/support/constellation.ts
··· 1 + import { AtURI, NSID, ValidateNSID } from "./atproto.ts"; 2 + 3 + // constellation api handling 4 + const BASEURL = "https://constellation.microcosm.blue"; 5 + 6 + 7 + /** Essentially an at:// URI, fed back by constellation. */ 8 + export type Reference = { 9 + did: string; 10 + collection: string; 11 + rkey: string; 12 + } 13 + 14 + /** Raw response type from /links */ 15 + export type LinksResponse = { 16 + total: number; 17 + linking_records: Reference[]; 18 + cursor: string; 19 + }; 20 + /** 21 + * Retrieves an array of record references to records containing links to the specified target. 22 + * @throws When the provided NSID is invalid. 23 + */ 24 + export async function links(target: AtURI, collection: NSID, path: string): Promise<Reference[]> { 25 + if (ValidateNSID(collection) == null) { 26 + throw new Error("invalid NSID for collection parameter"); 27 + } 28 + const _target = encodeURIComponent(target.toString()!); 29 + const _path = encodeURIComponent(path); 30 + let cursor = ""; 31 + let records: Reference[] = []; 32 + while (cursor != null) { 33 + const rsp = await fetch(`${BASEURL}/links?target=${_target.toString()}&collection=${collection}&path=${_path}${cursor ? `&cursor=${cursor}` : ""}`); 34 + const data = await rsp.json() as LinksResponse; 35 + console.log(data.total + " // " + data.cursor); 36 + records = records.concat(data.linking_records); 37 + cursor = data.cursor; 38 + } 39 + return records; 40 + }
+2
src/windowing_mod.ts
··· 35 35 this.titleBar.wraps.addEventListener("mousedown", this.titleGrabHandler.bind(this)); 36 36 this.wraps.addEventListener("mousedown", ()=>{this.wraps.style.zIndex = `${Window.zIndexCounter++}`;}); 37 37 this.add(this.content); 38 + this.wraps.style.left = `0px`; 39 + this.wraps.style.top = `0px`; 38 40 } 39 41 override with(...nodes: (Node | string)[]): this { 40 42 this.content.with(...nodes);
+7
src/windows/issuesearch.ts
··· 1 + // rewrite of ../issuesearch.ts to be a self-contained class that can be shoved into a window easily 2 + 3 + import { Column } from "../domlink.ts"; 4 + 5 + export class IssueSearch extends Column { 6 + 7 + }
+13
static/desktop.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>desktop</title> 7 + <link rel="stylesheet" href="styles/domlink.css"> 8 + </head> 9 + <body> 10 + <noscript>enable js or fukc off</noscript> 11 + <script src="desktop.js" type="module"></script> 12 + </body> 13 + </html>
+58
test/support/atproto.ts
··· 1 + import { ValidateNSID, ValidateDID, AtURI } from "../../src/support/atproto.ts"; 2 + import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts"; 3 + 4 + Deno.test("ValidateNSID returns NSID for valid input", () => { 5 + assertEquals(ValidateNSID("com.example.app"), "com.example.app"); 6 + assertEquals(ValidateNSID("com.example.app.v2"), "com.example.app.v2"); 7 + }); 8 + 9 + Deno.test("ValidateNSID returns null for invalid input", () => { 10 + assertEquals(ValidateNSID("invalid-nsid"), null); 11 + assertEquals(ValidateNSID("com.example..app"), null); 12 + assertEquals(ValidateNSID(".com.example.app"), null); 13 + assertEquals(ValidateNSID("com.example.app."), null); 14 + assertEquals(ValidateNSID("com.example.app_name"), null); 15 + assertEquals(ValidateNSID("com.example.app-name"), null); 16 + assertEquals(ValidateNSID(""), null); 17 + }); 18 + 19 + Deno.test("ValidateDID returns DID for valid input", () => { 20 + assertEquals(ValidateDID("did:plc:example"), "did:plc:example"); 21 + assertEquals(ValidateDID("did:web:example.com"), "did:web:example.com"); 22 + }); 23 + 24 + Deno.test("ValidateDID returns null for invalid input", () => { 25 + assertEquals(ValidateDID("invalid-did"), null); 26 + assertEquals(ValidateDID("did:other:example"), null); 27 + assertEquals(ValidateDID("did:plc"), null); 28 + assertEquals(ValidateDID("did:web:"), null); 29 + assertEquals(ValidateDID(""), null); 30 + }); 31 + 32 + Deno.test("AtURI.fromString parses valid URI", () => { 33 + const uri = AtURI.fromString("at://did:plc:example/com.example.collection/rkey123"); 34 + assertEquals(uri.authority, "did:plc:example"); 35 + assertEquals(uri.collection, "com.example.collection"); 36 + assertEquals(uri.rkey, "rkey123"); 37 + }); 38 + 39 + Deno.test("AtURI.fromString sets nulls for invalid URI", () => { 40 + const uri = AtURI.fromString("at://invalid-did/invalid-collection/actually-fine-rkey"); 41 + assertEquals(uri.authority, null); 42 + assertEquals(uri.collection, null); 43 + assertEquals(uri.rkey, "actually-fine-rkey"); 44 + }); 45 + 46 + Deno.test("AtURI toString returns string form of URI properly", () => { 47 + const uri = AtURI.fromString("at://did:plc:example/com.example.collection/rkey123"); 48 + assertEquals(uri.toString(), "at://did:plc:example/com.example.collection/rkey123"); 49 + }); 50 + 51 + Deno.test("AtURI toString returns null for invalid URI parts", () => { 52 + let uri = AtURI.fromString("at://invalid-did/com.example.collection/rkey123"); 53 + assertEquals(uri.toString(), null); 54 + 55 + uri = AtURI.fromString("at://did:plc:example/invalid-collection/rkey123"); 56 + assertEquals(uri.toString(), null); 57 + 58 + });