87 lines
2.3 KiB
JavaScript
Executable File
87 lines
2.3 KiB
JavaScript
Executable File
#!/usr/bin/env -S node -r esbin
|
|
import fs from "fs"
|
|
import { resolve } from "path"
|
|
import * as esbuild from "esbuild"
|
|
import { file } from "./utils"
|
|
import { getDefaultTarget } from "./plugins/esbuild-browserslist"
|
|
|
|
const outdir = resolve(__dirname, "../dist/vendor/sass")
|
|
fs.rmSync(outdir, { recursive: true, force: true })
|
|
|
|
const prefix = `
|
|
let window = globalThis;
|
|
|
|
let process = {
|
|
env: {},
|
|
stdout: {
|
|
write: console.log
|
|
},
|
|
stderr: {
|
|
write: console.error,
|
|
},
|
|
};
|
|
`
|
|
|
|
const sass = fs.readFileSync(
|
|
resolve(__dirname, "../node_modules", "sass/sass.dart.js"),
|
|
"utf-8",
|
|
)
|
|
|
|
const replaced: string = sass
|
|
.replaceAll(/typeof Buffer/g, '"undefined"')
|
|
.replaceAll("process.stdout.isTTY", "undefined")
|
|
.replaceAll("self.location", "window.location")
|
|
.replace(/require\("(chokidar|readline|fs|util)"\)/g, "{}")
|
|
.replace(
|
|
/(accept|accept\$1|add|call|toString|parse|write|scope\$1|parse[A-Z]\w+)\$(\d): function\(/g,
|
|
"$1$$$2(",
|
|
)
|
|
.replace(/\w+\.util\.inspect\.custom/g, "Symbol()")
|
|
.replace(/(\$eq|toString|get\$\w+|join\$0): function\(/g, "$1(")
|
|
.replace("if (dartNodeIsActuallyNode) {", "if (false) {")
|
|
// CSP
|
|
.replaceAll(
|
|
/new\s+self\.Function\(\s*("[^"\\]*(?:\\.[^"\\]*)*")\s*,\s*("[^"\\]*(?:\\.[^"\\]*)*")\s*\)/g,
|
|
(_, $1, $2) => `((${JSON.parse($1)}) => { ${JSON.parse($2)} })`,
|
|
)
|
|
.replaceAll(
|
|
/new\s+self\.Function\(\s*("[^"\\]*(?:\\.[^"\\]*)*")\s*,\s*('[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g,
|
|
(_, $1, $2) =>
|
|
`((${JSON.parse($1)}) => { ${JSON.parse(
|
|
'"' + $2.slice(1, -1).replaceAll('"', '\\"') + '"',
|
|
)} })`,
|
|
)
|
|
.trim()
|
|
|
|
const temporary = file.js(prefix + replaced)
|
|
|
|
const entry = file.js(/* js */ `
|
|
import "${temporary.path}";
|
|
const sass = globalThis._cliPkgExports.pop();
|
|
sass.load({});
|
|
|
|
export default sass;
|
|
`)
|
|
|
|
try {
|
|
esbuild.buildSync({
|
|
entryPoints: [entry.path],
|
|
outfile: resolve(outdir, "index.js"),
|
|
bundle: true,
|
|
minify: true,
|
|
format: "esm",
|
|
sourcemap: "external",
|
|
target: getDefaultTarget(),
|
|
external: ["fs", "chokidar", "readline"],
|
|
banner: { js: "/* eslint-disable */" },
|
|
legalComments: "linked",
|
|
define: {
|
|
"process.env.NODE_ENV": '"production"',
|
|
"process.env.NODE_DEBUG": "undefined",
|
|
},
|
|
})
|
|
} finally {
|
|
temporary.rm()
|
|
entry.rm()
|
|
}
|