derw
Version:
An Elm-inspired language that transpiles to TypeScript
272 lines (271 loc) • 9.28 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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateExportBlock = exports.generateImportBlock = exports.flattenLeftPipe = exports.generateListDestructurePart = exports.generateListRange = exports.generateFormatStringValue = exports.generateStringValue = exports.generateValue = void 0;
const Utils_1 = require("../Utils");
const List = __importStar(require("../stdlib/List"));
function FunctionCall(args) {
return Object.assign({ kind: "FunctionCall" }, args);
}
function LambdaCall(args) {
return Object.assign({ kind: "LambdaCall" }, args);
}
function generateValue(value) {
return value.body;
}
exports.generateValue = generateValue;
function generateStringValue(string) {
return `"${string.body}"`;
}
exports.generateStringValue = generateStringValue;
function generateFormatStringValue(string) {
return "`" + string.body + "`";
}
exports.generateFormatStringValue = generateFormatStringValue;
function generateListRange(list) {
const gap = `${list.end.body} - ${list.start.body} + 1`;
return `Array.from({ length: ${gap} }, (_ReservedX, _ReservedI) => _ReservedI + ${list.start.body})`;
}
exports.generateListRange = generateListRange;
function generateListDestructurePart(part) {
switch (part.kind) {
case "EmptyList": {
return "[]";
}
case "StringValue": {
const { body } = part;
return body;
}
case "FormatStringValue": {
const { body } = part;
return body;
}
case "Value": {
const { body } = part;
return body;
}
case "Destructure": {
const { constructor, pattern } = part;
const generatedPattern = pattern ? ` ${pattern}` : "";
return `${constructor}${pattern}`;
}
}
}
exports.generateListDestructurePart = generateListDestructurePart;
function addArgsToModuleReference(moduleReference, newArgs) {
switch (moduleReference.value.kind) {
case "FunctionCall": {
const { args, name } = moduleReference.value;
return Object.assign(Object.assign({}, moduleReference), { value: FunctionCall({
name,
args: List.append(args, newArgs)
}) });
}
case "Value": {
const { body } = moduleReference.value;
return Object.assign(Object.assign({}, moduleReference), { value: FunctionCall({
name: body,
args: newArgs
}) });
}
default: {
return moduleReference;
}
}
}
function flattenLeftPipe(leftPipe) {
const left = leftPipe.left;
const right = leftPipe.right;
switch (right.kind) {
case "FunctionCall": {
const { name, args } = right;
return FunctionCall({
name,
args: List.append(args, [left])
});
}
case "Value": {
const { body } = right;
return FunctionCall({
name: body,
args: [left]
});
}
case "ModuleReference": {
return addArgsToModuleReference(right, [left]);
}
case "Lambda": {
return LambdaCall({
lambda: right,
args: [left]
});
}
case "LeftPipe": {
switch (right.left.kind) {
case "FunctionCall": {
const { args, name } = right.left;
const fn = FunctionCall({
name,
args: List.append(args, [left])
});
return flattenLeftPipe({
kind: "LeftPipe",
left: fn,
right: right.right
});
}
case "Value": {
const { body } = right.left;
const fn = FunctionCall({
name: body,
args: [left]
});
return flattenLeftPipe({
kind: "LeftPipe",
left: fn,
right: right.right
});
}
case "ModuleReference": {
const fn = addArgsToModuleReference(right.left, [left]);
return flattenLeftPipe({
kind: "LeftPipe",
left: fn,
right: right.right
});
}
case "Lambda": {
const fn = LambdaCall({
lambda: right.left,
args: [left]
});
return flattenLeftPipe({
kind: "LeftPipe",
left: fn,
right: right.right
});
}
case "LeftPipe": {
return right;
}
default: {
return right.left;
}
}
;
}
}
}
exports.flattenLeftPipe = flattenLeftPipe;
function generateModule(module) {
if (module.namespace === "Relative") {
const withoutQuotes = module.name.slice(1, -1);
const name = (function () {
switch (module.alias.kind) {
case "Just": {
const { value } = module.alias;
return value;
}
case "Nothing": {
return (0, Utils_1.getNameFromPath)(withoutQuotes);
}
}
})();
const filteredExposing = (function () {
switch (module.alias.kind) {
case "Just": {
const { value } = module.alias;
return List.filter(function (expose) {
return expose !== value;
}, module.exposing);
}
case "Nothing": {
return module.exposing;
}
}
})();
const exposed = `import { ${filteredExposing.join(", ")} } from ${module.name};`;
if (module.exposing.length === 0) {
return `import * as ${name} from ${module.name};`;
}
else {
switch (module.alias.kind) {
case "Just": {
return `import * as ${name} from ${module.name};\n${exposed}`;
}
case "Nothing": {
return exposed;
}
}
;
}
;
}
else {
const name = (function () {
switch (module.alias.kind) {
case "Just": {
const { value } = module.alias;
return value;
}
case "Nothing": {
return module.name;
}
}
})();
const exposed = `import { ${module.exposing.join(", ")} } from "${module.name}";`;
if (module.exposing.length === 0) {
return `import * as ${name} from "${module.name}";`;
}
else {
switch (module.alias.kind) {
case "Just": {
return `import * as ${name} from "${module.name}";\n${exposed}`;
}
case "Nothing": {
return exposed;
}
}
;
}
;
}
}
function generateImportBlock(imports) {
return (function (y) {
return y.join("\n");
})(List.map(generateModule, List.filter(function (module) {
return module.name !== "globalThis";
}, imports.modules)));
}
exports.generateImportBlock = generateImportBlock;
function generateExportBlock(exports) {
return (function (x) {
return x.join("\n");
})(List.map(function (name) {
return `export { ${name} };`;
}, exports.names));
}
exports.generateExportBlock = generateExportBlock;