diff --git a/package-lock.json b/package-lock.json index 86ac9efc..d4ef09d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "brawl-chat", + "name": "hydrogen-web", "version": "0.0.27", "lockfileVersion": 1, "requires": true, @@ -1088,6 +1088,15 @@ "resolve": "^1.11.0" } }, + "@rollup/plugin-multi-entry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-multi-entry/-/plugin-multi-entry-3.0.1.tgz", + "integrity": "sha512-Gcp9E8y68Kx+Jo8zy/ZpiiAkb0W01cSqnxOz6h9bPR7MU3gaoTEdRf7xXYplwli1SBFEswXX588ESj+50Brfxw==", + "dev": true, + "requires": { + "matched": "^1.0.2" + } + }, "@rollup/plugin-node-resolve": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz", @@ -1158,6 +1167,18 @@ "color-convert": "^1.9.0" } }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "async-array-reduce": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", + "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", + "dev": true + }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -1484,6 +1505,15 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -1537,6 +1567,30 @@ "path-is-absolute": "^1.0.0" } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1549,12 +1603,30 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", + "dev": true, + "requires": { + "is-glob": "^3.0.0" + } + }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -1608,6 +1680,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -1617,6 +1695,21 @@ "loose-envify": "^1.0.0" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -1632,6 +1725,24 @@ "@types/estree": "*" } }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1692,6 +1803,20 @@ "sourcemap-codec": "^1.4.4" } }, + "matched": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/matched/-/matched-1.0.2.tgz", + "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.1", + "glob": "^7.1.2", + "has-glob": "^1.0.0", + "is-valid-glob": "^1.0.0", + "resolve-dir": "^1.0.0" + } + }, "mdn-polyfills": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/mdn-polyfills/-/mdn-polyfills-5.20.0.tgz", @@ -1776,6 +1901,12 @@ "wrappy": "1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -1946,6 +2077,16 @@ "path-parse": "^1.0.6" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "rollup": { "version": "1.32.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", @@ -2104,6 +2245,15 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 4750dd07..9cef3338 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@babel/preset-env": "^7.11.0", "@rollup/plugin-babel": "^5.1.0", "@rollup/plugin-commonjs": "^14.0.0", + "@rollup/plugin-multi-entry": "^3.0.1", "@rollup/plugin-node-resolve": "^8.4.0", "cheerio": "^1.0.0-rc.3", "core-js": "^3.6.5", diff --git a/scripts/build.mjs b/scripts/build.mjs index 8a7af56a..d5858082 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -30,6 +30,8 @@ import babel from '@rollup/plugin-babel'; import { nodeResolve } from '@rollup/plugin-node-resolve'; // needed because some of the polyfills are written as commonjs modules import commonjs from '@rollup/plugin-commonjs'; +// multi-entry plugin so we can add polyfill file to main +import multi from '@rollup/plugin-multi-entry'; const PROJECT_ID = "hydrogen"; const PROJECT_SHORT_NAME = "Hydrogen"; @@ -83,7 +85,7 @@ async function buildHtml(version, bundleName) { doc("link[rel=stylesheet]").attr("href", `${PROJECT_ID}.css`); doc("script#main").replaceWith( `` + - ``); + ``); removeOrEnableScript(doc("script#phone-debug-pre"), debug); removeOrEnableScript(doc("script#phone-debug-post"), debug); removeOrEnableScript(doc("script#service-worker"), offline); @@ -107,7 +109,7 @@ async function buildJs(bundleName) { await bundle.write({ file: path.join(targetDir, bundleName), format: 'iife', - name: 'main' + name: `${PROJECT_ID}Bundle` }); } @@ -129,14 +131,14 @@ async function buildJsLegacy(bundleName) { }); // create js bundle const rollupConfig = { - input: 'src/main-legacy.js', - plugins: [commonjs(), nodeResolve(), babelPlugin] + input: ['src/legacy-polyfill.js', 'src/main.js'], + plugins: [multi(), commonjs(), nodeResolve(), babelPlugin] }; const bundle = await rollup.rollup(rollupConfig); await bundle.write({ file: path.join(targetDir, bundleName), format: 'iife', - name: 'main' + name: `${PROJECT_ID}Bundle` }); } diff --git a/src/legacy-polyfill.js b/src/legacy-polyfill.js new file mode 100644 index 00000000..5665158c --- /dev/null +++ b/src/legacy-polyfill.js @@ -0,0 +1,26 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// polyfills needed for IE11 +import "core-js/stable"; +import "regenerator-runtime/runtime"; +import "mdn-polyfills/Element.prototype.closest"; +// TODO: contribute this to mdn-polyfills +if (!Element.prototype.remove) { + Element.prototype.remove = function remove() { + this.parentNode.removeChild(this); + }; +} \ No newline at end of file diff --git a/src/main-legacy.js b/src/main-legacy.js deleted file mode 100644 index e21d4ca5..00000000 --- a/src/main-legacy.js +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2020 Bruno Windels -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// polyfills needed for IE11 -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import "mdn-polyfills/Element.prototype.closest"; -// TODO: contribute this to mdn-polyfills -if (!Element.prototype.remove) { - Element.prototype.remove = function remove() { - this.parentNode.removeChild(this); - }; -} - -import {xhrRequest} from "./matrix/net/request/xhr.js"; -import {SessionContainer} from "./matrix/SessionContainer.js"; -import {StorageFactory} from "./matrix/storage/idb/StorageFactory.js"; -import {SessionInfoStorage} from "./matrix/sessioninfo/localstorage/SessionInfoStorage.js"; -import {BrawlViewModel} from "./domain/BrawlViewModel.js"; -import {BrawlView} from "./ui/web/BrawlView.js"; -import {Clock} from "./ui/web/dom/Clock.js"; -import {OnlineStatus} from "./ui/web/dom/OnlineStatus.js"; - -export default async function main(container) { - try { - const request = xhrRequest; - const sessionInfoStorage = new SessionInfoStorage("brawl_sessions_v1"); - const clock = new Clock(); - const storageFactory = new StorageFactory(); - - const vm = new BrawlViewModel({ - createSessionContainer: () => { - return new SessionContainer({ - random: Math.random, - onlineStatus: new OnlineStatus(), - storageFactory, - sessionInfoStorage, - request, - clock, - }); - }, - sessionInfoStorage, - storageFactory, - clock, - }); - window.__brawlViewModel = vm; - await vm.load(); - const view = new BrawlView(vm); - container.appendChild(view.mount()); - } catch(err) { - console.error(`${err.message}:\n${err.stack}`); - } -} diff --git a/src/main.js b/src/main.js index f5c13fc4..2c86b9d9 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,6 @@ /* Copyright 2020 Bruno Windels +Copyright 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,6 +17,7 @@ limitations under the License. // import {RecordRequester, ReplayRequester} from "./matrix/net/request/replay.js"; import {createFetchRequest} from "./matrix/net/request/fetch.js"; +import {xhrRequest} from "./matrix/net/request/xhr.js"; import {SessionContainer} from "./matrix/SessionContainer.js"; import {StorageFactory} from "./matrix/storage/idb/StorageFactory.js"; import {SessionInfoStorage} from "./matrix/sessioninfo/localstorage/SessionInfoStorage.js"; @@ -24,7 +26,10 @@ import {BrawlView} from "./ui/web/BrawlView.js"; import {Clock} from "./ui/web/dom/Clock.js"; import {OnlineStatus} from "./ui/web/dom/OnlineStatus.js"; -export default async function main(container) { +// Don't use a default export here, as we use multiple entries during legacy build, +// which does not support default exports, +// see https://github.com/rollup/plugins/tree/master/packages/multi-entry +export async function main(container) { try { // to replay: // const fetchLog = await (await fetch("/fetchlogs/constrainterror.json")).json(); @@ -35,9 +40,13 @@ export default async function main(container) { // const recorder = new RecordRequester(createFetchRequest(clock.createTimeout)); // const request = recorder.request; // window.getBrawlFetchLog = () => recorder.log(); - // normal network: const clock = new Clock(); - const request = createFetchRequest(clock.createTimeout); + let request; + if (typeof fetch === "function") { + request = createFetchRequest(clock.createTimeout); + } else { + request = xhrRequest; + } const sessionInfoStorage = new SessionInfoStorage("brawl_sessions_v1"); const storageFactory = new StorageFactory();