{"version":3,"sources":["validator/compile-asserts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,MAAM,YAAY,CAAC;AAS5B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE,CAAC,kBAAkB,GAAG,SAAS,CAqGjK","file":"compile-asserts.d.ts","sourcesContent":["import type { AssertOptions, FieldType } from '@src/parser/model';\nimport ts from 'typescript';\n\n/**\n * Compile asserts\n * @param name\n * @param asserts\n * @param type\n * @param factory\n * @param PRETTY\n */\nexport function compileAsserts(\n\tname: string,\n\tasserts: AssertOptions,\n\ttype: FieldType,\n\tfactory: ts.NodeFactory,\n\tPRETTY: boolean\n): ts.FunctionExpression | undefined {\n\t// Arr\n\tconst numberChecks: ts.Statement[] = [];\n\tconst elseChecks: ts.Statement[] = [\n\t\t// create var \"len\"\n\t\tfactory.createVariableStatement(\n\t\t\tundefined, factory.createVariableDeclarationList(\n\t\t\t\t[\n\t\t\t\t\tfactory.createVariableDeclaration(\n\t\t\t\t\t\tfactory.createIdentifier('len'), undefined, undefined,\n\t\t\t\t\t\tfactory.createPropertyAccessExpression(\n\t\t\t\t\t\t\tfactory.createIdentifier('value'),\n\t\t\t\t\t\t\tfactory.createIdentifier('length')\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\tts.NodeFlags.None)\n\t\t),\n\t];\n\t// Min value\n\tvar v: string | undefined = asserts.min ?? asserts.gte;\n\tif (v != null) {\n\t\tnumberChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.LessThanToken, v, `${name} >= ${v}`)\n\t\t);\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'len', ts.SyntaxKind.LessThanToken, v, `${name}.length >= ${v}`)\n\t\t);\n\t}\n\t// Max value\n\tv = asserts.max ?? asserts.lte;\n\tif (v != null) {\n\t\tnumberChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.GreaterThanToken, v, `${name} <= ${v}`)\n\t\t);\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'len', ts.SyntaxKind.GreaterThanToken, v, `${name}.length <= ${v}`)\n\t\t);\n\t}\n\t//lt\n\tv = asserts.lt;\n\tif (v != null) {\n\t\tnumberChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.GreaterThanEqualsToken, v, `Expected ${name} < ${v}`)\n\t\t);\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'len', ts.SyntaxKind.GreaterThanEqualsToken, v, `Expected ${name}.length < ${v}`)\n\t\t);\n\t}\n\t//gt\n\tv = asserts.gt;\n\tif (v != null) {\n\t\tnumberChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.LessThanEqualsToken, v, `Expected ${name} > ${v}`)\n\t\t);\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'len', ts.SyntaxKind.LessThanEqualsToken, v, `Expected ${name}.length > ${v}`)\n\t\t);\n\t}\n\t//eq\n\tv = asserts.eq;\n\tif (v != null) {\n\t\tnumberChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.ExclamationEqualsEqualsToken, v, `Expected ${name} === ${v}`)\n\t\t);\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.ExclamationEqualsEqualsToken, v, `Expected ${name} === ${v}`)\n\t\t);\n\t}\n\t//ne\n\tv = asserts.ne;\n\tif (v != null) {\n\t\tnumberChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.EqualsEqualsEqualsToken, v, `Expected ${name} !== ${v}`)\n\t\t);\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'value', ts.SyntaxKind.EqualsEqualsEqualsToken, v, `Expected ${name} !== ${v}`)\n\t\t);\n\t}\n\t// length\n\tv = asserts.length;\n\tif (v != null) {\n\t\telseChecks.push(\n\t\t\t_ifThrow(factory, 'len', ts.SyntaxKind.ExclamationEqualsEqualsToken, v, `Expected ${name}.length === ${v}`)\n\t\t);\n\t}\n\t// regex\n\tif (asserts.regex != null) {\n\t\telseChecks.push(\n\t\t\tfactory.createIfStatement(\n\t\t\t\tfactory.createCallExpression(\n\t\t\t\t\tfactory.createPropertyAccessExpression(\n\t\t\t\t\t\tfactory.createIdentifier('value'),\n\t\t\t\t\t\tfactory.createIdentifier('match')\n\t\t\t\t\t),\n\t\t\t\t\tundefined,\n\t\t\t\t\t[factory.createIdentifier(asserts.regex.toString())]\n\t\t\t\t),\n\t\t\t\tfactory.createThrowStatement(\n\t\t\t\t\tfactory.createNewExpression(\n\t\t\t\t\t\tfactory.createIdentifier('Error'),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tfactory.createBinaryExpression(\n\t\t\t\t\t\t\t\tfactory.createStringLiteral(\n\t\t\t\t\t\t\t\t\t`Expected \"${name}\" to match ${asserts.regex.toString()}. Got: `\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tfactory.createToken(ts.SyntaxKind.PlusToken),\n\t\t\t\t\t\t\t\tfactory.createIdentifier('value')\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tundefined\n\t\t\t)\n\t\t);\n\t}\n\n\t// return\n\tif (numberChecks.length === 0 && elseChecks.length === 1) return undefined;\n\telse\n\t\treturn factory.createFunctionExpression(\n\t\t\tundefined, undefined, undefined, undefined,\n\t\t\t[\n\t\t\t\tfactory.createParameterDeclaration(undefined, undefined, undefined,\n\t\t\t\t\tfactory.createIdentifier('value'),\n\t\t\t\t\tundefined, factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), undefined),\n\t\t\t]\n\t\t\t, undefined, factory.createBlock([\n\t\t\t\tfactory.createIfStatement(\n\t\t\t\t\t// If is Number\n\t\t\t\t\tfactory.createBinaryExpression(\n\t\t\t\t\t\tfactory.createTypeOfExpression(\n\t\t\t\t\t\t\tfactory.createIdentifier('value')\n\t\t\t\t\t\t),\n\t\t\t\t\t\tfactory.createToken(\n\t\t\t\t\t\t\tts.SyntaxKind.EqualsEqualsEqualsToken\n\t\t\t\t\t\t),\n\t\t\t\t\t\tfactory.createStringLiteral('number')\n\t\t\t\t\t),\n\t\t\t\t\t// If true\n\t\t\t\t\tfactory.createBlock(numberChecks, PRETTY),\n\t\t\t\t\t// Else\n\t\t\t\t\tfactory.createBlock(elseChecks, PRETTY)\n\t\t\t\t),\n\t\t\t])\n\t\t);\n\t// return factory.createFunctionExpression(\n\t// \tundefined, undefined, undefined, undefined,\n\t// \t// Argument\n\t// \t[\n\t// \t\tfactory.createParameterDeclaration(undefined, undefined, undefined,\n\t// \t\t\tfactory.createIdentifier('value'),\n\t// \t\t\tundefined, factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), undefined),\n\t// \t], undefined,\n\t// \tfactory.createBlock(\n\t// \t\t[\n\t// \t\t\tfactory.createIfStatement(\n\t// \t\t\t\t// If is Number\n\t// \t\t\t\tfactory.createBinaryExpression(\n\t// \t\t\t\t\tfactory.createTypeOfExpression(\n\t// \t\t\t\t\t\tfactory.createIdentifier('value')\n\t// \t\t\t\t\t),\n\t// \t\t\t\t\tfactory.createToken(\n\t// \t\t\t\t\t\tts.SyntaxKind.EqualsEqualsEqualsToken\n\t// \t\t\t\t\t),\n\t// \t\t\t\t\tfactory.createStringLiteral('number')\n\t// \t\t\t\t),\n\t// \t\t\t\t// If true\n\t// \t\t\t\tfactory.createBlock(numberChecks, PRETTY),\n\t// \t\t\t\t// Else\n\t// \t\t\t\tfactory.createBlock(elseChecks, PRETTY)\n\t// \t\t\t),\n\t// \t\t],\n\t// \t\tPRETTY\n\t// \t)\n\t// );\n}\n\n/** Generate lines */\ntype Tkind =\n\t| ts.SyntaxKind.LessThanToken\n\t| ts.SyntaxKind.GreaterThanToken\n\t| ts.SyntaxKind.GreaterThanEqualsToken\n\t| ts.SyntaxKind.LessThanEqualsToken\n\t| ts.SyntaxKind.EqualsEqualsEqualsToken\n\t| ts.SyntaxKind.ExclamationEqualsEqualsToken\n\t| ts.SyntaxKind.EqualsEqualsEqualsToken;\nfunction _ifThrow(\n\tfactory: ts.NodeFactory,\n\tidentifier: string,\n\tcmpToken: Tkind,\n\tcmpValue: string,\n\terrMsg: string\n) {\n\treturn factory.createIfStatement(\n\t\tfactory.createBinaryExpression(\n\t\t\tfactory.createIdentifier(identifier),\n\t\t\tfactory.createToken(cmpToken),\n\t\t\tfactory.createIdentifier(cmpValue)\n\t\t\t// typeof cmpValue === 'number'\n\t\t\t// \t? factory.createNumericLiteral(cmpValue)\n\t\t\t// \t: factory.createStringLiteral(cmpValue)\n\t\t),\n\t\tfactory.createThrowStatement(\n\t\t\tfactory.createNewExpression(\n\t\t\t\tfactory.createIdentifier('Error'),\n\t\t\t\tundefined,\n\t\t\t\t[\n\t\t\t\t\tfactory.createBinaryExpression(\n\t\t\t\t\t\tfactory.createStringLiteral(`${errMsg}. Got: `),\n\t\t\t\t\t\tfactory.createToken(ts.SyntaxKind.PlusToken),\n\t\t\t\t\t\tfactory.createIdentifier(identifier)\n\t\t\t\t\t),\n\t\t\t\t]\n\t\t\t)\n\t\t),\n\t\tundefined\n\t);\n}\n"]}