lore-hook-models
Version:
A lore hook that creates models for AJAX communication
71 lines (60 loc) • 2.23 kB
JavaScript
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;
}