UNPKG

@jtdc/jtd-dialect

Version:
141 lines (140 loc) 13.1 kB
var _a; import { __assign, __makeTemplateObject } from "tslib"; import { collectVarRefs, compilePropertyAccessor, encodeLetters, inlineVarAssignments, joinFragmentChildren, template as _, } from '@smikhalevski/codegen'; import { pascalCase } from 'change-case-all'; import { toJsonPointer } from './runtime'; /** * Creates a validator compilation dialect that renders validators which follow the JTD specification. */ export function createJtdDialect(options) { var opt = __assign(__assign({}, jtdDialectOptions), options); var renameValidator = opt.renameValidator, renamePropertyKey = opt.renamePropertyKey, renameDiscriminatorKey = opt.renameDiscriminatorKey, rewriteEnumValue = opt.rewriteEnumValue, rewriteMappingKey = opt.rewriteMappingKey, renameTypeGuard = opt.renameTypeGuard, renameType = opt.renameType; return { import: function () { return _(templateObject_1 || (templateObject_1 = __makeTemplateObject(["import{_S,_P,_K,_R,_o,_a,_e,_b,_s,_n,_i,_N,_O,Validator as _Validator}from\"@jtdc/jtd-dialect/lib/runtime\";"], ["import{_S,_P,_K,_R,_o,_a,_e,_b,_s,_n,_i,_N,_O,Validator as _Validator}from\"@jtdc/jtd-dialect/lib/runtime\";"]))); }, typeGuard: function (ref, node) { var name = renameTypeGuard(ref, node); return _(_(templateObject_2 || (templateObject_2 = __makeTemplateObject(["const ", "=(value:unknown):value is ", "=>!", "(value,{shallow:true});"], ["const ", "=(value:unknown):value is ", "=>!", "(value,{shallow:true});"])), name, renameType(ref, node), renameValidator(ref, node)), _(templateObject_3 || (templateObject_3 = __makeTemplateObject(["export{", "};"], ["export{", "};"])), name)); }, validator: function (ref, node, next) { var valueVar = _.var(); var ctxVar = _.var(); var pointerVar = _.var(); var cacheVar = _.var(); var name = renameValidator(ref, node); var cacheSize = 0; var bodyFrag = _(_.assignment(ctxVar, _(templateObject_4 || (templateObject_4 = __makeTemplateObject(["", "||{}"], ["", "||{}"])), ctxVar), true), _.assignment(pointerVar, _(templateObject_5 || (templateObject_5 = __makeTemplateObject(["", "||\"\""], ["", "||\"\""])), pointerVar)), _.assignment(cacheVar, _(templateObject_6 || (templateObject_6 = __makeTemplateObject(["(", ".cache||={})"], ["(", ".cache||={})"])), name)), next({ warpCache: function (frag) { return _(templateObject_7 || (templateObject_7 = __makeTemplateObject(["", ".", "||=", ""], ["", ".", "||=", ""])), cacheVar, encodeLetters(cacheSize++), frag); }, valueVar: valueVar, ctxVar: ctxVar, pointerVar: pointerVar, }), _(templateObject_8 || (templateObject_8 = __makeTemplateObject(["return ", ".errors;"], ["return ", ".errors;"])), ctxVar)); inlineVarAssignments(bodyFrag); var undeclaredVars = collectVarRefs(bodyFrag, [valueVar, ctxVar, pointerVar]); return _(_.block(templateObject_10 || (templateObject_10 = __makeTemplateObject(["const ", ":_Validator=(", ",", ",", ")=>{", "};"], ["const ", ":_Validator=(", ",", ",", ")=>{", "};"])), name, valueVar, ctxVar, pointerVar, _(undeclaredVars.length !== 0 && _(templateObject_9 || (templateObject_9 = __makeTemplateObject(["let ", ";"], ["let ", ";"])), joinFragmentChildren(undeclaredVars, ',')), bodyFrag)), _(templateObject_11 || (templateObject_11 = __makeTemplateObject(["export{", "};"], ["export{", "};"])), name)); }, ref: function (node, ctx) { return _(templateObject_12 || (templateObject_12 = __makeTemplateObject(["", "(", ",", ",", ");"], ["", "(", ",", ",", ");"])), renameValidator(node.ref, node), ctx.valueVar, ctx.ctxVar, ctx.pointerVar); }, nullable: function (node, ctx, next) { if (isUnconstrainedNode(node.valueNode)) { return _(templateObject_13 || (templateObject_13 = __makeTemplateObject([""], [""]))); } return _.block(templateObject_14 || (templateObject_14 = __makeTemplateObject(["if(_N(", ")){", "}"], ["if(_N(", ")){", "}"])), ctx.valueVar, next(ctx)); }, type: function (node, ctx) { var typeCheckerName = jtdTypeCheckerMap[node.type]; if (!typeCheckerName) { throw new Error('Unknown type: ' + node.type); } return _(templateObject_15 || (templateObject_15 = __makeTemplateObject(["", "(", ",", ",", ");"], ["", "(", ",", ",", ");"])), typeCheckerName, ctx.valueVar, ctx.ctxVar, ctx.pointerVar); }, enum: function (node, ctx) { var valuesFrag = ctx.warpCache(_(templateObject_16 || (templateObject_16 = __makeTemplateObject(["[", "]"], ["[", "]"])), joinFragmentChildren(node.values.map(function (value) { return JSON.stringify(rewriteEnumValue(value, node)); }), ','))); return _(templateObject_17 || (templateObject_17 = __makeTemplateObject(["_e(", ",", ",", ",", ");"], ["_e(", ",", ",", ",", ");"])), ctx.valueVar, valuesFrag, ctx.ctxVar, ctx.pointerVar); }, elements: function (node, ctx, next) { if (isUnconstrainedNode(node.elementNode)) { return _(templateObject_18 || (templateObject_18 = __makeTemplateObject(["_a(", ",", ",", ");"], ["_a(", ",", ",", ");"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar); } var indexVar = _.var(); var valueVar = _.var(); var pointerVar = _.var(); return _.block(templateObject_22 || (templateObject_22 = __makeTemplateObject(["if(_a(", ",", ",", ")){", "}"], ["if(_a(", ",", ",", ")){", "}"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar, _.block(templateObject_21 || (templateObject_21 = __makeTemplateObject(["for(", "=0;", "<", ".length;", "++){", "}"], ["for(", "=0;", "<", ".length;", "++){", "}"])), indexVar, indexVar, ctx.valueVar, indexVar, _(_.assignment(valueVar, _(templateObject_19 || (templateObject_19 = __makeTemplateObject(["", "[", "]"], ["", "[", "]"])), ctx.valueVar, indexVar)), _.assignment(pointerVar, _(templateObject_20 || (templateObject_20 = __makeTemplateObject(["", "+_S+", ""], ["", "+_S+", ""])), ctx.pointerVar, indexVar)), next(__assign(__assign({}, ctx), { pointerVar: pointerVar, valueVar: valueVar }))))); }, values: function (node, ctx, next) { if (isUnconstrainedNode(node.valueNode)) { return _(templateObject_23 || (templateObject_23 = __makeTemplateObject(["_o(", ",", ",", ");"], ["_o(", ",", ",", ");"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar); } var indexVar = _.var(); var keysVar = _.var(); var valueVar = _.var(); var pointerVar = _.var(); return _.block(templateObject_27 || (templateObject_27 = __makeTemplateObject(["if(_o(", ",", ",", ")){", "}"], ["if(_o(", ",", ",", ")){", "}"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar, _.block(templateObject_26 || (templateObject_26 = __makeTemplateObject(["for(", "=0,", "=_K(", ");", "<", ".length;", "++){", "}"], ["for(", "=0,", "=_K(", ");", "<", ".length;", "++){", "}"])), indexVar, keysVar, ctx.valueVar, indexVar, keysVar, indexVar, _(_.assignment(valueVar, _(templateObject_24 || (templateObject_24 = __makeTemplateObject(["", "[", "[", "]]"], ["", "[", "[", "]]"])), ctx.valueVar, keysVar, indexVar)), _.assignment(pointerVar, _(templateObject_25 || (templateObject_25 = __makeTemplateObject(["", "+_P(", "[", "])"], ["", "+_P(", "[", "])"])), ctx.pointerVar, keysVar, indexVar)), next(__assign(__assign({}, ctx), { valueVar: valueVar, pointerVar: pointerVar }))))); }, object: function (node, ctx, next) { if (Object.values(node.properties).every(isUnconstrainedNode) && Object.values(node.optionalProperties).every(isUnconstrainedNode)) { return _(templateObject_28 || (templateObject_28 = __makeTemplateObject(["_o(", ",", ",", ")"], ["_o(", ",", ",", ")"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar); } return _.block(templateObject_29 || (templateObject_29 = __makeTemplateObject(["if(_o(", ",", ",", ")){", "}"], ["if(_o(", ",", ",", ")){", "}"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar, next(ctx)); }, property: function (propKey, propNode, objectNode, ctx, next) { if (isUnconstrainedNode(propNode)) { return _(templateObject_30 || (templateObject_30 = __makeTemplateObject([""], [""]))); } propKey = renamePropertyKey(propKey, propNode, objectNode); var valueVar = _.var(); var pointerVar = _.var(); return _.block(_.assignment(valueVar, _(templateObject_31 || (templateObject_31 = __makeTemplateObject(["", "", ""], ["", "", ""])), ctx.valueVar, compilePropertyAccessor(propKey))), _.assignment(pointerVar, _(templateObject_32 || (templateObject_32 = __makeTemplateObject(["", "+", ""], ["", "+", ""])), ctx.pointerVar, compileJsonPointer(propKey))), next(__assign(__assign({}, ctx), { valueVar: valueVar, pointerVar: pointerVar }))); }, optionalProperty: function (propKey, propNode, objectNode, ctx, next) { if (isUnconstrainedNode(propNode)) { return _(templateObject_33 || (templateObject_33 = __makeTemplateObject([""], [""]))); } propKey = renamePropertyKey(propKey, propNode, objectNode); var valueVar = _.var(); var pointerVar = _.var(); return _.block(_.assignment(valueVar, _(templateObject_34 || (templateObject_34 = __makeTemplateObject(["", "", ""], ["", "", ""])), ctx.valueVar, compilePropertyAccessor(propKey))), _.block(templateObject_36 || (templateObject_36 = __makeTemplateObject(["if(_O(", ")){", "}"], ["if(_O(", ")){", "}"])), valueVar, _(_.assignment(pointerVar, _(templateObject_35 || (templateObject_35 = __makeTemplateObject(["", "+", ""], ["", "+", ""])), ctx.pointerVar, compileJsonPointer(propKey))), next(__assign(__assign({}, ctx), { valueVar: valueVar, pointerVar: pointerVar }))))); }, union: function (node, ctx, next) { var discriminatorKey = renameDiscriminatorKey(node); return _.block(templateObject_38 || (templateObject_38 = __makeTemplateObject(["if(_o(", ",", ",", ")){", "}"], ["if(_o(", ",", ",", ")){", "}"])), ctx.valueVar, ctx.ctxVar, ctx.pointerVar, _(_(templateObject_37 || (templateObject_37 = __makeTemplateObject(["switch(", "", "){", "}_R(", ",", "+", ")"], ["switch(", "", "){", "}_R(", ",", "+", ")"])), ctx.valueVar, compilePropertyAccessor(discriminatorKey), _(next(ctx)), ctx.ctxVar, ctx.pointerVar, compileJsonPointer(discriminatorKey)))); }, mapping: function (mappingKey, mappingNode, unionNode, ctx, next) { return _.block(_(templateObject_39 || (templateObject_39 = __makeTemplateObject(["case ", ":"], ["case ", ":"])), JSON.stringify(rewriteMappingKey(mappingKey, mappingNode, undefined, unionNode))), next(ctx), 'break;'); }, }; } function compileJsonPointer(key) { return JSON.stringify(toJsonPointer(key)); } function isUnconstrainedNode(node) { return node.nodeType === 0 /* ANY */ || node.nodeType === 2 /* NULLABLE */ && isUnconstrainedNode(node.valueNode); } var jtdTypeCheckerMap = (_a = {}, _a["boolean" /* BOOLEAN */] = '_b', _a["string" /* STRING */] = '_s', _a["timestamp" /* TIMESTAMP */] = '_s', _a["float32" /* FLOAT32 */] = '_n', _a["float64" /* FLOAT64 */] = '_n', _a["int8" /* INT8 */] = '_i', _a["uint8" /* UINT8 */] = '_i', _a["int16" /* INT16 */] = '_i', _a["uint16" /* UINT16 */] = '_i', _a["int32" /* INT32 */] = '_i', _a["uint32" /* UINT32 */] = '_i', _a); /** * Global default options used by {@link createJtdDialect}. */ export var jtdDialectOptions = { renameValidator: function (ref) { return 'validate' + pascalCase(ref); }, renamePropertyKey: function (propKey) { return propKey; }, renameDiscriminatorKey: function (node) { return node.discriminator; }, rewriteEnumValue: function (value) { return value; }, rewriteMappingKey: function (mappingKey) { return mappingKey; }, renameTypeGuard: function (ref) { return 'is' + pascalCase(ref); }, renameType: function (ref) { return pascalCase(ref); }, }; var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21, templateObject_22, templateObject_23, templateObject_24, templateObject_25, templateObject_26, templateObject_27, templateObject_28, templateObject_29, templateObject_30, templateObject_31, templateObject_32, templateObject_33, templateObject_34, templateObject_35, templateObject_36, templateObject_37, templateObject_38, templateObject_39;