@jtdc/jtd-dialect
Version:
JTD dialect for JTDc.
141 lines (140 loc) • 13.1 kB
JavaScript
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;