Skip to content

Commit 61bfb97

Browse files
committed
feat: weakmap metadata
1 parent 8167911 commit 61bfb97

File tree

7 files changed

+28
-21
lines changed

7 files changed

+28
-21
lines changed

src/components/SchemaRow.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { IRowRendererOptions, Tree } from '@stoplight/tree-list';
22
import cn from 'classnames';
33
import * as React from 'react';
44

5-
import { metadataStore } from '../tree/metadata';
5+
import { getNodeMetadata, metadataStore } from '../tree/metadata';
66
import { GoToRefHandler, SchemaTreeListNode } from '../types';
77
import { Caret, Description, Divider, Property, Validations } from './shared';
88

@@ -18,15 +18,10 @@ const ICON_DIMENSION = 20;
1818
const ROW_OFFSET = 7;
1919

2020
export const SchemaRow: React.FunctionComponent<ISchemaRow> = ({ className, node, rowOptions, onGoToRef }) => {
21-
const metadata = metadataStore[node.id];
22-
if (!metadata) {
23-
throw new Error('Missing metadata');
24-
}
25-
21+
const metadata = getNodeMetadata(node);
2622
const { path, schema: schemaNode } = metadata;
2723

28-
const parentSchemaNode =
29-
node.parent === null || !(node.parent.id in metadataStore) ? null : metadataStore[node.parent.id].schema;
24+
const parentSchemaNode = (node.parent !== null && metadataStore.get(node.parent)?.schema) || null;
3025
const description = 'annotations' in schemaNode ? schemaNode.annotations.description : null;
3126

3227
return (

src/components/__tests__/Type.spec.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import { IType, PropertyTypeColors, Type } from '../shared/Types';
55

66
describe('Type component', () => {
77
it.each(Object.keys(PropertyTypeColors))('should handle $s type', type => {
8-
const wrapper = shallow(<Type type={type as IType['type']} />);
8+
const wrapper = shallow(<Type type={type as IType['type']} subtype={void 0} />);
99

1010
expect(wrapper).toHaveText(type);
1111
});
1212

1313
it('should handle unknown types', () => {
1414
// @ts-ignore
15-
const wrapper = shallow(<Type type="foo" />);
15+
const wrapper = shallow(<Type type="foo" subtype={void 0} />);
1616

1717
expect(wrapper).toHaveText('foo');
1818
});

src/components/shared/Types.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { JSONSchema4CombinerName } from '../../types';
99
* TYPE
1010
*/
1111
export interface IType {
12-
type: JSONSchema4TypeName | JSONSchema4CombinerName | '$ref';
12+
type: JSONSchema4TypeName | JSONSchema4CombinerName | 'binary' | '$ref';
1313
subtype: Optional<JSONSchema4TypeName | JSONSchema4TypeName[]>;
1414
className?: string;
1515
}
@@ -75,7 +75,7 @@ export const PropertyTypeColors: Dictionary<string, IType['type']> = {
7575
integer: 'text-red-7 dark:text-red-6',
7676
number: 'text-red-7 dark:text-red-6',
7777
boolean: 'text-red-4',
78-
// binary: 'text-green-4',
78+
binary: 'text-green-4',
7979
string: 'text-green-7 dark:text-green-5',
8080
$ref: 'text-purple-6 dark:text-purple-4',
8181
};

src/tree/metadata.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
import { JsonPath } from '@stoplight/types';
22
import { SchemaNode, SchemaTreeListNode } from '../types';
3+
import { TreeListNode } from '@stoplight/tree-list';
34

45
export interface ITreeNodeMeta {
56
path: JsonPath;
67
schema: SchemaNode;
78
}
89

910
export const metadataStore = new WeakMap<SchemaTreeListNode, ITreeNodeMeta>();
11+
12+
export const getNodeMetadata = (node: TreeListNode): ITreeNodeMeta => {
13+
const metadata = metadataStore.get(node);
14+
if (metadata === void 0) {
15+
throw new Error('Missing metadata');
16+
}
17+
18+
return metadata;
19+
}

src/tree/populateTree.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ export type Walker = (
1919
level: number,
2020
path: JsonPath,
2121
options: WalkingOptions | null,
22-
) => void;
22+
) => undefined;
2323

24-
export const populateTree: Walker = (schema, parent, level, path, options) => {
24+
export const populateTree: Walker = (schema, parent, level, path, options): undefined => {
2525
if (typeof schema !== 'object' || schema === null) return;
2626

2727
for (const node of walk(schema)) {
@@ -34,10 +34,10 @@ export const populateTree: Walker = (schema, parent, level, path, options) => {
3434
};
3535

3636
parent.children.push(treeNode);
37-
metadataStore[treeNode.id] = {
37+
metadataStore.set(treeNode, {
3838
schema: node,
3939
path,
40-
};
40+
});
4141

4242
if (isRefNode(node) && isLocalRef(node.$ref) && node.$ref !== '#') {
4343
(treeNode as TreeListParentNode).children = [];

src/tree/tree.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { JSONSchema4 } from 'json-schema';
55
import { get } from 'lodash-es';
66
import { SchemaNode } from '../types';
77
import { isRefNode } from '../utils/guards';
8-
import { metadataStore } from './metadata';
8+
import { getNodeMetadata, metadataStore } from './metadata';
99
import { populateTree } from './populateTree';
1010

1111
export class SchemaTree extends Tree {
@@ -23,7 +23,9 @@ export class SchemaTree extends Tree {
2323
expanded[node.id] = false;
2424
}
2525

26-
if (metadataStore[parentTreeNode.id] && isRefNode(metadataStore[parentTreeNode.id].schema)) return false;
26+
const metadata = metadataStore.get(parentTreeNode);
27+
28+
if (metadata !== void 0 && isRefNode(metadata.schema)) return false;
2729
return level <= this.defaultExpandedDepth + 1;
2830
},
2931
});
@@ -45,9 +47,9 @@ export class SchemaTree extends Tree {
4547
return super.unwrap(node);
4648
}
4749

48-
const { path, schema } = metadataStore[node.id];
50+
const { path, schema } = getNodeMetadata(node);
4951
if (isRefNode(schema)) {
50-
this.populateTreeFragment(node, pointerToPath(schema.$ref)); // DO NOTE THAT NODES PLACED UNDER THE REF WON'T HAVE CORREC PATHS
52+
this.populateTreeFragment(node, pointerToPath(schema.$ref)); // DO NOTE THAT NODES PLACED UNDER THE REF MAY NOT HAVE CORRECT PATHS
5153
} else {
5254
this.populateTreeFragment(node, path);
5355
}

src/utils/__tests__/renderSchema.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as fs from 'fs';
22
import * as path from 'path';
3-
import { generateTree } from '../../tree/renderSchema';
3+
import { generateTree } from '../../tree/G';
44

55
const BASE_PATH = path.resolve(__dirname, '../../__fixtures__/');
66

0 commit comments

Comments
 (0)