89 lines
4.0 KiB
JavaScript
89 lines
4.0 KiB
JavaScript
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
|
|
import { execSync } from "child_process";
|
|
import * as fs from "node:fs";
|
|
import * as path from "node:path";
|
|
import { bundle as bundleCss, composeVisitors } from "lightningcss";
|
|
|
|
import { createRequire } from "node:module";
|
|
|
|
const INHERIT = {
|
|
stdio: "inherit",
|
|
stderr: "inherit",
|
|
};
|
|
|
|
export function get_host() {
|
|
return /host\: (.+?)$/gm.exec(execSync(`rustc -vV`).toString())[1];
|
|
}
|
|
|
|
export const resolveNPM = (url) => ({
|
|
read(filePath) {
|
|
if (filePath.startsWith("http")) {
|
|
return `@import url("${filePath}");`;
|
|
}
|
|
|
|
return fs.readFileSync(filePath, "utf8");
|
|
},
|
|
resolve(specifier, from) {
|
|
if (specifier.startsWith("http")) {
|
|
return { external: specifier };
|
|
}
|
|
|
|
const _require = createRequire(url);
|
|
|
|
if (specifier.startsWith(".") || specifier.startsWith("/")) {
|
|
return path.resolve(path.dirname(from), specifier);
|
|
}
|
|
|
|
return _require.resolve(specifier);
|
|
},
|
|
});
|
|
|
|
// Inline url() asset references as data URIs.
|
|
export function inlineUrlVisitor(fromFile) {
|
|
const dir = path.dirname(fromFile);
|
|
return composeVisitors([
|
|
{
|
|
Url(url) {
|
|
const ext = path.extname(url.url).toLowerCase();
|
|
if (![".svg", ".png", ".gif"].includes(ext)) {
|
|
return;
|
|
}
|
|
|
|
const resolved = path.resolve(dir, url.url);
|
|
if (!fs.existsSync(resolved)) {
|
|
return;
|
|
}
|
|
|
|
const content = fs.readFileSync(resolved);
|
|
const mime =
|
|
ext === ".svg"
|
|
? "image/svg+xml"
|
|
: ext === ".png"
|
|
? "image/png"
|
|
: "image/gif";
|
|
|
|
const new_content = content
|
|
.toString("base64")
|
|
.split("\n")
|
|
.map((x) => x.trim())
|
|
.join("");
|
|
return {
|
|
url: `data:${mime};base64,${new_content}`,
|
|
loc: url.loc,
|
|
};
|
|
},
|
|
},
|
|
]);
|
|
}
|