fix(editor): Enable explicit undo keyboard shortcut across all code editors (#8178)

Fixes [ADO-801](https://linear.app/n8n/issue/ADO-801),
[PAY-632](https://linear.app/n8n/issue/PAY-632), and
[PAY-730](https://linear.app/n8n/issue/PAY-730)
Also fixes #5297

## Review / Merge checklist
- [x] PR title and summary are descriptive
This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™ 2023-12-28 14:55:23 +01:00 committed by GitHub
parent e418d42450
commit cf7f6688ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 106 additions and 84 deletions

View file

@ -26,15 +26,15 @@
"test:dev": "vitest"
},
"dependencies": {
"@codemirror/autocomplete": "^6.4.0",
"@codemirror/commands": "^6.1.0",
"@codemirror/lang-javascript": "^6.1.2",
"@codemirror/autocomplete": "^6.11.1",
"@codemirror/commands": "^6.3.2",
"@codemirror/lang-javascript": "^6.2.1",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-python": "^6.1.2",
"@codemirror/language": "^6.2.1",
"@codemirror/lint": "^6.0.0",
"@codemirror/state": "^6.1.4",
"@codemirror/view": "^6.5.1",
"@codemirror/lang-python": "^6.1.3",
"@codemirror/language": "^6.9.3",
"@codemirror/lint": "^6.4.2",
"@codemirror/state": "^6.3.3",
"@codemirror/view": "^6.22.3",
"@fontsource/open-sans": "^4.5.0",
"@jsplumb/browser-ui": "^5.13.2",
"@jsplumb/common": "^5.13.2",

View file

@ -86,6 +86,7 @@ export default defineComponent({
mode: {
type: String as PropType<CodeExecutionMode>,
validator: (value: CodeExecutionMode): boolean => CODE_EXECUTION_MODES.includes(value),
required: true,
},
language: {
type: String as PropType<CodeNodeEditorLanguage>,
@ -103,6 +104,7 @@ export default defineComponent({
},
modelValue: {
type: String,
required: true,
},
},
setup() {

View file

@ -16,6 +16,7 @@ import {
toggleComment,
redo,
deleteCharBackward,
undo,
} from '@codemirror/commands';
import { lintGutter } from '@codemirror/lint';
import type { Extension } from '@codemirror/state';
@ -43,6 +44,7 @@ export const writableEditorExtensions: readonly Extension[] = [
{ key: 'Tab', run: acceptCompletion },
{ key: 'Enter', run: acceptCompletion },
{ key: 'Mod-/', run: toggleComment },
{ key: 'Mod-z', run: undo },
{ key: 'Mod-Shift-z', run: redo },
{ key: 'Backspace', run: deleteCharBackward, shift: deleteCharBackward },
indentWithTab,

View file

@ -6,7 +6,7 @@
import { defineComponent } from 'vue';
import { EditorView, keymap } from '@codemirror/view';
import { EditorState, Prec } from '@codemirror/state';
import { history, redo } from '@codemirror/commands';
import { history, redo, undo } from '@codemirror/commands';
import { workflowHelpers } from '@/mixins/workflowHelpers';
import { expressionManager } from '@/mixins/expressionManager';
@ -26,12 +26,15 @@ export default defineComponent({
props: {
modelValue: {
type: String,
required: true,
},
path: {
type: String,
required: true,
},
isReadOnly: {
type: Boolean,
default: false,
},
},
data() {
@ -56,6 +59,7 @@ export default defineComponent({
return false;
},
},
{ key: 'Mod-z', run: undo },
{ key: 'Mod-Shift-z', run: redo },
]),
),

View file

@ -19,6 +19,7 @@ export default defineComponent({
props: {
segments: {
type: Array as PropType<Segment[]>,
required: true,
},
},
data() {

View file

@ -11,7 +11,7 @@ import jsParser from 'prettier/plugins/babel';
import * as estree from 'prettier/plugins/estree';
import { htmlLanguage, autoCloseTags, html } from 'codemirror-lang-html-n8n';
import { autocompletion } from '@codemirror/autocomplete';
import { indentWithTab, insertNewlineAndIndent, history, redo } from '@codemirror/commands';
import { indentWithTab, insertNewlineAndIndent, history, redo, undo } from '@codemirror/commands';
import {
bracketMatching,
ensureSyntaxTree,
@ -92,6 +92,7 @@ export default defineComponent({
keymap.of([
indentWithTab,
{ key: 'Enter', run: insertNewlineAndIndent },
{ key: 'Mod-z', run: undo },
{ key: 'Mod-Shift-z', run: redo },
]),
indentOnInput(),

View file

@ -8,7 +8,7 @@ import type { PropType } from 'vue';
import { mapStores } from 'pinia';
import { EditorView, keymap } from '@codemirror/view';
import { Compartment, EditorState, Prec } from '@codemirror/state';
import { history, redo } from '@codemirror/commands';
import { history, redo, undo } from '@codemirror/commands';
import { acceptCompletion, autocompletion, completionStatus } from '@codemirror/autocomplete';
import { useNDVStore } from '@/stores/ndv.store';
@ -29,6 +29,7 @@ export default defineComponent({
props: {
modelValue: {
type: String,
required: true,
},
isReadOnly: {
type: Boolean,
@ -40,6 +41,7 @@ export default defineComponent({
},
path: {
type: String,
required: true,
},
additionalData: {
type: Object as PropType<IDataObject>,
@ -103,6 +105,7 @@ export default defineComponent({
return false;
},
},
{ key: 'Mod-z', run: undo },
{ key: 'Mod-Shift-z', run: redo },
]),
),

View file

@ -13,7 +13,7 @@
<script lang="ts">
import { defineComponent } from 'vue';
import { acceptCompletion, autocompletion, ifNotIn } from '@codemirror/autocomplete';
import { indentWithTab, history, redo, toggleComment } from '@codemirror/commands';
import { indentWithTab, history, redo, toggleComment, undo } from '@codemirror/commands';
import { bracketMatching, foldGutter, indentOnInput, LanguageSupport } from '@codemirror/language';
import { EditorState } from '@codemirror/state';
import type { Line, Extension } from '@codemirror/state';
@ -146,6 +146,7 @@ export default defineComponent({
extensions.push(
history(),
keymap.of([
{ key: 'Mod-z', run: undo },
{ key: 'Mod-Shift-z', run: redo },
{ key: 'Mod-/', run: toggleComment },
{ key: 'Tab', run: acceptCompletion },

View file

@ -952,32 +952,32 @@ importers:
packages/editor-ui:
dependencies:
'@codemirror/autocomplete':
specifier: ^6.4.0
version: 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
specifier: ^6.11.1
version: 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/commands':
specifier: ^6.1.0
version: 6.1.2
specifier: ^6.3.2
version: 6.3.2
'@codemirror/lang-javascript':
specifier: ^6.1.2
version: 6.1.2
specifier: ^6.2.1
version: 6.2.1
'@codemirror/lang-json':
specifier: ^6.0.1
version: 6.0.1
'@codemirror/lang-python':
specifier: ^6.1.2
version: 6.1.2(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
specifier: ^6.1.3
version: 6.1.3(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/language':
specifier: ^6.2.1
version: 6.2.1
specifier: ^6.9.3
version: 6.9.3
'@codemirror/lint':
specifier: ^6.0.0
version: 6.0.0
specifier: ^6.4.2
version: 6.4.2
'@codemirror/state':
specifier: ^6.1.4
version: 6.1.4
specifier: ^6.3.3
version: 6.3.3
'@codemirror/view':
specifier: ^6.5.1
version: 6.5.1
specifier: ^6.22.3
version: 6.22.3
'@fontsource/open-sans':
specifier: ^4.5.0
version: 4.5.12
@ -1013,7 +1013,7 @@ importers:
version: 1.1.0
'@n8n/codemirror-lang-sql':
specifier: ^1.0.2
version: 1.0.2(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
version: 1.0.2(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@n8n/permissions':
specifier: workspace:*
version: link:../@n8n/permissions
@ -1034,7 +1034,7 @@ importers:
version: 1.0.0
codemirror-lang-n8n-expression:
specifier: ^0.2.0
version: 0.2.0(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
version: 0.2.0(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
copy-to-clipboard:
specifier: ^3.3.3
version: 3.3.3
@ -4614,49 +4614,49 @@ packages:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true
/@codemirror/autocomplete@6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0):
resolution: {integrity: sha512-HLF2PnZAm1s4kGs30EiqKMgD7XsYaQ0XJnMR0rofEWQ5t5D60SfqpDIkIh1ze5tiEbyUWm8+VJ6W1/erVvBMIA==}
/@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0):
resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
dependencies:
'@codemirror/language': 6.2.1
'@codemirror/state': 6.1.4
'@codemirror/view': 6.5.1
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.3
'@codemirror/view': 6.22.3
'@lezer/common': 1.1.0
dev: false
/@codemirror/commands@6.1.2:
resolution: {integrity: sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg==}
/@codemirror/commands@6.3.2:
resolution: {integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==}
dependencies:
'@codemirror/language': 6.2.1
'@codemirror/state': 6.1.4
'@codemirror/view': 6.5.1
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.3
'@codemirror/view': 6.22.3
'@lezer/common': 1.1.0
dev: false
/@codemirror/lang-css@6.0.1(@codemirror/view@6.5.1)(@lezer/common@1.1.0):
/@codemirror/lang-css@6.0.1(@codemirror/view@6.22.3)(@lezer/common@1.1.0):
resolution: {integrity: sha512-rlLq1Dt0WJl+2epLQeAsfqIsx3lGu4HStHCJu95nGGuz2P2fNugbU3dQYafr2VRjM4eMC9HviI6jvS98CNtG5w==}
dependencies:
'@codemirror/autocomplete': 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/language': 6.2.1
'@codemirror/state': 6.1.4
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.3
'@lezer/css': 1.1.1
transitivePeerDependencies:
- '@codemirror/view'
- '@lezer/common'
dev: false
/@codemirror/lang-javascript@6.1.2:
resolution: {integrity: sha512-OcwLfZXdQ1OHrLiIcKCn7MqZ7nx205CMKlhe+vL88pe2ymhT9+2P+QhwkYGxMICj8TDHyp8HFKVwpiisUT7iEQ==}
/@codemirror/lang-javascript@6.2.1:
resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==}
dependencies:
'@codemirror/autocomplete': 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/language': 6.2.1
'@codemirror/lint': 6.0.0
'@codemirror/state': 6.1.4
'@codemirror/view': 6.5.1
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/language': 6.9.3
'@codemirror/lint': 6.4.2
'@codemirror/state': 6.3.3
'@codemirror/view': 6.22.3
'@lezer/common': 1.1.0
'@lezer/javascript': 1.0.2
dev: false
@ -4664,15 +4664,15 @@ packages:
/@codemirror/lang-json@6.0.1:
resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==}
dependencies:
'@codemirror/language': 6.2.1
'@codemirror/language': 6.9.3
'@lezer/json': 1.0.0
dev: false
/@codemirror/lang-python@6.1.2(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0):
resolution: {integrity: sha512-nbQfifLBZstpt6Oo4XxA2LOzlSp4b/7Bc5cmodG1R+Cs5PLLCTUvsMNWDnziiCfTOG/SW1rVzXq/GbIr6WXlcw==}
/@codemirror/lang-python@6.1.3(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0):
resolution: {integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==}
dependencies:
'@codemirror/autocomplete': 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/language': 6.2.1
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/language': 6.9.3
'@lezer/python': 1.1.5
transitivePeerDependencies:
- '@codemirror/state'
@ -4680,34 +4680,34 @@ packages:
- '@lezer/common'
dev: false
/@codemirror/language@6.2.1:
resolution: {integrity: sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q==}
/@codemirror/language@6.9.3:
resolution: {integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==}
dependencies:
'@codemirror/state': 6.1.4
'@codemirror/view': 6.5.1
'@codemirror/state': 6.3.3
'@codemirror/view': 6.22.3
'@lezer/common': 1.1.0
'@lezer/highlight': 1.1.1
'@lezer/lr': 1.2.3
style-mod: 4.0.0
dev: false
/@codemirror/lint@6.0.0:
resolution: {integrity: sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==}
/@codemirror/lint@6.4.2:
resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==}
dependencies:
'@codemirror/state': 6.1.4
'@codemirror/view': 6.5.1
'@codemirror/state': 6.3.3
'@codemirror/view': 6.22.3
crelt: 1.0.5
dev: false
/@codemirror/state@6.1.4:
resolution: {integrity: sha512-g+3OJuRylV5qsXuuhrc6Cvs1NQluNioepYMM2fhnpYkNk7NgX+j0AFuevKSVKzTDmDyt9+Puju+zPdHNECzCNQ==}
/@codemirror/state@6.3.3:
resolution: {integrity: sha512-0wufKcTw2dEwEaADajjHf6hBy1sh3M6V0e+q4JKIhLuiMSe5td5HOWpUdvKth1fT1M9VYOboajoBHpkCd7PG7A==}
dev: false
/@codemirror/view@6.5.1:
resolution: {integrity: sha512-xBKP8N3AXOs06VcKvIuvIQoUlGs7Hb78ftJWahLaRX909jKPMgGxR5XjvrawzTTZMSTU3DzdjDNPwG6fPM/ypQ==}
/@codemirror/view@6.22.3:
resolution: {integrity: sha512-rqnq+Zospwoi3x1vZ8BGV1MlRsaGljX+6qiGYmIpJ++M+LCC+wjfDaPklhwpWSgv7pr/qx29KiAKQBH5+DOn4w==}
dependencies:
'@codemirror/state': 6.1.4
style-mod: 4.0.0
'@codemirror/state': 6.3.3
style-mod: 4.1.0
w3c-keyname: 2.2.6
dev: false
@ -6069,12 +6069,12 @@ packages:
dev: false
optional: true
/@n8n/codemirror-lang-sql@1.0.2(@codemirror/view@6.5.1)(@lezer/common@1.1.0):
/@n8n/codemirror-lang-sql@1.0.2(@codemirror/view@6.22.3)(@lezer/common@1.1.0):
resolution: {integrity: sha512-sOf/KyewSu3Ikij0CkRtzJJDhRDZcwNCEYl8UdH4U/riL0/XZGcBD7MYofCCcKszanJZiEWRZ2KU1sRp234iMg==}
dependencies:
'@codemirror/autocomplete': 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/language': 6.2.1
'@codemirror/state': 6.1.4
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.3
'@lezer/highlight': 1.1.1
'@lezer/lr': 1.2.3
transitivePeerDependencies:
@ -9673,7 +9673,7 @@ packages:
ts-dedent: 2.2.0
type-fest: 2.19.0
vue: 3.3.4
vue-component-type-helpers: 1.8.25
vue-component-type-helpers: 1.8.27
transitivePeerDependencies:
- encoding
- supports-color
@ -13041,12 +13041,12 @@ packages:
/codemirror-lang-html-n8n@1.0.0:
resolution: {integrity: sha512-ofNP6VTDGJ5rue+kTCZlDZdF1PnE0sl2cAkfrsCAd5MlBgDmqTwuFJIkTI6KXOJXs0ucdTYH6QLhy9BSW7EaOQ==}
dependencies:
'@codemirror/autocomplete': 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/lang-css': 6.0.1(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/lang-javascript': 6.1.2
'@codemirror/language': 6.2.1
'@codemirror/state': 6.1.4
'@codemirror/view': 6.5.1
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/lang-css': 6.0.1(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.3
'@codemirror/view': 6.22.3
'@lezer/common': 1.1.0
'@lezer/css': 1.1.1
'@lezer/highlight': 1.1.1
@ -13054,11 +13054,11 @@ packages:
'@lezer/lr': 1.2.3
dev: false
/codemirror-lang-n8n-expression@0.2.0(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0):
/codemirror-lang-n8n-expression@0.2.0(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0):
resolution: {integrity: sha512-kdlpzevdCpWcpbNcwES9YZy+rDFwWOdO6Z78SWxT6jMhCPmdHQmO+gJ39aXAXlUI7OGLfOBtg1/ONxPjRpEIYQ==}
dependencies:
'@codemirror/autocomplete': 6.4.0(@codemirror/language@6.2.1)(@codemirror/state@6.1.4)(@codemirror/view@6.5.1)(@lezer/common@1.1.0)
'@codemirror/language': 6.2.1
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.0)
'@codemirror/language': 6.9.3
'@lezer/highlight': 1.1.1
'@lezer/lr': 1.2.3
transitivePeerDependencies:
@ -24032,6 +24032,10 @@ packages:
resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==}
dev: false
/style-mod@4.1.0:
resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==}
dev: false
/superagent@7.1.6:
resolution: {integrity: sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==}
engines: {node: '>=6.4.0 <13 || >=14'}
@ -25727,6 +25731,10 @@ packages:
resolution: {integrity: sha512-NCA6sekiJIMnMs4DdORxATXD+/NRkQpS32UC+I1KQJUasx+Z7MZUb3Y+MsKsFmX+PgyTYSteb73JW77AibaCCw==}
dev: true
/vue-component-type-helpers@1.8.27:
resolution: {integrity: sha512-0vOfAtI67UjeO1G6UiX5Kd76CqaQ67wrRZiOe7UAb9Jm6GzlUr/fC7CV90XfwapJRjpCMaZFhv1V0ajWRmE9Dg==}
dev: true
/vue-demi@0.14.5(vue@3.3.4):
resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
engines: {node: '>=12'}