esbuild-yaml
Version:
An esbuild plugin, that allows imports of YAML files
66 lines (62 loc) • 2.13 kB
JavaScript
import { readFile } from 'node:fs/promises';
import path from 'node:path';
import { parseAllDocuments, parse } from 'yaml';
// src/index.ts
function YAMLPlugin(options = {}) {
const type = options.type || "single";
const parserOptions = options.parserOptions || {};
return {
name: "yaml",
setup(build) {
build.onResolve({ filter: /\.ya?ml$/ }, (args) => {
if (args.resolveDir === "") return;
return {
path: path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path),
namespace: "yaml"
};
});
build.onLoad({ filter: /\.ya?ml$/, namespace: "yaml" }, async (args) => {
const yamlContent = await readFile(args.path, "utf8");
let parsed = {};
if (type === "multi") {
parsed = parseAllDocuments(yamlContent, parserOptions).map((doc) => doc.toJSON());
} else {
parsed = parse(yamlContent, parserOptions);
}
let content = parsed;
if (options.transform != null && typeof options.transform === "function") {
const transformed = options.transform(content, args.path);
if (transformed != null) {
content = transformed;
}
}
const code = `var data = ${JSON.stringify(content, null, 2)};
`;
return {
loader: "js",
contents: `${code}
export default data;`
};
});
build.onResolve({ filter: /\.ya?ml\?raw$/ }, (args) => {
if (args.resolveDir === "") return;
if (args.path.endsWith("?raw")) {
args.path = args.path.slice(0, -4);
}
return {
path: path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path),
namespace: "yaml-raw"
};
});
build.onLoad({ filter: /\.ya?ml$/, namespace: "yaml-raw" }, async (args) => {
const yamlContent = await readFile(args.path, "utf8");
return {
loader: "text",
contents: yamlContent
};
});
}
};
}
var index_default = YAMLPlugin;
export { YAMLPlugin, index_default as default };