diff --git a/.gitignore b/.gitignore index f7161f1..b7c89c9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ abap2xlsx abap2xlsx-demos open-abap-core src/abap.ts +src/abap.js input output \ No newline at end of file diff --git a/abap.mjs b/abap.mjs index 6331681..bfd5d99 100644 --- a/abap.mjs +++ b/abap.mjs @@ -10,7 +10,9 @@ function escape(input) { if (input.charCodeAt(0) === 0xFEFF) { input = input.substr(1); } - return input.replaceAll("`", "\\`").replaceAll("${", "\\${").trimEnd(); + return input.replaceAll("\\", "\\\\") + .replaceAll("`", "\\`") + .replaceAll("${", "\\${").trimEnd(); } function add(name, contents) { @@ -60,7 +62,7 @@ for (const dirent of fs.readdirSync("abap2xlsx/src", {recursive: true, withFileT ///////////////////////////////////////// -fs.writeFileSync("src/abap.ts", output + "\n};"); +fs.writeFileSync("src/abap.js", output + "\n};"); for (const filename in files) { fs.writeFileSync(path.join("input", filename), files[filename]); } \ No newline at end of file diff --git a/abap_transpile.json b/abap_transpile.json index 8697fba..2a54150 100644 --- a/abap_transpile.json +++ b/abap_transpile.json @@ -9,6 +9,7 @@ "ignoreSyntaxCheck": false, "addFilenames": true, "addCommonJS": true, + "skipReposrc": true, "unknownTypes": "runtimeError", "skip": [] } diff --git a/package-lock.json b/package-lock.json index 621741c..3722564 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,8 @@ "@abaplint/runtime": "^2.10.17", "@abaplint/transpiler": "^2.10.17", "@abaplint/transpiler-cli": "^2.10.17", + "assert": "^2.1.0", + "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "copy-webpack-plugin": "^12.0.2", "crypto-browserify": "^3.12.0", @@ -21,6 +23,7 @@ "html-webpack-plugin": "^5.6.0", "monaco-editor": "^0.51.0", "path-browserify": "^1.0.1", + "process": "^0.11.10", "split-grid": "^1.0.11", "stream-browserify": "^3.0.0", "string_decoder": "^1.3.0", @@ -838,6 +841,34 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1026,6 +1057,15 @@ "node": ">= 0.12" } }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, "node_modules/browserslist": { "version": "4.23.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", @@ -1681,6 +1721,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2243,6 +2300,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2410,6 +2476,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -2736,6 +2817,22 @@ "node": ">= 10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2748,6 +2845,18 @@ "node": ">=8" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -2787,6 +2896,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2817,6 +2941,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -2862,6 +3002,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -3282,6 +3437,49 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -3380,6 +3578,12 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -3520,6 +3724,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.45", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", @@ -3636,6 +3849,15 @@ "renderkid": "^3.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4772,6 +4994,19 @@ "punycode": "^2.1.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5192,6 +5427,25 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/package.json b/package.json index c5fd2b8..41ade9b 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "@abaplint/runtime": "^2.10.17", "@abaplint/transpiler": "^2.10.17", "@abaplint/transpiler-cli": "^2.10.17", + "assert": "^2.1.0", + "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "copy-webpack-plugin": "^12.0.2", "crypto-browserify": "^3.12.0", @@ -28,6 +30,7 @@ "html-webpack-plugin": "^5.6.0", "monaco-editor": "^0.51.0", "path-browserify": "^1.0.1", + "process": "^0.11.10", "split-grid": "^1.0.11", "stream-browserify": "^3.0.0", "string_decoder": "^1.3.0", diff --git a/public/zcl_excel_demo1.xlsx b/public/zcl_excel_demo1.xlsx index 824ba3f..5bd3bda 100644 Binary files a/public/zcl_excel_demo1.xlsx and b/public/zcl_excel_demo1.xlsx differ diff --git a/public/zcl_excel_demo2.xlsx b/public/zcl_excel_demo2.xlsx index 4dc9d84..4d9b3b0 100644 Binary files a/public/zcl_excel_demo2.xlsx and b/public/zcl_excel_demo2.xlsx differ diff --git a/src/index.css b/src/index.css index 8dacf07..b0334e9 100644 --- a/src/index.css +++ b/src/index.css @@ -7,6 +7,10 @@ body, html, .inner, .outer { overflow: hidden; } +a { + color: white; +} + #horizon { display: grid; grid-template-columns: 1fr 5px 1fr; diff --git a/src/index.ts b/src/index.ts index 806e55f..3b597c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ // @ts-ignore global.MonacoEnvironment = { globalAPI: true, - getWorkerUrl: function (_moduleId: any, label: any) { + getWorkerUrl: function (_moduleId, label) { /* if (label === "json") { return "./json.worker.bundle.js"; @@ -18,12 +18,15 @@ import "./index.css"; import "../public/favicon-16x16.png"; import "../public/favicon-32x32.png"; import * as monaco from "monaco-editor"; -import {config, Transpiler} from "@abaplint/transpiler"; -import {ABAP, MemoryConsole} from "@abaplint/runtime"; +import {config, ITranspilerOptions, Transpiler, UnknownTypesEnum} from "@abaplint/transpiler"; +// import {ABAP, MemoryConsole} from "@abaplint/runtime"; import * as abaplint from "@abaplint/core"; import * as abapMonaco from "@abaplint/monaco"; import Split from "split-grid"; -import { abapfiles } from "./abap"; +import { abapfiles } from "./abap.js"; +import * as initabap from "../output/init.mjs"; +import {Buffer} from "buffer"; +console.dir(initabap); // just to make sure its not shaked away const reg = new abaplint.Registry(new abaplint.Config(JSON.stringify(config))); for (const filename in abapfiles) { @@ -106,9 +109,37 @@ document.getElementById("demoDropdown").addEventListener("change", (e) => { // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction const AsyncFunction = new Function(`return Object.getPrototypeOf(async function(){}).constructor`)(); +async function sanitizeAndRun(js: string) { + let lines = js.split("\n"); + lines = lines.filter(row => row.includes("await import") === false); + lines = lines.filter(row => row.includes("export {") === false); + js = lines.join("\n"); + js += ` +const excel = await abap.Classes["ZCL_EXCEL_DEMO1"].zif_excel_demo_output$run(); +const writer = new abap.Classes["ZCL_EXCEL_WRITER_2007"](); +await writer.constructor_(); +const xstring = await writer.zif_excel_writer$write_file({io_excel: excel}); +return xstring; + `; +// console.dir(js); + + const f = new AsyncFunction("abap", js); + const res = await f(globalThis.abap); + console.dir(res); + + var file = document.createElement('a'); + file.setAttribute('href', 'data:application/octet-stream;base64,' + Buffer.from(res.get(), "hex").toString("base64")); + file.setAttribute('download', "foo.xlsx"); + file.innerText = "Download, " + (res.get().length / 2) + " bytes"; + document.getElementById("container2").appendChild(file); +} + async function abapChanged() { + // @ts-ignore + console.dir(globalThis.abap); + const contents = editor1.getValue(); + try { - const contents = editor1.getValue(); const file = new abaplint.MemoryFile(filename, contents); reg.updateFile(file); reg.parse(); @@ -119,6 +150,7 @@ async function abapChanged() { document.getElementById("container2").innerHTML = ``; setTimeout(() => monaco.editor.getEditors()[0].focus(), 1000); + return; } else { const markers = monaco.editor.getModelMarkers({}); if (markers.length > 0) { @@ -130,16 +162,33 @@ async function abapChanged() { return; } - document.getElementById("container2").innerHTML = `todo, compiling`; + document.getElementById("container2").innerHTML = `Compiling`; + } + } catch (error) { + console.dir(error); + } - // const res = await new Transpiler().runRaw([{filename, contents}]); + try { + const options: ITranspilerOptions = { + "ignoreSyntaxCheck": false, + "addFilenames": true, + "addCommonJS": true, + "skipReposrc": true, + "unknownTypes": UnknownTypesEnum.runtimeError, } + const result = await new Transpiler(options).run(reg); + document.getElementById("container2").innerHTML = `Compiling Done

`; + const compiled = result.objects.find(o => o.filename.includes("zcl_demo.clas.mjs"))?.chunk.getCode(); + await sanitizeAndRun(compiled); } catch (error) { + document.getElementById("container2").innerHTML = `Issues found during compilation or execution
`; console.dir(error); + document.getElementById("container2").innerHTML += error.toString(); } } editor1.onDidChangeModelContent(abapChanged); abapChanged(); editor1.focus(); -const abap = new ABAP({console: new MemoryConsole()}); + +//const abap = new ABAP({console: new MemoryConsole()}); diff --git a/tsconfig.json b/tsconfig.json index 32f32ea..f3d41c8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "moduleResolution": "node", "target": "es5", "outDir": "./dist", - "lib": ["dom", "es5", "es2015.collection", "es2015.promise"], + "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015"], "types": [], "baseUrl": ".", "typeRoots": ["node_modules/@types"] diff --git a/webpack.config.js b/webpack.config.js index 6acd230..b38a9a3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,8 +10,13 @@ module.exports = { entry: { app: "./src/index.ts", "editor.worker": "monaco-editor/esm/vs/editor/editor.worker.js", + /* "json.worker": "monaco-editor/esm/vs/language/json/json.worker", "ts.worker": "monaco-editor/esm/vs/language/typescript/ts.worker", + */ + }, + experiments: { + topLevelAwait: true }, devServer: { open: true, @@ -19,19 +24,24 @@ module.exports = { }, resolve: { fallback: { + "./%23ui2%23cl_json.clas.mjs": false, "buffer": require.resolve("buffer/"), + "assert": false, "stream": require.resolve("stream-browserify"), "crypto": false, "path": require.resolve("path-browserify"), "fs": false, "http": false, "https": false, - "zlib": false, + "process": require.resolve("process"), + "zlib": require.resolve("browserify-zlib"), + "tls": false, + "net": false, "util": false, "url": false, "string_decoder": require.resolve("string_decoder/"), }, - extensions: [".ts", ".js"], + extensions: [".ts", ".js", ".mjs"], }, output: { globalObject: "self", @@ -74,6 +84,7 @@ module.exports = { }), new webpack.ProvidePlugin({ Buffer: ["buffer", "Buffer"], + process: 'process/browser', }), new CopyPlugin({ patterns: [