From c84396ed62844e03397f4aa942ad5926e76d572e Mon Sep 17 00:00:00 2001 From: hzrd149 <github@hzrd149.com> Date: Wed, 22 Jan 2025 12:09:06 -0600 Subject: [PATCH] Add option to download another nsite as a homepage Replace homepage with simple welcome page --- .changeset/pink-rings-roll.md | 5 + .changeset/real-ladybugs-remain.md | 5 + .env.example | 7 + package.json | 1 + pnpm-lock.yaml | 553 +++++++++++++++++++++++++ public/components/nsite-card.js | 110 ----- public/favicon.ico | Bin 15406 -> 0 bytes public/index.html | 72 +++- public/lib/lit.min.js | 29 -- public/lib/milligram.css | 635 ----------------------------- public/lib/normalize.css | 349 ---------------- public/logo.jpg | Bin 45294 -> 0 bytes public/main.js | 58 --- public/pool.js | 4 - public/upload/index.html | 46 --- public/upload/upload.js | 142 ------- src/env.ts | 5 + src/index.ts | 52 ++- src/logger.ts | 3 +- 19 files changed, 677 insertions(+), 1399 deletions(-) create mode 100644 .changeset/pink-rings-roll.md create mode 100644 .changeset/real-ladybugs-remain.md delete mode 100644 public/components/nsite-card.js delete mode 100644 public/favicon.ico delete mode 100644 public/lib/lit.min.js delete mode 100644 public/lib/milligram.css delete mode 100644 public/lib/normalize.css delete mode 100644 public/logo.jpg delete mode 100644 public/main.js delete mode 100644 public/pool.js delete mode 100644 public/upload/index.html delete mode 100644 public/upload/upload.js diff --git a/.changeset/pink-rings-roll.md b/.changeset/pink-rings-roll.md new file mode 100644 index 0000000..cc71850 --- /dev/null +++ b/.changeset/pink-rings-roll.md @@ -0,0 +1,5 @@ +--- +"nsite-ts": minor +--- + +Replace homepage with simple welcome page diff --git a/.changeset/real-ladybugs-remain.md b/.changeset/real-ladybugs-remain.md new file mode 100644 index 0000000..29f0a8e --- /dev/null +++ b/.changeset/real-ladybugs-remain.md @@ -0,0 +1,5 @@ +--- +"nsite-ts": minor +--- + +Add option to download another nsite as a homepage diff --git a/.env.example b/.env.example index 2eaf90c..e6cd6a8 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,13 @@ MAX_FILE_SIZE='2 MB' # The cache folder for nginx NGINX_CACHE_DIR='/var/nginx/cache' +# A nprofile pointer for an nsite to use as the default homepage +# Setting this will override anything in the ./public folder +NSITE_HOMEPAGE="" + +# a local directory to download the homepage to +NSITE_HOMEPAGE_DIR="public" + # Screenshots require Puppeteer to be setup https://pptr.dev/troubleshooting#setting-up-chrome-linux-sandbox ENABLE_SCREENSHOTS="false" SCREENSHOTS_DIR="./screenshots" diff --git a/package.json b/package.json index 0fa7f70..9160cee 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "koa-static": "^5.0.0", "mime": "^4.0.6", "nostr-tools": "^2.10.4", + "nsite-cli": "^0.1.14", "pac-proxy-agent": "^7.1.0", "proxy-agent": "^6.5.0", "puppeteer": "^23.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2c3a42..e06ba33 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: nostr-tools: specifier: ^2.10.4 version: 2.10.4(typescript@5.7.3) + nsite-cli: + specifier: ^0.1.14 + version: 0.1.14(@types/node@20.17.14)(typescript@5.7.3) pac-proxy-agent: specifier: ^7.1.0 version: 7.1.0 @@ -214,6 +217,94 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@inquirer/checkbox@4.0.6': + resolution: {integrity: sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/confirm@5.1.3': + resolution: {integrity: sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/core@10.1.4': + resolution: {integrity: sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==} + engines: {node: '>=18'} + + '@inquirer/core@3.1.2': + resolution: {integrity: sha512-lR2GaqBkp42Ew9BOAOqf2pSp+ymVES1qN8OC90WWh45yeoYLl0Ty1GyCxmkKqBJtq/+Ea1MF12AdFcZcpRNFsw==} + engines: {node: '>=14.18.0'} + + '@inquirer/editor@4.2.3': + resolution: {integrity: sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/expand@4.0.6': + resolution: {integrity: sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/figures@1.0.9': + resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.3': + resolution: {integrity: sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/number@3.0.6': + resolution: {integrity: sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/password@4.0.6': + resolution: {integrity: sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/prompts@7.2.3': + resolution: {integrity: sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/rawlist@4.0.6': + resolution: {integrity: sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/search@3.0.6': + resolution: {integrity: sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/select@4.0.6': + resolution: {integrity: sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.2': + resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -266,6 +357,9 @@ packages: resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@2.2.3': + resolution: {integrity: sha512-l7r5oEQym9Us7EAigzg30/PQAvynhMt2uoYtT3t26eGDVm9Yii5mZ5jWSWmZ/oSIR2Et0xfc6DXrG0bZ787V3w==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -278,6 +372,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nostr-dev-kit/ndk@2.11.0': + resolution: {integrity: sha512-FKIMtcVsVcquzrC+yir9lOXHCIHmQ3IKEVCMohqEB7N96HjP2qrI9s5utbjI3lkavFNF5tXg1Gp9ODEo7XCfLA==} + engines: {node: '>=16'} + '@npmcli/fs@1.1.1': resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} @@ -534,6 +632,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mute-stream@0.0.1': + resolution: {integrity: sha512-0yQLzYhCqGz7CQPE3iDmYjhb7KMBFOP+tBkyw+/Y2YyDI5wpS7itXXxneN1zSsUwWx3Ji6YiVYrhAnpQGS/vkw==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -555,6 +656,9 @@ packages: '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} @@ -588,6 +692,10 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -622,6 +730,12 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -721,6 +835,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -748,6 +866,14 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -774,6 +900,14 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -805,6 +939,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -849,6 +987,10 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -940,6 +1082,14 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -987,6 +1137,18 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -1007,6 +1169,14 @@ packages: debug: optional: true + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -1088,6 +1258,10 @@ packages: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1189,6 +1363,16 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inquirer-autocomplete-standalone@0.8.1: + resolution: {integrity: sha512-mlzwCTiXDX1Cw4yJL5PCq32k23XYLTK8K6BDFoL1a76iJeFB5ul6IoMU9spgdDagl2SM7P6ZaCNjj8VNXRDPOQ==} + engines: {node: '>=16'} + + inquirer@12.3.2: + resolution: {integrity: sha512-YjQCIcDd3yyDuQrbII0FBtm/ZqNoWtvaC71yeCnd5Vbg4EgzsAGaemzfpzmqfvIZEp2roSwuZZKdM0C65hA43g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + ioredis@5.4.2: resolution: {integrity: sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg==} engines: {node: '>=12.22.0'} @@ -1235,6 +1419,10 @@ packages: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -1291,6 +1479,9 @@ packages: resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + light-bolt11-decoder@3.2.0: + resolution: {integrity: sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1415,6 +1606,14 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -1437,6 +1636,14 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} @@ -1472,6 +1679,11 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + nsite-cli@0.1.14: + resolution: {integrity: sha512-ZPIIrft//YJJpKINrVDOiTxA1ut1vK5YocrY/Dwf2dSM0xzER2ipF6QL5hfVHbT84wC5R3Ea9O1IoH17nuFHoQ==} + engines: {node: '>=20.0.0', npm: '>=8.0.0 '} + hasBin: true + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -1696,9 +1908,16 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -1827,6 +2046,10 @@ packages: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + tar-fs@2.1.2: resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} @@ -1870,6 +2093,9 @@ packages: resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true + tseep@1.3.1: + resolution: {integrity: sha512-ZPtfk1tQnZVyr7BPtbJ93qaAh2lZuIOpTMjhrYa4XctT8xe7t4SAW9LIxrySDuYMsfNNayE51E/WNGrNVgVicQ==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1883,6 +2109,10 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -1890,6 +2120,9 @@ packages: typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typescript-lru-cache@2.0.0: + resolution: {integrity: sha512-Jp57Qyy8wXeMkdNuZiglE6v2Cypg13eDA1chHwDG6kq51X7gk4K7P7HaDdzZKCxkegXkVHNcPD0n5aW6OZH3aA==} + typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} @@ -1914,6 +2147,10 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + utf8-buffer@1.0.0: + resolution: {integrity: sha512-ueuhzvWnp5JU5CiGSY4WdKbiN/PO2AZ/lpeLiz2l38qwdLy/cW40XobgyuIWucNyum0B33bVB0owjFCeGBSLqg==} + engines: {node: '>=8'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -1921,6 +2158,10 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + websocket-polyfill@1.0.0: resolution: {integrity: sha512-QwfEy8jcOOCVO9su9UP+msEmhZa4a9WSJfePIdCT8GxwVl2Z9toM7nCqFfDDxA/sRmxgf1KNiwL6PXvjJ9qRxw==} @@ -1932,6 +2173,10 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1977,6 +2222,10 @@ packages: resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} engines: {node: '>= 4.0.0'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -2171,6 +2420,132 @@ snapshots: '@gar/promisify@1.1.3': optional: true + '@inquirer/checkbox@4.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/confirm@5.1.3(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + + '@inquirer/core@10.1.4(@types/node@20.17.14)': + dependencies: + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@20.17.14) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + + '@inquirer/core@3.1.2': + dependencies: + '@inquirer/type': 1.5.5 + '@types/mute-stream': 0.0.1 + '@types/node': 20.17.14 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + figures: 3.2.0 + mute-stream: 1.0.0 + run-async: 3.0.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + '@inquirer/editor@4.2.3(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + external-editor: 3.1.0 + + '@inquirer/expand@4.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.9': {} + + '@inquirer/input@4.1.3(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + + '@inquirer/number@3.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + + '@inquirer/password@4.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@7.2.3(@types/node@20.17.14)': + dependencies: + '@inquirer/checkbox': 4.0.6(@types/node@20.17.14) + '@inquirer/confirm': 5.1.3(@types/node@20.17.14) + '@inquirer/editor': 4.2.3(@types/node@20.17.14) + '@inquirer/expand': 4.0.6(@types/node@20.17.14) + '@inquirer/input': 4.1.3(@types/node@20.17.14) + '@inquirer/number': 3.0.6(@types/node@20.17.14) + '@inquirer/password': 4.0.6(@types/node@20.17.14) + '@inquirer/rawlist': 4.0.6(@types/node@20.17.14) + '@inquirer/search': 3.0.6(@types/node@20.17.14) + '@inquirer/select': 4.0.6(@types/node@20.17.14) + '@types/node': 20.17.14 + + '@inquirer/rawlist@4.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@3.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@4.0.6(@types/node@20.17.14)': + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@3.0.2(@types/node@20.17.14)': + dependencies: + '@types/node': 20.17.14 + '@ioredis/commands@1.2.0': {} '@keyv/redis@3.0.1': @@ -2237,6 +2612,8 @@ snapshots: '@noble/hashes@1.7.1': {} + '@noble/secp256k1@2.2.3': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2249,6 +2626,25 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 + '@nostr-dev-kit/ndk@2.11.0(typescript@5.7.3)': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@noble/secp256k1': 2.2.3 + '@scure/base': 1.2.4 + debug: 4.4.0(supports-color@5.5.0) + light-bolt11-decoder: 3.2.0 + nostr-tools: 2.10.4(typescript@5.7.3) + tseep: 1.3.1 + typescript-lru-cache: 2.0.0 + utf8-buffer: 1.0.0 + websocket-polyfill: 1.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 @@ -2522,6 +2918,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/mute-stream@0.0.1': + dependencies: + '@types/node': 20.17.14 + '@types/node@12.20.55': {} '@types/node@20.17.14': @@ -2547,6 +2947,8 @@ snapshots: '@types/node': 20.17.14 '@types/send': 0.17.4 + '@types/wrap-ansi@3.0.0': {} + '@types/ws@8.5.13': dependencies: '@types/node': 20.17.14 @@ -2586,6 +2988,10 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -2618,6 +3024,16 @@ snapshots: dependencies: tslib: 2.8.1 + asynckit@0.4.0: {} + + axios@1.7.9(debug@4.4.0): + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + b4a@1.6.7: {} balanced-match@1.0.2: {} @@ -2742,6 +3158,11 @@ snapshots: callsites@3.1.0: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chardet@0.7.0: {} chokidar@3.6.0: @@ -2771,6 +3192,10 @@ snapshots: clean-stack@2.2.0: optional: true + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -2792,6 +3217,12 @@ snapshots: colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@12.1.0: {} + concat-map@0.0.1: {} console-control-strings@1.1.0: @@ -2823,6 +3254,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@6.0.2: {} debug@2.6.9: @@ -2853,6 +3286,8 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 + delayed-stream@1.0.0: {} + delegates@1.0.0: {} denque@2.1.0: {} @@ -2922,6 +3357,10 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -2974,6 +3413,20 @@ snapshots: dependencies: pend: 1.2.0 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + figures@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + file-uri-to-path@1.0.0: {} fill-range@7.1.1: @@ -2989,6 +3442,16 @@ snapshots: optionalDependencies: debug: 4.4.0(supports-color@5.5.0) + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fresh@0.5.2: {} fs-constants@1.0.0: {} @@ -3092,6 +3555,8 @@ snapshots: has-flag@3.0.0: {} + has-flag@4.0.0: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -3209,6 +3674,24 @@ snapshots: ini@1.3.8: {} + inquirer-autocomplete-standalone@0.8.1: + dependencies: + '@inquirer/core': 3.1.2 + '@inquirer/type': 1.5.5 + figures: 5.0.0 + picocolors: 1.1.1 + + inquirer@12.3.2(@types/node@20.17.14): + dependencies: + '@inquirer/core': 10.1.4(@types/node@20.17.14) + '@inquirer/prompts': 7.2.3(@types/node@20.17.14) + '@inquirer/type': 3.0.2(@types/node@20.17.14) + '@types/node': 20.17.14 + ansi-escapes: 4.3.2 + mute-stream: 2.0.0 + run-async: 3.0.0 + rxjs: 7.8.1 + ioredis@5.4.2: dependencies: '@ioredis/commands': 1.2.0 @@ -3265,6 +3748,8 @@ snapshots: dependencies: better-path-resolve: 1.0.0 + is-unicode-supported@1.3.0: {} + is-windows@1.0.2: {} isexe@2.0.0: {} @@ -3352,6 +3837,10 @@ snapshots: transitivePeerDependencies: - supports-color + light-bolt11-decoder@3.2.0: + dependencies: + '@scure/base': 1.1.1 + lines-and-columns@1.2.4: {} locate-path@5.0.0: @@ -3483,6 +3972,10 @@ snapshots: ms@2.1.3: {} + mute-stream@1.0.0: {} + + mute-stream@2.0.0: {} + napi-build-utils@2.0.0: {} negotiator@0.6.3: {} @@ -3498,6 +3991,14 @@ snapshots: node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp@8.4.1: dependencies: env-paths: 2.2.1 @@ -3558,6 +4059,30 @@ snapshots: set-blocking: 2.0.0 optional: true + nsite-cli@0.1.14(@types/node@20.17.14)(typescript@5.7.3): + dependencies: + '@noble/hashes': 1.7.1 + '@nostr-dev-kit/ndk': 2.11.0(typescript@5.7.3) + axios: 1.7.9(debug@4.4.0) + blossom-client-sdk: 2.1.1 + commander: 12.1.0 + debug: 4.4.0(supports-color@5.5.0) + dotenv: 16.4.7 + inquirer: 12.3.2(@types/node@20.17.14) + inquirer-autocomplete-standalone: 0.8.1 + mime-types: 2.1.35 + node-fetch: 3.3.2 + nostr-tools: 2.10.4(typescript@5.7.3) + proxy-agent: 6.5.0 + websocket-polyfill: 1.0.0 + ws: 8.18.0 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - supports-color + - typescript + - utf-8-validate + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -3802,10 +4327,16 @@ snapshots: glob: 7.2.3 optional: true + run-async@3.0.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -3943,6 +4474,10 @@ snapshots: dependencies: has-flag: 3.0.0 + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + tar-fs@2.1.2: dependencies: chownr: 1.1.4 @@ -4003,6 +4538,8 @@ snapshots: touch@3.1.1: {} + tseep@1.3.1: {} + tslib@2.8.1: {} tsscmp@1.0.6: {} @@ -4013,6 +4550,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + type-fest@0.21.3: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -4020,6 +4559,8 @@ snapshots: typed-query-selector@2.12.0: {} + typescript-lru-cache@2.0.0: {} + typescript@5.7.3: {} unbzip2-stream@1.4.3: @@ -4043,10 +4584,14 @@ snapshots: universalify@0.1.2: {} + utf8-buffer@1.0.0: {} + util-deprecate@1.0.2: {} vary@1.1.2: {} + web-streams-polyfill@3.3.3: {} + websocket-polyfill@1.0.0: dependencies: import2: 1.0.3 @@ -4065,6 +4610,12 @@ snapshots: string-width: 4.2.3 optional: true + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -4100,4 +4651,6 @@ snapshots: ylru@1.4.0: {} + yoctocolors-cjs@2.1.2: {} + zod@3.23.8: {} diff --git a/public/components/nsite-card.js b/public/components/nsite-card.js deleted file mode 100644 index d7e002c..0000000 --- a/public/components/nsite-card.js +++ /dev/null @@ -1,110 +0,0 @@ -import { html, css, LitElement } from "lit"; -import { nip19 } from "nostr-tools"; -import { pool, relays } from "../pool.js"; - -export class NsiteCard extends LitElement { - static styles = css` - :host { - min-width: 3in; - max-width: 4in; - border: 1px solid lightslategray; - display: flex; - flex-direction: column; - padding: 0.5em; - gap: 0.3em; - border-radius: 0.5em; - } - - .title { - display: flex; - gap: 0.5em; - align-items: center; - color: initial; - text-decoration: none; - } - .title h3 { - margin: 0; - } - .avatar { - width: 3rem; - height: 3rem; - border: none; - outline: none; - border-radius: 50%; - } - - .thumb { - display: flex; - overflow: hidden; - } - - .thumb > img { - width: 100%; - border-radius: 0.5em; - } - - .about { - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - } - - time { - margin-top: auto; - } - `; - - static properties = { - nsite: { type: Object }, - profile: { state: true, type: Object }, - hasThumb: { state: true, type: Boolean }, - }; - - constructor() { - super(); - this.hasThumb = true; - } - - connectedCallback() { - super.connectedCallback(); - - pool.get(relays, { kinds: [0], authors: [this.nsite.pubkey] }).then((event) => { - if (event) this.profile = JSON.parse(event.content); - }); - } - - handleError() { - this.hasThumb = false; - } - - render() { - const npub = nip19.npubEncode(this.nsite.pubkey); - const url = new URL("/", `${location.protocol}//${npub}.${location.host}`); - - return html` - ${this.hasThumb - ? html` - <a class="thumb" href="${url}" target="_blank"> - <img src="/screenshot/${this.nsite.pubkey}.png" @error=${this.handleError} /> - </a> - ` - : undefined} - <a class="title" href="${url}" target="_blank"> - ${this.profile && html`<img src="${this.profile.image || this.profile.picture}" class="avatar" />`} - <div> - ${this.profile - ? html` - <h3>${this.profile.display_name || this.profile.name}</h3> - <small>${this.profile.nip05}</small> - ` - : html`<h3>${npub.slice(0, 8)}</h3>`} - </div> - </a> - ${this.profile && html`<p class="about">${this.profile.about}</p>`} - <time>${new Date(this.nsite.created_at * 1000).toDateString()}</time> - `; - } -} - -customElements.define("nsite-card", NsiteCard); diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index ce391bcaa9a673b13aa4c373c4a884d8d4f6bdf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 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 diff --git a/public/index.html b/public/index.html index cea69c8..89e0726 100644 --- a/public/index.html +++ b/public/index.html @@ -3,27 +3,65 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>nsite</title> - - <script type="importmap"> - { - "imports": { - "blossom-client-sdk": "https://esm.run/blossom-client-sdk", - "nostr-tools": "https://esm.run/nostr-tools", - "lit": "https://esm.run/lit", - "lit/directives/repeat.js": "https://esm.run/lit/directives/repeat.js" - } - } - </script> - + <title>Welcome to nsite-ts</title> <style> - nostr-picture > img { - width: 100%; + body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.6; + color: #333; + max-width: 800px; + margin: 40px auto; + padding: 0 20px; + background-color: #f5f5f5; + } + .container { + background-color: white; + padding: 30px; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + } + h1 { + color: #2c3e50; + margin-bottom: 20px; + } + .info { + background-color: #f8f9fa; + border-left: 4px solid #007bff; + padding: 15px; + margin: 20px 0; + } + code { + background-color: #f1f1f1; + padding: 2px 6px; + border-radius: 3px; + font-family: Monaco, monospace; + user-select: all; + word-break: break-all; } </style> - <script type="module" src="./main.js"></script> </head> <body> - <nsite-app></nsite-app> + <div class="container"> + <h1>Welcome to nsite-ts</h1> + <p>If you're seeing this page, nsite-ts has been successfully installed and is working.</p> + + <div class="info"> + <p> + To set a custom homepage, set the <code>NSITE_HOMEPAGE</code> environment variable to your desired nprofile + </p> + <p> + Example: + <br /> + <code + >NSITE_HOMEPAGE=nprofile1qqspspfsrjnurtf0jdyswm8jstustv7pu4qw3pn4u99etptvgzm4uvcpz9mhxue69uhkummnw3e82efwvdhk6qg5waehxw309aex2mrp0yhxgctdw4eju6t04mzfem</code + > + </p> + </div> + + <p> + For more information about configuring nsite-ts, please refer to the + <a href="https://github.com/hzrd149/nsite-ts">documentation</a> + </p> + </div> </body> </html> diff --git a/public/lib/lit.min.js b/public/lib/lit.min.js deleted file mode 100644 index dd99bbe..0000000 --- a/public/lib/lit.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: BSD-3-Clause - */ -const t=globalThis,s=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),e=new WeakMap;class o{constructor(t,s,e){if(this._$cssResult$=!0,e!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=s}get styleSheet(){let t=this.i;const i=this.t;if(s&&void 0===t){const s=void 0!==i&&1===i.length;s&&(t=e.get(i)),void 0===t&&((this.i=t=new CSSStyleSheet).replaceSync(this.cssText),s&&e.set(i,t))}return t}toString(){return this.cssText}}const h=t=>new o("string"==typeof t?t:t+"",void 0,i),r=(t,...s)=>{const e=1===t.length?t[0]:s.reduce(((s,i,e)=>s+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[e+1]),t[0]);return new o(e,t,i)},n=(i,e)=>{if(s)i.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const s of e){const e=document.createElement("style"),o=t.litNonce;void 0!==o&&e.setAttribute("nonce",o),e.textContent=s.cssText,i.appendChild(e)}},c=s?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let s="";for(const i of t.cssRules)s+=i.cssText;return h(s)})(t):t -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: BSD-3-Clause - */,{is:a,defineProperty:l,getOwnPropertyDescriptor:u,getOwnPropertyNames:d,getOwnPropertySymbols:f,getPrototypeOf:p}=Object,v=globalThis,m=v.trustedTypes,y=m?m.emptyScript:"",g=v.reactiveElementPolyfillSupport,_=(t,s)=>t,b={toAttribute(t,s){switch(s){case Boolean:t=t?y:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},S=(t,s)=>!a(t,s),w={attribute:!0,type:String,converter:b,reflect:!1,hasChanged:S};Symbol.metadata??=Symbol("metadata"),v.litPropertyMetadata??=new WeakMap;class $ extends HTMLElement{static addInitializer(t){this.o(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this.u&&[...this.u.keys()]}static createProperty(t,s=w){if(s.state&&(s.attribute=!1),this.o(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),e=this.getPropertyDescriptor(t,i,s);void 0!==e&&l(this.prototype,t,e)}}static getPropertyDescriptor(t,s,i){const{get:e,set:o}=u(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const h=e?.call(this);o.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??w}static o(){if(this.hasOwnProperty(_("elementProperties")))return;const t=p(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(_("finalized")))return;if(this.finalized=!0,this.o(),this.hasOwnProperty(_("properties"))){const t=this.properties,s=[...d(t),...f(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this.u=new Map;for(const[t,s]of this.elementProperties){const i=this.p(t,s);void 0!==i&&this.u.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const s=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)s.unshift(c(t))}else void 0!==t&&s.push(c(t));return s}static p(t,s){const i=s.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this.v=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.m=null,this._()}_(){this.S=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this.$(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this.P??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this.P?.delete(t)}$(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this.v=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return n(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this.P?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this.P?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}C(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor.p(t,i);if(void 0!==e&&!0===i.reflect){const o=(void 0!==i.converter?.toAttribute?i.converter:b).toAttribute(s,i.type);this.m=t,null==o?this.removeAttribute(e):this.setAttribute(e,o),this.m=null}}_$AK(t,s){const i=this.constructor,e=i.u.get(t);if(void 0!==e&&this.m!==e){const t=i.getPropertyOptions(e),o="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:b;this.m=e,this[e]=o.fromAttribute(s,t.type),this.m=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??S)(this[t],s))return;this.T(t,s,i)}!1===this.isUpdatePending&&(this.S=this.A())}T(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this.m!==t&&(this.M??=new Set).add(t)}async A(){this.isUpdatePending=!0;try{await this.S}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this.v){for(const[t,s]of this.v)this[t]=s;this.v=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.T(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this.P?.forEach((t=>t.hostUpdate?.())),this.update(s)):this.k()}catch(s){throw t=!1,this.k(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this.P?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}k(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.S}shouldUpdate(t){return!0}update(t){this.M&&=this.M.forEach((t=>this.C(t,this[t]))),this.k()}updated(t){}firstUpdated(t){}}$.elementStyles=[],$.shadowRootOptions={mode:"open"},$[_("elementProperties")]=new Map,$[_("finalized")]=new Map,g?.({ReactiveElement:$}),(v.reactiveElementVersions??=[]).push("2.0.4"); -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: BSD-3-Clause - */ -const P=globalThis,C=P.trustedTypes,T=C?C.createPolicy("lit-html",{createHTML:t=>t}):void 0,x="$lit$",A=`lit$${Math.random().toFixed(9).slice(2)}$`,M="?"+A,k=`<${M}>`,E=document,U=()=>E.createComment(""),N=t=>null===t||"object"!=typeof t&&"function"!=typeof t,O=Array.isArray,R=t=>O(t)||"function"==typeof t?.[Symbol.iterator],z="[ \t\n\f\r]",V=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,L=/-->/g,I=/>/g,j=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),D=/'/g,H=/"/g,B=/^(?:script|style|textarea|title)$/i,W=t=>(s,...i)=>({_$litType$:t,strings:s,values:i}),q=W(1),J=W(2),Z=Symbol.for("lit-noChange"),F=Symbol.for("lit-nothing"),G=new WeakMap,K=E.createTreeWalker(E,129);function Q(t,s){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==T?T.createHTML(s):s}const X=(t,s)=>{const i=t.length-1,e=[];let o,h=2===s?"<svg>":"",r=V;for(let s=0;s<i;s++){const i=t[s];let n,c,a=-1,l=0;for(;l<i.length&&(r.lastIndex=l,c=r.exec(i),null!==c);)l=r.lastIndex,r===V?"!--"===c[1]?r=L:void 0!==c[1]?r=I:void 0!==c[2]?(B.test(c[2])&&(o=RegExp("</"+c[2],"g")),r=j):void 0!==c[3]&&(r=j):r===j?">"===c[0]?(r=o??V,a=-1):void 0===c[1]?a=-2:(a=r.lastIndex-c[2].length,n=c[1],r=void 0===c[3]?j:'"'===c[3]?H:D):r===H||r===D?r=j:r===L||r===I?r=V:(r=j,o=void 0);const u=r===j&&t[s+1].startsWith("/>")?" ":"";h+=r===V?i+k:a>=0?(e.push(n),i.slice(0,a)+x+i.slice(a)+A+u):i+A+(-2===a?s:u)}return[Q(t,h+(t[i]||"<?>")+(2===s?"</svg>":"")),e]};class Y{constructor({strings:t,_$litType$:s},i){let e;this.parts=[];let o=0,h=0;const r=t.length-1,n=this.parts,[c,a]=X(t,s);if(this.el=Y.createElement(c,i),K.currentNode=this.el.content,2===s){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(e=K.nextNode())&&n.length<r;){if(1===e.nodeType){if(e.hasAttributes())for(const t of e.getAttributeNames())if(t.endsWith(x)){const s=a[h++],i=e.getAttribute(t).split(A),r=/([.?@])?(.*)/.exec(s);n.push({type:1,index:o,name:r[2],strings:i,ctor:"."===r[1]?ot:"?"===r[1]?ht:"@"===r[1]?rt:et}),e.removeAttribute(t)}else t.startsWith(A)&&(n.push({type:6,index:o}),e.removeAttribute(t));if(B.test(e.tagName)){const t=e.textContent.split(A),s=t.length-1;if(s>0){e.textContent=C?C.emptyScript:"";for(let i=0;i<s;i++)e.append(t[i],U()),K.nextNode(),n.push({type:2,index:++o});e.append(t[s],U())}}}else if(8===e.nodeType)if(e.data===M)n.push({type:2,index:o});else{let t=-1;for(;-1!==(t=e.data.indexOf(A,t+1));)n.push({type:7,index:o}),t+=A.length-1}o++}}static createElement(t,s){const i=E.createElement("template");return i.innerHTML=t,i}}function tt(t,s,i=t,e){if(s===Z)return s;let o=void 0!==e?i.U?.[e]:i.N;const h=N(s)?void 0:s._$litDirective$;return o?.constructor!==h&&(o?._$AO?.(!1),void 0===h?o=void 0:(o=new h(t),o._$AT(t,i,e)),void 0!==e?(i.U??=[])[e]=o:i.N=o),void 0!==o&&(s=tt(t,o._$AS(t,s.values),o,e)),s}class st{constructor(t,s){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=s}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}O(t){const{el:{content:s},parts:i}=this._$AD,e=(t?.creationScope??E).importNode(s,!0);K.currentNode=e;let o=K.nextNode(),h=0,r=0,n=i[0];for(;void 0!==n;){if(h===n.index){let s;2===n.type?s=new it(o,o.nextSibling,this,t):1===n.type?s=new n.ctor(o,n.name,n.strings,this,t):6===n.type&&(s=new nt(o,this,t)),this._$AV.push(s),n=i[++r]}h!==n?.index&&(o=K.nextNode(),h++)}return K.currentNode=E,e}R(t){let s=0;for(const i of this._$AV)void 0!==i&&(void 0!==i.strings?(i._$AI(t,i,s),s+=i.strings.length-2):i._$AI(t[s])),s++}}class it{get _$AU(){return this._$AM?._$AU??this.V}constructor(t,s,i,e){this.type=2,this._$AH=F,this._$AN=void 0,this._$AA=t,this._$AB=s,this._$AM=i,this.options=e,this.V=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const s=this._$AM;return void 0!==s&&11===t?.nodeType&&(t=s.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,s=this){t=tt(this,t,s),N(t)?t===F||null==t||""===t?(this._$AH!==F&&this._$AR(),this._$AH=F):t!==this._$AH&&t!==Z&&this.L(t):void 0!==t._$litType$?this.I(t):void 0!==t.nodeType?this.j(t):R(t)?this.D(t):this.L(t)}H(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}j(t){this._$AH!==t&&(this._$AR(),this._$AH=this.H(t))}L(t){this._$AH!==F&&N(this._$AH)?this._$AA.nextSibling.data=t:this.j(E.createTextNode(t)),this._$AH=t}I(t){const{values:s,_$litType$:i}=t,e="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Y.createElement(Q(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===e)this._$AH.R(s);else{const t=new st(e,this),i=t.O(this.options);t.R(s),this.j(i),this._$AH=t}}_$AC(t){let s=G.get(t.strings);return void 0===s&&G.set(t.strings,s=new Y(t)),s}D(t){O(this._$AH)||(this._$AH=[],this._$AR());const s=this._$AH;let i,e=0;for(const o of t)e===s.length?s.push(i=new it(this.H(U()),this.H(U()),this,this.options)):i=s[e],i._$AI(o),e++;e<s.length&&(this._$AR(i&&i._$AB.nextSibling,e),s.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t&&t!==this._$AB;){const s=t.nextSibling;t.remove(),t=s}}setConnected(t){void 0===this._$AM&&(this.V=t,this._$AP?.(t))}}class et{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,s,i,e,o){this.type=1,this._$AH=F,this._$AN=void 0,this.element=t,this.name=s,this._$AM=e,this.options=o,i.length>2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=F}_$AI(t,s=this,i,e){const o=this.strings;let h=!1;if(void 0===o)t=tt(this,t,s,0),h=!N(t)||t!==this._$AH&&t!==Z,h&&(this._$AH=t);else{const e=t;let r,n;for(t=o[0],r=0;r<o.length-1;r++)n=tt(this,e[i+r],s,r),n===Z&&(n=this._$AH[r]),h||=!N(n)||n!==this._$AH[r],n===F?t=F:t!==F&&(t+=(n??"")+o[r+1]),this._$AH[r]=n}h&&!e&&this.B(t)}B(t){t===F?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}class ot extends et{constructor(){super(...arguments),this.type=3}B(t){this.element[this.name]=t===F?void 0:t}}class ht extends et{constructor(){super(...arguments),this.type=4}B(t){this.element.toggleAttribute(this.name,!!t&&t!==F)}}class rt extends et{constructor(t,s,i,e,o){super(t,s,i,e,o),this.type=5}_$AI(t,s=this){if((t=tt(this,t,s,0)??F)===Z)return;const i=this._$AH,e=t===F&&i!==F||t.capture!==i.capture||t.once!==i.once||t.passive!==i.passive,o=t!==F&&(i===F||e);e&&this.element.removeEventListener(this.name,this,i),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){"function"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class nt{constructor(t,s,i){this.element=t,this.type=6,this._$AN=void 0,this._$AM=s,this.options=i}get _$AU(){return this._$AM._$AU}_$AI(t){tt(this,t)}}const ct={W:x,q:A,J:M,Z:1,F:X,G:st,K:R,X:tt,Y:it,tt:et,st:ht,it:rt,et:ot,ot:nt},at=P.litHtmlPolyfillSupport;at?.(Y,it),(P.litHtmlVersions??=[]).push("3.1.3");const lt=(t,s,i)=>{const e=i?.renderBefore??s;let o=e._$litPart$;if(void 0===o){const t=i?.renderBefore??null;e._$litPart$=o=new it(s.insertBefore(U(),t),t,void 0,i??{})}return o._$AI(t),o}; -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: BSD-3-Clause - */class ut extends ${constructor(){super(...arguments),this.renderOptions={host:this},this.ht=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const s=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this.ht=lt(s,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this.ht?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this.ht?.setConnected(!1)}render(){return Z}}ut._$litElement$=!0,ut[("finalized","finalized")]=!0,globalThis.litElementHydrateSupport?.({LitElement:ut});const dt=globalThis.litElementPolyfillSupport;dt?.({LitElement:ut});const ft={_$AK:(t,s,i)=>{t._$AK(s,i)},_$AL:t=>t._$AL};(globalThis.litElementVersions??=[]).push("4.0.5"); -/** - * @license - * Copyright 2022 Google LLC - * SPDX-License-Identifier: BSD-3-Clause - */ -const pt=!1;export{o as CSSResult,ut as LitElement,$ as ReactiveElement,ft as _$LE,ct as _$LH,n as adoptStyles,r as css,b as defaultConverter,c as getCompatibleStyle,q as html,pt as isServer,Z as noChange,S as notEqual,F as nothing,lt as render,s as supportsAdoptingStyleSheets,J as svg,h as unsafeCSS}; -//# sourceMappingURL=lit-core.min.js.map diff --git a/public/lib/milligram.css b/public/lib/milligram.css deleted file mode 100644 index 8118dee..0000000 --- a/public/lib/milligram.css +++ /dev/null @@ -1,635 +0,0 @@ -/*! - * Milligram v1.4.1 - * https://milligram.io - * - * Copyright (c) 2020 CJ Patoilo - * Licensed under the MIT license - */ - -*, -*:after, -*:before { - box-sizing: inherit; -} - -html { - box-sizing: border-box; - font-size: 62.5%; -} - -body { - color: #606c76; - font-family: 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; - font-size: 1.6em; - font-weight: 300; - letter-spacing: .01em; - line-height: 1.6; -} - -blockquote { - border-left: 0.3rem solid #d1d1d1; - margin-left: 0; - margin-right: 0; - padding: 1rem 1.5rem; -} - -blockquote *:last-child { - margin-bottom: 0; -} - -.button, -button, -input[type='button'], -input[type='reset'], -input[type='submit'] { - background-color: #9b4dca; - border: 0.1rem solid #9b4dca; - border-radius: .4rem; - color: #fff; - cursor: pointer; - display: inline-block; - font-size: 1.1rem; - font-weight: 700; - height: 3.8rem; - letter-spacing: .1rem; - line-height: 3.8rem; - padding: 0 3.0rem; - text-align: center; - text-decoration: none; - text-transform: uppercase; - white-space: nowrap; -} - -.button:focus, .button:hover, -button:focus, -button:hover, -input[type='button']:focus, -input[type='button']:hover, -input[type='reset']:focus, -input[type='reset']:hover, -input[type='submit']:focus, -input[type='submit']:hover { - background-color: #606c76; - border-color: #606c76; - color: #fff; - outline: 0; -} - -.button[disabled], -button[disabled], -input[type='button'][disabled], -input[type='reset'][disabled], -input[type='submit'][disabled] { - cursor: default; - opacity: .5; -} - -.button[disabled]:focus, .button[disabled]:hover, -button[disabled]:focus, -button[disabled]:hover, -input[type='button'][disabled]:focus, -input[type='button'][disabled]:hover, -input[type='reset'][disabled]:focus, -input[type='reset'][disabled]:hover, -input[type='submit'][disabled]:focus, -input[type='submit'][disabled]:hover { - background-color: #9b4dca; - border-color: #9b4dca; -} - -.button.button-outline, -button.button-outline, -input[type='button'].button-outline, -input[type='reset'].button-outline, -input[type='submit'].button-outline { - background-color: transparent; - color: #9b4dca; -} - -.button.button-outline:focus, .button.button-outline:hover, -button.button-outline:focus, -button.button-outline:hover, -input[type='button'].button-outline:focus, -input[type='button'].button-outline:hover, -input[type='reset'].button-outline:focus, -input[type='reset'].button-outline:hover, -input[type='submit'].button-outline:focus, -input[type='submit'].button-outline:hover { - background-color: transparent; - border-color: #606c76; - color: #606c76; -} - -.button.button-outline[disabled]:focus, .button.button-outline[disabled]:hover, -button.button-outline[disabled]:focus, -button.button-outline[disabled]:hover, -input[type='button'].button-outline[disabled]:focus, -input[type='button'].button-outline[disabled]:hover, -input[type='reset'].button-outline[disabled]:focus, -input[type='reset'].button-outline[disabled]:hover, -input[type='submit'].button-outline[disabled]:focus, -input[type='submit'].button-outline[disabled]:hover { - border-color: inherit; - color: #9b4dca; -} - -.button.button-clear, -button.button-clear, -input[type='button'].button-clear, -input[type='reset'].button-clear, -input[type='submit'].button-clear { - background-color: transparent; - border-color: transparent; - color: #9b4dca; -} - -.button.button-clear:focus, .button.button-clear:hover, -button.button-clear:focus, -button.button-clear:hover, -input[type='button'].button-clear:focus, -input[type='button'].button-clear:hover, -input[type='reset'].button-clear:focus, -input[type='reset'].button-clear:hover, -input[type='submit'].button-clear:focus, -input[type='submit'].button-clear:hover { - background-color: transparent; - border-color: transparent; - color: #606c76; -} - -.button.button-clear[disabled]:focus, .button.button-clear[disabled]:hover, -button.button-clear[disabled]:focus, -button.button-clear[disabled]:hover, -input[type='button'].button-clear[disabled]:focus, -input[type='button'].button-clear[disabled]:hover, -input[type='reset'].button-clear[disabled]:focus, -input[type='reset'].button-clear[disabled]:hover, -input[type='submit'].button-clear[disabled]:focus, -input[type='submit'].button-clear[disabled]:hover { - color: #9b4dca; -} - -code { - background: #f4f5f6; - border-radius: .4rem; - font-size: 86%; - margin: 0 .2rem; - padding: .2rem .5rem; - white-space: nowrap; -} - -pre { - background: #f4f5f6; - border-left: 0.3rem solid #9b4dca; - overflow-y: hidden; -} - -pre > code { - border-radius: 0; - display: block; - padding: 1rem 1.5rem; - white-space: pre; -} - -hr { - border: 0; - border-top: 0.1rem solid #f4f5f6; - margin: 3.0rem 0; -} - -input[type='color'], -input[type='date'], -input[type='datetime'], -input[type='datetime-local'], -input[type='email'], -input[type='month'], -input[type='number'], -input[type='password'], -input[type='search'], -input[type='tel'], -input[type='text'], -input[type='url'], -input[type='week'], -input:not([type]), -textarea, -select { - -webkit-appearance: none; - background-color: transparent; - border: 0.1rem solid #d1d1d1; - border-radius: .4rem; - box-shadow: none; - box-sizing: inherit; - height: 3.8rem; - padding: .6rem 1.0rem .7rem; - width: 100%; -} - -input[type='color']:focus, -input[type='date']:focus, -input[type='datetime']:focus, -input[type='datetime-local']:focus, -input[type='email']:focus, -input[type='month']:focus, -input[type='number']:focus, -input[type='password']:focus, -input[type='search']:focus, -input[type='tel']:focus, -input[type='text']:focus, -input[type='url']:focus, -input[type='week']:focus, -input:not([type]):focus, -textarea:focus, -select:focus { - border-color: #9b4dca; - outline: 0; -} - -select { - background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 8" width="30"><path fill="%23d1d1d1" d="M0,0l6,8l6-8"/></svg>') center right no-repeat; - padding-right: 3.0rem; -} - -select:focus { - background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 8" width="30"><path fill="%239b4dca" d="M0,0l6,8l6-8"/></svg>'); -} - -select[multiple] { - background: none; - height: auto; -} - -textarea { - min-height: 6.5rem; -} - -label, -legend { - display: block; - font-size: 1.6rem; - font-weight: 700; - margin-bottom: .5rem; -} - -fieldset { - border-width: 0; - padding: 0; -} - -input[type='checkbox'], -input[type='radio'] { - display: inline; -} - -.label-inline { - display: inline-block; - font-weight: normal; - margin-left: .5rem; -} - -.container { - margin: 0 auto; - max-width: 112.0rem; - padding: 0 2.0rem; - position: relative; - width: 100%; -} - -.row { - display: flex; - flex-direction: column; - padding: 0; - width: 100%; -} - -.row.row-no-padding { - padding: 0; -} - -.row.row-no-padding > .column { - padding: 0; -} - -.row.row-wrap { - flex-wrap: wrap; -} - -.row.row-top { - align-items: flex-start; -} - -.row.row-bottom { - align-items: flex-end; -} - -.row.row-center { - align-items: center; -} - -.row.row-stretch { - align-items: stretch; -} - -.row.row-baseline { - align-items: baseline; -} - -.row .column { - display: block; - flex: 1 1 auto; - margin-left: 0; - max-width: 100%; - width: 100%; -} - -.row .column.column-offset-10 { - margin-left: 10%; -} - -.row .column.column-offset-20 { - margin-left: 20%; -} - -.row .column.column-offset-25 { - margin-left: 25%; -} - -.row .column.column-offset-33, .row .column.column-offset-34 { - margin-left: 33.3333%; -} - -.row .column.column-offset-40 { - margin-left: 40%; -} - -.row .column.column-offset-50 { - margin-left: 50%; -} - -.row .column.column-offset-60 { - margin-left: 60%; -} - -.row .column.column-offset-66, .row .column.column-offset-67 { - margin-left: 66.6666%; -} - -.row .column.column-offset-75 { - margin-left: 75%; -} - -.row .column.column-offset-80 { - margin-left: 80%; -} - -.row .column.column-offset-90 { - margin-left: 90%; -} - -.row .column.column-10 { - flex: 0 0 10%; - max-width: 10%; -} - -.row .column.column-20 { - flex: 0 0 20%; - max-width: 20%; -} - -.row .column.column-25 { - flex: 0 0 25%; - max-width: 25%; -} - -.row .column.column-33, .row .column.column-34 { - flex: 0 0 33.3333%; - max-width: 33.3333%; -} - -.row .column.column-40 { - flex: 0 0 40%; - max-width: 40%; -} - -.row .column.column-50 { - flex: 0 0 50%; - max-width: 50%; -} - -.row .column.column-60 { - flex: 0 0 60%; - max-width: 60%; -} - -.row .column.column-66, .row .column.column-67 { - flex: 0 0 66.6666%; - max-width: 66.6666%; -} - -.row .column.column-75 { - flex: 0 0 75%; - max-width: 75%; -} - -.row .column.column-80 { - flex: 0 0 80%; - max-width: 80%; -} - -.row .column.column-90 { - flex: 0 0 90%; - max-width: 90%; -} - -.row .column .column-top { - align-self: flex-start; -} - -.row .column .column-bottom { - align-self: flex-end; -} - -.row .column .column-center { - align-self: center; -} - -@media (min-width: 40rem) { - .row { - flex-direction: row; - margin-left: -1.0rem; - width: calc(100% + 2.0rem); - } - .row .column { - margin-bottom: inherit; - padding: 0 1.0rem; - } -} - -a { - color: #9b4dca; - text-decoration: none; -} - -a:focus, a:hover { - color: #606c76; -} - -dl, -ol, -ul { - list-style: none; - margin-top: 0; - padding-left: 0; -} - -dl dl, -dl ol, -dl ul, -ol dl, -ol ol, -ol ul, -ul dl, -ul ol, -ul ul { - font-size: 90%; - margin: 1.5rem 0 1.5rem 3.0rem; -} - -ol { - list-style: decimal inside; -} - -ul { - list-style: circle inside; -} - -.button, -button, -dd, -dt, -li { - margin-bottom: 1.0rem; -} - -fieldset, -input, -select, -textarea { - margin-bottom: 1.5rem; -} - -blockquote, -dl, -figure, -form, -ol, -p, -pre, -table, -ul { - margin-bottom: 2.5rem; -} - -table { - border-spacing: 0; - display: block; - overflow-x: auto; - text-align: left; - width: 100%; -} - -td, -th { - border-bottom: 0.1rem solid #e1e1e1; - padding: 1.2rem 1.5rem; -} - -td:first-child, -th:first-child { - padding-left: 0; -} - -td:last-child, -th:last-child { - padding-right: 0; -} - -@media (min-width: 40rem) { - table { - display: table; - overflow-x: initial; - } -} - -b, -strong { - font-weight: bold; -} - -p { - margin-top: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: 300; - letter-spacing: -.1rem; - margin-bottom: 2.0rem; - margin-top: 0; -} - -h1 { - font-size: 4.6rem; - line-height: 1.2; -} - -h2 { - font-size: 3.6rem; - line-height: 1.25; -} - -h3 { - font-size: 2.8rem; - line-height: 1.3; -} - -h4 { - font-size: 2.2rem; - letter-spacing: -.08rem; - line-height: 1.35; -} - -h5 { - font-size: 1.8rem; - letter-spacing: -.05rem; - line-height: 1.5; -} - -h6 { - font-size: 1.6rem; - letter-spacing: 0; - line-height: 1.4; -} - -img { - max-width: 100%; -} - -.clearfix:after { - clear: both; - content: ' '; - display: table; -} - -.float-left { - float: left; -} - -.float-right { - float: right; -} - -/*# sourceMappingURL=milligram.css.map */ \ No newline at end of file diff --git a/public/lib/normalize.css b/public/lib/normalize.css deleted file mode 100644 index 192eb9c..0000000 --- a/public/lib/normalize.css +++ /dev/null @@ -1,349 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Render the `main` element consistently in IE. - */ - -main { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} diff --git a/public/logo.jpg b/public/logo.jpg deleted file mode 100644 index 4941c28a16c88f78582a7b5d057fad4285f83680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45294 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≷6c5}omRl#7`fv+wuL4&DGl(0Sc(>Rf#(x`mPp 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 diff --git a/public/main.js b/public/main.js deleted file mode 100644 index b08e1fc..0000000 --- a/public/main.js +++ /dev/null @@ -1,58 +0,0 @@ -import { LitElement, html, css } from "lit"; -import { repeat } from "lit/directives/repeat.js"; -import "./components/nsite-card.js"; -import { pool, relays } from "./pool.js"; - -export class NsiteApp extends LitElement { - static properties = { - selected: { state: true }, - status: { state: true, type: String }, - sites: { state: true, type: Array }, - }; - - static styles = css` - .sites { - display: flex; - gap: 0.5em; - flex-wrap: wrap; - } - `; - - seen = new Set(); - constructor() { - super(); - this.sites = []; - } - - connectedCallback() { - super.connectedCallback(); - - pool.subscribeMany(relays, [{ kinds: [34128], "#d": ["/index.html"] }], { - onevent: (event) => { - if (this.seen.has(event.pubkey)) return; - this.seen.add(event.pubkey); - - this.sites = [...this.sites, event].sort((a, b) => b.created_at - a.created_at); - }, - }); - } - - render() { - return html`<div class="container"> - <img src="/logo.jpg" style="max-height: 2in" /> - <h1>nsite</h1> - <a class="navbar-item" href="https://github.com/hzrd149/nsite-ts" target="_blank">Source Code</a> - - <h2 class="subtitle is-2">Latest nsites:</h2> - <div class="sites"> - ${repeat( - this.sites, - (nsite) => nsite.pubkey, - (nsite) => html`<nsite-card .nsite="${nsite}"></nsite-card>`, - )} - </div> - </div>`; - } -} - -customElements.define("nsite-app", NsiteApp); diff --git a/public/pool.js b/public/pool.js deleted file mode 100644 index d333c8c..0000000 --- a/public/pool.js +++ /dev/null @@ -1,4 +0,0 @@ -import { SimplePool } from "nostr-tools"; - -export const relays = ["wss://relay.damus.io", "wss://nos.lol", "wss://nostr.wine"]; -export const pool = new SimplePool(); diff --git a/public/upload/index.html b/public/upload/index.html deleted file mode 100644 index 26165e3..0000000 --- a/public/upload/index.html +++ /dev/null @@ -1,46 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>nsite</title> - <script type="importmap"> - { - "imports": { - "blossom-client-sdk": "https://esm.run/blossom-client-sdk", - "nostr-tools": "https://esm.run/nostr-tools" - } - } - </script> - </head> - <body> - <label>relays</label> - <br /> - <textarea type="text" id="relays" cols="50" rows="4"></textarea> - <br /> - <br /> - <label>blossom servers</label> - <br /> - <textarea type="text" id="servers" cols="50" rows="4"></textarea> - <br /> - <br /> - <input type="file" id="files" webkitdirectory directory multiple /> - <button id="upload-button">Upload nsite</button> - <div - id="log" - style=" - max-height: 50em; - max-width: 80em; - width: 100%; - border: 1px solid gray; - min-height: 8em; - margin: 0.5em 0; - overflow: auto; - font-size: 0.8em; - gap: 0.1em; - white-space: pre; - " - ></div> - <script type="module" src="/upload/upload.js"></script> - </body> -</html> diff --git a/public/upload/upload.js b/public/upload/upload.js deleted file mode 100644 index a0dda2b..0000000 --- a/public/upload/upload.js +++ /dev/null @@ -1,142 +0,0 @@ -import { multiServerUpload, BlossomClient } from "blossom-client-sdk"; -import { SimplePool } from "nostr-tools"; - -const logContainer = document.getElementById("log"); -function log(...args) { - const el = document.createElement("div"); - el.innerText = args.join(" "); - logContainer.appendChild(el); -} - -const uploadButton = document.getElementById("upload-button"); - -/** @type {HTMLInputElement} */ -const filesInput = document.getElementById("files"); - -/** - * @param {FileSystemFileEntry} fileEntry - * @returns {File} - */ -export function readFileSystemFile(fileEntry) { - return new Promise((res, rej) => { - fileEntry.file( - (file) => res(file), - (err) => rej(err), - ); - }); -} - -/** - * @param {FileSystemDirectoryEntry} directory - * @returns {FileSystemEntry[]} - */ -export function readFileSystemDirectory(directory) { - return new Promise((res, rej) => { - directory.createReader().readEntries( - (entries) => res(entries), - (err) => rej(err), - ); - }); -} - -/** - * uploads a file system entry to blossom servers - * @param {FileSystemEntry} entry - * @returns {{file: File, path: string, sha256: string}[]} - */ -async function readFileSystemEntry(entry) { - const files = []; - if (entry instanceof FileSystemFileEntry && entry.isFile) { - try { - const file = await readFileSystemFile(entry); - const sha256 = await BlossomClient.getFileSha256(file); - const path = entry.fullPath; - - files.push({ file, path, sha256 }); - } catch (e) { - log("Failed to add" + entry.fullPath); - log(e.message); - } - } else if (entry instanceof FileSystemDirectoryEntry && entry.isDirectory) { - const entries = await readFileSystemDirectory(entry); - for (const e of entries) files.push(...(await readFileSystemEntry(e))); - } - - return files; -} - -/** - * uploads a file system entry to blossom servers - * @param {FileList} list - * @returns {{file: File, path: string, sha256: string}[]} - */ -async function readFileList(list) { - const files = []; - for (const file of list) { - const path = file.webkitRelativePath ? file.webkitRelativePath : file.name; - const sha256 = await BlossomClient.getFileSha256(file); - files.push({ file, path, sha256 }); - } - return files; -} - -const pool = new SimplePool(); - -/** - * uploads a file system entry to blossom servers - * @param {{file:File, path:string}} files - * @param {import("blossom-client-sdk").Signer} signer - * @param {*} auth - * @param {string[]} servers - * @param {string[]} relays - */ -async function uploadFiles(files, signer, auth, servers, relays) { - for (const { file, path, sha256 } of files) { - try { - const upload = multiServerUpload(servers, file, signer, auth); - - let published = false; - for await (let { blob } of upload) { - if (!published) { - const signed = await signer({ - kind: 34128, - content: "", - created_at: Math.round(Date.now() / 1000), - tags: [ - ["d", path], - ["x", sha256], - ], - }); - await pool.publish(relays, signed); - - log("Published", path, sha256, signed.id); - } - } - } catch (error) { - log(`Failed to upload ${path}`, error); - } - } -} - -uploadButton.addEventListener("click", async () => { - if (!window.nostr) return alert("Missing NIP-07 signer"); - - const signer = (draft) => window.nostr.signEvent(draft); - const relays = document.getElementById("relays").value.split(/\n|,/); - const servers = document.getElementById("servers").value.split(/\n|,/); - - try { - if (filesInput.files) { - const files = await readFileList(filesInput.files); - - // strip leading dir - for (const file of files) file.path = file.path.replace(/^[^\/]+\//, "/"); - - log(`Found ${files.length} files`); - - await uploadFiles(files, signer, undefined, servers, relays); - } - } catch (error) { - alert(`Failed to upload files: ${error.message}`); - } -}); diff --git a/src/env.ts b/src/env.ts index e11001a..e32cdb4 100644 --- a/src/env.ts +++ b/src/env.ts @@ -1,6 +1,9 @@ import "dotenv/config"; import xbytes from "xbytes"; +const NSITE_HOMEPAGE = process.env.NSITE_HOMEPAGE; +const NSITE_HOMEPAGE_DIR = process.env.NSITE_HOMEPAGE_DIR || "public"; + const LOOKUP_RELAYS = process.env.LOOKUP_RELAYS?.split(",").map((u) => u.trim()) ?? [ "wss://user.kindpag.es/", "wss://purplepag.es/", @@ -30,6 +33,8 @@ const SCREENSHOTS_DIR = process.env.SCREENSHOTS_DIR || "./screenshots"; const ONION_HOST = process.env.ONION_HOST; export { + NSITE_HOMEPAGE, + NSITE_HOMEPAGE_DIR, SUBSCRIPTION_RELAYS, LOOKUP_RELAYS, BLOSSOM_SERVERS, diff --git a/src/index.ts b/src/index.ts index 9c283c5..f34293b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,8 @@ import mime from "mime"; import morgan from "koa-morgan"; import send from "koa-send"; import { npubEncode } from "nostr-tools/nip19"; +import { spawn } from "node:child_process"; +import { nip19 } from "nostr-tools"; import { resolveNpubFromHostname } from "./helpers/dns.js"; import { getNsiteBlobs, parseNsiteEvent } from "./events.js"; @@ -19,6 +21,8 @@ import { ENABLE_SCREENSHOTS, HOST, NGINX_CACHE_DIR, + NSITE_HOMEPAGE, + NSITE_HOMEPAGE_DIR, NSITE_HOST, NSITE_PORT, ONION_HOST, @@ -64,12 +68,12 @@ app.use(async (ctx, next) => { // resolve pubkey if not in cache if (pubkey === undefined) { - console.log(`${ctx.hostname}: Resolving`); + logger(`${ctx.hostname}: Resolving`); pubkey = await resolveNpubFromHostname(ctx.hostname); if (pubkey) { await userDomains.set(ctx.hostname, pubkey); - console.log(`${ctx.hostname}: Found ${pubkey}`); + logger(`${ctx.hostname}: Found ${pubkey}`); } else { await userDomains.set(ctx.hostname, ""); } @@ -194,14 +198,48 @@ if (ENABLE_SCREENSHOTS) { }); } +// download homepage +if (NSITE_HOMEPAGE) { + try { + const log = logger.extend("homepage"); + // create the public dir + try { + fs.mkdirSync(NSITE_HOMEPAGE_DIR); + } catch (error) {} + + const bin = (await import.meta.resolve("nsite-cli")).replace("file://", ""); + + const decode = nip19.decode(NSITE_HOMEPAGE); + if (decode.type !== "nprofile") throw new Error("NSITE_HOMEPAGE must be a valid nprofile"); + + // use nsite-cli to download the homepage + const args = [bin, "download", NSITE_HOMEPAGE_DIR, nip19.npubEncode(decode.data.pubkey)]; + if (decode.data.relays) args.push("--relays", decode.data.relays?.join(",")); + + const child = spawn("node", args, { stdio: "pipe" }); + + child.on("spawn", () => log("Downloading...")); + child.stdout.on("data", (line) => log(line.toString("utf-8"))); + child.on("error", (e) => log("Failed", e)); + child.on("close", (code) => { + if (code === 0) log("Finished"); + else log("Failed"); + }); + } catch (error) { + console.log(`Failed to download homepage`); + console.log(error); + } +} + // serve static files from public const serveOptions: serve.Options = { hidden: true, maxAge: 60 * 60 * 1000, index: "index.html", }; + try { - const www = path.resolve(process.cwd(), "public"); + const www = NSITE_HOMEPAGE_DIR; fs.statSync(www); app.use(serve(www, serveOptions)); } catch (error) { @@ -210,19 +248,19 @@ try { } app.listen({ host: NSITE_HOST, port: NSITE_PORT }, () => { - console.log("Started on port", HOST); + logger("Started on port", HOST); }); // invalidate nginx cache and screenshots on new events if (SUBSCRIPTION_RELAYS.length > 0) { - console.log(`Listening for new nsite events on: ${SUBSCRIPTION_RELAYS.join(", ")}`); + logger(`Listening for new nsite events on: ${SUBSCRIPTION_RELAYS.join(", ")}`); subscribeForEvents(SUBSCRIPTION_RELAYS, async (event) => { try { const nsite = parseNsiteEvent(event); if (nsite) { if (NGINX_CACHE_DIR) { - console.log(`${nsite.pubkey}: Invalidating ${nsite.path}`); + logger(`${nsite.pubkey}: Invalidating ${nsite.path}`); await invalidatePubkeyPath(nsite.pubkey, nsite.path); } @@ -243,7 +281,7 @@ process.on("unhandledRejection", (reason, promise) => { }); async function shutdown() { - console.log("Shutting down..."); + logger("Shutting down..."); pool.destroy(); process.exit(0); } diff --git a/src/logger.ts b/src/logger.ts index 7578cbd..b3dcf2c 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,8 +1,7 @@ import debug from "debug"; // enable default logging -if (!debug.enabled("nsite")) debug.enable("nsite"); -if (!debug.enabled("nsite:*")) debug.enable("nsite:*"); +if (!debug.enabled("nsite")) debug.enable("nsite,nsite:*"); const logger = debug("nsite");