UNPKG

lore-hook-models

Version:

A lore hook that creates models for AJAX communication

71 lines (60 loc) 2.23 kB
import _defaultsDeep from 'lodash/defaultsDeep'; import _merge from 'lodash/merge'; import _snakeCase from 'lodash/snakeCase'; import _upperFirst from 'lodash/upperFirst'; import _kebabCase from 'lodash/kebabCase'; import _camelCase from 'lodash/camelCase'; import pluralize from 'pluralize'; var CasingStyles = { Camel: 'camel', Snake: 'snake', Kebab: 'kebab', Pascal: 'pascal' }; function applyCasingStyle(casingStyle, modelName) { switch (casingStyle) { case CasingStyles.Camel: return _camelCase(modelName); case CasingStyles.Kebab: return _kebabCase(modelName); case CasingStyles.Pascal: return _upperFirst(_camelCase(modelName)); case CasingStyles.Snake: return _snakeCase(modelName); default: throw new Error('Illegal casingStyle of \'' + casingStyle + '\' provided. Must be one of [' + [CasingStyles.Camel, CasingStyles.Kebab, CasingStyles.Pascal, CasingStyles.Snake] + ']'); } } function getUrlRoot(modelName, config) { var apiRoot = config.apiRoot; var isPlural = config.pluralize; var casingStyle = config.casingStyle; var endpoint = config.endpoint; // if the user did not provide a custom endpoint, generate // one from the model name if (!endpoint) { endpoint = isPlural ? applyCasingStyle(casingStyle, pluralize(modelName)) : applyCasingStyle(casingStyle, modelName); } return apiRoot ? apiRoot + '/' + endpoint : endpoint; } export default function (modelName, options) { var connection = options.connection || {}; var config = options.config || {}; var definition = options.definition || {}; /** * Merge apiRoot, pluralize and casingStyle from config files for * connections, models and the individual model definition */ var combinedConfig = _merge({}, connection, config, definition); var conventions = { properties: { urlRoot: getUrlRoot(modelName, combinedConfig) } }; if (connection.headers) { conventions.properties.headers = connection.headers; } // Build the final set of properties for the collection var properties = _defaultsDeep({}, definition.properties, config.properties, connection.models.properties, conventions.properties); return properties; }