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);