diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index 00742b9..0000000 --- a/.browserslistrc +++ /dev/null @@ -1,2 +0,0 @@ -ChromeAndroid >=37 -iOS >=11 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index a61513a..25a5454 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,3 @@ dist dist-xdc -webxdc.js -webxdc.d.ts pnpm-lock.yaml \ No newline at end of file diff --git a/index.html b/index.html index 741a343..7888252 100644 --- a/index.html +++ b/index.html @@ -3,9 +3,9 @@ + -

Chat

diff --git a/package.json b/package.json index cc2c748..da46d50 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,9 @@ "build": "vite build" }, "devDependencies": { - "@vitejs/plugin-legacy": "^4.0.2", "concurrently": "^8.1.0", - "eruda": "^3.0.0", - "jsdom": "^22.1.0", "prettier": "^3.0.3", - "toml": "^3.0.0", "vite": "^4.3.2", - "vite-plugin-zip-pack": "^1.0.5", - "webxdc-dev": "^0.17.0" + "webxdc-vite-plugins": "github:webxdc/webxdc-vite-plugins" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d392cb6..ebc5672 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,33 +5,18 @@ settings: excludeLinksFromLockfile: false devDependencies: - '@vitejs/plugin-legacy': - specifier: ^4.0.2 - version: 4.1.1(terser@5.19.4)(vite@4.3.9) concurrently: specifier: ^8.1.0 version: 8.1.0 - eruda: - specifier: ^3.0.0 - version: 3.0.0 - jsdom: - specifier: ^22.1.0 - version: 22.1.0 prettier: specifier: ^3.0.3 version: 3.0.3 - toml: - specifier: ^3.0.0 - version: 3.0.0 vite: specifier: ^4.3.2 version: 4.3.9(terser@5.19.4) - vite-plugin-zip-pack: - specifier: ^1.0.5 - version: 1.0.5(vite@4.3.9) - webxdc-dev: - specifier: ^0.17.0 - version: 0.17.0 + webxdc-vite-plugins: + specifier: github:webxdc/webxdc-vite-plugins + version: github.com/webxdc/webxdc-vite-plugins/4f21b1e509361f2986fa8b3533b851181a6cd56e(terser@5.19.4)(vite@4.3.9) packages: @@ -1487,11 +1472,6 @@ packages: resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} dev: true - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: @@ -1522,10 +1502,6 @@ packages: - supports-color dev: true - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true - /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1545,15 +1521,6 @@ packages: engines: {node: '>=6.0'} dev: true - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1577,10 +1544,6 @@ packages: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - /axios@0.25.0: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} dependencies: @@ -1750,13 +1713,6 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -1822,13 +1778,6 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cssstyle@3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} - dependencies: - rrweb-cssom: 0.6.0 - dev: true - /csstype@3.0.11: resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} dev: true @@ -1837,15 +1786,6 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true - /data-urls@4.0.0: - resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} - engines: {node: '>=14'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - dev: true - /date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -1876,20 +1816,11 @@ packages: ms: 2.1.2 dev: true - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true - /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1900,13 +1831,6 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - dependencies: - webidl-conversions: 7.0.0 - dev: true - /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true @@ -1924,11 +1848,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - /eruda@3.0.0: resolution: {integrity: sha512-6L8A8aBHOQv0rqeBlNdJEl/hl6OAdLVRtJlVmBIlIJ6Fe1a92HFXO58jHLC0vFyuKV0deTjYjRaWwLo9lJ9K9A==} dev: true @@ -2081,15 +2000,6 @@ packages: optional: true dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -2163,13 +2073,6 @@ packages: function-bind: 1.1.1 dev: true - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - dependencies: - whatwg-encoding: 2.0.0 - dev: true - /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -2181,17 +2084,6 @@ packages: toidentifier: 1.0.1 dev: true - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /http-proxy-middleware@2.0.6: resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} @@ -2221,16 +2113,6 @@ packages: - debug dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2238,13 +2120,6 @@ packages: safer-buffer: 2.1.2 dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: true @@ -2297,10 +2172,6 @@ packages: engines: {node: '>=10'} dev: true - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2326,44 +2197,6 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /jsdom@22.1.0: - resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} - engines: {node: '>=16'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 - decimal.js: 10.4.3 - domexception: 4.0.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.5 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.13.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -2504,10 +2337,6 @@ packages: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true - /nwsapi@2.2.5: - resolution: {integrity: sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==} - dev: true - /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true @@ -2532,12 +2361,6 @@ packages: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2587,15 +2410,6 @@ packages: ipaddr.js: 1.9.1 dev: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -2603,10 +2417,6 @@ packages: side-channel: 1.0.4 dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -2710,10 +2520,6 @@ packages: fsevents: 2.3.2 dev: true - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true - /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: @@ -2732,13 +2538,6 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - dependencies: - xmlchars: 2.2.0 - dev: true - /scroll-lock@2.1.5: resolution: {integrity: sha512-GN8Lp0AzXbkrPFUUNkMUruiiv019UvarNKE/SnXi+AxZRjMnDc2R22VB9RcUtL4P/uub04cKibmpHKIKTyWwYQ==} dev: true @@ -2905,10 +2704,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - /systemjs@6.14.2: resolution: {integrity: sha512-1TlOwvKWdXxAY9vba+huLu99zrQURDWA8pUTYsRIYDZYQbGyK+pyEP4h4dlySsqo7ozyJBmYD20F+iUHhAltEg==} dev: true @@ -2949,27 +2744,10 @@ packages: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} dev: true - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} - dependencies: - punycode: 2.3.0 - dev: true - /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -3010,11 +2788,6 @@ packages: engines: {node: '>=4'} dev: true - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -3031,13 +2804,6 @@ packages: picocolors: 1.0.0 dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -3094,13 +2860,6 @@ packages: fsevents: 2.3.2 dev: true - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - dependencies: - xml-name-validator: 4.0.0 - dev: true - /wait-on@6.0.1: resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} engines: {node: '>=10.0.0'} @@ -3119,11 +2878,6 @@ packages: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true - /webxdc-dev@0.17.0: resolution: {integrity: sha512-+NZHjIadGNrNfTjhaAcUUPxDwtaTEZ0ULnnz+Pl/v/3vAYs+fOOhjMaxKAI0YYf4oxgLVob0F5yjMI/tRr4SlQ==} hasBin: true @@ -3154,26 +2908,6 @@ packages: - utf-8-validate dev: true - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - dependencies: - iconv-lite: 0.6.3 - dev: true - - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - dev: true - - /whatwg-url@12.0.1: - resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} - engines: {node: '>=14'} - dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 - dev: true - /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -3216,15 +2950,6 @@ packages: optional: true dev: true - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true - - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3251,3 +2976,26 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 dev: true + + github.com/webxdc/webxdc-vite-plugins/4f21b1e509361f2986fa8b3533b851181a6cd56e(terser@5.19.4)(vite@4.3.9): + resolution: {tarball: https://codeload.github.com/webxdc/webxdc-vite-plugins/tar.gz/4f21b1e509361f2986fa8b3533b851181a6cd56e} + id: github.com/webxdc/webxdc-vite-plugins/4f21b1e509361f2986fa8b3533b851181a6cd56e + name: webxdc-vite-plugins + version: 0.1.0 + peerDependencies: + vite: ^4.0.0 + dependencies: + '@vitejs/plugin-legacy': 4.1.1(terser@5.19.4)(vite@4.3.9) + eruda: 3.0.0 + vite: 4.3.9(terser@5.19.4) + vite-plugin-zip-pack: 1.0.5(vite@4.3.9) + webxdc-dev: 0.17.0 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - encoding + - supports-color + - terser + - utf-8-validate + dev: true diff --git a/vite.config.js b/vite.config.js index d390acb..8f1c637 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,61 +1,5 @@ -import legacy from "@vitejs/plugin-legacy"; -import zipPack from "vite-plugin-zip-pack"; +import { webxdcViteConfig } from "webxdc-vite-plugins"; import { defineConfig } from "vite"; -import { readFileSync } from "node:fs"; -import * as toml from "toml"; - -const manifest = toml.parse(readFileSync("./public/manifest.toml", "utf-8")); -let name = manifest.name || "app"; -let version = manifest.version ? "_" + manifest.version : ""; - -function eruda(debug = undefined) { - const erudaSrc = readFileSync("./node_modules/eruda/eruda.js", "utf-8"); - return { - name: "vite-plugin-eruda", - apply: "build", - transformIndexHtml(html) { - const tags = [ - { - tag: "script", - children: erudaSrc, - injectTo: "head", - }, - { - tag: "script", - children: "eruda.init();", - injectTo: "head", - }, - ]; - if (debug === true) { - return { - html, - tags, - }; - } else if (debug === false) { - return html; - } - // @ts-ignore - if (process.env.NODE_ENV !== "production") { - return { - html, - tags, - }; - } else { - return html; - } - }, - }; -} - // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - legacy({ renderModernChunks: false }), - eruda(), - zipPack({ - outDir: "dist-xdc", - outFileName: name + version + ".xdc", - }), - ], -}); +export default defineConfig(webxdcViteConfig()); diff --git a/webxdc.d.ts b/webxdc.d.ts deleted file mode 100644 index be65fea..0000000 --- a/webxdc.d.ts +++ /dev/null @@ -1,136 +0,0 @@ -//@ts-check - -type SendingStatusUpdate = { - /** the payload, deserialized json: - * any javascript primitive, array or object. */ - payload: T; - /** optional, short, informational message that will be added to the chat, - * eg. "Alice voted" or "Bob scored 123 in MyGame"; - * usually only one line of text is shown, - * use this option sparingly to not spam the chat. */ - info?: string; - /** optional, if the Webxdc creates a document, you can set this to the name of the document; - * do not set if the Webxdc does not create a document */ - document?: string; - /** optional, short text, shown beside the icon; - * it is recommended to use some aggregated value, - * eg. "8 votes", "Highscore: 123" */ - summary?: string; -}; - -type ReceivedStatusUpdate = { - /** the payload, deserialized json */ - payload: T; - /** the serial number of this update. Serials are larger than 0 and newer serials have higher numbers */ - serial: number; - /** the maximum serial currently known */ - max_serial: number; - /** optional, short, informational message. */ - info?: string; - /** optional, if the Webxdc creates a document, this is the name of the document; - * not set if the Webxdc does not create a document */ - document?: string; - /** optional, short text, shown beside the webxdc's icon. */ - summary?: string; -}; - -type XDCFile = { - /** name of the file, including extension */ - name: string; -} & ( - | { - /** Blob, also accepts inherit types like File */ - blob: Blob; - } - | { - /** base64 encoded file data */ - base64: string; - } - | { - /** text for textfile, will be encoded as utf8 */ - plainText: string; - } -); - -type SendOptions = - | { - file: XDCFile; - text?: string; - } - | { - file?: XDCFile; - text: string; - }; - -interface Webxdc { - /** Returns the peer's own address. - * This is esp. useful if you want to differ between different peers - just send the address along with the payload, - * and, if needed, compare the payload addresses against selfAddr() later on. */ - selfAddr: string; - /** Returns the peer's own name. This is name chosen by the user in their settings, if there is nothing set, that defaults to the peer's address. */ - selfName: string; - /** - * set a listener for new status updates. - * The "serial" specifies the last serial that you know about (defaults to 0). - * Note that own status updates, that you send with {@link sendUpdate}, also trigger this method - * @returns promise that resolves when the listener has processed all the update messages known at the time when `setUpdateListener` was called. - * */ - setUpdateListener( - cb: (statusUpdate: ReceivedStatusUpdate) => void, - serial?: number - ): Promise; - /** - * @deprecated See {@link setUpdateListener|`setUpdateListener()`}. - */ - getAllUpdates(): Promise[]>; - /** - * Webxdc are usually shared in a chat and run independently on each peer. To get a shared status, the peers use sendUpdate() to send updates to each other. - * @param update status update to send - * @param description short, human-readable description what this update is about. this is shown eg. as a fallback text in an email program. - */ - sendUpdate(update: SendingStatusUpdate, description: string): void; - /** - * Send a message with file, text or both to a chat. - * Asks user to what Chat to send the message to. - * May exit the xdc, please save your app state before calling this function. - * @param message - * @returns promise that may not resolve (because the xdc closes) and is rejected on error. - */ - sendToChat(message: SendOptions): Promise; - /** - * Asks the user to choose files. - * This either opens a normal file picker (like ``) or an integrated Filepicker if the ui has implemented it. - * This custom file picker should show files that were recently send or received in chats, - * but also show a button to open the normal file picker. - */ - importFiles(filter: { - /** - * mimetypes as in https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept#unique_file_type_specifiers - */ - mimeTypes?: string[]; - /** only show files with these extensions. - * All extensions need to start with a dot and have the format `.ext`. */ - extensions?: string[]; - /** false by default, whether to allow multiple files to be selected */ - multiple?: boolean; - }): Promise; -} - -////////// ANCHOR: global -declare global { - interface Window { - webxdc: Webxdc; - } -} -////////// ANCHOR_END: global - -export { SendingStatusUpdate, ReceivedStatusUpdate, Webxdc, XDCFile }; - -/* Types for the Simulator */ -declare global { - interface Window { - addXdcPeer: () => void; - clearXdcStorage: () => void; - alterXdcApp: () => void; - } -} diff --git a/webxdc.js b/webxdc.js deleted file mode 100644 index 1e82fb0..0000000 --- a/webxdc.js +++ /dev/null @@ -1,248 +0,0 @@ -// debug friend: document.writeln(JSON.stringify(value)); -//@ts-check -/** @type {import('./webxdc').Webxdc} */ -window.webxdc = (() => { - var updateListener = (_) => {}; - var updatesKey = "__xdcUpdatesKey__"; - window.addEventListener("storage", (event) => { - if (event.key == null) { - window.location.reload(); - } else if (event.key === updatesKey) { - var updates = JSON.parse(event.newValue); - var update = updates[updates.length - 1]; - update.max_serial = updates.length; - console.log("[Webxdc] " + JSON.stringify(update)); - updateListener(update); - } - }); - - function getUpdates() { - var updatesJSON = window.localStorage.getItem(updatesKey); - return updatesJSON ? JSON.parse(updatesJSON) : []; - } - - var params = new URLSearchParams(window.location.hash.substr(1)); - return { - selfAddr: params.get("addr") || "device0@local.host", - selfName: params.get("name") || "device0", - setUpdateListener: (cb, serial = 0) => { - var updates = getUpdates(); - var maxSerial = updates.length; - updates.forEach((update) => { - if (update.serial > serial) { - update.max_serial = maxSerial; - cb(update); - } - }); - updateListener = cb; - return Promise.resolve(); - }, - getAllUpdates: () => { - console.log("[Webxdc] WARNING: getAllUpdates() is deprecated."); - return Promise.resolve([]); - }, - sendUpdate: (update, description) => { - var updates = getUpdates(); - var serial = updates.length + 1; - var _update = { - payload: update.payload, - summary: update.summary, - info: update.info, - serial: serial, - }; - updates.push(_update); - window.localStorage.setItem(updatesKey, JSON.stringify(updates)); - _update.max_serial = serial; - console.log( - '[Webxdc] description="' + description + '", ' + JSON.stringify(_update) - ); - updateListener(_update); - }, - sendToChat: async (content) => { - if (!content.file && !content.text) { - alert("🚨 Error: either file or text need to be set. (or both)"); - return Promise.reject( - "Error from sendToChat: either file or text need to be set" - ); - } - - /** @type {(file: Blob) => Promise} */ - const blob_to_base64 = (file) => { - const data_start = ";base64,"; - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => { - /** @type {string} */ - //@ts-ignore - let data = reader.result; - resolve(data.slice(data.indexOf(data_start) + data_start.length)); - }; - reader.onerror = () => reject(reader.error); - }); - }; - - let base64Content; - if (content.file) { - if (!content.file.name) { - return Promise.reject("file name is missing"); - } - if ( - Object.keys(content.file).filter((key) => - ["blob", "base64", "plainText"].includes(key) - ).length > 1 - ) { - return Promise.reject( - "you can only set one of `blob`, `base64` or `plainText`, not multiple ones" - ); - } - - // @ts-ignore - needed because typescript imagines that blob would not exist - if (content.file.blob instanceof Blob) { - // @ts-ignore - needed because typescript imagines that blob would not exist - base64Content = await blob_to_base64(content.file.blob); - // @ts-ignore - needed because typescript imagines that base64 would not exist - } else if (typeof content.file.base64 === "string") { - // @ts-ignore - needed because typescript imagines that base64 would not exist - base64Content = content.file.base64; - // @ts-ignore - needed because typescript imagines that plainText would not exist - } else if (typeof content.file.plainText === "string") { - base64Content = await blob_to_base64( - // @ts-ignore - needed because typescript imagines that plainText would not exist - new Blob([content.file.plainText]) - ); - } else { - return Promise.reject( - "data is not set or wrong format, set one of `blob`, `base64` or `plainText`, see webxdc documentation for sendToChat" - ); - } - } - const msg = `The app would now close and the user would select a chat to send this message:\nText: ${ - content.text ? `"${content.text}"` : "No Text" - }\nFile: ${ - content.file - ? `${content.file.name} - ${base64Content.length} bytes` - : "No File" - }`; - if (content.file) { - const confirmed = confirm( - msg + "\n\nDownload the file in the browser instead?" - ); - if (confirmed) { - var element = document.createElement("a"); - element.setAttribute( - "href", - "data:application/octet-stream;base64," + base64Content - ); - element.setAttribute("download", content.file.name); - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); - } - } else { - alert(msg); - } - }, - importFiles: (filters) => { - var element = document.createElement("input"); - element.type = "file"; - element.accept = [ - ...(filters.extensions || []), - ...(filters.mimeTypes || []), - ].join(","); - element.multiple = filters.multiple || false; - const promise = new Promise((resolve, _reject) => { - element.onchange = (_ev) => { - console.log("element.files", element.files); - const files = Array.from(element.files || []); - document.body.removeChild(element); - resolve(files); - }; - }); - element.style.display = "none"; - document.body.appendChild(element); - element.click(); - console.log(element); - return promise; - }, - }; -})(); - -window.addXdcPeer = () => { - var loc = window.location; - // get next peer ID - var params = new URLSearchParams(loc.hash.substr(1)); - var peerId = Number(params.get("next_peer")) || 1; - - // open a new window - var peerName = "device" + peerId; - var url = - loc.protocol + - "//" + - loc.host + - loc.pathname + - "#name=" + - peerName + - "&addr=" + - peerName + - "@local.host"; - window.open(url); - - // update next peer ID - params.set("next_peer", String(peerId + 1)); - window.location.hash = "#" + params.toString(); -}; - -window.clearXdcStorage = () => { - window.localStorage.clear(); - window.location.reload(); -}; - -window.alterXdcApp = () => { - var styleControlPanel = - "position: fixed; bottom:1em; left:1em; background-color: #000; opacity:0.8; padding:.5em; font-size:16px; font-family: sans-serif; color:#fff; z-index: 9999"; - var styleMenuLink = - "color:#fff; text-decoration: none; vertical-align: middle"; - var styleAppIcon = - "height: 1.5em; width: 1.5em; margin-right: 0.5em; border-radius:10%; vertical-align: middle"; - var title = document.getElementsByTagName("title")[0]; - if (typeof title == "undefined") { - title = document.createElement("title"); - document.getElementsByTagName("head")[0].append(title); - } - title.innerText = window.webxdc.selfAddr; - - if (window.webxdc.selfName === "device0") { - var div = document.createElement("div"); - div.innerHTML = - '
' + - 'Add Peer' + - ' | ' + - 'Clear Storage' + - "
"; - var controlPanel = div.firstChild; - - function loadIcon(name) { - var tester = new Image(); - tester.onload = () => { - div.innerHTML = ''; - controlPanel.insertBefore(div.firstChild, controlPanel.firstChild); - }; - tester.src = name; - } - loadIcon("icon.png"); - loadIcon("icon.jpg"); - - document.getElementsByTagName("body")[0].append(controlPanel); - } -}; - -window.addEventListener("load", window.alterXdcApp);