denoify
Version:
For NPM module authors that would like to support Deno but do not want to write and maintain a port.
75 lines (70 loc) • 2.06 kB
text/typescript
import config from ".";
export type ConfigFileType =
| {
type: "absent";
}
| {
type: "js" | "json";
configFileBasename: string;
configFileRawContent: string;
};
function tryParseAsJson(content: string) {
try {
return JSON.parse(content);
} catch {
return undefined;
}
}
function parseConfig({
configFileBasename,
configFileRawContent
}: {
configFileBasename: string | undefined;
configFileRawContent: string | undefined;
}): ConfigFileType {
if (
configFileBasename === undefined ||
configFileRawContent === undefined ||
!config.supportedConfigFile.find(configFile => configFileBasename.endsWith(configFile))
) {
return {
type: "absent"
};
}
if (configFileBasename.endsWith(".json") && tryParseAsJson(configFileRawContent)) {
return {
type: "json",
configFileBasename,
configFileRawContent
};
}
if (configFileBasename.endsWith(".js")) {
return {
type: "js",
configFileBasename,
configFileRawContent
};
}
return {
type: "absent"
};
}
export default function getFileTypeAndContent({
getConfigFileRawContent
}: {
getConfigFileRawContent: (configFileBasename: string) => Promise<string | undefined>;
}) {
return config.supportedConfigFile.reduce(async (configFileType, configFileBasename) => {
if ((await configFileType).type !== "absent") {
return configFileType;
}
const configFileRawContent = await getConfigFileRawContent(configFileBasename);
if (!configFileRawContent || (configFileBasename === config.packageJson && !tryParseAsJson(configFileRawContent)?.denoify)) {
return configFileType;
}
return parseConfig({
configFileBasename,
configFileRawContent
});
}, Promise.resolve({ type: "absent" }) as Promise<ConfigFileType>);
}