You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
3.9 KiB
JavaScript
166 lines
3.9 KiB
JavaScript
const { build } = require("esbuild");
|
|
const { sassPlugin } = require("esbuild-sass-plugin");
|
|
const { externalGlobalPlugin } = require("esbuild-plugin-external-global");
|
|
|
|
// Will be used later for treeshaking
|
|
//const fs = require("fs");
|
|
// const path = require("path");
|
|
|
|
// function getFiles(dir, files = []) {
|
|
// const fileList = fs.readdirSync(dir);
|
|
// for (const file of fileList) {
|
|
// const name = `${dir}/${file}`;
|
|
// if (
|
|
// name.includes("node_modules") ||
|
|
// name.includes("config") ||
|
|
// name.includes("package.json") ||
|
|
// name.includes("main.js") ||
|
|
// name.includes("index-node.ts") ||
|
|
// name.endsWith(".d.ts")
|
|
// ) {
|
|
// continue;
|
|
// }
|
|
|
|
// if (fs.statSync(name).isDirectory()) {
|
|
// getFiles(name, files);
|
|
// } else if (
|
|
// !(
|
|
// name.match(/\.(sa|sc|c)ss$/) ||
|
|
// name.match(/\.(woff|woff2|eot|ttf|otf)$/) ||
|
|
// name.match(/locales\/[^/]+\.json$/)
|
|
// )
|
|
// ) {
|
|
// continue;
|
|
// } else {
|
|
// files.push(name);
|
|
// }
|
|
// }
|
|
// return files;
|
|
// }
|
|
|
|
const browserConfig = {
|
|
entryPoints: ["index.tsx"],
|
|
bundle: true,
|
|
format: "esm",
|
|
plugins: [
|
|
sassPlugin(),
|
|
externalGlobalPlugin({
|
|
react: "React",
|
|
"react-dom": "ReactDOM",
|
|
}),
|
|
],
|
|
splitting: true,
|
|
loader: {
|
|
".woff2": "file",
|
|
},
|
|
};
|
|
const createESMBrowserBuild = async () => {
|
|
// Development unminified build with source maps
|
|
await build({
|
|
...browserConfig,
|
|
outdir: "dist/browser/dev",
|
|
sourcemap: true,
|
|
chunkNames: "excalidraw-assets-dev/[name]-[hash]",
|
|
assetNames: "excalidraw-assets-dev/[name]-[hash]",
|
|
define: {
|
|
"import.meta.env": JSON.stringify({ DEV: true }),
|
|
},
|
|
});
|
|
|
|
// production minified build without sourcemaps
|
|
await build({
|
|
...browserConfig,
|
|
outdir: "dist/browser/prod",
|
|
minify: true,
|
|
chunkNames: "excalidraw-assets/[name]-[hash]",
|
|
assetNames: "excalidraw-assets/[name]-[hash]",
|
|
define: {
|
|
"import.meta.env": JSON.stringify({ PROD: true }),
|
|
},
|
|
});
|
|
};
|
|
|
|
// const BASE_PATH = `${path.resolve(`${__dirname}/..`)}`;
|
|
// const filesinExcalidrawPackage = [
|
|
// ...getFiles(`${BASE_PATH}/packages/excalidraw`),
|
|
// `${BASE_PATH}/packages/utils/export.ts`,
|
|
// `${BASE_PATH}/packages/utils/bbox.ts`,
|
|
// ...getFiles(`${BASE_PATH}/public/fonts`),
|
|
// ];
|
|
|
|
// const filesToTransform = filesinExcalidrawPackage.filter((file) => {
|
|
// return !(
|
|
// file.includes("/__tests__/") ||
|
|
// file.includes(".test.") ||
|
|
// file.includes("/tests/") ||
|
|
// file.includes("example")
|
|
// );
|
|
// });
|
|
|
|
const rawConfigCommon = {
|
|
bundle: true,
|
|
format: "esm",
|
|
plugins: [sassPlugin()],
|
|
assetNames: "[dir]/[name]-[hash]",
|
|
loader: {
|
|
".json": "copy",
|
|
".woff2": "file",
|
|
},
|
|
packages: "external",
|
|
// chunks are always external, so they are not bundled within and get build separately
|
|
external: ["*.chunk"],
|
|
};
|
|
|
|
const rawConfigIndex = {
|
|
...rawConfigCommon,
|
|
entryPoints: ["index.tsx"],
|
|
};
|
|
|
|
const rawConfigChunks = {
|
|
...rawConfigCommon,
|
|
// create a separate chunk for each
|
|
entryPoints: ["**/*.chunk.ts"],
|
|
};
|
|
|
|
function buildDev(chunkConfig) {
|
|
const config = {
|
|
...chunkConfig,
|
|
sourcemap: true,
|
|
define: {
|
|
"import.meta.env": JSON.stringify({ DEV: true }),
|
|
},
|
|
outdir: "dist/dev",
|
|
};
|
|
|
|
return build(config);
|
|
}
|
|
|
|
function buildProd(chunkConfig) {
|
|
const config = {
|
|
...chunkConfig,
|
|
minify: true,
|
|
define: {
|
|
"import.meta.env": JSON.stringify({ PROD: true }),
|
|
},
|
|
outdir: "dist/prod",
|
|
};
|
|
|
|
return build(config);
|
|
}
|
|
|
|
const createESMRawBuild = async () => {
|
|
// development unminified build with source maps
|
|
await buildDev(rawConfigIndex);
|
|
await buildDev(rawConfigChunks);
|
|
|
|
// production minified buld without sourcemaps
|
|
await buildProd(rawConfigIndex);
|
|
await buildProd(rawConfigChunks);
|
|
};
|
|
|
|
// otherwise throws "ERROR: Could not resolve "./subset-worker.chunk"
|
|
(async () => {
|
|
await createESMRawBuild();
|
|
await createESMBrowserBuild();
|
|
})();
|