prettier-plugin-imports
Version:
A prettier plugins to sort imports in provided RegEx order
65 lines (59 loc) • 2.01 kB
text/typescript
import type { ParserPlugin, ParserPluginWithOptions } from '@babel/parser';
/**
* Returns a list of babel parser plugin names
*
* @param importOrderParserPlugins Array of experimental babel parser plugins
* @returns List of parser plugins to be passed to babel parser
*/
export const getExperimentalParserPlugins = (
importOrderParserPlugins: string[],
): ParserPlugin[] => {
return importOrderParserPlugins.map((pluginNameOrJson) => {
// ParserPlugin can be either a string or and array of [name: string, options: object]
// in prettier options the array will be sent in a JSON string
const isParserPluginWithOptions = pluginNameOrJson.startsWith('[');
let plugin: ParserPlugin;
if (isParserPluginWithOptions) {
try {
plugin = JSON.parse(pluginNameOrJson) as ParserPluginWithOptions;
} catch (e) {
throw Error(
'Invalid JSON in importOrderParserPlugins: ' + pluginNameOrJson,
);
}
} else {
plugin = pluginNameOrJson as ParserPlugin;
}
return plugin;
});
};
/**
* Checks whether a specified plugin is included in importOrderParserPlugins.
* More fancy than just a `.includes()` because importOrderParserPlugins can
* contain plugins with configuration
*
* @param importOrderParserPlugins Array of experimental babel parser plugins
* @returns True if the plugin is in the list
*/
export const hasPlugin = (
importOrderParserPlugins: string[],
pluginName: string,
): boolean => {
for (const pluginNameOrJson of importOrderParserPlugins) {
const isParserPluginWithOptions = pluginNameOrJson.startsWith('[');
let plugin;
if (isParserPluginWithOptions) {
try {
plugin = JSON.parse(pluginNameOrJson)[0];
} catch (e) {
throw Error(
'Invalid JSON in importOrderParserPlugins: ' + pluginNameOrJson,
);
}
} else {
plugin = pluginNameOrJson as ParserPlugin;
}
if (plugin === pluginName) return true;
}
return false;
};