Configure package exports explicitly (#336)

Closes #337
Blocks https://github.com/webrecorder/archiveweb.page/issues/198

Adds a dedicated `misc` export, as well as explicitly exporting the
`electron-*` files and the `index.html` file. This restricts imports to
only these files, and allows us to not have to exactly match webpack
configs between RWP and AWP.
This commit is contained in:
Emma Segal-Grossman
2024-06-18 21:41:21 -04:00
committed by GitHub
parent 2700797b6a
commit 1feee354c7
4 changed files with 102 additions and 5 deletions
+12 -2
View File
@@ -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",
+1 -1
View File
@@ -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
+1 -1
View File
@@ -3,7 +3,7 @@
"outDir": "./dist/",
"module": "esnext",
"target": "es6",
"moduleResolution": "node",
"moduleResolution": "Bundler",
"allowJs": true,
"strict": true,
"declaration": true,
+88 -1
View File
@@ -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,
];