@lolocompany/react-admin-lolo
Version:
A library for schema-driven web apps using [Lolo](https://lolo.company), [React Admin](https://github.com/marmelab/react-admin) and [RJSF](https://github.com/rjsf-team/react-jsonschema-form)
1,641 lines (1,395 loc) • 1.11 MB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var ra = require('react-admin');
var reactRedux = require('react-redux');
var history$1 = require('history');
var Amplify = require('aws-amplify');
var inflection = require('inflection');
var Auth = require('@aws-amplify/auth');
var polyglotI18nProvider = require('ra-i18n-polyglot');
var englishMessages = require('ra-language-english');
var redux = require('redux');
var connectedReactRouter = require('connected-react-router');
var createSagaMiddleware = require('redux-saga');
var effects = require('redux-saga/effects');
var reactRouter = require('react-router');
var TextField$1 = require('@material-ui/core/TextField');
var CircularProgress = require('@material-ui/core/CircularProgress');
var Grid = require('@material-ui/core/Grid');
var Button = require('@material-ui/core/Button');
var CreateIcon = require('@material-ui/icons/CreateOutlined');
var styles$1 = require('@material-ui/core/styles');
var Popper = require('@material-ui/core/Popper');
var ListSubheader = require('@material-ui/core/ListSubheader');
var Paper = require('@material-ui/core/Paper');
var IconButton$3 = require('@material-ui/core/IconButton');
var Chip = require('@material-ui/core/Chip');
var utils = require('@material-ui/core/utils');
var core = require('@material-ui/core');
var Box = require('@material-ui/core/Box');
var AddIcon = require('@material-ui/icons/Add');
var ArrowUpward = require('@material-ui/icons/ArrowUpward');
var ArrowDownward = require('@material-ui/icons/ArrowDownward');
var Remove = require('@material-ui/icons/Remove');
var Typography = require('@material-ui/core/Typography');
var List$1 = require('@material-ui/core/List');
var ListItem = require('@material-ui/core/ListItem');
var ListItemIcon = require('@material-ui/core/ListItemIcon');
var ErrorIcon = require('@material-ui/icons/Error');
var ListItemText = require('@material-ui/core/ListItemText');
var styles$2 = require('@material-ui/styles');
var Divider = require('@material-ui/core/Divider');
var FormControl = require('@material-ui/core/FormControl');
var FormHelperText = require('@material-ui/core/FormHelperText');
var Input = require('@material-ui/core/Input');
var InputLabel = require('@material-ui/core/InputLabel');
var Checkbox = require('@material-ui/core/Checkbox');
var FormControlLabel = require('@material-ui/core/FormControlLabel');
var FormLabel = require('@material-ui/core/FormLabel');
var FormGroup = require('@material-ui/core/FormGroup');
var Radio = require('@material-ui/core/Radio');
var RadioGroup = require('@material-ui/core/RadioGroup');
var Slider = require('@material-ui/core/Slider');
var MenuItem = require('@material-ui/core/MenuItem');
require('react-router-dom');
var PowerSettingsNew = require('@material-ui/icons/PowerSettingsNew');
var reactAdminImportCsv = require('react-admin-import-csv');
var Inbox = require('@material-ui/icons/Inbox');
var raCore = require('ra-core');
var uiComponents = require('@aws-amplify/ui-components');
var uiReact = require('@aws-amplify/ui-react');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () {
return e[k];
}
});
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var React__namespace = /*#__PURE__*/_interopNamespace(React);
var ra__namespace = /*#__PURE__*/_interopNamespace(ra);
var Amplify__default = /*#__PURE__*/_interopDefaultLegacy(Amplify);
var inflection__default = /*#__PURE__*/_interopDefaultLegacy(inflection);
var Auth__default = /*#__PURE__*/_interopDefaultLegacy(Auth);
var polyglotI18nProvider__default = /*#__PURE__*/_interopDefaultLegacy(polyglotI18nProvider);
var englishMessages__default = /*#__PURE__*/_interopDefaultLegacy(englishMessages);
var createSagaMiddleware__default = /*#__PURE__*/_interopDefaultLegacy(createSagaMiddleware);
var TextField__default = /*#__PURE__*/_interopDefaultLegacy(TextField$1);
var CircularProgress__default = /*#__PURE__*/_interopDefaultLegacy(CircularProgress);
var Grid__default = /*#__PURE__*/_interopDefaultLegacy(Grid);
var Button__default = /*#__PURE__*/_interopDefaultLegacy(Button);
var CreateIcon__default = /*#__PURE__*/_interopDefaultLegacy(CreateIcon);
var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
var ListSubheader__default = /*#__PURE__*/_interopDefaultLegacy(ListSubheader);
var Paper__default = /*#__PURE__*/_interopDefaultLegacy(Paper);
var IconButton__default = /*#__PURE__*/_interopDefaultLegacy(IconButton$3);
var Chip__default = /*#__PURE__*/_interopDefaultLegacy(Chip);
var Box__default = /*#__PURE__*/_interopDefaultLegacy(Box);
var AddIcon__default = /*#__PURE__*/_interopDefaultLegacy(AddIcon);
var ArrowUpward__default = /*#__PURE__*/_interopDefaultLegacy(ArrowUpward);
var ArrowDownward__default = /*#__PURE__*/_interopDefaultLegacy(ArrowDownward);
var Remove__default = /*#__PURE__*/_interopDefaultLegacy(Remove);
var Typography__default = /*#__PURE__*/_interopDefaultLegacy(Typography);
var List__default = /*#__PURE__*/_interopDefaultLegacy(List$1);
var ListItem__default = /*#__PURE__*/_interopDefaultLegacy(ListItem);
var ListItemIcon__default = /*#__PURE__*/_interopDefaultLegacy(ListItemIcon);
var ErrorIcon__default = /*#__PURE__*/_interopDefaultLegacy(ErrorIcon);
var ListItemText__default = /*#__PURE__*/_interopDefaultLegacy(ListItemText);
var Divider__default = /*#__PURE__*/_interopDefaultLegacy(Divider);
var FormControl__default = /*#__PURE__*/_interopDefaultLegacy(FormControl);
var FormHelperText__default = /*#__PURE__*/_interopDefaultLegacy(FormHelperText);
var Input__default = /*#__PURE__*/_interopDefaultLegacy(Input);
var InputLabel__default = /*#__PURE__*/_interopDefaultLegacy(InputLabel);
var Checkbox__default = /*#__PURE__*/_interopDefaultLegacy(Checkbox);
var FormControlLabel__default = /*#__PURE__*/_interopDefaultLegacy(FormControlLabel);
var FormLabel__default = /*#__PURE__*/_interopDefaultLegacy(FormLabel);
var FormGroup__default = /*#__PURE__*/_interopDefaultLegacy(FormGroup);
var Radio__default = /*#__PURE__*/_interopDefaultLegacy(Radio);
var RadioGroup__default = /*#__PURE__*/_interopDefaultLegacy(RadioGroup);
var Slider__default = /*#__PURE__*/_interopDefaultLegacy(Slider);
var MenuItem__default = /*#__PURE__*/_interopDefaultLegacy(MenuItem);
var PowerSettingsNew__default = /*#__PURE__*/_interopDefaultLegacy(PowerSettingsNew);
var Inbox__default = /*#__PURE__*/_interopDefaultLegacy(Inbox);
function _extends$A() {
_extends$A = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends$A.apply(this, arguments);
}
Amplify__default['default'].configure({
Auth: {
region: 'eu-west-1',
userPoolId: 'eu-west-1_lQin10bBN',
userPoolWebClientId: '2j7v5uee5qc13p6kncmlrjqq0q'
}
});
exports.authProvider = {
init: async updateAuth => {
let token = null;
token = await (async () => {
try {
const session = await Amplify.Auth.currentSession();
return session.idToken.jwtToken;
} catch (e) {
return null;
}
})();
Amplify.Hub.listen('auth', data => {
const {
payload: {
event,
data: {
signInUserSession: {
idToken: {
jwtToken
}
}
}
}
} = data;
updateAuth(event === 'signIn' ? jwtToken : null);
});
updateAuth(token);
},
login: params => Promise.resolve(),
logout: params => {
localStorage.clear();
return Amplify.Auth.signOut();
},
checkAuth: params => Amplify.Auth.currentSession(),
checkError: error => Promise.resolve(),
getPermissions: params => Promise.resolve()
};
class AuthProvider {
constructor(options) {
if (options) {
exports.authProvider = Object.assign(exports.authProvider, options);
}
}
}
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
var queryString = {};
var strictUriEncode = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);
var token = '%[a-f0-9]{2}';
var singleMatcher = new RegExp(token, 'gi');
var multiMatcher = new RegExp('(' + token + ')+', 'gi');
function decodeComponents(components, split) {
try {
// Try to decode the entire string first
return decodeURIComponent(components.join(''));
} catch (err) {
// Do nothing
}
if (components.length === 1) {
return components;
}
split = split || 1;
// Split the array in 2 parts
var left = components.slice(0, split);
var right = components.slice(split);
return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));
}
function decode(input) {
try {
return decodeURIComponent(input);
} catch (err) {
var tokens = input.match(singleMatcher);
for (var i = 1; i < tokens.length; i++) {
input = decodeComponents(tokens, i).join('');
tokens = input.match(singleMatcher);
}
return input;
}
}
function customDecodeURIComponent(input) {
// Keep track of all the replacements and prefill the map with the `BOM`
var replaceMap = {
'%FE%FF': '\uFFFD\uFFFD',
'%FF%FE': '\uFFFD\uFFFD'
};
var match = multiMatcher.exec(input);
while (match) {
try {
// Decode as big chunks as possible
replaceMap[match[0]] = decodeURIComponent(match[0]);
} catch (err) {
var result = decode(match[0]);
if (result !== match[0]) {
replaceMap[match[0]] = result;
}
}
match = multiMatcher.exec(input);
}
// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else
replaceMap['%C2'] = '\uFFFD';
var entries = Object.keys(replaceMap);
for (var i = 0; i < entries.length; i++) {
// Replace all decoded components
var key = entries[i];
input = input.replace(new RegExp(key, 'g'), replaceMap[key]);
}
return input;
}
var decodeUriComponent = function (encodedURI) {
if (typeof encodedURI !== 'string') {
throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');
}
try {
encodedURI = encodedURI.replace(/\+/g, ' ');
// Try the built in decoder first
return decodeURIComponent(encodedURI);
} catch (err) {
// Fallback to a more advanced decoder
return customDecodeURIComponent(encodedURI);
}
};
var splitOnFirst = (string, separator) => {
if (!(typeof string === 'string' && typeof separator === 'string')) {
throw new TypeError('Expected the arguments to be of type `string`');
}
if (separator === '') {
return [string];
}
const separatorIndex = string.indexOf(separator);
if (separatorIndex === -1) {
return [string];
}
return [
string.slice(0, separatorIndex),
string.slice(separatorIndex + separator.length)
];
};
var filterObj = function (obj, predicate) {
var ret = {};
var keys = Object.keys(obj);
var isArr = Array.isArray(predicate);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var val = obj[key];
if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {
ret[key] = val;
}
}
return ret;
};
(function (exports) {
const strictUriEncode$1 = strictUriEncode;
const decodeComponent = decodeUriComponent;
const splitOnFirst$1 = splitOnFirst;
const filterObject = filterObj;
const isNullOrUndefined = value => value === null || value === undefined;
const encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');
function encoderForArrayFormat(options) {
switch (options.arrayFormat) {
case 'index':
return key => (result, value) => {
const index = result.length;
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
if (value === null) {
return [...result, [encode(key, options), '[', index, ']'].join('')];
}
return [
...result,
[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')
];
};
case 'bracket':
return key => (result, value) => {
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
if (value === null) {
return [...result, [encode(key, options), '[]'].join('')];
}
return [...result, [encode(key, options), '[]=', encode(value, options)].join('')];
};
case 'comma':
case 'separator':
case 'bracket-separator': {
const keyValueSep = options.arrayFormat === 'bracket-separator' ?
'[]=' :
'=';
return key => (result, value) => {
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
// Translate null to an empty string so that it doesn't serialize as 'null'
value = value === null ? '' : value;
if (result.length === 0) {
return [[encode(key, options), keyValueSep, encode(value, options)].join('')];
}
return [[result, encode(value, options)].join(options.arrayFormatSeparator)];
};
}
default:
return key => (result, value) => {
if (
value === undefined ||
(options.skipNull && value === null) ||
(options.skipEmptyString && value === '')
) {
return result;
}
if (value === null) {
return [...result, encode(key, options)];
}
return [...result, [encode(key, options), '=', encode(value, options)].join('')];
};
}
}
function parserForArrayFormat(options) {
let result;
switch (options.arrayFormat) {
case 'index':
return (key, value, accumulator) => {
result = /\[(\d*)\]$/.exec(key);
key = key.replace(/\[\d*\]$/, '');
if (!result) {
accumulator[key] = value;
return;
}
if (accumulator[key] === undefined) {
accumulator[key] = {};
}
accumulator[key][result[1]] = value;
};
case 'bracket':
return (key, value, accumulator) => {
result = /(\[\])$/.exec(key);
key = key.replace(/\[\]$/, '');
if (!result) {
accumulator[key] = value;
return;
}
if (accumulator[key] === undefined) {
accumulator[key] = [value];
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
case 'comma':
case 'separator':
return (key, value, accumulator) => {
const isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);
const isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));
value = isEncodedArray ? decode(value, options) : value;
const newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);
accumulator[key] = newValue;
};
case 'bracket-separator':
return (key, value, accumulator) => {
const isArray = /(\[\])$/.test(key);
key = key.replace(/\[\]$/, '');
if (!isArray) {
accumulator[key] = value ? decode(value, options) : value;
return;
}
const arrayValue = value === null ?
[] :
value.split(options.arrayFormatSeparator).map(item => decode(item, options));
if (accumulator[key] === undefined) {
accumulator[key] = arrayValue;
return;
}
accumulator[key] = [].concat(accumulator[key], arrayValue);
};
default:
return (key, value, accumulator) => {
if (accumulator[key] === undefined) {
accumulator[key] = value;
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
}
}
function validateArrayFormatSeparator(value) {
if (typeof value !== 'string' || value.length !== 1) {
throw new TypeError('arrayFormatSeparator must be single character string');
}
}
function encode(value, options) {
if (options.encode) {
return options.strict ? strictUriEncode$1(value) : encodeURIComponent(value);
}
return value;
}
function decode(value, options) {
if (options.decode) {
return decodeComponent(value);
}
return value;
}
function keysSorter(input) {
if (Array.isArray(input)) {
return input.sort();
}
if (typeof input === 'object') {
return keysSorter(Object.keys(input))
.sort((a, b) => Number(a) - Number(b))
.map(key => input[key]);
}
return input;
}
function removeHash(input) {
const hashStart = input.indexOf('#');
if (hashStart !== -1) {
input = input.slice(0, hashStart);
}
return input;
}
function getHash(url) {
let hash = '';
const hashStart = url.indexOf('#');
if (hashStart !== -1) {
hash = url.slice(hashStart);
}
return hash;
}
function extract(input) {
input = removeHash(input);
const queryStart = input.indexOf('?');
if (queryStart === -1) {
return '';
}
return input.slice(queryStart + 1);
}
function parseValue(value, options) {
if (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {
value = Number(value);
} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {
value = value.toLowerCase() === 'true';
}
return value;
}
function parse(query, options) {
options = Object.assign({
decode: true,
sort: true,
arrayFormat: 'none',
arrayFormatSeparator: ',',
parseNumbers: false,
parseBooleans: false
}, options);
validateArrayFormatSeparator(options.arrayFormatSeparator);
const formatter = parserForArrayFormat(options);
// Create an object with no prototype
const ret = Object.create(null);
if (typeof query !== 'string') {
return ret;
}
query = query.trim().replace(/^[?#&]/, '');
if (!query) {
return ret;
}
for (const param of query.split('&')) {
if (param === '') {
continue;
}
let [key, value] = splitOnFirst$1(options.decode ? param.replace(/\+/g, ' ') : param, '=');
// Missing `=` should be `null`:
// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
value = value === undefined ? null : ['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? value : decode(value, options);
formatter(decode(key, options), value, ret);
}
for (const key of Object.keys(ret)) {
const value = ret[key];
if (typeof value === 'object' && value !== null) {
for (const k of Object.keys(value)) {
value[k] = parseValue(value[k], options);
}
} else {
ret[key] = parseValue(value, options);
}
}
if (options.sort === false) {
return ret;
}
return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {
const value = ret[key];
if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {
// Sort object keys, not values
result[key] = keysSorter(value);
} else {
result[key] = value;
}
return result;
}, Object.create(null));
}
exports.extract = extract;
exports.parse = parse;
exports.stringify = (object, options) => {
if (!object) {
return '';
}
options = Object.assign({
encode: true,
strict: true,
arrayFormat: 'none',
arrayFormatSeparator: ','
}, options);
validateArrayFormatSeparator(options.arrayFormatSeparator);
const shouldFilter = key => (
(options.skipNull && isNullOrUndefined(object[key])) ||
(options.skipEmptyString && object[key] === '')
);
const formatter = encoderForArrayFormat(options);
const objectCopy = {};
for (const key of Object.keys(object)) {
if (!shouldFilter(key)) {
objectCopy[key] = object[key];
}
}
const keys = Object.keys(objectCopy);
if (options.sort !== false) {
keys.sort(options.sort);
}
return keys.map(key => {
const value = object[key];
if (value === undefined) {
return '';
}
if (value === null) {
return encode(key, options);
}
if (Array.isArray(value)) {
if (value.length === 0 && options.arrayFormat === 'bracket-separator') {
return encode(key, options) + '[]';
}
return value
.reduce(formatter(key), [])
.join('&');
}
return encode(key, options) + '=' + encode(value, options);
}).filter(x => x.length > 0).join('&');
};
exports.parseUrl = (url, options) => {
options = Object.assign({
decode: true
}, options);
const [url_, hash] = splitOnFirst$1(url, '#');
return Object.assign(
{
url: url_.split('?')[0] || '',
query: parse(extract(url), options)
},
options && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}
);
};
exports.stringifyUrl = (object, options) => {
options = Object.assign({
encode: true,
strict: true,
[encodeFragmentIdentifier]: true
}, options);
const url = removeHash(object.url).split('?')[0] || '';
const queryFromUrl = exports.extract(object.url);
const parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});
const query = Object.assign(parsedQueryFromUrl, object.query);
let queryString = exports.stringify(query, options);
if (queryString) {
queryString = `?${queryString}`;
}
let hash = getHash(object.url);
if (object.fragmentIdentifier) {
hash = `#${options[encodeFragmentIdentifier] ? encode(object.fragmentIdentifier, options) : object.fragmentIdentifier}`;
}
return `${url}${queryString}${hash}`;
};
exports.pick = (input, filter, options) => {
options = Object.assign({
parseFragmentIdentifier: true,
[encodeFragmentIdentifier]: false
}, options);
const {url, query, fragmentIdentifier} = exports.parseUrl(input, options);
return exports.stringifyUrl({
url,
query: filterObject(query, filter),
fragmentIdentifier
}, options);
};
exports.exclude = (input, filter, options) => {
const exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);
return exports.pick(input, exclusionFilter, options);
};
}(queryString));
var _dataProvider = (apiUrl => {
let getToken = async () => {
const session = await Auth__default['default'].currentSession();
return session.idToken.jwtToken;
};
const fetchJson = async (path, options = {}) => {
if (!options.headers) {
options.headers = new Headers({
Accept: 'application/json'
});
}
options.headers.set('Authorization', await getToken());
const accountId = localStorage.getItem('accountId');
if (accountId) {
options.headers.set('Lolo-Account-Id', accountId);
}
return ra.fetchUtils.fetchJson(apiUrl + path, options).catch(err => {
if (err.body && err.body.error) {
// 401, 403, 500
err.message = err.body.error;
} else if (err.body && err.body.errors) {
// 422
err.message = err.body.errors.map(item => {
const field = inflection.humanize(item.dataPath.replace('.body.', ''));
return `${field} ${item.message}`;
}).join(', ');
}
throw err;
});
};
const buildQs = (filter = {}) => Object.entries(filter).reduce((memo, [k, v]) => {
if (v && v.constructor === Object) {
for (const prop in v) {
memo[`q[${k}.${prop}]`] = v[prop];
}
} else {
memo[`q[${k}]`] = v;
}
return memo;
}, {});
const create = async (resource, params) => {
const res = await fetchJson(`/${resource}`, {
method: 'POST',
body: JSON.stringify(params.data)
});
return {
data: res.json
};
};
const getList = async (resource, params, queryOpts = {}) => {
console.log('getList', resource, params, queryOpts);
const {
page = 1,
perPage = 10
} = params.pagination || {};
const {
field = 'id',
order = 'ASC'
} = params.sort || {};
const query = {
limit: perPage,
sort: `${field} ${order.toLowerCase()}`,
offset: (page - 1) * perPage,
...buildQs(params.filter),
...queryOpts
};
const url = `/${resource}?${queryString.stringify(query)}`;
const res = await fetchJson(url);
return {
data: res.json[kebabToCamel(resource)],
total: res.json.total
};
};
return {
/**
* API URL
*/
apiUrl,
/**
* Custom request
*/
sendRequest: async (path, options) => {
const res = await fetchJson(path, options);
return {
data: res.json
};
},
/**
* getList
*/
getList,
/**
* getOne
*/
getOne: async (resource, params) => {
const res = await fetchJson(`/${resource}/${params.id}`);
return {
data: res.json
};
},
/**
* getMany
*/
getMany: (resource, params) => {
params.filter = {
id: params.ids
};
return getList(resource, params, {
qor: 1,
qre: 0,
limit: 100
});
},
/**
* getManyReference
*/
getManyReference: (resource, params) => {
params.filter[params.target] = params.id;
return getList(resource, params, {
qre: 0
});
},
/**
* update
*/
update: (resource, params) => {
return fetchJson(`/${resource}/${params.id}`, {
method: 'PUT',
body: JSON.stringify(params.data)
}).then(res => {
return {
data: res.json
};
});
},
/**
* updateMany
*/
updateMany: (resource, params) => {
throw new Error('Not implemented');
},
/**
* create
*/
create,
/**
* delete
*/
delete: (resource, params) => {
return fetchJson(`/${resource}/${params.id}`, {
method: 'DELETE'
}).then(() => ({
data: resource
}));
},
/**
* deleteMany
*/
deleteMany: async (resource, params) => {
const deletedIds = [];
for (const id of params.ids) {
const url = `/${resource}/${id}`;
try {
await fetchJson(url, {
method: 'DELETE'
});
deletedIds.push(id);
} catch (err) {
console.log('delete error', err);
}
}
return {
data: deletedIds
};
},
/**
* getToken
*/
get getToken() {
return getToken;
},
set getToken(fn) {
getToken = fn;
}
};
});
function kebabToCamel(s) {
return s.replace(/(-\w)/g, function (m) {
return m[1].toUpperCase();
});
}
var i18nProvider = polyglotI18nProvider__default['default'](locale => englishMessages__default['default'], 'en', {
allowMissing: true
});
// in src/createAdminStore.js
var createAdminStore = (({
authProvider,
dataProvider,
history
}) => {
const reducer = redux.combineReducers({
admin: ra.adminReducer,
router: connectedReactRouter.connectRouter(history) // add your own reducers here
});
const resettableAppReducer = (state, action) => reducer(action.type !== ra.USER_LOGOUT ? state : undefined, action);
const saga = function* rootSaga() {
yield effects.all([ra.adminSaga(dataProvider, authProvider) // add your own sagas here
].map(effects.fork));
};
const sagaMiddleware = createSagaMiddleware__default['default']();
const composeEnhancers = process.env.NODE_ENV === 'development' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
trace: true,
traceLimit: 25
}) || redux.compose;
const store = redux.createStore(resettableAppReducer, {
/* set your initial state here */
}, composeEnhancers(redux.applyMiddleware(sagaMiddleware, connectedReactRouter.routerMiddleware(history) // add your own middlewares here
) // add your own enhancers here
));
sagaMiddleware.run(saga);
return store;
});
const customlocalStorage = {
setItem: (key, value) => {
let event = new Event('localStorageItemUpdated');
event.key = key;
event.value = value;
localStorage.setItem(key, value);
window.dispatchEvent(event);
},
removeItem: key => {
let event = new Event('localStorageItemUpdated');
localStorage.removeItem(key);
window.dispatchEvent(event);
},
getItem: key => {
return localStorage.getItem(key);
}
};
function useAuth() {
const [jwtToken, setJwtToken] = React.useState(null);
React.useEffect(() => {
exports.authProvider.init(token => {
setJwtToken(token);
});
}, []);
return {
jwtToken
};
}
function useIsMountedRef() {
const isMountedRef = React.useRef(null);
React.useEffect(() => {
isMountedRef.current = true;
return () => isMountedRef.current = false;
}, []);
return isMountedRef;
}
const AdminDataContext = /*#__PURE__*/React__default['default'].createContext({});
function useAdminContext() {
const context = React__default['default'].useContext(AdminDataContext);
if (!context) {
throw new Error('useAdminContext must be used within AdminContext');
}
return context;
}
const defaultAccountsUrl = 'https://dev.lolo.company/api/accounts/all';
function AdminContext(props) {
const {
data
} = props;
const [accounts, setAccounts] = React.useState([]);
const [selectedAccount, setSelectedAccount] = React.useState(null);
const {
jwtToken
} = useAuth();
const refresh = ra__namespace.useRefresh();
React.useEffect(() => {
const getAccounts = async () => {
const headers = new Headers({
Accept: 'application/json'
});
headers.set('Authorization', jwtToken);
ra__namespace.fetchUtils.fetchJson(data.accountsUrl || defaultAccountsUrl, {
headers
}).then(({
json
}) => {
setAccounts(json.accounts);
setSelectedAccount(getSelectedAccount(json.accounts, refresh));
}).catch(err => {
if (err.status === 401) data.authProvider.logout();
throw err;
});
};
if (jwtToken) {
getAccounts();
}
}, [jwtToken]);
return /*#__PURE__*/React__default['default'].createElement(AdminDataContext.Provider, {
value: {
accounts,
selectedAccount,
setSelectedAccount,
...data
}
}, props.children);
}
const getSelectedAccount = (accounts, refresh) => {
if (accounts.length < 1) return null;
const id = localStorage.getItem('accountId');
const isPrimaryAccount = accounts.find(item => item.isPrimary);
if (id) {
return accounts.find(item => item.id === id) || null;
} else {
if (isPrimaryAccount) {
return isPrimaryAccount;
} else {
localStorage.setItem('accountId', accounts[0].id);
refresh();
return accounts[0];
}
}
};
const ListActions = props => {
const {
className,
exporter,
filters,
maxResults,
hasCreate,
...rest
} = props;
const {
currentSort,
resource,
displayedFilters,
filterValues,
basePath,
showFilter,
total
} = ra__namespace.useListContext();
return /*#__PURE__*/React__default['default'].createElement(ra__namespace.TopToolbar, _extends$A({
className: className
}, ra__namespace.sanitizeListRestProps(rest)), filters && /*#__PURE__*/React.cloneElement(filters, {
resource,
showFilter,
displayedFilters,
filterValues,
context: 'button'
}), hasCreate ? /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(ra__namespace.CreateButton, {
to: {
pathname: `${basePath}/create`,
search: 'source=' + JSON.stringify(filterValues)
}
}), /*#__PURE__*/React__default['default'].createElement(ImportButton, props)) : null, /*#__PURE__*/React__default['default'].createElement(ra__namespace.ExportButton, {
disabled: total === 0,
resource: resource,
sort: currentSort,
filterValues: filterValues,
maxResults: maxResults
}));
};
const CreateActions = ({
basePath,
resource
}) => /*#__PURE__*/React__default['default'].createElement(ra__namespace.TopToolbar, null, /*#__PURE__*/React__default['default'].createElement(ra__namespace.ListButton, {
basePath: basePath,
resource: resource
}));
const EditActions = ({
basePath,
resource
}) => /*#__PURE__*/React__default['default'].createElement(ra__namespace.TopToolbar, null, /*#__PURE__*/React__default['default'].createElement(ra__namespace.ListButton, {
basePath: basePath,
resource: resource
}));
function _objectWithoutPropertiesLoose$k(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
function _objectWithoutProperties$j(source, excluded) {
if (source == null) return {};
var target = _objectWithoutPropertiesLoose$k(source, excluded);
var key, i;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i = 0; i < sourceSymbolKeys.length; i++) {
key = sourceSymbolKeys[i];
if (excluded.indexOf(key) >= 0) continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
target[key] = source[key];
}
}
return target;
}
function _defineProperty$r(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
var propTypes = {exports: {}};
var reactIs = {exports: {}};
var reactIs_production_min = {};
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?
Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119;
function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}reactIs_production_min.AsyncMode=l;reactIs_production_min.ConcurrentMode=m;reactIs_production_min.ContextConsumer=k;reactIs_production_min.ContextProvider=h;reactIs_production_min.Element=c;reactIs_production_min.ForwardRef=n;reactIs_production_min.Fragment=e;reactIs_production_min.Lazy=t;reactIs_production_min.Memo=r;reactIs_production_min.Portal=d;
reactIs_production_min.Profiler=g;reactIs_production_min.StrictMode=f;reactIs_production_min.Suspense=p;reactIs_production_min.isAsyncMode=function(a){return A(a)||z(a)===l};reactIs_production_min.isConcurrentMode=A;reactIs_production_min.isContextConsumer=function(a){return z(a)===k};reactIs_production_min.isContextProvider=function(a){return z(a)===h};reactIs_production_min.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===c};reactIs_production_min.isForwardRef=function(a){return z(a)===n};reactIs_production_min.isFragment=function(a){return z(a)===e};reactIs_production_min.isLazy=function(a){return z(a)===t};
reactIs_production_min.isMemo=function(a){return z(a)===r};reactIs_production_min.isPortal=function(a){return z(a)===d};reactIs_production_min.isProfiler=function(a){return z(a)===g};reactIs_production_min.isStrictMode=function(a){return z(a)===f};reactIs_production_min.isSuspense=function(a){return z(a)===p};
reactIs_production_min.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};reactIs_production_min.typeOf=z;
var reactIs_development = {};
/** @license React v16.13.1
* react-is.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
if (process.env.NODE_ENV !== "production") {
(function() {
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
// nor polyfill, then a plain number is used for performance.
var hasSymbol = typeof Symbol === 'function' && Symbol.for;
var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
// (unstable) APIs that have been removed. Can we remove the symbols?
var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
function isValidElementType(type) {
return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);
}
function typeOf(object) {
if (typeof object === 'object' && object !== null) {
var $$typeof = object.$$typeof;
switch ($$typeof) {
case REACT_ELEMENT_TYPE:
var type = object.type;
switch (type) {
case REACT_ASYNC_MODE_TYPE:
case REACT_CONCURRENT_MODE_TYPE:
case REACT_FRAGMENT_TYPE:
case REACT_PROFILER_TYPE:
case REACT_STRICT_MODE_TYPE:
case REACT_SUSPENSE_TYPE:
return type;
default:
var $$typeofType = type && type.$$typeof;
switch ($$typeofType) {
case REACT_CONTEXT_TYPE:
case REACT_FORWARD_REF_TYPE:
case REACT_LAZY_TYPE:
case REACT_MEMO_TYPE:
case REACT_PROVIDER_TYPE:
return $$typeofType;
default:
return $$typeof;
}
}
case REACT_PORTAL_TYPE:
return $$typeof;
}
}
return undefined;
} // AsyncMode is deprecated along with isAsyncMode
var AsyncMode = REACT_ASYNC_MODE_TYPE;
var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
var ContextConsumer = REACT_CONTEXT_TYPE;
var ContextProvider = REACT_PROVIDER_TYPE;
var Element = REACT_ELEMENT_TYPE;
var ForwardRef = REACT_FORWARD_REF_TYPE;
var Fragment = REACT_FRAGMENT_TYPE;
var Lazy = REACT_LAZY_TYPE;
var Memo = REACT_MEMO_TYPE;
var Portal = REACT_PORTAL_TYPE;
var Profiler = REACT_PROFILER_TYPE;
var StrictMode = REACT_STRICT_MODE_TYPE;
var Suspense = REACT_SUSPENSE_TYPE;
var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated
function isAsyncMode(object) {
{
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
}
}
return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
}
function isConcurrentMode(object) {
return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
}
function isContextConsumer(object) {
return typeOf(object) === REACT_CONTEXT_TYPE;
}
function isContextProvider(object) {
return typeOf(object) === REACT_PROVIDER_TYPE;
}
function isElement(object) {
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
}
function isForwardRef(object) {
return typeOf(object) === REACT_FORWARD_REF_TYPE;
}
function isFragment(object) {
return typeOf(object) === REACT_FRAGMENT_TYPE;
}
function isLazy(object) {
return typeOf(object) === REACT_LAZY_TYPE;
}
function isMemo(object) {
return typeOf(object) === REACT_MEMO_TYPE;
}
function isPortal(object) {
return typeOf(object) === REACT_PORTAL_TYPE;
}
function isProfiler(object) {
return typeOf(object) === REACT_PROFILER_TYPE;
}
function isStrictMode(object) {
return typeOf(object) === REACT_STRICT_MODE_TYPE;
}
function isSuspense(object) {
return typeOf(object) === REACT_SUSPENSE_TYPE;
}
reactIs_development.AsyncMode = AsyncMode;
reactIs_development.ConcurrentMode = ConcurrentMode;
reactIs_development.ContextConsumer = ContextConsumer;
reactIs_development.ContextProvider = ContextProvider;
reactIs_development.Element = Element;
reactIs_development.ForwardRef = ForwardRef;
reactIs_development.Fragment = Fragment;
reactIs_development.Lazy = Lazy;
reactIs_development.Memo = Memo;
reactIs_development.Portal = Portal;
reactIs_development.Profiler = Profiler;
reactIs_development.StrictMode = StrictMode;
reactIs_development.Suspense = Suspense;
reactIs_development.isAsyncMode = isAsyncMode;
reactIs_development.isConcurrentMode = isConcurrentMode;
reactIs_development.isContextConsumer = isContextConsumer;
reactIs_development.isContextProvider = isContextProvider;
reactIs_development.isElement = isElement;
reactIs_development.isForwardRef = isForwardRef;
reactIs_development.isFragment = isFragment;
reactIs_development.isLazy = isLazy;
reactIs_development.isMemo = isMemo;
reactIs_development.isPortal = isPortal;
reactIs_development.isProfiler = isProfiler;
reactIs_development.isStrictMode = isStrictMode;
reactIs_development.isSuspense = isSuspense;
reactIs_development.isValidElementType = isValidElementType;
reactIs_development.typeOf = typeOf;
})();
}
if (process.env.NODE_ENV === 'production') {
reactIs.exports = reactIs_production_min;
} else {
reactIs.exports = reactIs_development;
}
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty$h = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject$3(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
var from;
var to = toObject$3(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key in from) {
if (hasOwnProperty$h.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var ReactPropTypesSecret$3 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
var ReactPropTypesSecret_1 = ReactPropTypesSecret$3;
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var printWarning$1 = function() {};
if (process.env.NODE_ENV !== 'production') {
var ReactPropTypesSecret$2 = ReactPropTypesSecret_1;
var loggedTypeFailures = {};
var has$6 = Function.call.bind(Object.prototype.hasOwnProperty);
printWarning$1 = function(text) {
var message = 'Warning: ' + text;
if (typeof console !== 'undefined') {
console.error(message);
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error(message);
} catch (x) {}
};
}
/**
* Assert that the values match with the type specs.
* Error messages are memorized and will only be shown once.
*
* @param {object} typeSpecs Map of name to a ReactPropType
* @param {object} values Runtime values that need to be type-checked
* @param {string} location e.g. "prop", "context", "child context"
* @param {string} componentName Name of the component for error messages.
* @param {?Function} getStack Returns the component stack.
* @private
*/
function checkPropTypes$1(typeSpecs, values, location, componentName, getStack) {
if (process.env.NODE_ENV !== 'production') {
for (var typeSpecName in typeSpecs) {
if (has$6(typeSpecs, typeSpecName)) {
var error;
// Prop type validation may throw. In case they do, we don't want to
// fail the render phase where it didn't fail before. So we log it.
// After these have been cleaned up, we'll let them throw.
try {
// This is intentionally an invariant that gets caught. It's the same
// behavior as without this statement except with a better message.
if (typeof typeSpecs[typeSpecName] !== 'function') {
var err = Error(
(componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
);
err.name = 'Invariant Violation';
throw err;
}
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$2);
} catch (ex) {
error = ex;
}
if (error && !(error instanceof Error)) {
printWarning$1(
(componentName || 'React class') + ': type specification of ' +
location + ' `' + typeSpecName + '` is invalid; the type checker ' +
'function must return `null` or an `Error` but returned