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:
+