Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 9dfaaab

Browse files
committed
fix previews for Maps/Sets
1 parent d41dc96 commit 9dfaaab

File tree

11 files changed

+178
-134
lines changed

11 files changed

+178
-134
lines changed

.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
},
5757
"env": {
5858
"browser": true,
59-
"node": true
59+
"node": true,
60+
"es6": true
6061
}
6162
}

demo/dist/index.html

Lines changed: 0 additions & 14 deletions
This file was deleted.

demo/dist/js/bundle.js

Lines changed: 0 additions & 65 deletions
This file was deleted.

demo/src/js/DemoApp.jsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ class DemoApp extends React.Component {
143143
<Button onClick={this.props.addRecursive} style={styles.button}>
144144
Add Recursive
145145
</Button>
146+
<Button onClick={this.props.addNativeMap} style={styles.button}>
147+
Add Native Map
148+
</Button>
146149
<Button onClick={this.props.addImmutableMap} style={styles.button}>
147150
Add Immutable Map
148151
</Button>
@@ -230,6 +233,7 @@ export default connect(
230233
addIterator: () => ({ type: 'ADD_ITERATOR' }),
231234
addHugeObect: () => ({ type: 'ADD_HUGE_OBJECT' }),
232235
addRecursive: () => ({ type: 'ADD_RECURSIVE' }),
236+
addNativeMap: () => ({ type: 'ADD_NATIVE_MAP' }),
233237
addImmutableMap: () => ({ type: 'ADD_IMMUTABLE_MAP' }),
234238
changeImmutableNested: () => ({ type: 'CHANGE_IMMUTABLE_NESTED' }),
235239
hugePayload: () => ({

demo/src/js/reducers.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,25 @@ const IMMUTABLE_MAP = Immutable.Map({
2525
seq: Immutable.Seq.of(1, 2, 3, 4, 5, 6, 7, 8)
2626
});
2727

28+
const NATIVE_MAP = new window.Map([
29+
['map', new window.Map([
30+
[{ first: true }, 1],
31+
['second', 2]
32+
])],
33+
['weakMap', new window.WeakMap([
34+
[{ first: true }, 1],
35+
[{ second: 1 }, 2]
36+
])],
37+
['set', new window.Set([
38+
{ first: true },
39+
'second'
40+
])],
41+
['weakSet', new window.WeakSet([
42+
{ first: true },
43+
{ second: 1 }
44+
])]
45+
]);
46+
2847
/* eslint-enable babel/new-cap */
2948

3049
const HUGE_ARRAY = Array.from({ length: 5000 })
@@ -71,23 +90,24 @@ export default {
7190
iterators: (state=[], action) => action.type === 'ADD_ITERATOR' ?
7291
[...state, createIterator()] : state,
7392
nested: (state=NESTED, action) =>
74-
action.type === 'CHANGE_NESTED' ?
75-
{
76-
...state,
77-
long: {
78-
nested: [{
79-
path: {
80-
to: {
81-
a: state.long.nested[0].path.to.a + '!'
82-
}
93+
action.type === 'CHANGE_NESTED' ? {
94+
...state,
95+
long: {
96+
nested: [{
97+
path: {
98+
to: {
99+
a: state.long.nested[0].path.to.a + '!'
83100
}
84-
}]
85-
}
86-
} : state,
101+
}
102+
}]
103+
}
104+
} : state,
87105
recursive: (state=[], action) => action.type === 'ADD_RECURSIVE' ?
88106
[...state, { ...RECURSIVE }] : state,
89107
immutables: (state=[], action) => action.type === 'ADD_IMMUTABLE_MAP' ?
90108
[...state, IMMUTABLE_MAP] : state,
109+
maps: (state=[], action) => action.type === 'ADD_NATIVE_MAP' ?
110+
[...state, NATIVE_MAP] : state,
91111
immutableNested: (state=IMMUTABLE_NESTED, action) => action.type === 'CHANGE_IMMUTABLE_NESTED' ?
92112
state.updateIn(
93113
['long', 'nested', 0, 'path', 'to', 'a'],
@@ -96,7 +116,7 @@ export default {
96116
addFunction: (state=null, action) => action.type === 'ADD_FUNCTION' ?
97117
{ f: FUNC } : state,
98118
addSymbol: (state=null, action) => action.type === 'ADD_SYMBOL' ?
99-
{ s: window.Symbol('symbol') } : state,
119+
{ s: window.Symbol('symbol'), error: new Error('TEST') } : state,
100120
shuffleArray: (state=DEFAULT_SHUFFLE_ARRAY, action) =>
101121
action.type === 'SHUFFLE_ARRAY' ?
102122
shuffle(state) : state

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
"stats": "webpack --profile --json > stats.json",
99
"start": "webpack-dev-server",
1010
"lint": "eslint --ext .jsx,.js --max-warnings 0 src",
11-
"preversion": "npm run lint & npm run flow",
12-
"version": "npm run build:demo && git add -A .",
11+
"preversion": "npm -s run lint & npm -s run flow",
12+
"version": "npm -s run build:demo && git add -A .",
1313
"postversion": "git push",
1414
"prepublish": "npm run build:lib",
1515
"gh": "git-directory-deploy --directory demo/dist --branch gh-pages",
1616
"flow": "flow",
17-
"test": "npm run lint && npm run flow"
17+
"test": "npm -s run lint && npm -s run flow"
1818
},
1919
"main": "lib/index.js",
2020
"repository": {
@@ -90,7 +90,7 @@
9090
"jss-vendor-prefixer": "^4.0.0",
9191
"lodash.debounce": "^4.0.3",
9292
"react-base16-styling": "^0.4.1",
93-
"react-json-tree": "^0.10.0",
93+
"react-json-tree": "^0.10.5",
9494
"redux-devtools-themes": "^1.0.0"
9595
},
9696
"pre-commit": [

src/DevtoolsInspector.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ export default class DevtoolsInspector extends PureComponent<DefaultProps, Props
132132

133133
componentDidMount() {
134134
this.updateSizeMode();
135-
this.updateSizeTimeout = window.setInterval(this.updateSizeMode.bind(this), 150);
135+
this.updateSizeTimeout = setInterval(this.updateSizeMode.bind(this), 150);
136136
}
137137

138138
componentWillUnmount() {
139-
window.clearTimeout(this.updateSizeTimeout);
139+
clearTimeout(this.updateSizeTimeout);
140140
}
141141

142142
updateMonitorState(monitorState: MonitorState) {

src/tabs/getItemString.js

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,126 @@
11
// @flow
22
import React from 'react';
3-
import { Iterable } from 'immutable';
4-
import isIterable from '../utils/isIterable';
3+
import getType from '../utils/getType';
54

65
import type { StylingFunction } from 'react-base16-styling';
76

8-
const IS_IMMUTABLE_KEY = '@@__IS_IMMUTABLE__@@';
7+
function getShortTypeString(val: any, diff?: boolean): string {
8+
const type = getType(val);
99

10-
function isImmutable(value): boolean {
11-
return Iterable.isKeyed(value) || Iterable.isIndexed(value) || Iterable.isIterable(value);
12-
}
13-
14-
function getShortTypeString(val, diff): string {
1510
if (diff && Array.isArray(val)) {
1611
val = val[val.length === 2 ? 1 : 0];
1712
}
1813

19-
if (isIterable(val) && !isImmutable(val)) {
14+
switch (type) {
15+
case 'Immutable List':
16+
case 'Immutable Stack':
17+
case 'Immutable Seq':
18+
return '<I>' + val.size ? '[…]' : '[]';
19+
case 'Map':
20+
return val.size ? '{…}' : '{}';
21+
case 'WeakMap':
22+
return '{…}';
23+
case 'Set':
24+
return val.size ? '(…)' : '()';
25+
case 'WeakSet':
26+
return '(…)';
27+
case 'Immutable Map':
28+
case 'Immutable OrderedMap':
29+
return '<I>' + val.size ? '{…}' : '{}';
30+
case 'Immutable Set':
31+
case 'Immutable OrderedSet':
32+
return '<I>' + val.size ? '(…)' : '()';
33+
case 'Iterable':
2034
return '(…)';
21-
} else if (Array.isArray(val)) {
35+
case 'Array':
2236
return val.length > 0 ? '[…]' : '[]';
23-
} else if (val === null) {
37+
case 'Null':
2438
return 'null';
25-
} else if (val === undefined) {
39+
case 'Undefined':
2640
return 'undef';
27-
} else if (typeof val === 'object') {
41+
case 'Error':
42+
return `Error(${getShortTypeString(val.message)}`;
43+
case 'Object':
2844
return Object.keys(val).length > 0 ? '{…}' : '{}';
29-
} else if (typeof val === 'function') {
45+
case 'Function':
3046
return 'fn';
31-
} else if (typeof val === 'string') {
47+
case 'String':
3248
return `"${val.substr(0, 10) + (val.length > 10 ? '…' : '')}"`
33-
} else if ((typeof val: any) === 'symbol') {
49+
case 'Symbol':
3450
return 'symbol';
35-
} else {
36-
return val;
51+
default:
52+
return val.toString();
3753
}
3854
}
3955

56+
function getFirstEntries(data, limit, getEntryString): string {
57+
let idx = 0, arr = [];
58+
59+
for (let entry of data) {
60+
if (idx === 3) {
61+
arr.push('…');
62+
break;
63+
};
64+
arr.push(getEntryString(entry));
65+
idx++;
66+
}
67+
68+
return arr.join(', ');
69+
}
70+
4071
function getText(type, data, isWideLayout, isDiff): string {
41-
if (type === 'Object') {
72+
let str;
73+
type = getType(data);
74+
75+
switch(type) {
76+
case 'Immutable List':
77+
case 'Immutable Stack':
78+
case 'Immutable Seq':
79+
str = getFirstEntries(data, 3, entry => getShortTypeString(entry));
80+
return `<I>[ ${str} ]`;
81+
case 'Map':
82+
str = getFirstEntries(data, 3, entry =>
83+
`${getShortTypeString(entry[0])} => ${getShortTypeString(entry[1])}`
84+
);
85+
return `{ ${str} }`;
86+
case 'WeakMap':
87+
return '{…}';
88+
case 'Set':
89+
str = getFirstEntries(data, 3, entry => getShortTypeString(entry));
90+
return `( ${str} )`;
91+
case 'WeakSet':
92+
return '(…)';
93+
case 'Immutable Map':
94+
case 'Immutable OrderedMap':
95+
str = getFirstEntries(data, 3, entry =>
96+
`${getShortTypeString(entry[0])} => ${getShortTypeString(entry[1])}`
97+
);
98+
return `<I>{ ${str} }`;
99+
case 'Immutable Set':
100+
case 'Immutable OrderedSet':
101+
str = getFirstEntries(data, 3, entry => getShortTypeString(entry));
102+
return `<I>( ${str} )`;
103+
case 'Object':
42104
const keys = Object.keys(data);
43105
if (!isWideLayout) return keys.length ? '{…}' : '{}';
44106

45-
const str = keys
107+
str = keys
46108
.slice(0, 3)
47109
.map(key => `${key}: ${getShortTypeString(data[key], isDiff)}`)
48110
.concat(keys.length > 3 ? ['…'] : [])
49111
.join(', ');
50112

51113
return `{ ${str} }`;
52-
} else if (type === 'Array') {
114+
case 'Array':
53115
if (!isWideLayout) return data.length ? '[…]' : '[]';
54116

55-
const str = data
117+
str = data
56118
.slice(0, 4)
57119
.map(val => getShortTypeString(val, isDiff))
58120
.concat(data.length > 4 ? ['…'] : []).join(', ');
59121

60122
return `[${str}]`;
61-
} else {
123+
default:
62124
return type;
63125
}
64126
}
@@ -71,7 +133,6 @@ const getItemString = (
71133
isDiff: boolean = false
72134
): React$Element<*> =>
73135
<span {...styling('treeItemHint')}>
74-
{data[IS_IMMUTABLE_KEY] ? 'Immutable' : ''}
75136
{getText(type, data, isWideLayout, isDiff)}
76137
</span>;
77138

src/utils/getInspectedState.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
// @flow
22
import { Iterable, fromJS } from 'immutable';
33
import isIterable from './isIterable';
4+
import getType from './getType';
45

56
function iterateToKey(obj, key) { // maybe there's a better way, dunno
67
let idx = 0;
78
for (let entry of obj) {
8-
if (Array.isArray(entry)) {
9-
if (entry[0] === key) return entry[1];
10-
} else {
11-
if (idx > key) return;
12-
if (idx === key) return entry;
13-
}
9+
if (idx === key) return entry;
1410
idx++;
1511
}
1612
}
1713

14+
const entryRegex = /\[entry (\d+)\]/;
15+
1816
export default function getInspectedState(
1917
state: Object, path: ?string[], convertImmutable: boolean
2018
): Object {
@@ -24,8 +22,15 @@ export default function getInspectedState(
2422
if (!s) {
2523
return s;
2624
}
27-
28-
if (Iterable.isAssociative(s)) {
25+
if (Iterable.isAssociative(s) || getType(s) === 'Map') {
26+
if (!s.has(key) && entryRegex.test(key)) {
27+
const match = key.match(entryRegex);
28+
const entry = iterateToKey(s, parseInt(match && match[1], 10));
29+
return entry && {
30+
'[key]': entry[0],
31+
'[value]': entry[1]
32+
};
33+
}
2934
return s.get(key);
3035
} else if (isIterable(s)) {
3136
return iterateToKey(s, parseInt(key, 10));

src/utils/getType.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// @flow
2+
import { List, Map as ImMap, Set as ImSet, OrderedMap, OrderedSet, Stack, Seq } from 'immutable';
3+
import objType from 'react-json-tree/lib/objType';
4+
5+
type Type =
6+
string |
7+
'Immutable List' |
8+
'Immutable Map' |
9+
'Immutable Set' |
10+
'Immutable OrderedMap' |
11+
'Immutable OrderedSet' |
12+
'Immutable Stack' |
13+
'Immutable Seq';
14+
15+
export default function getType(value: any): Type {
16+
if (List.isList(value)) {
17+
return 'Immutable List';
18+
} else if (ImMap.isMap(value)) {
19+
return 'Immutable Map';
20+
} else if (ImSet.isSet(value)) {
21+
return 'Immutable Set';
22+
} else if (OrderedMap.isOrderedMap(value)) {
23+
return 'Immutable OrderedMap';
24+
} else if (OrderedSet.isOrderedSet(value)) {
25+
return 'Immutable OrderedSet';
26+
} else if (Stack.isStack(value)) {
27+
return 'Immutable Stack';
28+
} else if (Seq.isSeq(value)) {
29+
return 'Immutable Seq';
30+
}
31+
32+
return objType(value);
33+
}

0 commit comments

Comments
 (0)