snapshot of https://github.com/excalidraw/excalidraw.git (master, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Tests / test (push) Failing after 15s
Some checks failed
Tests / test (push) Failing after 15s
This commit is contained in:
129
scripts/buildPackage.js
Normal file
129
scripts/buildPackage.js
Normal file
@@ -0,0 +1,129 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
const { pathToFileURL } = require("url");
|
||||
|
||||
const { build } = require("esbuild");
|
||||
const { sassPlugin } = require("esbuild-sass-plugin");
|
||||
|
||||
const { parseEnvVariables } = require("../packages/excalidraw/env.cjs");
|
||||
|
||||
const ENV_VARS = {
|
||||
development: {
|
||||
...parseEnvVariables(`${__dirname}/../.env.development`),
|
||||
DEV: true,
|
||||
},
|
||||
production: {
|
||||
...parseEnvVariables(`${__dirname}/../.env.production`),
|
||||
PROD: true,
|
||||
},
|
||||
};
|
||||
|
||||
// Resolve a relative path from the source file's directory
|
||||
const resolveRelativePath = (importPath, sourceFile) => {
|
||||
const sourceDir = path.dirname(sourceFile);
|
||||
const extensions = [".scss", ".css", ""];
|
||||
|
||||
for (const ext of extensions) {
|
||||
const fullPath = path.resolve(sourceDir, importPath + ext);
|
||||
if (fs.existsSync(fullPath)) {
|
||||
return fullPath;
|
||||
}
|
||||
// Try with underscore prefix for partials
|
||||
const partialPath = path.join(
|
||||
path.dirname(fullPath),
|
||||
`_${path.basename(fullPath)}`,
|
||||
);
|
||||
if (fs.existsSync(partialPath)) {
|
||||
return partialPath;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
// Precompile function to convert relative paths to absolute paths
|
||||
const precompile = (source, sourcePath) => {
|
||||
// Match @use and @forward statements with relative paths
|
||||
const importRegex = /(@use|@forward)\s+["'](\.[^"']+)["']/g;
|
||||
|
||||
return source.replace(importRegex, (match, directive, importPath) => {
|
||||
const resolvedPath = resolveRelativePath(importPath, sourcePath);
|
||||
if (resolvedPath) {
|
||||
// Convert to file:// URL format for sass
|
||||
const fileUrl = pathToFileURL(resolvedPath).href;
|
||||
return `${directive} "${fileUrl}"`;
|
||||
}
|
||||
return match;
|
||||
});
|
||||
};
|
||||
|
||||
// excludes all external dependencies and bundles only the source code
|
||||
const getConfig = (outdir) => ({
|
||||
outdir,
|
||||
bundle: true,
|
||||
splitting: true,
|
||||
format: "esm",
|
||||
packages: "external",
|
||||
plugins: [
|
||||
sassPlugin({
|
||||
precompile,
|
||||
}),
|
||||
],
|
||||
target: "es2020",
|
||||
assetNames: "[dir]/[name]",
|
||||
chunkNames: "[dir]/[name]-[hash]",
|
||||
alias: {
|
||||
"@excalidraw/utils": path.resolve(__dirname, "../packages/utils/src"),
|
||||
},
|
||||
external: [
|
||||
"@excalidraw/common",
|
||||
"@excalidraw/element",
|
||||
"@excalidraw/math",
|
||||
"@excalidraw/fractional-indexing",
|
||||
],
|
||||
loader: {
|
||||
".woff2": "file",
|
||||
},
|
||||
});
|
||||
|
||||
function buildDev(config) {
|
||||
return build({
|
||||
...config,
|
||||
sourcemap: true,
|
||||
define: {
|
||||
"import.meta.env": JSON.stringify(ENV_VARS.development),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function buildProd(config) {
|
||||
return build({
|
||||
...config,
|
||||
minify: true,
|
||||
define: {
|
||||
"import.meta.env": JSON.stringify(ENV_VARS.production),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
const createESMRawBuild = async () => {
|
||||
const chunksConfig = {
|
||||
entryPoints: ["index.tsx", "**/*.chunk.ts"],
|
||||
entryNames: "[name]",
|
||||
};
|
||||
|
||||
// development unminified build with source maps
|
||||
await buildDev({
|
||||
...getConfig("dist/dev"),
|
||||
...chunksConfig,
|
||||
});
|
||||
|
||||
// production minified buld without sourcemaps
|
||||
await buildProd({
|
||||
...getConfig("dist/prod"),
|
||||
...chunksConfig,
|
||||
});
|
||||
};
|
||||
|
||||
(async () => {
|
||||
await createESMRawBuild();
|
||||
})();
|
||||
Reference in New Issue
Block a user