-
Toufic Batache authoredToufic Batache authored
plugin-yaml-patched.ts 2.07 KiB
/// Code taken from https://github.com/rollup/plugins/blob/master/packages/yaml/src/index.js
import {
createFilter,
makeLegalIdentifier,
type FilterPattern,
} from "@rollup/pluginutils"
import YAML, { type LoadOptions } from "js-yaml"
import toSource from "tosource"
import type { PluginOption } from "vite"
interface Options extends LoadOptions {
documentMode?: "multi" | "single"
exclude?: FilterPattern | undefined
include?: FilterPattern | undefined
transform?: ((data: unknown, id: string) => unknown) | null
}
const defaults: Options = {
documentMode: "single",
transform: null,
}
const ext = /\.ya?ml$/
export default function yaml(opts: Options = {}): PluginOption {
const options = Object.assign({}, defaults, opts)
const { documentMode } = options
const filter = createFilter(options.include, options.exclude)
let loadMethod: (str: string, opts?: LoadOptions) => unknown
if (documentMode === "single") {
loadMethod = YAML.load
} else if (documentMode === "multi") {
loadMethod = YAML.loadAll as (str: string, opts?: LoadOptions) => unknown
} else {
this.error(
`plugin-yaml → documentMode: '${documentMode}' is not a valid value. Please choose 'single' or 'multi'`,
)
}
return {
name: "yaml",
transform(content: string, id: string) {
if (!ext.test(id)) return null
if (!filter(id)) return null
// The pach is here: it adds `options` argument.
let data = loadMethod(content, options)
if (typeof options.transform === "function") {
const result = options.transform(data, id)
// eslint-disable-next-line no-undefined
if (result !== undefined) {
data = result
}
}
const keys = Object.keys(data).filter(
(key) => key === makeLegalIdentifier(key),
)
const code = `var data = ${toSource(data)};\n\n`
const exports = ["export default data;"]
.concat(keys.map((key) => `export var ${key} = data.${key};`))
.join("\n")
return {
code: code + exports,
map: { mappings: "" },
}
},
}
}