derw
Version:
An Elm-inspired language that transpiles to TypeScript
183 lines (182 loc) • 8.05 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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.repl = void 0;
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) {
var _a, e_1, _b, _c;
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) {
var _a;
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 (_a = filename, Promise.resolve().then(() => __importStar(require(_a))));
}
let linesAddedToCurrentBufferSinceLastParsing = [];
try {
for (var _d = true, rl_1 = __asyncValues(rl), rl_1_1; rl_1_1 = await rl_1.next(), _a = rl_1_1.done, !_a;) {
_c = rl_1_1.value;
_d = false;
try {
const line = _c;
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 (_a = filename, Promise.resolve().then(() => __importStar(require(_a))));
console.log(currentlyImportedModule["_cli"]);
}
else {
linesAddedToCurrentBufferSinceLastParsing.push(line.split("\t").join(" "));
}
rl.prompt();
}
finally {
_d = true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (!_d && !_a && (_b = rl_1.return)) await _b.call(rl_1);
}
finally { if (e_1) throw e_1.error; }
}
}
exports.repl = repl;