@mistlog/typetype
Version:
A programming language designed for typescript type generation
375 lines (374 loc) • 15.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArrayType = exports.TypeReference = exports.ConstructSignature = exports.CallSignature = exports.TypeObjectProperty = exports.RestType = exports.TypeSpreadProperty = exports.ObjectTypeLiteral = exports.TupleType = exports.VoidType = exports.AnyType = exports.NeverType = exports.BigIntType = exports.NumberType = exports.BooleanTypeLiteral = exports.StringTypeLiteral = exports.StringLiteral = exports.Number = exports.NumberTypeLiteral = exports.TemplateChar = exports.TemplateCharSequence = exports.TemplateExpression = exports.TemplateElement = exports.TemplateTypeLiteral = exports.TypeLiteral = exports.StringType = exports.ObjectType = exports.BasicType = void 0;
const react_peg_1 = require("react-peg");
const common_1 = require("../common");
const identifier_1 = require("./identifier");
const string_1 = require("./string");
const expression_1 = require("../expression");
const function_1 = require("../function");
function BasicType() {
return (react_peg_1.ReactPeg.createChunk("or", null,
react_peg_1.ReactPeg.createChunk(ArrayType, null),
react_peg_1.ReactPeg.createChunk(NeverType, null),
react_peg_1.ReactPeg.createChunk(ObjectType, null),
react_peg_1.ReactPeg.createChunk(AnyType, null),
react_peg_1.ReactPeg.createChunk(VoidType, null),
react_peg_1.ReactPeg.createChunk(NumberType, null),
react_peg_1.ReactPeg.createChunk(BigIntType, null),
react_peg_1.ReactPeg.createChunk(StringType, null),
react_peg_1.ReactPeg.createChunk(TupleType, null),
react_peg_1.ReactPeg.createChunk(TypeLiteral, null)));
}
exports.BasicType = BasicType;
function ObjectType() {
const action = () => {
return {
kind: "ObjectType",
value: "object"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("object")));
}
exports.ObjectType = ObjectType;
function StringType() {
const action = () => {
return {
kind: "StringType",
value: "string"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("string")));
}
exports.StringType = StringType;
function TypeLiteral() {
return (react_peg_1.ReactPeg.createChunk("or", null,
react_peg_1.ReactPeg.createChunk(ObjectTypeLiteral, null),
react_peg_1.ReactPeg.createChunk(NumberTypeLiteral, null),
react_peg_1.ReactPeg.createChunk(StringTypeLiteral, null),
react_peg_1.ReactPeg.createChunk(BooleanTypeLiteral, null),
react_peg_1.ReactPeg.createChunk(TemplateTypeLiteral, null)));
}
exports.TypeLiteral = TypeLiteral;
function TemplateTypeLiteral() {
const action = ({ items }) => {
return {
kind: "TemplateTypeLiteral",
items
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(common_1._, null),
react_peg_1.ReactPeg.createChunk("text", null, "`"),
react_peg_1.ReactPeg.createChunk("repeat", { type: "*", label: "items" },
react_peg_1.ReactPeg.createChunk("or", null,
react_peg_1.ReactPeg.createChunk(TemplateElement, null),
react_peg_1.ReactPeg.createChunk(TemplateExpression, null))),
react_peg_1.ReactPeg.createChunk("text", null, "`"),
react_peg_1.ReactPeg.createChunk(common_1._, null)));
}
exports.TemplateTypeLiteral = TemplateTypeLiteral;
function TemplateElement() {
const action = ({ value }) => {
return {
kind: "TemplateElement",
value
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(TemplateCharSequence, { label: "value" })));
}
exports.TemplateElement = TemplateElement;
function TemplateExpression() {
const action = ({ expression }) => {
return {
kind: "TemplateExpression",
expression
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk("text", null, "$"),
react_peg_1.ReactPeg.createChunk("text", null, `{`),
react_peg_1.ReactPeg.createChunk(common_1._, null),
react_peg_1.ReactPeg.createChunk(expression_1.TypeExpression, { label: "expression" }),
react_peg_1.ReactPeg.createChunk(common_1._, null),
react_peg_1.ReactPeg.createChunk("text", null, `}`)));
}
exports.TemplateExpression = TemplateExpression;
function TemplateCharSequence() {
return (react_peg_1.ReactPeg.createChunk("pattern", { action: ({ chars }) => chars.join("") },
react_peg_1.ReactPeg.createChunk("repeat", { type: "+", label: "chars" },
react_peg_1.ReactPeg.createChunk(TemplateChar, null))));
}
exports.TemplateCharSequence = TemplateCharSequence;
function TemplateChar() {
return (react_peg_1.ReactPeg.createChunk("pattern", { action: ({ char }) => char },
react_peg_1.ReactPeg.createChunk("assert", { type: "without" },
react_peg_1.ReactPeg.createChunk("or", null,
react_peg_1.ReactPeg.createChunk("text", null, "`"),
react_peg_1.ReactPeg.createChunk("text", null, "$"))),
react_peg_1.ReactPeg.createChunk("or", { label: "char" },
react_peg_1.ReactPeg.createChunk("text", null, "\\\\`"),
react_peg_1.ReactPeg.createChunk(string_1.SourceCharacter, { label: "char" }))));
}
exports.TemplateChar = TemplateChar;
function NumberTypeLiteral() {
const action = ({ value }) => {
return {
kind: "NumberTypeLiteral",
value
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(common_1._, null),
react_peg_1.ReactPeg.createChunk(Number, { label: "value" }),
react_peg_1.ReactPeg.createChunk(common_1._, null)));
}
exports.NumberTypeLiteral = NumberTypeLiteral;
function Number() {
const digits = (react_peg_1.ReactPeg.createChunk("repeat", { type: "+" },
react_peg_1.ReactPeg.createChunk("set", null, "0-9")));
const action = ({ globalFunction }) => {
return parseFloat(globalFunction.text());
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
digits,
react_peg_1.ReactPeg.createChunk("opt", null,
react_peg_1.ReactPeg.createChunk("text", null, "."),
digits)));
}
exports.Number = Number;
function StringLiteral() {
const action = ({ value }) => {
return {
kind: "StringLiteral",
value
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(string_1.String, { label: "value" })));
}
exports.StringLiteral = StringLiteral;
function StringTypeLiteral() {
const action = ({ value }) => {
return {
kind: "StringTypeLiteral",
value
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(string_1.String, { label: "value" })));
}
exports.StringTypeLiteral = StringTypeLiteral;
function BooleanTypeLiteral() {
const action = ({ value }) => {
return {
kind: "BooleanTypeLiteral",
value: value === "true" ? true : false
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk("or", { label: "value" },
react_peg_1.ReactPeg.createChunk("text", null, "true"),
react_peg_1.ReactPeg.createChunk("text", null, "false"))));
}
exports.BooleanTypeLiteral = BooleanTypeLiteral;
function NumberType() {
const action = () => {
return {
kind: "NumberType",
value: "number"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("number")));
}
exports.NumberType = NumberType;
function BigIntType() {
const action = () => {
return {
kind: "BigIntType",
value: "bigint"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("bigint")));
}
exports.BigIntType = BigIntType;
function NeverType() {
const action = () => {
return {
kind: "NeverType",
value: "never"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("never")));
}
exports.NeverType = NeverType;
function AnyType() {
const action = () => {
return {
kind: "AnyType",
value: "any"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("any")));
}
exports.AnyType = AnyType;
function VoidType() {
const action = () => {
return {
kind: "VoidType",
value: "void"
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("void")));
}
exports.VoidType = VoidType;
function TupleType() {
const action = ({ items }) => {
return {
kind: "TupleType",
items
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
common_1.Text("["),
react_peg_1.ReactPeg.createChunk(expression_1.TypeExpressionList, { label: "items" }),
common_1.Text("]")));
}
exports.TupleType = TupleType;
function ObjectTypeLiteral() {
const action = ({ head, tail }) => {
return {
kind: "ObjectTypeLiteral",
props: head ? [head, ...tail] : []
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
common_1.Text("{"),
react_peg_1.ReactPeg.createChunk("opt", { label: "head" },
react_peg_1.ReactPeg.createChunk(Member, null)),
react_peg_1.ReactPeg.createChunk("repeat", { type: "*", label: "tail" },
react_peg_1.ReactPeg.createChunk("pattern", { action: ({ member }) => member },
common_1.Text(","),
react_peg_1.ReactPeg.createChunk(Member, { label: "member" }))),
common_1.Text("}")));
}
exports.ObjectTypeLiteral = ObjectTypeLiteral;
function Member() {
return (react_peg_1.ReactPeg.createChunk("or", null,
react_peg_1.ReactPeg.createChunk(TypeObjectProperty, null),
react_peg_1.ReactPeg.createChunk(TypeSpreadProperty, null)));
}
function TypeSpreadProperty() {
const action = ({ prop }) => {
return {
kind: "TypeSpreadProperty",
param: prop.param
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(RestType, { label: "prop" })));
}
exports.TypeSpreadProperty = TypeSpreadProperty;
function RestType() {
const action = ({ param }) => {
return {
kind: "RestType",
param
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(common_1._, null),
common_1.Text("..."),
react_peg_1.ReactPeg.createChunk(expression_1.TypeExpression, { label: "param" }),
react_peg_1.ReactPeg.createChunk(common_1._, null)));
}
exports.RestType = RestType;
function TypeObjectProperty() {
const action = ({ name, value: rawValue, optional, readonly }) => {
const value = rawValue || /** shorthand */ {
kind: "TypeReference",
typeName: Object.assign({}, name)
};
return {
kind: "TypeObjectProperty",
name,
value,
optional: Boolean(optional),
readonly: Boolean(readonly)
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(common_1._, null),
react_peg_1.ReactPeg.createChunk("opt", { label: "readonly" }, common_1.Text("readonly")),
react_peg_1.ReactPeg.createChunk("or", { label: "name" },
react_peg_1.ReactPeg.createChunk(ConstructSignature, null),
react_peg_1.ReactPeg.createChunk(CallSignature, null),
react_peg_1.ReactPeg.createChunk(StringLiteral, null),
react_peg_1.ReactPeg.createChunk(identifier_1.Identifier, null)),
react_peg_1.ReactPeg.createChunk("opt", { label: "optional" }, common_1.Text("?")),
react_peg_1.ReactPeg.createChunk("opt", { label: "value" },
react_peg_1.ReactPeg.createChunk("pattern", { action: ({ expression }) => expression },
common_1.Text(":"),
react_peg_1.ReactPeg.createChunk(expression_1.TypeExpression, { label: "expression" }))),
react_peg_1.ReactPeg.createChunk(common_1._, null)));
}
exports.TypeObjectProperty = TypeObjectProperty;
function CallSignature() {
const action = ({ params }) => {
return {
kind: "CallSignature",
params
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
common_1.Text("("),
react_peg_1.ReactPeg.createChunk(function_1.FunctionTypeParamList, { label: "params" }),
common_1.Text(")")));
}
exports.CallSignature = CallSignature;
function ConstructSignature() {
const action = ({ params }) => {
return {
kind: "ConstructSignature",
params
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
common_1.Text("new"),
common_1.Text("("),
react_peg_1.ReactPeg.createChunk(function_1.FunctionTypeParamList, { label: "params" }),
common_1.Text(")")));
}
exports.ConstructSignature = ConstructSignature;
function TypeReference() {
const action = ({ typeName }) => {
return {
kind: "TypeReference",
typeName
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(identifier_1.Identifier, { label: "typeName" })));
}
exports.TypeReference = TypeReference;
function ArrayElementType() {
const basicType = BasicType();
basicType.children = basicType.children.filter((child) => child.rule !== ArrayType);
return basicType;
}
function ArrayType() {
const action = ({ elementType, members }) => {
return {
kind: "ArrayType",
elementType,
dimension: members.length
};
};
return (react_peg_1.ReactPeg.createChunk("pattern", { action: action },
react_peg_1.ReactPeg.createChunk(ArrayElementType, { label: "elementType" }),
react_peg_1.ReactPeg.createChunk("repeat", { type: "+", label: "members" },
common_1.Text("["),
common_1.Text("]"))));
}
exports.ArrayType = ArrayType;