UNPKG

@mistlog/typetype

Version:

A programming language designed for typescript type generation

375 lines (374 loc) 15.4 kB
"use strict"; 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;