UNPKG

ra-core

Version:

Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React

152 lines 5.69 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.inferTypeFromValues = exports.InferenceTypes = void 0; var getValuesFromRecords_1 = __importDefault(require("./getValuesFromRecords.cjs")); var assertions_1 = require("./assertions.cjs"); var inflection_1 = require("inflection"); exports.InferenceTypes = [ 'array', 'boolean', 'date', 'email', 'id', 'image', 'number', 'reference', 'referenceChild', 'referenceArray', 'referenceArrayChild', 'richText', 'string', 'url', 'object', ]; /** * Guesses an element type based on an array of values * * @example * inferElementFromValues( * 'address', * ['2 Baker Street', '1 Downing street'], * ); * // { type: 'string', props: { source: 'address' } } * * @param {string} name Property name, e.g. 'date_of_birth' * @param {any[]} values an array of values from which to determine the type, e.g. [12, 34.4, 43] */ var inferTypeFromValues = function (name, values) { if (values === void 0) { values = []; } if (name === 'id') { return { type: 'id', props: { source: name } }; } if (name.substr(name.length - 3) === '_id') { return { type: 'reference', props: { source: name, reference: (0, inflection_1.pluralize)(name.substr(0, name.length - 3)), }, children: { type: 'referenceChild' }, }; } if (name.substr(name.length - 2) === 'Id') { return { type: 'reference', props: { source: name, reference: (0, inflection_1.pluralize)(name.substr(0, name.length - 2)), }, children: { type: 'referenceChild' }, }; } if (name.substr(name.length - 4) === '_ids') { return { type: 'referenceArray', props: { source: name, reference: (0, inflection_1.pluralize)(name.substr(0, name.length - 4)), }, children: { type: 'referenceArrayChild' }, }; } if (name.substr(name.length - 3) === 'Ids') { return { type: 'referenceArray', props: { source: name, reference: (0, inflection_1.pluralize)(name.substr(0, name.length - 3)), }, children: { type: 'referenceArrayChild' }, }; } if (values.length === 0) { if (name === 'email') { return { type: 'email', props: { source: name } }; } if (name === 'url') { return { type: 'url', props: { source: name } }; } // FIXME introspect further using name return { type: 'string', props: { source: name } }; } if ((0, assertions_1.valuesAreArray)(values)) { if ((0, assertions_1.isObject)(values[0][0])) { var leafValues_1 = (0, getValuesFromRecords_1.default)(values.reduce(function (acc, vals) { return acc.concat(vals); }, [])); // FIXME bad visual representation return { type: 'array', props: { source: name }, children: Object.keys(leafValues_1).map(function (leafName) { return (0, exports.inferTypeFromValues)(leafName, leafValues_1[leafName]); }), }; } // FIXME introspect further return { type: 'string', props: { source: name } }; } if ((0, assertions_1.valuesAreBoolean)(values)) { return { type: 'boolean', props: { source: name } }; } if ((0, assertions_1.valuesAreDate)(values)) { return { type: 'date', props: { source: name } }; } if ((0, assertions_1.valuesAreString)(values)) { if (name === 'email' || (0, assertions_1.valuesAreEmail)(values)) { return { type: 'email', props: { source: name } }; } if (name === 'url' || (0, assertions_1.valuesAreUrl)(values)) { if ((0, assertions_1.valuesAreImageUrl)(values)) { return { type: 'image', props: { source: name } }; } return { type: 'url', props: { source: name } }; } if ((0, assertions_1.valuesAreDateString)(values)) { return { type: 'date', props: { source: name } }; } if ((0, assertions_1.valuesAreHtml)(values)) { return { type: 'richText', props: { source: name } }; } if ((0, assertions_1.valuesAreInteger)(values) || (0, assertions_1.valuesAreNumeric)(values)) { return { type: 'number', props: { source: name } }; } return { type: 'string', props: { source: name } }; } if ((0, assertions_1.valuesAreInteger)(values) || (0, assertions_1.valuesAreNumeric)(values)) { return { type: 'number', props: { source: name } }; } if ((0, assertions_1.valuesAreObject)(values)) { /// Arbitrarily, choose the first prop of the first object var propName_1 = Object.keys(values[0]).shift(); if (!propName_1) { return { type: 'object', props: { source: name } }; } var leafValues = values.map(function (v) { return v[propName_1]; }); return (0, exports.inferTypeFromValues)("".concat(name, ".").concat(propName_1), leafValues); } return { type: 'string', props: { source: name } }; }; exports.inferTypeFromValues = inferTypeFromValues; //# sourceMappingURL=inferTypeFromValues.js.map