UNPKG

8.14 kBJavaScriptView Raw
1import { isPlainObject, isUndefined, isNull, isNumber, isBoolean, isString, isArray, RUNTIME_CHECK_URL, isComponent, } from './utils';
2export function serializationCheckMetaReducer(reducer, checks) {
3 return function (state, action) {
4 if (checks.action(action)) {
5 const unserializableAction = getUnserializable(action);
6 throwIfUnserializable(unserializableAction, 'action');
7 }
8 const nextState = reducer(state, action);
9 if (checks.state()) {
10 const unserializableState = getUnserializable(nextState);
11 throwIfUnserializable(unserializableState, 'state');
12 }
13 return nextState;
14 };
15}
16function getUnserializable(target, path = []) {
17 // Guard against undefined and null, e.g. a reducer that returns undefined
18 if ((isUndefined(target) || isNull(target)) && path.length === 0) {
19 return {
20 path: ['root'],
21 value: target,
22 };
23 }
24 const keys = Object.keys(target);
25 return keys.reduce((result, key) => {
26 if (result) {
27 return result;
28 }
29 const value = target[key];
30 // Ignore Ivy components
31 if (isComponent(value)) {
32 return result;
33 }
34 if (isUndefined(value) ||
35 isNull(value) ||
36 isNumber(value) ||
37 isBoolean(value) ||
38 isString(value) ||
39 isArray(value)) {
40 return false;
41 }
42 if (isPlainObject(value)) {
43 return getUnserializable(value, [...path, key]);
44 }
45 return {
46 path: [...path, key],
47 value,
48 };
49 }, false);
50}
51function throwIfUnserializable(unserializable, context) {
52 if (unserializable === false) {
53 return;
54 }
55 const unserializablePath = unserializable.path.join('.');
56 const error = new Error(`Detected unserializable ${context} at "${unserializablePath}". ${RUNTIME_CHECK_URL}#strict${context}serializability`);
57 error.value = unserializable.value;
58 error.unserializablePath = unserializablePath;
59 throw error;
60}
61//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbl9yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yZS9zcmMvbWV0YS1yZWR1Y2Vycy9zZXJpYWxpemF0aW9uX3JlZHVjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGFBQWEsRUFDYixXQUFXLEVBQ1gsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsV0FBVyxHQUNaLE1BQU0sU0FBUyxDQUFDO0FBRWpCLE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsT0FBZ0MsRUFDaEMsTUFBcUU7SUFFckUsT0FBTyxVQUFVLEtBQUssRUFBRSxNQUFNO1FBQzVCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6QixNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZELHFCQUFxQixDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQixNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pELHFCQUFxQixDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLE1BQVksRUFDWixPQUFpQixFQUFFO0lBRW5CLDBFQUEwRTtJQUMxRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hFLE9BQU87WUFDTCxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZCxLQUFLLEVBQUUsTUFBTTtTQUNkLENBQUM7S0FDSDtJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUF5QyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN6RSxJQUFJLE1BQU0sRUFBRTtZQUNWLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLEtBQUssR0FBSSxNQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkMsd0JBQXdCO1FBQ3hCLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxJQUNFLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNiLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDZixTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ2hCLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ2Q7WUFDQSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTztZQUNMLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUNwQixLQUFLO1NBQ04sQ0FBQztJQUNKLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixjQUFzRCxFQUN0RCxPQUEyQjtJQUUzQixJQUFJLGNBQWMsS0FBSyxLQUFLLEVBQUU7UUFDNUIsT0FBTztLQUNSO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RCxNQUFNLEtBQUssR0FBUSxJQUFJLEtBQUssQ0FDMUIsMkJBQTJCLE9BQU8sUUFBUSxrQkFBa0IsTUFBTSxpQkFBaUIsVUFBVSxPQUFPLGlCQUFpQixDQUN0SCxDQUFDO0lBQ0YsS0FBSyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUM5QyxNQUFNLEtBQUssQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25SZWR1Y2VyLCBBY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNVbmRlZmluZWQsXG4gIGlzTnVsbCxcbiAgaXNOdW1iZXIsXG4gIGlzQm9vbGVhbixcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIFJVTlRJTUVfQ0hFQ0tfVVJMLFxuICBpc0NvbXBvbmVudCxcbn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemF0aW9uQ2hlY2tNZXRhUmVkdWNlcihcbiAgcmVkdWNlcjogQWN0aW9uUmVkdWNlcjxhbnksIGFueT4sXG4gIGNoZWNrczogeyBhY3Rpb246IChhY3Rpb246IEFjdGlvbikgPT4gYm9vbGVhbjsgc3RhdGU6ICgpID0+IGJvb2xlYW4gfVxuKTogQWN0aW9uUmVkdWNlcjxhbnksIGFueT4ge1xuICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoY2hlY2tzLmFjdGlvbihhY3Rpb24pKSB7XG4gICAgICBjb25zdCB1bnNlcmlhbGl6YWJsZUFjdGlvbiA9IGdldFVuc2VyaWFsaXphYmxlKGFjdGlvbik7XG4gICAgICB0aHJvd0lmVW5zZXJpYWxpemFibGUodW5zZXJpYWxpemFibGVBY3Rpb24sICdhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuXG4gICAgaWYgKGNoZWNrcy5zdGF0ZSgpKSB7XG4gICAgICBjb25zdCB1bnNlcmlhbGl6YWJsZVN0YXRlID0gZ2V0VW5zZXJpYWxpemFibGUobmV4dFN0YXRlKTtcbiAgICAgIHRocm93SWZVbnNlcmlhbGl6YWJsZSh1bnNlcmlhbGl6YWJsZVN0YXRlLCAnc3RhdGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dFN0YXRlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRVbnNlcmlhbGl6YWJsZShcbiAgdGFyZ2V0PzogYW55LFxuICBwYXRoOiBzdHJpbmdbXSA9IFtdXG4pOiBmYWxzZSB8IHsgcGF0aDogc3RyaW5nW107IHZhbHVlOiBhbnkgfSB7XG4gIC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIGFuZCBudWxsLCBlLmcuIGEgcmVkdWNlciB0aGF0IHJldHVybnMgdW5kZWZpbmVkXG4gIGlmICgoaXNVbmRlZmluZWQodGFyZ2V0KSB8fCBpc051bGwodGFyZ2V0KSkgJiYgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogWydyb290J10sXG4gICAgICB2YWx1ZTogdGFyZ2V0LFxuICAgIH07XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KTtcbiAgcmV0dXJuIGtleXMucmVkdWNlPGZhbHNlIHwgeyBwYXRoOiBzdHJpbmdbXTsgdmFsdWU6IGFueSB9PigocmVzdWx0LCBrZXkpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gKHRhcmdldCBhcyBhbnkpW2tleV07XG5cbiAgICAvLyBJZ25vcmUgSXZ5IGNvbXBvbmVudHNcbiAgICBpZiAoaXNDb21wb25lbnQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzVW5kZWZpbmVkKHZhbHVlKSB8fFxuICAgICAgaXNOdWxsKHZhbHVlKSB8fFxuICAgICAgaXNOdW1iZXIodmFsdWUpIHx8XG4gICAgICBpc0Jvb2xlYW4odmFsdWUpIHx8XG4gICAgICBpc1N0cmluZyh2YWx1ZSkgfHxcbiAgICAgIGlzQXJyYXkodmFsdWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZ2V0VW5zZXJpYWxpemFibGUodmFsdWUsIFsuLi5wYXRoLCBrZXldKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogWy4uLnBhdGgsIGtleV0sXG4gICAgICB2YWx1ZSxcbiAgICB9O1xuICB9LCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHRocm93SWZVbnNlcmlhbGl6YWJsZShcbiAgdW5zZXJpYWxpemFibGU6IGZhbHNlIHwgeyBwYXRoOiBzdHJpbmdbXTsgdmFsdWU6IGFueSB9LFxuICBjb250ZXh0OiAnc3RhdGUnIHwgJ2FjdGlvbidcbikge1xuICBpZiAodW5zZXJpYWxpemFibGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdW5zZXJpYWxpemFibGVQYXRoID0gdW5zZXJpYWxpemFibGUucGF0aC5qb2luKCcuJyk7XG4gIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoXG4gICAgYERldGVjdGVkIHVuc2VyaWFsaXphYmxlICR7Y29udGV4dH0gYXQgXCIke3Vuc2VyaWFsaXphYmxlUGF0aH1cIi4gJHtSVU5USU1FX0NIRUNLX1VSTH0jc3RyaWN0JHtjb250ZXh0fXNlcmlhbGl6YWJpbGl0eWBcbiAgKTtcbiAgZXJyb3IudmFsdWUgPSB1bnNlcmlhbGl6YWJsZS52YWx1ZTtcbiAgZXJyb3IudW5zZXJpYWxpemFibGVQYXRoID0gdW5zZXJpYWxpemFibGVQYXRoO1xuICB0aHJvdyBlcnJvcjtcbn1cbiJdfQ==
\No newline at end of file