Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ formatted(component);
// </div>"
```

To minimize output, you can ignore the default props like this `decompile(withoutDefaultProps(<Foo />));`

See more examples on the [test file](https://github.com/rogeriochaves/react-decompiler/blob/master/test/decompiler_spec.js)
9 changes: 8 additions & 1 deletion dist/decompiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ var _objectAssign = require('object-assign');

var _objectAssign2 = _interopRequireDefault(_objectAssign);

var _removeDefaultProps = require('./remove-default-props');

var _removeDefaultProps2 = _interopRequireDefault(_removeDefaultProps);

var getProps = function getProps(component) {
return (0, _objectAssign2['default'])((0, _objectAssign2['default'])(getAttribute('key', component), getAttribute('ref', component)), component.props);
};
Expand Down Expand Up @@ -109,6 +113,9 @@ var decompile = stringifyItems;

exports.decompile = decompile;
var formatted = function formatted(items) {
return (0, _jsBeautify.html)(stringifyItems(items), { indent_size: 2 });
return (0, _jsBeautify.html)(decompile(items), { indent_size: 2 });
};

exports.formatted = formatted;
var withoutDefaultProps = _removeDefaultProps2['default'];
exports.withoutDefaultProps = withoutDefaultProps;
38 changes: 38 additions & 0 deletions dist/remove-default-props.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
'use strict';

Object.defineProperty(exports, '__esModule', {
value: true
});

var _extends = 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; };

function _defineProperty(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 _reactAddonsTestUtils = require('react-addons-test-utils');

exports['default'] = function (components) {
return [].concat(components).map(removeDefaultPropsIfReact);
};

var removeDefaultPropsIfReact = function removeDefaultPropsIfReact(item) {
return (0, _reactAddonsTestUtils.isElement)(item) ? removeComponentDefaultProps(item) : item;
};

var removeComponentDefaultProps = function removeComponentDefaultProps(component) {
return _extends({}, component, { props: filterDefaultProps(component) });
};

var filterDefaultProps = function filterDefaultProps(component) {
return Object.keys(component.props).reduce(addPropIfNotDefault(component), {});
};

var addPropIfNotDefault = function addPropIfNotDefault(component) {
return function (accumulated, prop) {
return isDefaultProp(component, prop) ? accumulated : _extends({}, accumulated, _defineProperty({}, prop, removeDefaultPropsIfReact(component.props[prop])));
};
};

var isDefaultProp = function isDefaultProp(component, prop) {
return component.type.defaultProps && component.props[prop] === component.type.defaultProps[prop];
};
module.exports = exports['default'];
2 changes: 1 addition & 1 deletion dist/stringify-object.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,4 @@ module.exports = function (val, opts, pad) {

return '\'' + val.replace(/'/g, '\\\'') + '\'';
})(val, opts, pad);
};
};
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"main": "index.js",
"scripts": {
"test": "node_modules/karma/bin/karma start karma.conf.js",
"prepublish": "mkdir dist; node_modules/babel/bin/babel.js src/decompiler.js --out-file dist/decompiler.js; node_modules/babel/bin/babel.js src/stringify-object.js --out-file dist/stringify-object.js"
"prepublish": "mkdir dist; node_modules/babel/bin/babel.js src --out-dir dist"
},
"author": {
"name": "Rogério Chaves",
Expand Down
7 changes: 5 additions & 2 deletions src/decompiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {isElement as isReact} from 'react-addons-test-utils';
import {html as htmlBeautify} from 'js-beautify';
import stringifyObject from './stringify-object';
import merge from 'object-assign';
import removeDefaultProps from './remove-default-props';

const getProps = component =>
merge(
Expand Down Expand Up @@ -51,7 +52,7 @@ const stringifyComponent = component =>
getChildren(component) ? stringifyComposedComponent(component) : stringifySimpleComponent(component);

const stringifyFunction = value =>
value.toString().replace(/ {[\s\S]*/, '{ ... }')
value.toString().replace(/ {[\s\S]*/, '{ ... }');

const stringifyValue = value => {
switch (typeof value) {
Expand All @@ -70,4 +71,6 @@ const stringifyItems = components =>

export const decompile = stringifyItems;

export const formatted = (items) => htmlBeautify(stringifyItems(items), { indent_size: 2 });
export const formatted = (items) => htmlBeautify(decompile(items), { indent_size: 2 });

export const withoutDefaultProps = removeDefaultProps;
20 changes: 20 additions & 0 deletions src/remove-default-props.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {isElement as isReact} from 'react-addons-test-utils';

export default (components) =>
[].concat(components).map(removeDefaultPropsIfReact)

const removeDefaultPropsIfReact = (item) =>
isReact(item) ? removeComponentDefaultProps(item) : item;

const removeComponentDefaultProps = (component) =>
({...component, props: filterDefaultProps(component)});

const filterDefaultProps = (component) =>
Object.keys(component.props).reduce(addPropIfNotDefault(component), {});

const addPropIfNotDefault = (component) => (accumulated, prop) =>
isDefaultProp(component, prop) ? accumulated :
{...accumulated, [prop]: removeDefaultPropsIfReact(component.props[prop])};

const isDefaultProp = (component, prop) =>
component.type.defaultProps && component.props[prop] === component.type.defaultProps[prop];
38 changes: 37 additions & 1 deletion test/decompiler_spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import ReactTestUtils from 'react-addons-test-utils';
import {decompile, formatted} from 'decompiler';
import {decompile, formatted, withoutDefaultProps} from 'decompiler';

describe('decompiler', () => {

Expand Down Expand Up @@ -241,4 +241,40 @@ describe('decompiler', () => {

expect(decompile(component)).toBe(`<div foo={[ <span />, <div />]} />`);
});

it('stringify should strip out props that have default values', () => {
let Bar = React.createClass({
propTypes: {
baz: React.PropTypes.number
},

getDefaultProps () {
return { baz: 456 };
},

render () {
return <span>Bar</span>;
}
});

let Baz = React.createClass({
propTypes: {
name: React.PropTypes.string,
greeting: React.PropTypes.string
},

getDefaultProps () {
return { baz: 456, greeting: "hello" };
},

render () {
return <span>{this.props.name}</span>;
}
});

expect(decompile(withoutDefaultProps(<Bar/>))).toBe('<Bar />');
expect(decompile(withoutDefaultProps(<Bar baz={456}/>))).toBe('<Bar />');
expect(decompile(withoutDefaultProps(<Bar baz={123}/>))).toBe('<Bar baz={123} />');
expect(decompile(withoutDefaultProps(<Bar baz={123} foo={<Baz name="Bob" greeting="hello" />} />))).toBe('<Bar baz={123} foo={<Baz name="Bob" />} />');
});
});