From 85e7d07a6a5655258eb7adff98aa0ce2fd2a1357 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste WATENBERG Date: Sat, 22 Sep 2018 23:01:53 +0200 Subject: [PATCH 1/6] (feat) Preview json path in context --- demo/src/index.js | 83 ++++++++++++++++++------- doczrc.js | 3 - package.json | 1 - src/JsonPathPreviewer.mdx | 54 ++++++++++++++++ src/components/Editor.js | 31 +++------- src/components/JsonPathPreviewer.css | 13 ++++ src/components/JsonPathPreviewer.js | 93 ++++++++++++++++++++++++++++ src/components/editor.css | 3 + src/index.js | 4 +- src/index.mdx | 2 +- tests/Editor-test.js | 8 --- tests/JsonPathPreviewer-test.js | 84 +++++++++++++++++++++++++ 12 files changed, 322 insertions(+), 57 deletions(-) create mode 100644 src/JsonPathPreviewer.mdx create mode 100644 src/components/JsonPathPreviewer.css create mode 100644 src/components/JsonPathPreviewer.js create mode 100644 tests/JsonPathPreviewer-test.js diff --git a/demo/src/index.js b/demo/src/index.js index 3c6d9cb..96b774b 100644 --- a/demo/src/index.js +++ b/demo/src/index.js @@ -1,31 +1,72 @@ -import React, {Component} from 'react' -import {render} from 'react-dom' +import React, {Component} from 'react'; +import {render} from 'react-dom'; -import JsonPathEditor from '../../src' +import JsonPathEditor from '../../src'; +import Previewer from '../../src/components/JsonPathPreviewer'; import { generateRandomJson } from './generateRandomJson'; class Demo extends Component { - constructor(props) { - super(props) + constructor(props) { + super(props); - this.state = { - json: generateRandomJson(5) + this.state = { + json: generateRandomJson(5) + }; } - } - render() { - const {json} = this.state; - return
-

react-jsonpath-editor Demo

-

With a default json

- -

With a random json and a default value

- -

With a default value

- -
- } + render() { + const {json} = this.state; + return
+

react-jsonpath-editor Demo

+

With a default json

+ +

With a random json and a default value

+ +

With a default value

+ +
+
+
+ + +
; + } } -render(, document.querySelector('#demo')) +render(, document.querySelector('#demo')); diff --git a/doczrc.js b/doczrc.js index 8dfec96..fd87ddd 100644 --- a/doczrc.js +++ b/doczrc.js @@ -2,9 +2,6 @@ import { css } from 'docz-plugin-css'; import { svgr } from 'docz-plugin-svgr'; export default { - themeConfig: { - mode: 'dark' - }, plugins: [ svgr(), css() diff --git a/package.json b/package.json index 825b740..6f3b5d2 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ }, "dependencies": { "easy-json-schema": "0.0.2-beta", - "jsoneditor": "^5.16.0", "jsonpath": "^1.0.0", "prop-types": "^15.6.2" }, diff --git a/src/JsonPathPreviewer.mdx b/src/JsonPathPreviewer.mdx new file mode 100644 index 0000000..b275768 --- /dev/null +++ b/src/JsonPathPreviewer.mdx @@ -0,0 +1,54 @@ +--- +name: react-json-path-previewer +route: /json-path-previewer +--- + +import { Playground, PropsTable } from 'docz' +import { JsonPathPreviewer } from './'; + +# React JSON Path previewer + + + +## Basic usage + + + + \ No newline at end of file diff --git a/src/components/Editor.js b/src/components/Editor.js index 5d5ede9..669ce18 100644 --- a/src/components/Editor.js +++ b/src/components/Editor.js @@ -1,5 +1,4 @@ import React, { Component } from 'react'; -import JSONEditor from 'jsoneditor'; import jp from 'jsonpath/jsonpath.min'; import ejs from 'easy-json-schema'; import { getSuggestions } from './suggestionBuilder'; @@ -8,6 +7,7 @@ import SuggestionList from './SuggestionList'; import 'jsoneditor/dist/jsoneditor.min.css'; import './editor.css'; +import JsonPathPreviewer from './JsonPathPreviewer'; const defaultJsonToFilter = { 'store': { @@ -51,7 +51,6 @@ class Editor extends Component { constructor(props) { super(props); - this.jsonEditorRef = React.createRef(); this.onJsonChange = this.onJsonChange.bind(this); this.onSelectSuggestion = this.onSelectSuggestion.bind(this); this.onCaretChanged = this.onCaretChanged.bind(this); @@ -64,10 +63,7 @@ class Editor extends Component { } componentDidMount() { - this.jsonEditor = new JSONEditor(this.jsonEditorRef.current, { modes: ['tree', 'code'], search: false, change: this.onJsonChange }); - this.jsonEditor.set(this.state.jsonToFilter); this.initSchema(this.props); - this.jsonEditor.expandAll(); this.evalPathAndSuggestions(this.props); this.props.input.addEventListener('keyup',this.onCaretChanged); this.props.input.addEventListener('click',this.onCaretChanged); @@ -90,7 +86,6 @@ class Editor extends Component { initSchema(props) { if (props.jsonSchema) { this.setState({ jsonSchema: props.jsonSchema }); - this.jsonEditor.setSchema(props.jsonSchema); } else { const schema = ejs(this.state.jsonToFilter); this.setState({ jsonSchema: schema }); @@ -104,14 +99,10 @@ class Editor extends Component { this.setState({ jsonToFilter: newProps.json }, () => { resolve(); }); - this.jsonEditor.set(newProps.json); }); promises.push(jsonToFilterStatePromise); } - if (newProps.jsonSchema) { - this.jsonEditor.setSchema(newProps.jsonSchema); - } // ensure state modifications to jsonToFilter did propagate if (promises.length > 0) { @@ -134,20 +125,11 @@ class Editor extends Component { ); this.setState({ suggestions }); - - try { - const filteredJson = jp.query(this.state.jsonToFilter, props.jsonpath); - this.jsonEditor.set(filteredJson); - this.jsonEditor.expandAll(); - } catch (e) { - this.jsonEditor.set(this.state.jsonToFilter); - this.jsonEditor.expandAll(); - } } } onJsonChange() { - this.setState({ jsonToFilter: this.jsonEditor.get() }, () => this.initSchema(this.props)); + this.initSchema(this.props); } onSelectSuggestion(suggestion) { @@ -174,15 +156,20 @@ class Editor extends Component { left: this.props.position.x, }; + const {jsonpath} = this.props; + const {jsonToFilter, suggestions} = this.state; + return
-
+
+ +
; } } diff --git a/src/components/JsonPathPreviewer.css b/src/components/JsonPathPreviewer.css new file mode 100644 index 0000000..b0858e9 --- /dev/null +++ b/src/components/JsonPathPreviewer.css @@ -0,0 +1,13 @@ +.highlighted { + color: green; + font-weight: bold; +} + +code { + color: #777; + font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; +} + +code p { + margin: 0; +} \ No newline at end of file diff --git a/src/components/JsonPathPreviewer.js b/src/components/JsonPathPreviewer.js new file mode 100644 index 0000000..663b869 --- /dev/null +++ b/src/components/JsonPathPreviewer.js @@ -0,0 +1,93 @@ +import React, { Component } from 'react'; +import jp from 'jsonpath/jsonpath.min'; +import PropTypes from 'prop-types'; +import './JsonPathPreviewer.css'; + +export const carriageReturnTag = '£CR£'; +export const indentationIncrementationTag = '£INC£'; +export const indentationDecrementationTag = '£DEC£'; +export const highlightingTags = { + start: '££TAGGED£', + end: '£TAGGED££' +}; + +class JsonPathPreviewer extends Component { + + evalJsonPath(json, jsonPath) { + try { + return jp.paths(json, jsonPath); + } catch(e) { + return []; + } + } + + tagPartOfJsonToHighlight(jsonAsObject, paths, traversedPath = ['$']) { + if (Array.isArray(jsonAsObject)) { + const doesTraversingPathMatch = paths.filter(oneOfPathsToRetrieve => oneOfPathsToRetrieve.join(',') === traversedPath.join(',')).length > 0; + return `${carriageReturnTag + indentationIncrementationTag}${doesTraversingPathMatch ? highlightingTags.start : ''}[${carriageReturnTag + indentationIncrementationTag}${jsonAsObject.map((item, index) => + this.tagPartOfJsonToHighlight(item, paths, [...traversedPath, index]) + ).join(',' + carriageReturnTag)}${indentationDecrementationTag + carriageReturnTag}]${doesTraversingPathMatch ? highlightingTags.end : ''}${indentationDecrementationTag}`; + } + + if (typeof jsonAsObject === 'object') { + const doesTraversingPathMatch = paths.filter(oneOfPathsToRetrieve => oneOfPathsToRetrieve.join(',') === traversedPath.join(',')).length > 0; + return `${doesTraversingPathMatch ? highlightingTags.start : ''}{${carriageReturnTag + indentationIncrementationTag}${Object.keys(jsonAsObject).map(key => + `"${key}": ${this.tagPartOfJsonToHighlight(jsonAsObject[key], paths, [...traversedPath, key])}` + ).join(',' + carriageReturnTag)}${indentationDecrementationTag + carriageReturnTag}}${doesTraversingPathMatch ? highlightingTags.end : ''}`; + } + + const doesTraversingPathMatch = paths.filter(oneOfPathsToRetrieve => oneOfPathsToRetrieve.join(',') === traversedPath.join(',')).length > 0; + + if (typeof jsonAsObject === 'number') { + return `${doesTraversingPathMatch ? highlightingTags.start : ''}${jsonAsObject}${doesTraversingPathMatch ? highlightingTags.end : ''}`; + } else { + return `"${doesTraversingPathMatch ? highlightingTags.start : ''}${jsonAsObject}${doesTraversingPathMatch ? highlightingTags.end : ''}"`; + } + } + + convertTaggedJsonAsReactComponent(taggedJSON) { + let increments = 0; + let highlightBlock = false; + return taggedJSON.split(carriageReturnTag).map(line => { + if (line.includes(indentationIncrementationTag)) increments++; + if (line.includes(highlightingTags.start + '[') || line.includes(highlightingTags.start + '{')) highlightBlock = true; + const toReturn = +

+ {Array(increments).fill( )} + {line.replace(new RegExp(indentationIncrementationTag,'g'), '').replace(new RegExp(indentationDecrementationTag,'g'), '') + .split(highlightingTags.start).map(jsonPart => { + const parts = jsonPart.split(highlightingTags.end); + if (parts.length === 2) { + return {parts[0]}{parts[1]}; + } + return {jsonPart}; + })} +

+
; + if (line.includes(indentationDecrementationTag)) increments--; + if (line.includes(']' + highlightingTags.end) || line.includes('}' + highlightingTags.end)) highlightBlock = false; + return toReturn; + }); + } + + render() { + const {json, jsonPath} = this.props; + + const pathsEvaluated = this.evalJsonPath(json, jsonPath); + + return ( + + {this.convertTaggedJsonAsReactComponent(this.tagPartOfJsonToHighlight(json, pathsEvaluated))} + + ); + } +} + +JsonPathPreviewer.propTypes = { + /** Json on which execute jsonPath */ + json: PropTypes.object.isRequired, + /** JsonPath to preview on JSON */ + jsonPath: PropTypes.string.isRequired +}; + +export default JsonPathPreviewer; \ No newline at end of file diff --git a/src/components/editor.css b/src/components/editor.css index a4c24cd..02d5481 100644 --- a/src/components/editor.css +++ b/src/components/editor.css @@ -8,7 +8,10 @@ .react-json-path-editor-jsoneditor-container { width: 500px; + max-height: 500px; + overflow: auto; background: white; + border: 1px solid #3883fa; box-shadow: 5px 5px 5px 1px rgba(0, 0, 0, .2); } diff --git a/src/index.js b/src/index.js index 8a4ae2a..79e3283 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import React, {Component} from 'react'; import Editor from './components/Editor'; import PropTypes from 'prop-types'; +import JsonPathPreviewer from './components/JsonPathPreviewer'; /** * props : @@ -133,4 +134,5 @@ ReactJsonPath.propTypes = { }; -export default ReactJsonPath; \ No newline at end of file +export default ReactJsonPath; +export {JsonPathPreviewer}; \ No newline at end of file diff --git a/src/index.mdx b/src/index.mdx index 7442567..dcdff30 100644 --- a/src/index.mdx +++ b/src/index.mdx @@ -1,5 +1,5 @@ --- -name: react-json-editor +name: react-json-path-editor route: / --- diff --git a/tests/Editor-test.js b/tests/Editor-test.js index 0cc5b9c..f9e7b33 100644 --- a/tests/Editor-test.js +++ b/tests/Editor-test.js @@ -24,14 +24,6 @@ describe('Editor component', () => { expect(wraper.state().jsonSchema).toEqual({type: 'number'}); }); - - it ('should set json when updated in editor', () => { - const wraper = mount(); - wraper.instance().jsonEditor.set({test: 'a'}); - wraper.instance().onJsonChange(); - expect(wraper.state().jsonToFilter).toEqual({test: 'a'}); - }); - it ('should dispatch selected suggestion', () => { //S const spy = expect.createSpy(); diff --git a/tests/JsonPathPreviewer-test.js b/tests/JsonPathPreviewer-test.js new file mode 100644 index 0000000..d6ab396 --- /dev/null +++ b/tests/JsonPathPreviewer-test.js @@ -0,0 +1,84 @@ +import expect from 'expect'; +import React from 'react'; +import Enzyme, { mount, shallow } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; +import Previewer, { highlightingTags } from '../src/components/JsonPathPreviewer'; + +Enzyme.configure({ adapter: new Adapter() }); + +const defaultJson = { + 'store': { + 'book': [ + { + 'category': 'reference', + 'author': 'Nigel Rees', + 'title': 'Sayings of the Century', + 'price': 8.95 + }, + { + 'category': 'fiction', + 'author': 'Evelyn Waugh', + 'title': 'Sword of Honour', + 'price': 12.99 + }, + { + 'category': 'fiction', + 'author': 'Herman Melville', + 'title': 'Moby Dick', + 'isbn': '0-553-21311-3', + 'price': 8.99 + }, + { + 'category': 'fiction', + 'author': 'J. R. R. Tolkien', + 'title': 'The Lord of the Rings', + 'isbn': '0-395-19395-8', + 'price': 22.99 + } + ], + 'bicycle': { + 'color': 'red', + 'price': 19.95 + } + } +}; + +describe('Json path preview component', () => { + it('should tag all authors', () => { + const wraper = mount(); + const paths = wraper.instance().evalJsonPath(defaultJson, '$..author'); + const taggedJSON = wraper.instance().tagPartOfJsonToHighlight(defaultJson, paths); + + defaultJson.store.book.forEach(book => { + expect(taggedJSON).toContain(highlightingTags.start + book.author + highlightingTags.end); + }); + }); + + it('should tag all prices', () => { + const wraper = mount(); + const paths = wraper.instance().evalJsonPath(defaultJson, '$..price'); + const taggedJSON = wraper.instance().tagPartOfJsonToHighlight(defaultJson, paths); + + defaultJson.store.book.forEach(book => { + expect(taggedJSON).toContain(highlightingTags.start + book.price + highlightingTags.end); + }); + expect(taggedJSON).toContain(highlightingTags.start + defaultJson.store.bicycle.price + highlightingTags.end); + }); + + it ('should tag first book\'s category', () => { + const wraper = mount(); + const paths = wraper.instance().evalJsonPath(defaultJson, '$..book[0].category'); + const taggedJSON = wraper.instance().tagPartOfJsonToHighlight(defaultJson, paths); + + expect(taggedJSON).toContain(highlightingTags.start + defaultJson.store.book[0].category + highlightingTags.end); + }); + + it ('should not tag anything', () => { + const wraper = mount(); + const paths = wraper.instance().evalJsonPath(defaultJson, '$..books'); + const taggedJSON = wraper.instance().tagPartOfJsonToHighlight(defaultJson, paths); + + expect(taggedJSON).toNotContain(highlightingTags.start); + expect(taggedJSON).toNotContain(highlightingTags.end); + }); +}); \ No newline at end of file From 8e8075030f0cc611e1862b7ba53908e7e9e4585d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste WATENBERG Date: Sat, 22 Sep 2018 23:25:42 +0200 Subject: [PATCH 2/6] (doc) update cover image --- docs/react-jsonpath-editor.png | Bin 46901 -> 51722 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/react-jsonpath-editor.png b/docs/react-jsonpath-editor.png index 3a7e7c0914c4922b6891275bc349ea027c55c641..813857648229217a7c415fd5f53af0cf1304020c 100644 GIT binary patch literal 51722 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 literal 46901 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 Date: Sat, 22 Sep 2018 23:31:42 +0200 Subject: [PATCH 3/6] (fix) remove json editor css --- src/components/Editor.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Editor.js b/src/components/Editor.js index 669ce18..47bbe52 100644 --- a/src/components/Editor.js +++ b/src/components/Editor.js @@ -5,7 +5,6 @@ import { getSuggestions } from './suggestionBuilder'; import { getInputSelection, setCaretPosition, insertAtCursor } from './getInputSelection'; import SuggestionList from './SuggestionList'; -import 'jsoneditor/dist/jsoneditor.min.css'; import './editor.css'; import JsonPathPreviewer from './JsonPathPreviewer'; From 3c58eb420d8f8b1a788c249471b832c5dac81efd Mon Sep 17 00:00:00 2001 From: Jean-Baptiste WATENBERG Date: Sun, 23 Sep 2018 14:28:41 +0200 Subject: [PATCH 4/6] (chore) remove unused code related to json editor --- src/components/Editor.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/Editor.js b/src/components/Editor.js index 47bbe52..0f6660d 100644 --- a/src/components/Editor.js +++ b/src/components/Editor.js @@ -50,7 +50,6 @@ class Editor extends Component { constructor(props) { super(props); - this.onJsonChange = this.onJsonChange.bind(this); this.onSelectSuggestion = this.onSelectSuggestion.bind(this); this.onCaretChanged = this.onCaretChanged.bind(this); @@ -127,10 +126,6 @@ class Editor extends Component { } } - onJsonChange() { - this.initSchema(this.props); - } - onSelectSuggestion(suggestion) { const initialJsonPathLength = this.props.jsonpath.length; From 81c6eb82ae236068a27a64361cbebe50ad37a0b8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste WATENBERG Date: Sun, 23 Sep 2018 15:37:53 +0200 Subject: [PATCH 5/6] (test) improve unit tests --- src/components/suggestionBuilder.js | 2 +- tests/JsonPathPreviewer-test.js | 8 + tests/SuggestionBuilder-test.js | 119 +++-------- tests/getInputSelection-test.js | 105 +++++++-- tests/index-test.js | 319 +++++++++++++++------------- 5 files changed, 290 insertions(+), 263 deletions(-) diff --git a/src/components/suggestionBuilder.js b/src/components/suggestionBuilder.js index 5912929..6a2346d 100644 --- a/src/components/suggestionBuilder.js +++ b/src/components/suggestionBuilder.js @@ -1,6 +1,6 @@ import jp from 'jsonpath/jsonpath.min'; -const suggestions = [ +export const suggestions = [ { 'description': 'pick a value in a collection', 'value': '[]', diff --git a/tests/JsonPathPreviewer-test.js b/tests/JsonPathPreviewer-test.js index d6ab396..d48e36f 100644 --- a/tests/JsonPathPreviewer-test.js +++ b/tests/JsonPathPreviewer-test.js @@ -73,6 +73,14 @@ describe('Json path preview component', () => { expect(taggedJSON).toContain(highlightingTags.start + defaultJson.store.book[0].category + highlightingTags.end); }); + it ('should tag all books', () => { + const wraper = mount(); + const paths = wraper.instance().evalJsonPath(defaultJson, '$..book'); + const taggedJSON = wraper.instance().tagPartOfJsonToHighlight(defaultJson, paths); + + expect(taggedJSON).toContain('£CR££INC£££TAGGED£[£CR££INC£{£CR££INC£"category": "reference",£CR£"author": "Nigel Rees",£CR£"title": "Sayings of the Century",£CR£"price": 8.95£DEC££CR£},£CR£{£CR££INC£"category": "fiction",£CR£"author": "Evelyn Waugh",£CR£"title": "Sword of Honour",£CR£"price": 12.99£DEC££CR£},£CR£{£CR££INC£"category": "fiction",£CR£"author": "Herman Melville",£CR£"title": "Moby Dick",£CR£"isbn": "0-553-21311-3",£CR£"price": 8.99£DEC££CR£},£CR£{£CR££INC£"category": "fiction",£CR£"author": "J. R. R. Tolkien",£CR£"title": "The Lord of the Rings",£CR£"isbn": "0-395-19395-8",£CR£"price": 22.99£DEC££CR£}£DEC££CR£]£TAGGED£££DEC£'); + }); + it ('should not tag anything', () => { const wraper = mount(); const paths = wraper.instance().evalJsonPath(defaultJson, '$..books'); diff --git a/tests/SuggestionBuilder-test.js b/tests/SuggestionBuilder-test.js index 4bce623..4cb329d 100644 --- a/tests/SuggestionBuilder-test.js +++ b/tests/SuggestionBuilder-test.js @@ -1,5 +1,5 @@ import expect from 'expect'; -import { getSuggestions, evalAllProperties } from '../src/components/suggestionBuilder'; +import { getSuggestions, evalAllProperties, suggestions } from '../src/components/suggestionBuilder'; describe('get suggestion', () => { @@ -35,29 +35,7 @@ describe('get suggestion', () => { // When const suggestion = getSuggestions('$', 2, { test: 0 }); // Then - expect(suggestion).toEqual([ - { - description: 'access a specific property', - scopes: [ - 'array', - 'object' - ], - value: '.' - }, - { - description: 'search recursively for a property', - scopes: [ - 'array', - 'object' - ], - value: '..' - }, - { - description: 'get all values', - value: '.*', - scopes: ['array', 'object'] - }, - ]); + expect(suggestion).toEqual(suggestions.filter(sug => sug.scopes.includes('object'))); }); it('should lists array suggestions', () => { @@ -65,44 +43,7 @@ describe('get suggestion', () => { // When const suggestion = getSuggestions('$', 2, [0, 1]); // Then - expect(suggestion).toEqual([ - { - description: 'pick a value in a collection', - scopes: [ - 'array' - ], - setCarretAt: 1, - value: '[]' - }, - { - description: 'get collection size', - scopes: [ - 'array' - ], - value: '.length' - }, - { - description: 'access a specific property', - scopes: [ - 'array', - 'object' - ], - value: '.' - }, - { - description: 'search recursively for a property', - scopes: [ - 'array', - 'object' - ], - value: '..' - }, - { - description: 'get all values', - value: '.*', - scopes: ['array', 'object'] - }, - ]); + expect(suggestion).toEqual(suggestions.filter(sug => sug.scopes.includes('array'))); }); it('should lists pick suggestions', () => { @@ -110,36 +51,7 @@ describe('get suggestion', () => { // When const suggestion = getSuggestions('$.test[]', 7, { test: [0, 1] }); // Then - expect(suggestion).toEqual([ - { - description: 'filter a collection', - value: '?(@)', - setCarretAt: 3, - scopes: ['[]'] - }, - { - description: 'select an item by it\'s index relatively to the size of the collection', - value: '(@.length-1)', - setCarretAt: 10, - scopes: ['[]'] - }, - { - description: 'select a range of item by their indexes', - value: '0:1', - setCarretAt: 0, - scopes: ['[]'] - }, - { - description: 'retrieves last item in a collection', - value: '-1:', - scopes: ['[]'] - }, - { - description: 'get all values', - value: '*', - scopes: ['[]', '.'] - } - ]); + expect(suggestion).toEqual(suggestions.filter(sug => sug.scopes.includes('[]'))); }); it('should not lists pick suggestions', () => { @@ -150,6 +62,29 @@ describe('get suggestion', () => { expect(suggestion).toEqual([]); }); + it('should lists suggestions when json path ends with part of an attribute', () => { + // Given + // When + const suggestion = getSuggestions('$.tes', 5, { test: [0, 1] }); + // then + expect(suggestion).toEqual([ + { + 'description': 'property', + 'scopes': [ + 'object' + ], + 'value': 'test' + }, ...suggestions.filter(sug => sug.scopes.includes('object'))]); + }); + + it('should lists suggestions when json path ends with an exact attribute', () => { + // Given + // When + const suggestion = getSuggestions('$.test', 5, { test: {exemple: 'test'} }); + // then + expect(suggestion).toEqual(suggestions.filter(sug => sug.scopes.includes('object'))); + }); + it('should lists no suggestions when json path is invalid', () => { // Given // When diff --git a/tests/getInputSelection-test.js b/tests/getInputSelection-test.js index 1ca57eb..cfab49f 100644 --- a/tests/getInputSelection-test.js +++ b/tests/getInputSelection-test.js @@ -1,54 +1,125 @@ -import expect from 'expect' -import React from 'react' -import { render, unmountComponentAtNode } from 'react-dom' +import expect from 'expect'; +import React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; import Enzyme, { mount, shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; -import JsonPathEditor from 'src/' +import JsonPathEditor from 'src/'; Enzyme.configure({ adapter: new Adapter() }); -import { setCaretPosition, getInputSelection, insertAtCursor } from "../src/components/getInputSelection"; +import { setCaretPosition, getInputSelection, insertAtCursor } from '../src/components/getInputSelection'; describe('input selection helpers', () => { it('should return and set expected positions', () => { - const wrapper = mount() + const wrapper = mount(); let input = wrapper.instance().inputRef.current; expect(getInputSelection(input)).toEqual({start: 1, end: 1}); setCaretPosition(input, 0); - }) + }); + + it('should not set carret when element is null', () => { + const wrapper = mount(); + let input = wrapper.instance().inputRef.current; + setCaretPosition(null, 0); + expect(getInputSelection(input)).toEqual({start: 1, end: 1}); + }); it('should set carret at 0', () => { - const wrapper = mount() + const wrapper = mount(); let input = wrapper.instance().inputRef.current; setCaretPosition(input, 0); expect(getInputSelection(input)).toEqual({start: 0, end: 0}); - }) + }); it('should set carret at 0', () => { - const wrapper = mount() + const wrapper = mount(); let input = wrapper.instance().inputRef.current; setCaretPosition(input, 0); expect(getInputSelection(input)).toEqual({start: 0, end: 0}); - }) + }); it('should set carret at 5', () => { const spyMove = expect.createSpy(); const spySelect = expect.createSpy(); const spy = expect.createSpy().andCall(function () { - return {move: spyMove, select: spySelect} - }); + return {move: spyMove, select: spySelect}; + }); setCaretPosition({createTextRange: spy}, 5); expect(spy).toHaveBeenCalledWith(); expect(spyMove).toHaveBeenCalledWith('character', 5); expect(spySelect).toHaveBeenCalledWith(); - }) + }); it('should return text at position', () => { - const wrapper = mount() + const wrapper = mount(); let input = wrapper.instance().inputRef.current; expect(getInputSelection(input)).toEqual({start: 1, end: 1}); const result = insertAtCursor(input, 'b'); expect(result).toEqual('ab'); - }) -}) \ No newline at end of file + }); + + + it('should getInputSelection for old browser and return 0 when no range', () => { + const mockedRange = undefined; + document.selection = {createRange: expect.createSpy() + .andReturn(mockedRange)}; + const mockElement = {selectionStart: undefined, value:'hello'}; + const position = getInputSelection(mockElement); + expect(position).toEqual({start: 0, end: 0}); + }); + + it('should getInputSelection for old browser and return 0', () => { + const mockedTextRange = { + moveToBookmark: expect.createSpy(), + collapse: expect.createSpy(), + compareEndPoints: expect.createSpy().andReturn(2), + moveStart: expect.createSpy().andReturn(0), + moveEnd: expect.createSpy() + }; + const mockElement = {selectionStart: undefined, value:'hello', createTextRange: expect.createSpy().andReturn(mockedTextRange)}; + const mockedRange = {parentElement: expect.createSpy().andReturn(mockElement),getBookmark: expect.createSpy()}; + document.selection = {createRange: expect.createSpy() + .andReturn(mockedRange)}; + const position = getInputSelection(mockElement); + expect(position).toEqual({start: mockElement.value.length, end: mockElement.value.length}); + }); + + it('should getInputSelection for old browser and return 0 when managing range', () => { + const mockedTextRange = { + moveToBookmark: expect.createSpy(), + collapse: expect.createSpy(), + compareEndPoints: expect.createSpy().andReturn(-2), + moveStart: expect.createSpy().andReturn(0), + moveEnd: expect.createSpy().andReturn(0) + }; + const mockElement = {selectionStart: undefined, value:'hello', createTextRange: expect.createSpy().andReturn(mockedTextRange)}; + const mockedRange = {parentElement: expect.createSpy().andReturn(mockElement),getBookmark: expect.createSpy()}; + document.selection = {createRange: expect.createSpy().andReturn(mockedRange)}; + const position = getInputSelection(mockElement); + expect(position).toEqual({start: 0, end: 0}); + }); + + it('should getInputSelection for old browser and return 0,len when managing selected range', () => { + let isFirstCall = true; + const mockedTextRange = { + moveToBookmark: expect.createSpy(), + collapse: expect.createSpy(), + compareEndPoints: expect.createSpy().andCall(() => { + if (isFirstCall) { + isFirstCall = false; + return -2; + } else { + return 2; + } + }), + moveStart: expect.createSpy().andReturn(0), + moveEnd: expect.createSpy().andReturn(0) + }; + const mockElement = {selectionStart: undefined, value:'hello', createTextRange: expect.createSpy().andReturn(mockedTextRange)}; + const mockedRange = {parentElement: expect.createSpy().andReturn(mockElement),getBookmark: expect.createSpy()}; + document.selection = {createRange: expect.createSpy().andReturn(mockedRange)}; + const position = getInputSelection(mockElement); + expect(position).toEqual({start: 0, end: mockElement.value.length}); + }); +}); \ No newline at end of file diff --git a/tests/index-test.js b/tests/index-test.js index 5fe0c99..209486c 100644 --- a/tests/index-test.js +++ b/tests/index-test.js @@ -1,162 +1,175 @@ -import expect from 'expect' -import React from 'react' -import { render, unmountComponentAtNode } from 'react-dom' +import expect from 'expect'; +import React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; import Enzyme, { mount, shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; -import JsonPathEditor from 'src/' +import JsonPathEditor from 'src/'; Enzyme.configure({ adapter: new Adapter() }); describe('JsonPathEditor', () => { - it('should render an input', () => { - const wrapper = mount() - expect(wrapper.find('input').length).toBe(1) + it('should render an input', () => { + const wrapper = mount(); + expect(wrapper.find('input').length).toBe(1); - }) - - it('should unmount', () => { - const wrapper = mount() - wrapper.unmount(); - }) - - it('should have a default state', () => { - const wrapper = mount(); - expect(wrapper.state()).toEqual({ - value: '', - editorOpened: false, - isBlurEnable: true, - editorPosition: {x:0,y:0} - }) - }) - - it('should set value according to value prop', () => { - const wrapper = mount(); - expect(wrapper.state()).toEqual({ - value: 'hello', - editorOpened: false, - isBlurEnable: true, - editorPosition: {x:0,y:0} - }) - }) - - it('should let the editor closed', () => { - const wrapper = mount(); - wrapper.find('input').simulate('focus') - expect(wrapper.state().editorOpened).toEqual(false) - }) - - it('should open the editor', () => { - const wrapper = mount(); - wrapper.find('input').simulate('focus') - expect(wrapper.state().editorOpened).toEqual(true) - }) - - it('should close the editor when focus is lost', () => { - const wrapper = mount(); - wrapper.find('input').simulate('focus') - expect(wrapper.state().editorOpened).toEqual(true) - wrapper.find('input').simulate('blur') - expect(wrapper.state().editorOpened).toEqual(false) - }) - - it('should not close the editor when focus is lost and blur is disabled', () => { - const wrapper = mount(); - wrapper.find('input').simulate('focus') - expect(wrapper.state().editorOpened).toEqual(true) - wrapper.setState({isBlurEnable: false}) - wrapper.find('input').simulate('blur') - expect(wrapper.state().editorOpened).toEqual(true) - }) - - it('should reflect prop value change to state', () => { - const wrapper = mount(); - expect(wrapper.state().value).toEqual('$') - wrapper.setProps({value: '$.'}) - expect(wrapper.state().value).toEqual('$.') - }) - - it('should not reflect prop value change to state when value is null', () => { - const wrapper = mount(); - expect(wrapper.state().value).toEqual('$') - wrapper.setProps({value: null}) - expect(wrapper.state().value).toEqual('$') - }) - - it('should not reflect prop value change to state when value is undefined', () => { - const wrapper = mount(); - expect(wrapper.state().value).toEqual('$') - let value; - wrapper.setProps({value}) - expect(wrapper.state().value).toEqual('$') - }) - - it('should not reflect prop change to state', () => { - const wrapper = mount(); - expect(wrapper.state().value).toEqual('$') - wrapper.setProps({xx: '$.'}) - expect(wrapper.state().value).toEqual('$') - }) - - it('should close the editor when esc is pressed', () => { - const wrapper = mount(); - wrapper.find('input').simulate('focus') - expect(wrapper.state().editorOpened).toEqual(true) - wrapper.instance().escFunction({keyCode: 27}) - expect(wrapper.state().editorOpened).toEqual(false) - expect(wrapper.state().isBlurEnable).toEqual(true) - }) - - it('should not close the editor when another key than esc is pressed', () => { - const wrapper = mount(); - wrapper.find('input').simulate('focus') - expect(wrapper.state().editorOpened).toEqual(true) - wrapper.instance().escFunction({keyCode: 28}) - expect(wrapper.state().editorOpened).toEqual(true) - }) - - it('should set isBlurEnabled accordingly', () => { - const wrapper = mount(); - wrapper.instance().controlBlur({isEnable: true}) - expect(wrapper.state().isBlurEnable).toEqual(true) - wrapper.instance().controlBlur({isEnable: false}) - expect(wrapper.state().isBlurEnable).toEqual(false) - }) - - it('should dispatch the change when jsonPath is updated but no callback is defined in properties, neither jsonPath starts by $', () => { - const wrapper = mount(); - wrapper.instance().changePath('world'); - expect(wrapper.state().editorOpened).toBe(false); - expect(wrapper.state().value).toBe('world'); - }) - - it('should dispatch the change from an event', () => { - const wrapper = mount(); - wrapper.instance().onChange({target: {value:'world'}}); - expect(wrapper.state().editorOpened).toBe(false); - expect(wrapper.state().value).toBe('world'); - }) - - it('should dispatch the change when jsonPath is updated but no callback is defined in properties', () => { - const wrapper = mount(); - wrapper.instance().changePath('$.'); - expect(wrapper.state().editorOpened).toBe(true); - expect(wrapper.state().value).toBe('$.'); - }) - - it('should dispatch the change when jsonPath is updated', () => { - const spy = expect.createSpy() - const wrapper = mount(); - wrapper.instance().changePath('$.'); - expect(wrapper.state().editorOpened).toBe(true); - expect(wrapper.state().value).toBe('$.'); - expect(spy).toHaveBeenCalledWith('$.'); - }) - - it('should focus input and enable blur when mouse leaves the editor', () => { - const wrapper = mount(); - wrapper.instance().onMouseLeaveFromEditor(); - expect(wrapper.state().isBlurEnable).toEqual(true); - }) -}) + }); + + it('should unmount', () => { + const wrapper = mount(); + wrapper.unmount(); + }); + + it('should have a default state', () => { + const wrapper = mount(); + expect(wrapper.state()).toEqual({ + value: '', + editorOpened: false, + isBlurEnable: true, + editorPosition: {x:0,y:0} + }); + }); + + it('should set value according to value prop', () => { + const wrapper = mount(); + expect(wrapper.state()).toEqual({ + value: 'hello', + editorOpened: false, + isBlurEnable: true, + editorPosition: {x:0,y:0} + }); + }); + + it('should let the editor closed', () => { + const wrapper = mount(); + wrapper.find('input').simulate('focus'); + expect(wrapper.state().editorOpened).toEqual(false); + }); + + it('should open the editor', () => { + const wrapper = mount(); + wrapper.find('input').simulate('focus'); + expect(wrapper.state().editorOpened).toEqual(true); + }); + + it('should close the editor when focus is lost', () => { + const wrapper = mount(); + wrapper.find('input').simulate('focus'); + expect(wrapper.state().editorOpened).toEqual(true); + wrapper.find('input').simulate('blur'); + expect(wrapper.state().editorOpened).toEqual(false); + }); + + it('should not close the editor when focus is lost and blur is disabled', () => { + const wrapper = mount(); + wrapper.find('input').simulate('focus'); + expect(wrapper.state().editorOpened).toEqual(true); + wrapper.setState({isBlurEnable: false}); + wrapper.find('input').simulate('blur'); + expect(wrapper.state().editorOpened).toEqual(true); + }); + + it('should reflect prop value change to state', () => { + const wrapper = mount(); + expect(wrapper.state().value).toEqual('$'); + wrapper.setProps({value: '$.'}); + expect(wrapper.state().value).toEqual('$.'); + }); + + it('should not reflect prop value change to state when value is null', () => { + const wrapper = mount(); + expect(wrapper.state().value).toEqual('$'); + wrapper.setProps({value: null}); + expect(wrapper.state().value).toEqual('$'); + }); + + it('should not reflect prop value change to state when value is undefined', () => { + const wrapper = mount(); + expect(wrapper.state().value).toEqual('$'); + let value; + wrapper.setProps({value}); + expect(wrapper.state().value).toEqual('$'); + }); + + it('should not reflect prop change to state', () => { + const wrapper = mount(); + expect(wrapper.state().value).toEqual('$'); + wrapper.setProps({xx: '$.'}); + expect(wrapper.state().value).toEqual('$'); + }); + + it('should close the editor when esc is pressed', () => { + const wrapper = mount(); + wrapper.find('input').simulate('focus'); + expect(wrapper.state().editorOpened).toEqual(true); + wrapper.instance().escFunction({keyCode: 27}); + expect(wrapper.state().editorOpened).toEqual(false); + expect(wrapper.state().isBlurEnable).toEqual(true); + }); + + it('should not close the editor when another key than esc is pressed', () => { + const wrapper = mount(); + wrapper.find('input').simulate('focus'); + expect(wrapper.state().editorOpened).toEqual(true); + wrapper.instance().escFunction({keyCode: 28}); + expect(wrapper.state().editorOpened).toEqual(true); + }); + + it('should set isBlurEnabled accordingly', () => { + const wrapper = mount(); + wrapper.instance().controlBlur({isEnable: true}); + expect(wrapper.state().isBlurEnable).toEqual(true); + wrapper.instance().controlBlur({isEnable: false}); + expect(wrapper.state().isBlurEnable).toEqual(false); + }); + + it('should dispatch the change when jsonPath is updated but no callback is defined in properties, neither jsonPath starts by $', () => { + const wrapper = mount(); + wrapper.instance().changePath('world'); + expect(wrapper.state().editorOpened).toBe(false); + expect(wrapper.state().value).toBe('world'); + }); + + it('should dispatch the change from an event', () => { + const wrapper = mount(); + wrapper.instance().onChange({target: {value:'world'}}); + expect(wrapper.state().editorOpened).toBe(false); + expect(wrapper.state().value).toBe('world'); + }); + + it('should dispatch the change when jsonPath is updated but no callback is defined in properties', () => { + const wrapper = mount(); + wrapper.instance().changePath('$.'); + expect(wrapper.state().editorOpened).toBe(true); + expect(wrapper.state().value).toBe('$.'); + }); + + it('should dispatch the change when jsonPath is updated', () => { + const spy = expect.createSpy(); + const wrapper = mount(); + wrapper.instance().changePath('$.'); + expect(wrapper.state().editorOpened).toBe(true); + expect(wrapper.state().value).toBe('$.'); + expect(spy).toHaveBeenCalledWith('$.'); + }); + + it('should focus input and enable blur when mouse leaves the editor', () => { + const wrapper = mount(); + wrapper.instance().onMouseLeaveFromEditor(); + expect(wrapper.state().isBlurEnable).toEqual(true); + }); + + it('should overrides editor position when a position is given', () => { + const wrapper = mount(); + expect(wrapper.state().editorPosition).toEqual({x: 20, y: 20}); + }); + + it('should updateEditorPosition do nothing when input ref is not defined', () => { + const wrapper = mount(); + const initialPosition = wrapper.state().editorPosition; + wrapper.instance().inputRef = undefined; + wrapper.instance().updateEditorPosition(); + expect(wrapper.state().editorPosition).toEqual(initialPosition); + }); +}); From def64ae9289a996ab1ceca95e835499c351a4789 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste WATENBERG Date: Sun, 23 Sep 2018 16:17:15 +0200 Subject: [PATCH 6/6] (chore) improve ci --- .travis.yml | 27 ++++++++++++++++++--------- package.json | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 06e30d9..3a87079 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,25 @@ sudo: false - language: node_js node_js: - - 8 - +- 8 before_install: - - npm install codecov.io coveralls - +- npm install codecov.io coveralls after_success: - - cat ./coverage/lcov.info | ./node_modules/codecov.io/bin/codecov.io.js - - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js - +- cat ./coverage/lcov.info | ./node_modules/codecov.io/bin/codecov.io.js +- cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js +- npm run docz:build branches: only: - - master + - master +deploy: + - provider: npm + email: "jeanbaptiste.watenberg@gmail.com" + on: + branch: master + api_key: + secure: gpLMqNojmvhWMHWoskbjdNY053xujK8VbxiksEXj0b44eUvdGkiRnugeKEgaDPjBLl2vx9jjw+awQlUnNieWn+V3fFAq1BAAChJYR7kDD7Wl4hV2TiihXFWWwE89GdGggol5VbIsX+JZsCaPrrQnEjc6CFFSBBRdCLokGlURreT67cHb+n4kuwBalq5HX9Gvymdcpc4akWWhr73HQFT6hK4wpqsXU5TSvCe9jsHBjTTFmviLtUE3sLQB7iUG++2vLlSaRVqUx37ty5RSZgaPrvymMdb8xWMpCkdN+fr2fRSs/8YDy0eva4Vezcfjc5eBY7+LbEportVKp9JLaoyNvA0JJpUaHkGlOKTrfAIRVPfXJkk9IBxSqg+Lnse+RMKCU+eCN6W86EjLlvjREfpK8KkhWBqNBhg3ar0bcVm+7XQYp2FhXMrKK4KMK6PCQGyPr7ip7sbUJLJ5/zYraOq/s7vJuY1MqmJV2+QalYeWmD1+6iFOLlmQ4/hCwbp9Gdco7PHRX2flA2+Td1V++3rvRRLATfBQKosue00Bux1u1FSGIUTYGcSdHlTKZ0U0CsJXoUn0DnOOhwURdRsNK2t8j6R+CB4z0e0lIEqx4SG2+/+74FOJE7RuNi7+Us/By5g8a3fpbH/MSJ1cXlw5vrE4B88La4/tx4RMEUGAIU5R56U= + - provider: surge + project: .docz/dist + domain: react-jsonpath-editor.surge.sh + on: + branch: master diff --git a/package.json b/package.json index 6f3b5d2..3f621e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-jsonpath-editor", - "version": "1.1.0-beta.3", + "version": "1.2.0", "description": "react-jsonpath-editor React component", "main": "lib/index.js", "module": "es/index.js",