functional-models-orm-sql
Version:
A sql based backend for functional-models
116 lines • 4.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.toToObjectResult = exports.toJsonAble = exports.BasicPropertyTypeToParser = exports.bestGuessParser = exports.dateParser = exports.booleanParser = exports.jsonParser = exports.floatParser = exports.integerParser = exports.stringParser = exports.nullParser = exports.toSimpleSqlObject = exports.toSimpleSqlValue = void 0;
const functional_models_1 = require("functional-models");
const merge_1 = __importDefault(require("lodash/merge"));
const toSimpleSqlValue = (propertyType, value) => {
if (value === null || value === undefined) {
return null;
}
// Arrays to stringified arrays.
if (Array.isArray(value)) {
return JSON.stringify(value);
}
if (typeof value === 'object') {
return JSON.stringify(value);
}
return value;
};
exports.toSimpleSqlValue = toSimpleSqlValue;
const toSimpleSqlObject = (definition, obj) => {
const properties = definition.properties;
if (!obj) {
return {};
}
return Object.entries(properties)
.map(([key, property]) => ({
key,
property: property.getPropertyType(),
}))
.reduce((acc, { key, property }) => {
const value = obj[key];
const sqlValue = (0, exports.toSimpleSqlValue)(property, value);
return (0, merge_1.default)(acc, { [key]: sqlValue });
}, {});
};
exports.toSimpleSqlObject = toSimpleSqlObject;
const nullParser = (func) => (value) => {
if (value === undefined || value === null) {
return null;
}
return func(value);
};
exports.nullParser = nullParser;
exports.stringParser = (0, exports.nullParser)((value) => `${value}`);
exports.integerParser = (0, exports.nullParser)(parseInt);
exports.floatParser = (0, exports.nullParser)(parseFloat);
exports.jsonParser = (0, exports.nullParser)((value) => JSON.parse(value));
exports.booleanParser = (0, exports.nullParser)((value) => {
if (typeof value === 'boolean') {
return value;
}
return Boolean(value);
});
exports.dateParser = (0, exports.nullParser)((value) => new Date(value).toISOString());
exports.bestGuessParser = (0, exports.nullParser)((value) => {
const theType = typeof value;
if (theType === 'number' || theType === 'boolean' || theType === 'object') {
return value;
}
// Could be a stringified json...
if (theType === 'string') {
// eslint-disable-next-line
try {
const asJson = JSON.parse(theType);
return asJson;
// eslint-disable-next-line
}
catch (_a) { }
return value;
}
throw new Error(`Cannot determine type of ${value}! Type: ${theType}`);
});
exports.BasicPropertyTypeToParser = {
[functional_models_1.PropertyType.UniqueId]: exports.stringParser,
[functional_models_1.PropertyType.Date]: exports.dateParser,
[functional_models_1.PropertyType.Datetime]: exports.dateParser,
[functional_models_1.PropertyType.Object]: exports.jsonParser,
[functional_models_1.PropertyType.Array]: exports.jsonParser,
[functional_models_1.PropertyType.ModelReference]: exports.stringParser,
[functional_models_1.PropertyType.Integer]: exports.integerParser,
[functional_models_1.PropertyType.Text]: exports.stringParser,
[functional_models_1.PropertyType.BigText]: exports.stringParser,
[functional_models_1.PropertyType.Number]: exports.floatParser,
[functional_models_1.PropertyType.Email]: exports.stringParser,
[functional_models_1.PropertyType.Boolean]: exports.booleanParser,
};
const toJsonAble = (propertyTypeToParser) => (propertyType, value) => {
if (value === undefined || value === null) {
return null;
}
const parser = propertyTypeToParser[propertyType];
if (!parser) {
return (0, exports.bestGuessParser)(value);
}
return parser(value);
};
exports.toJsonAble = toJsonAble;
const toToObjectResult = (propertyTypeToParser) => (definition, obj) => {
const properties = definition.properties;
const parsers = (0, exports.toJsonAble)(propertyTypeToParser);
return Object.entries(properties)
.map(([key, property]) => ({
key,
property: property.getPropertyType(),
}))
.reduce((acc, { key, property }) => {
const value = obj[key];
const jsonAble = parsers(property, value);
return (0, merge_1.default)(acc, { [key]: jsonAble });
}, {});
};
exports.toToObjectResult = toToObjectResult;
//# sourceMappingURL=parsers.js.map