From 030d3ca9601f28a788998d88f7975c1180e190f2 Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Wed, 10 Nov 2021 22:07:59 +0100 Subject: [PATCH] feat: support multiple query languages in the transform modal (WIP) --- README.md | 12 +- package-lock.json | 14 ++ package.json | 1 + src/lib/components/JSONEditor.svelte | 16 ++ src/lib/components/modals/TransformModal.scss | 14 +- .../components/modals/TransformModal.svelte | 42 ++-- .../components/modals/TransformWizard.svelte | 2 +- .../components/modes/codemode/CodeMode.svelte | 12 ++ .../components/modes/treemode/TreeMode.svelte | 13 ++ src/lib/config.js | 1 + src/lib/index.js | 2 + .../plugins/query/jmespathQueryLanguage.js | 198 ++++++++++++++++++ .../query/jmespathQueryLanguage.test.js | 67 ++++++ .../query/lodashQueryLanguage.js} | 43 +++- src/lib/types.js | 25 +++ src/routes/development.svelte | 23 +- 16 files changed, 453 insertions(+), 32 deletions(-) create mode 100644 src/lib/plugins/query/jmespathQueryLanguage.js create mode 100644 src/lib/plugins/query/jmespathQueryLanguage.test.js rename src/lib/{logic/jsCreateQuery.js => plugins/query/lodashQueryLanguage.js} (55%) diff --git a/README.md b/README.md index f652569b..68b943a3 100644 --- a/README.md +++ b/README.md @@ -93,9 +93,9 @@ Or one-way binding: } } - function handleChange(updatedContent) { + function handleChange(updatedContent, previousContent, patchResult) { // content is an object { json: JSON } | { text: string } - console.log('onChange: ', updatedContent) + console.log('onChange: ', updatedContent, previousContent, patchResult) content = updatedContent } @@ -134,9 +134,9 @@ Browser example loading the ES module: target: document.getElementById('jsoneditor'), props: { content, - onChange: (updatedContent) => { + onChange: (updatedContent, previousContent, patchResult) => { // content is an object { json: JSON } | { text: string } - console.log('onChange', updatedContent) + console.log('onChange', updatedContent, previousContent, patchResult) content = updatedContent } } @@ -174,9 +174,9 @@ const editor = new JSONEditor({ target: document.getElementById('jsoneditor'), props: { content, - onChange: (updatedContent) => { + onChange: (updatedContent, previousContent, patchResult) => { // content is an object { json: JSON } | { text: string } - console.log('onChange', updatedContent) + console.log('onChange', updatedContent, previousContent, patchResult) } } }) diff --git a/package-lock.json b/package-lock.json index 9e6d3a6e..9dca16c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "debug": "^4.3.2", "diff-sequences": "^27.0.6", "immutable-json-patch": "^1.1.2", + "jmespath": "0.15.0", "json-source-map": "^0.6.1", "jsonrepair": "^2.2.1", "lodash-es": "^4.17.21", @@ -3470,6 +3471,14 @@ "node": ">= 10.13.0" } }, + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8457,6 +8466,11 @@ "supports-color": "^7.0.0" } }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index 8322587c..efa95c17 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "debug": "^4.3.2", "diff-sequences": "^27.0.6", "immutable-json-patch": "^1.1.2", + "jmespath": "^0.15.0", "json-source-map": "^0.6.1", "jsonrepair": "^2.2.1", "lodash-es": "^4.17.21", diff --git a/src/lib/components/JSONEditor.svelte b/src/lib/components/JSONEditor.svelte index 3352a177..100b92ed 100644 --- a/src/lib/components/JSONEditor.svelte +++ b/src/lib/components/JSONEditor.svelte @@ -10,6 +10,7 @@ import AbsolutePopup from './modals/popup/AbsolutePopup.svelte' import CodeMode from './modes/codemode/CodeMode.svelte' import TreeMode from './modes/treemode/TreeMode.svelte' + import { lodashQueryLanguage } from '$lib/plugins/query/lodashQueryLanguage' // TODO: document how to enable debugging in the readme: localStorage.debug="jsoneditor:*", then reload const debug = createDebug('jsoneditor:Main') @@ -31,6 +32,15 @@ export let navigationBar = true export let validator = null + /** @type {QueryLanguage[]} */ + export let queryLanguages + + /** @type {string} */ + export let queryLanguageId + + /** @type {(queryLanguageId: string) => void} */ + export let onChangeQueryLanguage + /** @type {((content: Content, previousContent: Content, patchResult: JSONPatchResult | null) => void) | null} */ export let onChange = null @@ -281,6 +291,9 @@ {mainMenuBar} {navigationBar} {validator} + {queryLanguages} + {queryLanguageId} + {onChangeQueryLanguage} onChange={handleChangeText} onSwitchToTreeMode={handleSwitchToTreeMode} {onError} @@ -298,6 +311,9 @@ {mainMenuBar} {navigationBar} {validator} + {queryLanguages} + {queryLanguageId} + {onChangeQueryLanguage} {onError} onChange={handleChange} onRequestRepair={handleRequestRepair} diff --git a/src/lib/components/modals/TransformModal.scss b/src/lib/components/modals/TransformModal.scss index a71c67d4..6c110b35 100644 --- a/src/lib/components/modals/TransformModal.scss +++ b/src/lib/components/modals/TransformModal.scss @@ -5,7 +5,19 @@ .description { color: $dark-gray; - code { + :global(p) { + margin: $padding 0; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + + :global(code) { background: $background-gray; font-family: $font-family-mono; font-size: $font-size-mono; diff --git a/src/lib/components/modals/TransformModal.svelte b/src/lib/components/modals/TransformModal.svelte index f4f1000f..704d5ca3 100644 --- a/src/lib/components/modals/TransformModal.svelte +++ b/src/lib/components/modals/TransformModal.svelte @@ -3,7 +3,6 @@ @@ -117,6 +125,13 @@ Read-only

+

+ Query language: +