You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
4.7 KiB
TypeScript

import { getLogger } from "https://deno.land/std@0.146.0/log/mod.ts";
import { Args } from "https://deno.land/std@0.146.0/flags/mod.ts";
import { join, resolve } from "https://deno.land/std@0.146.0/path/mod.ts";
import {
checkExists,
getAppConfigDirectory,
getAppConfigFile,
getAppLogFile,
} from "./utils.ts";
import { setup } from "./setup.ts";
import { error, setupLogs } from "./log.ts";
import { bootstrap } from "./bootstrap.ts";
import { render } from "./render.ts";
const appName = "readme-manager";
/**
* The main readme-manager module.
*
* @param {Args} args The parsed Deno.args.
* @param {boolean} cliMode
*/
export const manager = async (args: Args, cliMode?: boolean) => {
const appLogFile = getAppLogFile(appName);
await setupLogs(appLogFile);
const logger = getLogger(args.debug && "debug");
if (args.debug) {
logger.debug(`Logs will be appended to ${appLogFile}`);
}
const errorHandler = error(appLogFile, cliMode, args.debug);
const appConfigFile = getAppConfigFile(appName, errorHandler);
logger.info(`App config file will be ${appConfigFile}`);
const appConfigDirectory = getAppConfigDirectory(appName, errorHandler);
logger.info(`App config file will be ${appConfigDirectory}`);
if (args.setup) {
return setup(
appName,
appConfigFile,
logger,
errorHandler,
appConfigDirectory,
cliMode,
);
}
if (args.bootstrap) {
return bootstrap(appConfigDirectory, errorHandler);
}
let templates = args?.templates;
let match = args?.match;
if (!args.match || !args.templates) {
logger.debug("Checking configuration file.");
let appConfigFileContent;
if (!(await checkExists(appConfigFile, errorHandler))) {
appConfigFileContent = await setup(
appName,
appConfigFile,
logger,
errorHandler,
appConfigDirectory,
cliMode,
);
}
if (!appConfigFileContent) {
try {
appConfigFileContent = await Deno.readTextFile(appConfigFile);
} catch (e) {
errorHandler(`Something went wrong reading ${appConfigFile}.`, e);
}
if (!appConfigFileContent) {
appConfigFileContent = await setup(
appName,
appConfigFile,
logger,
errorHandler,
appConfigDirectory,
cliMode,
);
}
try {
appConfigFileContent = JSON.parse(appConfigFileContent);
} catch (e) {
errorHandler(
`Something went wrong parsing the json in ${appConfigFile}.`,
e,
);
}
if (
!appConfigFileContent ||
typeof appConfigFileContent !== "object" ||
Object.keys(appConfigFileContent).length === 0
) {
appConfigFileContent = JSON.parse(
await setup(
appName,
appConfigFile,
logger,
errorHandler,
appConfigDirectory,
cliMode,
),
);
}
match = appConfigFileContent.match;
if (args.match) match = args.match;
templates = appConfigFileContent.templates;
if (args.templates) templates = appConfigFileContent.templates;
}
}
let targetPath = args?._?.[0];
if (args._.length === 0) targetPath = Deno.cwd();
targetPath = `${targetPath}`; // cast to string
try {
for await (const file of Deno.readDir(targetPath)) {
logger.debug(`Checking ${file.name} in ${targetPath}`);
if (file.isFile && file.name === match) {
console.log(`Matched ${file.name}.`);
try {
const readme = await render(
resolve(join(targetPath, file.name)),
resolve(targetPath),
await Deno.readTextFile(resolve(join(targetPath, file.name))),
templates,
errorHandler,
);
if (readme) {
await Deno.writeTextFile(
resolve(join(targetPath, "README.md")),
readme,
);
} else {
errorHandler(
`Something went wrong, ${
resolve(join(targetPath, file.name))
} generated an empty render output.`,
);
}
} catch (e) {
errorHandler(
`Something went wrong rendering ${
resolve(
join(targetPath, "README.md"),
)
}`,
e,
);
}
console.log(`Generated ${join(targetPath, "README.md")}.`);
}
}
} catch (e) {
if (e instanceof Deno.errors.PermissionDenied) {
logger.error("PermissionDenied on a directory.");
logger.error(e.message);
} else {
errorHandler(
"Something went wrong reading the direcotries of the target path.",
e,
);
}
}
};