derw
Version:
An Elm-inspired language that transpiles to TypeScript
117 lines (109 loc) • 3.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.template = void 0;
const baner_1 = require("@eeue56/baner");
const promises_1 = require("fs/promises");
const install_1 = require("./install");
const utils_1 = require("./utils");
const validTemplates = ["web", "html"];
const templateParser = (0, baner_1.parser)([
(0, baner_1.longFlag)("path", "path of Derw file to create", (0, baner_1.string)()),
(0, baner_1.longFlag)("template", "Template to use", (0, baner_1.oneOf)(validTemplates)),
(0, baner_1.bothFlag)("h", "help", "This help text", (0, baner_1.empty)()),
]);
function showInfoHelp() {
console.log("Generate a Derw file from a template.");
console.log("Also installs required packages.");
console.log((0, baner_1.help)(templateParser));
}
async function copyWebTemplate(path) {
const template = `
import "../derw-packages/derw-lang/html/src/Html" exposing ( HtmlNode, RunningProgram, div, text, program, attribute, class_ )
type alias Model = {
}
initialModel: Model
initialModel =
{ }
type Msg =
Noop
update: Msg -> Model -> (Msg -> void) -> Model
update msg model send =
case msg of
Noop ->
model
view: Model -> HtmlNode Msg
view model =
div [ ] [ ] [ text "Hello" ]
root: any
root =
document.getElementById "root"
main: RunningProgram Model Msg
main =
program {
initialModel: initialModel,
view: view,
update: update,
root: root
}
`.trim() + "\n";
if (await (0, utils_1.fileExists)(path)) {
console.log("Already a file!");
process.exit(1);
}
await (0, promises_1.writeFile)(path, template);
}
async function copyHtmlTemplate(path) {
const template = `
<!doctype html>
<html>
<body>
<div id="root"></div>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
`.trim() + "\n";
if (await (0, utils_1.fileExists)(path)) {
console.log("Already a file!");
process.exit(1);
}
await (0, promises_1.writeFile)(path, template);
}
async function template(isInPackageDirectory, argv) {
const program = (0, baner_1.parse)(templateParser, 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 path = program.flags.path.isPresent &&
program.flags.path.arguments.kind === "Ok" &&
program.flags.path.arguments.value;
const template = program.flags.template.isPresent &&
program.flags.template.arguments.kind === "Ok" &&
program.flags.template.arguments.value;
if (!path) {
console.log("You must provide a path via --path");
return;
}
if (template === "web") {
await copyWebTemplate(path);
await (0, install_1.install)(isInPackageDirectory, [
"--name",
"derw-lang/html",
"--version",
"main",
]);
}
else if (template === "html") {
await copyHtmlTemplate(path);
}
else {
console.log(`Template ${template} is unknown. Try one of: ${validTemplates.join(", ")}`);
}
}
exports.template = template;