Spaces:
Sleeping
Sleeping
File size: 3,098 Bytes
6e52333 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | 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();
})();
|