diff --git a/addons/actions/src/util.js b/addons/actions/src/util.js index b93c00ceea41..b3cac28e2506 100644 --- a/addons/actions/src/util.js +++ b/addons/actions/src/util.js @@ -70,9 +70,12 @@ export function decycle(object, depth = 15) { } else { obj = { [CLASS_NAME_KEY]: value.constructor ? value.constructor.name : 'Object' }; - Object.keys(value).forEach(name => { + // We want to iterate over all the enumerable properties, including the ones in prototype chain + // eslint-disable-next-line no-restricted-syntax, guard-for-in + for (const name in value) { + // noinspection JSUnfilteredForInLoop obj[name] = derez(value[name], `${path}[${JSON.stringify(name)}]`, _depth + 1); - }); + } } if (_depth === 0 && isObject(value) && isCyclic) { diff --git a/examples/cra-kitchen-sink/src/stories/__snapshots__/addon-actions.stories.storyshot b/examples/cra-kitchen-sink/src/stories/__snapshots__/addon-actions.stories.storyshot new file mode 100644 index 000000000000..10772f38a115 --- /dev/null +++ b/examples/cra-kitchen-sink/src/stories/__snapshots__/addon-actions.stories.storyshot @@ -0,0 +1,56 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots Addon Actions Circular Payload 1`] = ` + +`; + +exports[`Storyshots Addon Actions Decorated Action 1`] = ` + +`; + +exports[`Storyshots Addon Actions File object as payload 1`] = ` + +`; + +exports[`Storyshots Addon Actions Function Name 1`] = ` + +`; + +exports[`Storyshots Addon Actions Hello World 1`] = ` + +`; + +exports[`Storyshots Addon Actions Reserved keyword as name 1`] = ` + +`; diff --git a/examples/cra-kitchen-sink/src/stories/addon-actions.stories.js b/examples/cra-kitchen-sink/src/stories/addon-actions.stories.js index 04feb6fafade..8059166df83b 100644 --- a/examples/cra-kitchen-sink/src/stories/addon-actions.stories.js +++ b/examples/cra-kitchen-sink/src/stories/addon-actions.stories.js @@ -2,6 +2,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; import { action, decorateAction } from '@storybook/addon-actions'; import { Button } from '@storybook/react/demo'; +import { File } from 'global'; const pickFirst = decorateAction([args => args.slice(0, 1)]); @@ -17,4 +18,8 @@ storiesOf('Addon Actions', module) const fn = action('fnName'); return ; }) - .add('Reserved keyword as name', () => ); + .add('Reserved keyword as name', () => ) + .add('File object as payload', () => { + const file = new File([''], 'filename.txt', { type: 'text/plain', lastModified: new Date() }); + return ; + });