derw
Version:
An Elm-inspired language that transpiles to TypeScript
110 lines (107 loc) • 3.95 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.init = void 0;
const baner_1 = require("@eeue56/baner");
const promises_1 = require("fs/promises");
const path_1 = __importDefault(require("path"));
const package_1 = require("../package");
const utils_1 = require("./utils");
const initParser = (0, baner_1.parser)([
(0, baner_1.longFlag)("dir", "name of a directory to use as package name e.g stdlib. Defaults to current directory's name", (0, baner_1.string)()),
(0, baner_1.bothFlag)("h", "help", "This help text", (0, baner_1.empty)()),
]);
function showInfoHelp() {
console.log("Initialize a directory as a Derw project.");
console.log((0, baner_1.help)(initParser));
}
async function copyTSconfig(dir) {
const tsconfig = {
compilerOptions: {
target: "es2017",
module: "commonjs",
declaration: true,
outDir: "./build/",
rootDirs: ["src"],
strict: true,
moduleResolution: "node",
types: ["node"],
esModuleInterop: true,
skipLibCheck: true,
forceConsistentCasingInFileNames: true,
},
include: ["src/**/*"],
exclude: ["node_modules/**"],
};
if (await (0, utils_1.fileExists)(path_1.default.join(dir, "tsconfig.json"))) {
console.log("Already got a tsconfig!");
process.exit(1);
}
await (0, promises_1.writeFile)(path_1.default.join(dir, "tsconfig.json"), JSON.stringify(tsconfig, null, 4));
}
async function appendGitIgnore(dir) {
let gitIgnore = "";
const gitIgnorePath = path_1.default.join(dir, ".gitignore");
try {
gitIgnore = await (await (0, promises_1.readFile)(gitIgnorePath)).toString();
}
catch (e) { }
gitIgnore =
gitIgnore +
`
# derw
derw-packages/
src/**/*.ts
`;
await (0, promises_1.writeFile)(gitIgnorePath, gitIgnore);
}
async function appendGitAttributes(dir) {
let gitAttributes = "";
const gitAttributesPath = path_1.default.join(dir, ".gitattributes");
try {
gitAttributes = await (await (0, promises_1.readFile)(gitAttributesPath)).toString();
}
catch (e) { }
gitAttributes =
gitAttributes +
`
*.derw linguist-language=Elm
*.derw gitlab-language=elm
`.trim();
await (0, promises_1.writeFile)(gitAttributesPath, gitAttributes);
}
async function init(isInPackageDirectory, argv) {
const program = (0, baner_1.parse)(initParser, argv);
if (program.flags["h/help"].isPresent) {
showInfoHelp();
return;
}
const errors = (0, baner_1.allErrors)(program);
if (errors.length > 0) {
console.log("Errors:");
console.log(errors.join("\n"));
process.exit(1);
}
const dir = program.flags.dir.isPresent && program.flags.dir.arguments.kind === "Ok"
? program.flags.dir.arguments.value
: process.cwd();
const packageName = path_1.default.basename(dir);
const package_ = (0, package_1.Package)(packageName, [], []);
const isAlreadyAPackage = await (0, utils_1.fileExists)(path_1.default.join(dir, "derw-package.json"));
if (isAlreadyAPackage) {
console.log("Package already initialized!");
process.exit(-1);
}
await (0, promises_1.writeFile)(path_1.default.join(dir, "derw-package.json"), (0, package_1.exportPackage)(package_));
await copyTSconfig(dir);
await appendGitIgnore(dir);
await appendGitAttributes(dir);
await (0, utils_1.ensureDirectoryExists)(path_1.default.join(dir, "src"));
console.log("Project initialized!");
console.log("Put your files in `src`");
console.log("Compile your project via `derw compile`");
console.log("Run tests via `derw test`");
}
exports.init = init;