UNPKG

sucrase

Version:

Super-fast alternative to Babel for when you can target modern JS runtimes

45 lines (44 loc) 1.71 kB
import Parser, { plugins } from "./parser"; import "./tokenizer/context"; import flowPlugin from "./plugins/flow"; import jsxPlugin from "./plugins/jsx"; import typescriptPlugin from "./plugins/typescript"; plugins.flow = flowPlugin; plugins.jsx = jsxPlugin; plugins.typescript = typescriptPlugin; export function parse(input, options) { return getParser(options, input).parse(); } function getParser(options, input) { const Cls = options && options.plugins ? getParserClass(options.plugins) : Parser; return new Cls(options || null, input); } const parserClassCache = {}; /** Get a Parser class with plugins applied. */ function getParserClass(pluginsFromOptions) { // Filter out just the plugins that have an actual mixin associated with them. let pluginList = pluginsFromOptions.filter((p) => p === "flow" || p === "jsx" || p === "typescript"); if (pluginList.indexOf("flow") >= 0) { // ensure flow plugin loads last pluginList = pluginList.filter((plugin) => plugin !== "flow"); pluginList.push("flow"); } if (pluginList.indexOf("flow") >= 0 && pluginList.indexOf("typescript") >= 0) { throw new Error("Cannot combine flow and typescript plugins."); } if (pluginList.indexOf("typescript") >= 0) { // ensure typescript plugin loads last pluginList = pluginList.filter((plugin) => plugin !== "typescript"); pluginList.push("typescript"); } const key = pluginList.join("/"); let cls = parserClassCache[key]; if (!cls) { cls = Parser; for (const plugin of pluginList) { cls = plugins[plugin](cls); } parserClassCache[key] = cls; } return cls; }