diff --git a/package.json b/package.json index 7c64b95e..71015c5a 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,18 @@ "homepage": "https://replayweb.page/", "author": "Webrecorder Software", "license": "AGPL-3.0-or-later", - "main": "ui.js", - "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "default": "./ui.js" + }, + "./misc": { + "types": "./dist/types/misc.d.ts", + "default": "./dist/misc.js" + }, + "./src/electron-*": "./src/electron-*.ts", + "./index.html": "./index.html" + }, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.4", "@shoelace-style/shoelace": "~2.15.1", diff --git a/src/components/labeled-field.ts b/src/components/labeled-field.ts index 367b2be8..e4af2539 100644 --- a/src/components/labeled-field.ts +++ b/src/components/labeled-field.ts @@ -8,7 +8,7 @@ import faX from "@fortawesome/fontawesome-free/svgs/solid/times.svg"; import { registerIconLibrary } from "@shoelace-style/shoelace/dist/utilities/icon-library.js"; -import systemLibrary from "@shoelace-style/shoelace/dist/components/icon/library.system"; +import systemLibrary from "@shoelace-style/shoelace/dist/components/icon/library.system.js"; // disable system library to prevent loading of unused data: URLs // allow only "x-lg" as it is needed for sl-dialog diff --git a/tsconfig.json b/tsconfig.json index 9757cfe0..a547c9a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "outDir": "./dist/", "module": "esnext", "target": "es6", - "moduleResolution": "node", + "moduleResolution": "Bundler", "allowJs": true, "strict": true, "declaration": true, diff --git a/webpack.config.js b/webpack.config.js index 27defb4b..46e85015 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -188,4 +188,91 @@ const browserConfig = (/*env, argv*/) => { return merge(tsConfig, config); }; -module.exports = [browserConfig, electronMainConfig, electronPreloadConfig]; +const miscConfig = (/*env, argv*/) => { + const isDevServer = process.env.WEBPACK_SERVE; + + /** @type {import('webpack').Configuration['entry']} */ + const entry = { + misc: "./src/misc.ts", + }; + + /** @type {import('webpack').Configuration} */ + const config = { + target: "web", + mode: "production", + cache: { + type: isDevServer ? "memory" : "filesystem", + }, + resolve: { + fallback: { crypto: false }, + }, + entry, + optimization, + + output: { + path: path.join(__dirname, "dist"), + filename: "[name].js", + libraryTarget: "self", + globalObject: "self", + publicPath: "/", + }, + + devServer: { + compress: true, + port: 9990, + open: false, + static: __dirname, + //publicPath: "/" + }, + + plugins: [ + new webpack.NormalModuleReplacementPlugin(/^node:*/, (resource) => { + switch (resource.request) { + case "node:stream": + resource.request = "stream-browserify"; + break; + } + }), + + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + new webpack.ProvidePlugin({ + process: "process/browser", + }), + new MiniCssExtractPlugin(), + new webpack.DefinePlugin({ + __SW_NAME__: JSON.stringify("sw.js"), + __HELPER_PROXY__: JSON.stringify(HELPER_PROXY), + __GDRIVE_CLIENT_ID__: JSON.stringify(GDRIVE_CLIENT_ID), + __VERSION__: JSON.stringify(package_json.version), + }), + new webpack.BannerPlugin(BANNER_TEXT), + ], + + module: { + rules: [ + { + test: /\.svg$/, + use: ["raw-loader"], + }, + { + test: /main.scss$/, + use: ["css-loader", "sass-loader"], + }, + { + test: /wombat.js|wombatWorkers.js|index.html$/i, + use: ["raw-loader"], + }, + ], + }, + }; + return merge(tsConfig, config); +}; + +module.exports = [ + browserConfig, + miscConfig, + electronMainConfig, + electronPreloadConfig, +];