Skip to content

Commit da856a7

Browse files
Merge pull request #33 from CarstenWickner/discard-extraneous-proptypes
Discard extraneous proptypes
2 parents 42c04f1 + bbf5de9 commit da856a7

29 files changed

+313
-712
lines changed

.eslintrc.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"max-len": ["warn", 150],
4848
"quotes": ["error", "double"],
4949
"react/jsx-indent": ["error", 4],
50-
"react/jsx-indent-props": ["error", 4]
50+
"react/jsx-indent-props": ["error", 4],
51+
"react/prop-types": "off"
5152
}
5253
}

CHANGELOG.MD

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Fixed
9+
- ignore non-`string` values when searching by `fields`
10+
11+
### Removed
12+
- run-time proptype validation for JSON Schemas (now only at compile-time through TypeScript)
13+
- proptype validations for internal (i.e. not exported) components
814

915
## [4.0.0] - 2019-10-28
1016
### Changed

src/component/Inspector.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { InspectorColView } from "./InspectorColView";
1111
import { InspectorDetails } from "./InspectorDetails";
1212
import { InspectorBreadcrumbs } from "./InspectorBreadcrumbs";
1313
import { InspectorSearchField } from "./InspectorSearchField";
14-
import { JsonSchemaPropType } from "./JsonSchemaPropType";
1514
import { createRenderDataBuilder, createFilterFunctionForColumn } from "./renderDataUtils";
1615

1716
import { createBreadcrumbBuilder } from "./breadcrumbsUtils";
@@ -207,7 +206,7 @@ export class Inspector extends React.Component<
207206
};
208207
}, isDeepEqual);
209208

210-
render(): React.ReactNode {
209+
render(): React.ReactElement {
211210
const {
212211
schemas,
213212
referenceSchemas,
@@ -254,8 +253,8 @@ export class Inspector extends React.Component<
254253
}
255254

256255
static propTypes = {
257-
schemas: PropTypes.objectOf(JsonSchemaPropType).isRequired,
258-
referenceSchemas: PropTypes.arrayOf(JsonSchemaPropType),
256+
schemas: PropTypes.objectOf(PropTypes.object).isRequired,
257+
referenceSchemas: PropTypes.arrayOf(PropTypes.object),
259258
defaultSelectedItems: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.number)])),
260259
parserConfig: PropTypes.shape({
261260
anyOf: PropTypes.shape({
Lines changed: 49 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,57 @@
1-
import * as PropTypes from "prop-types";
21
import * as React from "react";
32
import classNames from "classnames";
43

5-
import { ColumnDataPropType } from "./renderDataUtils";
64
import { createBreadcrumbBuilder } from "./breadcrumbsUtils";
75
import { InspectorProps, RenderColumn, RenderOptionsColumn } from "./InspectorTypes";
86

9-
export class InspectorBreadcrumbs extends React.Component<{
7+
export const InspectorBreadcrumbs: React.FunctionComponent<{
108
columnData: Array<RenderColumn>;
119
breadcrumbsOptions: InspectorProps["breadcrumbs"];
12-
}> {
13-
render(): React.ReactNode {
14-
const { columnData, breadcrumbsOptions } = this.props;
15-
const buildBreadcrumb = createBreadcrumbBuilder(breadcrumbsOptions);
16-
const { preventNavigation, renderItem, renderTrailingContent } = breadcrumbsOptions;
17-
return (
18-
<>
19-
<div className="jsonschema-inspector-breadcrumbs">
20-
<span className="jsonschema-inspector-breadcrumbs-icon" />
21-
{columnData.map((column, index) => {
22-
const breadcrumbText = buildBreadcrumb(column, index);
23-
if (!breadcrumbText) {
24-
// omit empty breadcrumb
25-
return null;
26-
}
27-
const hasNestedItems =
28-
index < columnData.length - 2 ||
29-
(index === columnData.length - 2 &&
30-
(!(columnData[columnData.length - 1] as RenderOptionsColumn).options ||
31-
!columnData[columnData.length - 1].selectedItem));
32-
if (renderItem) {
33-
return renderItem({
34-
breadcrumbText,
35-
hasNestedItems,
36-
column,
37-
index
38-
});
39-
}
40-
const { selectedItem, onSelect } = column;
41-
return (
42-
<span
43-
key={index}
44-
className={classNames({
45-
"jsonschema-inspector-breadcrumbs-item": true,
46-
"has-nested-items": hasNestedItems
47-
})}
48-
onDoubleClick={preventNavigation ? undefined : (event): void => onSelect(event, selectedItem)}
49-
>
50-
{breadcrumbText}
51-
</span>
52-
);
53-
})}
54-
</div>
55-
{renderTrailingContent &&
56-
renderTrailingContent({
57-
breadcrumbTexts: columnData.map(buildBreadcrumb).filter((b) => !!b),
58-
columnData
59-
})}
60-
</>
61-
);
62-
}
63-
64-
static propTypes = {
65-
columnData: ColumnDataPropType.isRequired,
66-
breadcrumbsOptions: PropTypes.shape({
67-
prefix: PropTypes.string,
68-
separator: PropTypes.string,
69-
skipSeparator: PropTypes.func,
70-
mutateName: PropTypes.func,
71-
preventNavigation: PropTypes.bool,
72-
renderItem: PropTypes.func,
73-
renderTrailingContent: PropTypes.func
74-
}).isRequired
75-
};
76-
}
10+
}> = ({ columnData, breadcrumbsOptions }): React.ReactElement => {
11+
const buildBreadcrumb = createBreadcrumbBuilder(breadcrumbsOptions);
12+
const { preventNavigation, renderItem, renderTrailingContent } = breadcrumbsOptions;
13+
return (
14+
<>
15+
<div className="jsonschema-inspector-breadcrumbs">
16+
<span className="jsonschema-inspector-breadcrumbs-icon" />
17+
{columnData.map((column, index) => {
18+
const breadcrumbText = buildBreadcrumb(column, index);
19+
if (!breadcrumbText) {
20+
// omit empty breadcrumb
21+
return null;
22+
}
23+
const hasNestedItems =
24+
index < columnData.length - 2 ||
25+
(index === columnData.length - 2 &&
26+
(!(columnData[columnData.length - 1] as RenderOptionsColumn).options || !columnData[columnData.length - 1].selectedItem));
27+
if (renderItem) {
28+
return renderItem({
29+
breadcrumbText,
30+
hasNestedItems,
31+
column,
32+
index
33+
});
34+
}
35+
const { selectedItem, onSelect } = column;
36+
return (
37+
<span
38+
key={index}
39+
className={classNames({
40+
"jsonschema-inspector-breadcrumbs-item": true,
41+
"has-nested-items": hasNestedItems
42+
})}
43+
onDoubleClick={preventNavigation ? undefined : (event): void => onSelect(event, selectedItem)}
44+
>
45+
{breadcrumbText}
46+
</span>
47+
);
48+
})}
49+
</div>
50+
{renderTrailingContent &&
51+
renderTrailingContent({
52+
breadcrumbTexts: columnData.map(buildBreadcrumb).filter((b) => !!b),
53+
columnData
54+
})}
55+
</>
56+
);
57+
};

src/component/InspectorColView.tsx

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
import * as PropTypes from "prop-types";
21
import * as React from "react";
32

43
import { InspectorColumn } from "./InspectorColumn";
54
import { InspectorOptionsColumn } from "./InspectorOptionsColumn";
6-
import { ColumnDataPropType } from "./renderDataUtils";
75
import { InspectorProps, RenderItemsColumn, RenderOptionsColumn } from "./InspectorTypes";
86

9-
interface ColViewDefaultProps {
10-
appendEmptyColumn: boolean;
11-
renderItemContent: InspectorProps["renderItemContent"];
12-
}
13-
14-
export interface ColViewProps extends ColViewDefaultProps {
7+
export interface ColViewProps {
158
columnData: Array<RenderItemsColumn | RenderOptionsColumn>;
9+
appendEmptyColumn?: boolean;
10+
renderItemContent?: InspectorProps["renderItemContent"];
1611
}
1712

1813
export class InspectorColView extends React.Component<ColViewProps> {
@@ -33,7 +28,7 @@ export class InspectorColView extends React.Component<ColViewProps> {
3328
}
3429
}
3530

36-
render(): React.ReactNode {
31+
render(): React.ReactElement {
3732
const { columnData, appendEmptyColumn, renderItemContent } = this.props;
3833
return (
3934
<div className="jsonschema-inspector-colview" ref={this.colViewContainerRef} tabIndex={-1}>
@@ -70,15 +65,4 @@ export class InspectorColView extends React.Component<ColViewProps> {
7065
</div>
7166
);
7267
}
73-
74-
static propTypes = {
75-
columnData: ColumnDataPropType.isRequired,
76-
appendEmptyColumn: PropTypes.bool,
77-
renderItemContent: PropTypes.func // func({ string: name, boolean: hasNestedItems, boolean: selected, JsonSchema: schema })
78-
};
79-
80-
static defaultProps: ColViewDefaultProps = {
81-
appendEmptyColumn: false,
82-
renderItemContent: undefined
83-
};
8468
}

src/component/InspectorColumn.tsx

Lines changed: 33 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,39 @@
1-
import * as PropTypes from "prop-types";
21
import * as React from "react";
32
import classNames from "classnames";
43

54
import { InspectorItem } from "./InspectorItem";
6-
import { RenderItemsColumnPropTypeShape } from "./renderDataUtils";
75
import { InspectorProps, RenderItemsColumn } from "./InspectorTypes";
86

9-
interface ColumnDefaultProps {
10-
selectedItem: RenderItemsColumn["selectedItem"];
11-
filteredItems: RenderItemsColumn["filteredItems"];
12-
trailingSelection: RenderItemsColumn["trailingSelection"];
13-
renderItemContent: InspectorProps["renderItemContent"];
14-
}
15-
16-
export class InspectorColumn extends React.Component<
17-
{
18-
items: RenderItemsColumn["items"];
19-
onSelect: RenderItemsColumn["onSelect"];
20-
} & ColumnDefaultProps
21-
> {
22-
render(): React.ReactNode {
23-
const { items, selectedItem, filteredItems, trailingSelection, onSelect, renderItemContent } = this.props;
24-
return (
25-
<div
26-
className={classNames({
27-
"jsonschema-inspector-column": true,
28-
"with-selection": selectedItem,
29-
"trailing-selection": trailingSelection
30-
})}
31-
onClick={onSelect}
32-
role="presentation"
33-
tabIndex={-1}
34-
>
35-
{Object.keys(items)
36-
.sort()
37-
.map((name) => (
38-
<InspectorItem
39-
key={name}
40-
name={name}
41-
schemaGroup={items[name]}
42-
selected={name === selectedItem}
43-
matchesFilter={filteredItems ? filteredItems.includes(name) : undefined}
44-
onSelect={(event): void => onSelect(event, name)}
45-
renderContent={renderItemContent}
46-
/>
47-
))}
48-
</div>
49-
);
50-
}
51-
52-
static propTypes = {
53-
...RenderItemsColumnPropTypeShape,
54-
renderItemContent: PropTypes.func // func({ string: name, boolean: hasNestedItems, boolean: selected, JsonSchema: schema })
55-
};
56-
57-
static defaultProps: ColumnDefaultProps = {
58-
selectedItem: undefined,
59-
filteredItems: undefined,
60-
trailingSelection: false,
61-
renderItemContent: undefined
62-
};
63-
}
7+
export const InspectorColumn: React.FunctionComponent<{
8+
items: RenderItemsColumn["items"];
9+
onSelect: RenderItemsColumn["onSelect"];
10+
selectedItem?: RenderItemsColumn["selectedItem"];
11+
filteredItems?: RenderItemsColumn["filteredItems"];
12+
trailingSelection?: RenderItemsColumn["trailingSelection"];
13+
renderItemContent?: InspectorProps["renderItemContent"];
14+
}> = ({ items, selectedItem, filteredItems, trailingSelection, onSelect, renderItemContent }): React.ReactElement => (
15+
<div
16+
className={classNames({
17+
"jsonschema-inspector-column": true,
18+
"with-selection": selectedItem,
19+
"trailing-selection": trailingSelection
20+
})}
21+
onClick={onSelect}
22+
role="presentation"
23+
tabIndex={-1}
24+
>
25+
{Object.keys(items)
26+
.sort()
27+
.map((name) => (
28+
<InspectorItem
29+
key={name}
30+
name={name}
31+
schemaGroup={items[name]}
32+
selected={name === selectedItem}
33+
matchesFilter={filteredItems ? filteredItems.includes(name) : undefined}
34+
onSelect={(event): void => onSelect(event, name)}
35+
renderContent={renderItemContent}
36+
/>
37+
))}
38+
</div>
39+
);

0 commit comments

Comments
 (0)