derw
Version:
An Elm-inspired language that transpiles to TypeScript
165 lines (164 loc) • 6.6 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.repl = repl;
const promises_1 = require("fs/promises");
const process_1 = require("process");
const readline = __importStar(require("readline"));
const Ts_1 = require("../generators/Ts");
const parser_1 = require("../parser");
const Tokens_1 = require("../Tokens");
const types_1 = require("../types");
const utils_1 = require("./utils");
function exportEverything(module) {
const exposing = [];
for (const block of module.body) {
switch (block.kind) {
case "Const":
case "Function": {
exposing.push(block.name);
break;
}
case "TypeAlias":
case "UnionType": {
exposing.push(block.type.name);
break;
}
}
}
module.body.push((0, types_1.Export)(exposing));
return module;
}
async function repl(isInPackageDirectory, argv) {
let currentBuffer = [];
function completer(text) {
const tokens = (0, Tokens_1.tokenize)(currentBuffer.join("\n"));
const identifiers = tokens.filter((token) => token.kind === "IdentifierToken");
return [
[
...new Set(identifiers.map((token) => token.body)),
],
text,
];
}
const rl = readline.createInterface({
input: process_1.stdin,
output: process_1.stdout,
completer,
tabSize: 4,
});
rl.prompt();
rl.on("close", () => { });
let currentlyImportedModule = null;
let module = null;
await (0, utils_1.ensureDirectoryExists)("derw-packages/.cli/");
async function run(currentBuffer) {
module = (0, parser_1.parseWithContext)([...currentBuffer].join("\n"), "Main");
module = exportEverything(module);
const generated = (0, Ts_1.generateTypescript)((0, types_1.contextModuleToModule)(module));
const fileTimestamp = new Date().getTime();
const filename = `${process.cwd()}/derw-packages/.cli/${fileTimestamp}.ts`;
await (0, promises_1.writeFile)(filename, generated);
currentlyImportedModule = await Promise.resolve(`${filename}`).then(s => __importStar(require(s)));
}
let linesAddedToCurrentBufferSinceLastParsing = [];
for await (const line of rl) {
if (line.trim() === "") {
module = (0, parser_1.parseWithContext)([
...currentBuffer,
"",
...linesAddedToCurrentBufferSinceLastParsing,
].join("\n"), "Main");
module = (0, parser_1.addTypeErrors)(module, []);
if (module.errors.length > 0) {
console.log(`Errors while parsing: ${module.errors.join("\n")}`);
linesAddedToCurrentBufferSinceLastParsing = [];
}
else {
for (const newLine of linesAddedToCurrentBufferSinceLastParsing) {
currentBuffer.push(newLine);
}
linesAddedToCurrentBufferSinceLastParsing = [];
currentBuffer.push("");
console.log("Parsed successfully");
}
}
else if (line.trim() === ":run") {
await run(currentBuffer);
}
else if (line.startsWith(":show")) {
const name = line.split(" ")[1].trim();
await run(currentBuffer);
1;
if (currentlyImportedModule[name] === undefined) {
console.log(`Couldn't find ${name} in current scope.`);
}
else {
console.log(currentlyImportedModule[name]);
}
}
else if (line.trim() === ":help") {
console.log("Enter some code, followed by a blank newline.");
console.log("Run the current namespace via :run");
console.log("And check the values of code via :show <name>");
console.log("Or evaluate a constant or function with :eval <function> <args>");
}
else if (line.startsWith(":eval")) {
const expression = `
_cli: any
_cli = ${line.split(" ").slice(1).join(" ")}
`;
module = (0, parser_1.parseWithContext)([...currentBuffer, "", expression].join("\n"), "Main");
module = exportEverything(module);
if (module.errors.length > 0) {
console.log(`Errors while parsing: ${module.errors.join("\n")}`);
continue;
}
else {
console.log("Parsed successfully");
}
const generated = (0, Ts_1.generateTypescript)((0, types_1.contextModuleToModule)(module));
const fileTimestamp = new Date().getTime();
const filename = `${process.cwd()}/derw-packages/.cli/${fileTimestamp}.ts`;
await (0, promises_1.writeFile)(filename, generated);
currentlyImportedModule = await Promise.resolve(`${filename}`).then(s => __importStar(require(s)));
console.log(currentlyImportedModule["_cli"]);
}
else {
linesAddedToCurrentBufferSinceLastParsing.push(line.split("\t").join(" "));
}
rl.prompt();
}
}