diff --git a/packages/hoppscotch-app/assets/scss/styles.scss b/packages/hoppscotch-app/assets/scss/styles.scss index 7d06cefdd..b8f4647fc 100644 --- a/packages/hoppscotch-app/assets/scss/styles.scss +++ b/packages/hoppscotch-app/assets/scss/styles.scss @@ -136,44 +136,43 @@ a { } } -.tippy-popper { - .tooltip-theme { - @apply bg-tooltip; - @apply text-primary; - @apply font-semibold; - @apply py-1 px-2; +.tooltip-theme { + @apply bg-tooltip; + @apply text-primary; + @apply font-semibold; + @apply py-1 px-2; + @apply rounded; + @apply truncate; + @apply shadow; + + font-size: 88%; + line-height: var(--body-line-height); + + kbd { + @apply inline-flex; + @apply font-sans; + @apply bg-gray-500; + @apply bg-opacity-45; + @apply text-primaryLight; + @apply rounded-sm; + @apply px-1; + @apply ml-1; @apply truncate; - @apply shadow; - - font-size: 88%; - line-height: var(--body-line-height); - - kbd { - @apply inline-flex; - @apply font-sans; - @apply bg-gray-500; - @apply bg-opacity-45; - @apply text-primaryLight; - @apply rounded-sm; - @apply px-1; - @apply ml-1; - @apply truncate; - } } +} - .popover-theme { - @apply bg-popover; - @apply text-secondary; - @apply p-2; - @apply shadow-lg; - @apply focus:outline-none; +.popover-theme { + @apply bg-popover; + @apply text-secondary; + @apply p-2; + @apply shadow-lg; + @apply focus:outline-none; - font-size: var(--body-font-size); - line-height: var(--body-line-height); + font-size: var(--body-font-size); + line-height: var(--body-line-height); - .tippy-roundarrow svg { - @apply fill-popover; - } + .tippy-roundarrow svg { + @apply fill-popover; } } diff --git a/packages/hoppscotch-app/components/graphql/RequestOptions.vue b/packages/hoppscotch-app/components/graphql/RequestOptions.vue index 252ca3eca..1787465e0 100644 --- a/packages/hoppscotch-app/components/graphql/RequestOptions.vue +++ b/packages/hoppscotch-app/components/graphql/RequestOptions.vue @@ -307,6 +307,7 @@ useCodemirror(bulkEditor, bulkHeaders, { }, linter: null, completer: null, + environmentHighlights: false, }) const variableEditor = ref(null) @@ -318,6 +319,7 @@ useCodemirror(variableEditor, variableString, { }, linter: jsonLinter, completer: null, + environmentHighlights: false, }) const queryEditor = ref(null) @@ -330,6 +332,7 @@ useCodemirror(queryEditor, gqlQueryString, { }, linter: createGQLQueryLinter(schemaString), completer: queryCompleter(schemaString), + environmentHighlights: false, }) const copyQueryIcon = ref("copy") diff --git a/packages/hoppscotch-app/components/graphql/Response.vue b/packages/hoppscotch-app/components/graphql/Response.vue index 972c92dbe..69b60f378 100644 --- a/packages/hoppscotch-app/components/graphql/Response.vue +++ b/packages/hoppscotch-app/components/graphql/Response.vue @@ -105,6 +105,7 @@ useCodemirror( }, linter: null, completer: null, + environmentHighlights: false, }) ) diff --git a/packages/hoppscotch-app/components/graphql/Sidebar.vue b/packages/hoppscotch-app/components/graphql/Sidebar.vue index 0087f1990..a740e7f0e 100644 --- a/packages/hoppscotch-app/components/graphql/Sidebar.vue +++ b/packages/hoppscotch-app/components/graphql/Sidebar.vue @@ -409,6 +409,7 @@ useCodemirror( }, linter: null, completer: null, + environmentHighlights: false, }) ) diff --git a/packages/hoppscotch-app/components/http/CodegenModal.vue b/packages/hoppscotch-app/components/http/CodegenModal.vue index 6b5171a6b..d4062f379 100644 --- a/packages/hoppscotch-app/components/http/CodegenModal.vue +++ b/packages/hoppscotch-app/components/http/CodegenModal.vue @@ -109,6 +109,7 @@ useCodemirror(generatedCode, requestCode, { }, linter: null, completer: null, + environmentHighlights: false, }) watch( diff --git a/packages/hoppscotch-app/components/http/Headers.vue b/packages/hoppscotch-app/components/http/Headers.vue index ae77c61cb..df1a24d93 100644 --- a/packages/hoppscotch-app/components/http/Headers.vue +++ b/packages/hoppscotch-app/components/http/Headers.vue @@ -182,6 +182,7 @@ useCodemirror(bulkEditor, bulkHeaders, { }, linter: null, completer: null, + environmentHighlights: true, }) watch(bulkHeaders, () => { diff --git a/packages/hoppscotch-app/components/http/ImportCurl.vue b/packages/hoppscotch-app/components/http/ImportCurl.vue index 3c7efe792..153daef74 100644 --- a/packages/hoppscotch-app/components/http/ImportCurl.vue +++ b/packages/hoppscotch-app/components/http/ImportCurl.vue @@ -47,6 +47,7 @@ useCodemirror(curlEditor, curl, { }, linter: null, completer: null, + environmentHighlights: false, }) defineProps<{ show: boolean }>() diff --git a/packages/hoppscotch-app/components/http/Parameters.vue b/packages/hoppscotch-app/components/http/Parameters.vue index ede5854da..83959ed68 100644 --- a/packages/hoppscotch-app/components/http/Parameters.vue +++ b/packages/hoppscotch-app/components/http/Parameters.vue @@ -189,6 +189,7 @@ useCodemirror(bulkEditor, bulkParams, { }, linter: null, completer: null, + environmentHighlights: true, }) const params$ = useReadonlyStream(restParams$, []) diff --git a/packages/hoppscotch-app/components/http/PreRequestScript.vue b/packages/hoppscotch-app/components/http/PreRequestScript.vue index b89de57ff..86a6481b5 100644 --- a/packages/hoppscotch-app/components/http/PreRequestScript.vue +++ b/packages/hoppscotch-app/components/http/PreRequestScript.vue @@ -88,6 +88,7 @@ useCodemirror( }, linter, completer, + environmentHighlights: false, }) ) diff --git a/packages/hoppscotch-app/components/http/RawBody.vue b/packages/hoppscotch-app/components/http/RawBody.vue index 58d62343f..64bc45da3 100644 --- a/packages/hoppscotch-app/components/http/RawBody.vue +++ b/packages/hoppscotch-app/components/http/RawBody.vue @@ -91,6 +91,7 @@ useCodemirror( }, linter: null, completer: null, + environmentHighlights: true, }) ) diff --git a/packages/hoppscotch-app/components/http/Tests.vue b/packages/hoppscotch-app/components/http/Tests.vue index eabd4dba0..5f757e7c2 100644 --- a/packages/hoppscotch-app/components/http/Tests.vue +++ b/packages/hoppscotch-app/components/http/Tests.vue @@ -88,6 +88,7 @@ useCodemirror( }, linter, completer, + environmentHighlights: false, }) ) diff --git a/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue index 0a621078b..654f87b33 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue @@ -102,6 +102,7 @@ useCodemirror( }, linter: null, completer: null, + environmentHighlights: true, }) ) diff --git a/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue index dd31ba3fc..7959d1089 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue @@ -193,6 +193,7 @@ const { cursor } = useCodemirror( }, linter: null, completer: null, + environmentHighlights: true, }) ) diff --git a/packages/hoppscotch-app/components/lenses/renderers/RawLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/RawLensRenderer.vue index aa9bc624f..b58a70a6c 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/RawLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/RawLensRenderer.vue @@ -92,6 +92,7 @@ useCodemirror( }, linter: null, completer: null, + environmentHighlights: true, }) ) diff --git a/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue index 65d1198df..fce2bd662 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue @@ -92,6 +92,7 @@ useCodemirror( }, linter: null, completer: null, + environmentHighlights: true, }) ) diff --git a/packages/hoppscotch-app/helpers/editor/codemirror.ts b/packages/hoppscotch-app/helpers/editor/codemirror.ts index 381668559..b2a1e1744 100644 --- a/packages/hoppscotch-app/helpers/editor/codemirror.ts +++ b/packages/hoppscotch-app/helpers/editor/codemirror.ts @@ -30,9 +30,11 @@ import { GQLLanguage } from "@hoppscotch/codemirror-lang-graphql" import { pipe } from "fp-ts/function" import * as O from "fp-ts/Option" import { isJSONContentType } from "../utils/contenttypes" +import { useStreamSubscriber } from "../utils/composables" import { Completer } from "./completion" import { LinterDefinition } from "./linting/linter" import { basicSetup, baseTheme, baseHighlightStyle } from "./themes/baseTheme" +import { HoppEnvironmentPlugin } from "./extensions/HoppEnvironment" type ExtendedEditorConfig = { mode: string @@ -45,6 +47,9 @@ type CodeMirrorOptions = { extendedEditorConfig: Partial linter: LinterDefinition | null completer: Completer | null + + // NOTE: This property is not reactive + environmentHighlights: boolean } const hoppCompleterExt = (completer: Completer): Extension => { @@ -148,6 +153,8 @@ export function useCodemirror( value: Ref, options: CodeMirrorOptions ): { cursor: Ref<{ line: number; ch: number }> } { + const { subscribeToStream } = useStreamSubscriber() + const language = new Compartment() const lineWrapping = new Compartment() const placeholderConfig = new Compartment() @@ -165,64 +172,70 @@ export function useCodemirror( const view = ref() + const environmentTooltip = options.environmentHighlights + ? new HoppEnvironmentPlugin(subscribeToStream, view) + : null + const initView = (el: any) => { + const extensions = [ + basicSetup, + baseTheme, + baseHighlightStyle, + ViewPlugin.fromClass( + class { + update(update: ViewUpdate) { + if (update.selectionSet) { + const cursorPos = update.state.selection.main.head + + const line = update.state.doc.lineAt(cursorPos) + + cachedCursor.value = { + line: line.number - 1, + ch: cursorPos - line.from, + } + + cursor.value = { + line: cachedCursor.value.line, + ch: cachedCursor.value.ch, + } + } + if (update.docChanged) { + // Expensive on big files ? + cachedValue.value = update.state.doc + .toJSON() + .join(update.state.lineBreak) + if (!options.extendedEditorConfig.readOnly) + value.value = cachedValue.value + } + } + } + ), + EditorState.changeFilter.of(() => !options.extendedEditorConfig.readOnly), + placeholderConfig.of( + placeholder(options.extendedEditorConfig.placeholder ?? "") + ), + language.of( + getEditorLanguage( + options.extendedEditorConfig.mode ?? "", + options.linter ?? undefined, + options.completer ?? undefined + ) + ), + lineWrapping.of( + options.extendedEditorConfig.lineWrapping + ? [EditorView.lineWrapping] + : [] + ), + keymap.of(defaultKeymap), + ] + + if (environmentTooltip) extensions.push(environmentTooltip.extension) + view.value = new EditorView({ parent: el, state: EditorState.create({ doc: value.value, - extensions: [ - basicSetup, - baseTheme, - baseHighlightStyle, - ViewPlugin.fromClass( - class { - update(update: ViewUpdate) { - if (update.selectionSet) { - const cursorPos = update.state.selection.main.head - - const line = update.state.doc.lineAt(cursorPos) - - cachedCursor.value = { - line: line.number - 1, - ch: cursorPos - line.from, - } - - cursor.value = { - line: cachedCursor.value.line, - ch: cachedCursor.value.ch, - } - } - if (update.docChanged) { - // Expensive on big files ? - cachedValue.value = update.state.doc - .toJSON() - .join(update.state.lineBreak) - if (!options.extendedEditorConfig.readOnly) - value.value = cachedValue.value - } - } - } - ), - EditorState.changeFilter.of( - () => !options.extendedEditorConfig.readOnly - ), - placeholderConfig.of( - placeholder(options.extendedEditorConfig.placeholder ?? "") - ), - language.of( - getEditorLanguage( - options.extendedEditorConfig.mode ?? "", - options.linter ?? undefined, - options.completer ?? undefined - ) - ), - lineWrapping.of( - options.extendedEditorConfig.lineWrapping - ? [EditorView.lineWrapping] - : [] - ), - keymap.of(defaultKeymap), - ], + extensions, }), }) } diff --git a/packages/hoppscotch-app/helpers/editor/extensions/HoppEnvironment.ts b/packages/hoppscotch-app/helpers/editor/extensions/HoppEnvironment.ts new file mode 100644 index 000000000..2dbb28635 --- /dev/null +++ b/packages/hoppscotch-app/helpers/editor/extensions/HoppEnvironment.ts @@ -0,0 +1,146 @@ +import { Compartment } from "@codemirror/state" +import { hoverTooltip } from "@codemirror/tooltip" +import { + Decoration, + EditorView, + MatchDecorator, + ViewPlugin, +} from "@codemirror/view" +import { Ref } from "@nuxtjs/composition-api" +import { StreamSubscriberFunc } from "~/helpers/utils/composables" +import { + AggregateEnvironment, + aggregateEnvs$, + getAggregateEnvs, +} from "~/newstore/environments" + +const HOPP_ENVIRONMENT_REGEX = /(<<\w+>>)/g + +const HOPP_ENV_HIGHLIGHT = + "cursor-help transition rounded px-1 focus:outline-none mx-0.5" +const HOPP_ENV_HIGHLIGHT_FOUND = + "bg-accentDark text-accentContrast hover:bg-accent" +const HOPP_ENV_HIGHLIGHT_NOT_FOUND = "bg-red-400 text-red-50 hover:bg-red-600" + +const cursorTooltipField = (aggregateEnvs: AggregateEnvironment[]) => + hoverTooltip((view, pos, side) => { + const { from, to, text } = view.state.doc.lineAt(pos) + + // TODO: When Codemirror 6 allows this to work (not make the + // popups appear half of the time) use this implementation + // const wordSelection = view.state.wordAt(pos) + // if (!wordSelection) return null + // const word = view.state.doc.sliceString( + // wordSelection.from - 2, + // wordSelection.to + 2 + // ) + // if (!HOPP_ENVIRONMENT_REGEX.test(word)) return null + + // Tracking the start and the end of the words + let start = pos + let end = pos + + while (start > from && /\w/.test(text[start - from - 1])) start-- + while (end < to && /\w/.test(text[end - from])) end++ + + if ( + (start === pos && side < 0) || + (end === pos && side > 0) || + !HOPP_ENVIRONMENT_REGEX.test(text.slice(start - from - 2, end - from + 2)) + ) + return null + + const envName = + aggregateEnvs.find( + (env) => env.key === text.slice(start - from, end - from) + // env.key === word.slice(wordSelection.from + 2, wordSelection.to - 2) + )?.sourceEnv ?? "choose an environment" + + const envValue = ( + aggregateEnvs.find( + (env) => env.key === text.slice(start - from, end - from) + // env.key === word.slice(wordSelection.from + 2, wordSelection.to - 2) + )?.value ?? "not found" + ).replace(/"/g, """) + + const textContent = `${envName} ${envValue}` + + return { + pos: start, + end: to, + above: true, + create() { + const dom = document.createElement("span") + dom.innerHTML = textContent + dom.className = "tooltip-theme" + return { dom } + }, + } + }) + +function checkEnv(env: string, aggregateEnvs: AggregateEnvironment[]) { + const className = aggregateEnvs.find( + (k: { key: string }) => k.key === env.slice(2, -2) + ) + ? HOPP_ENV_HIGHLIGHT_FOUND + : HOPP_ENV_HIGHLIGHT_NOT_FOUND + + return Decoration.mark({ + class: `${HOPP_ENV_HIGHLIGHT} ${className}`, + }) +} + +const getMatchDecorator = (aggregateEnvs: AggregateEnvironment[]) => + new MatchDecorator({ + regexp: HOPP_ENVIRONMENT_REGEX, + decoration: (m) => checkEnv(m[0], aggregateEnvs), + }) + +export const environmentHighlightStyle = ( + aggregateEnvs: AggregateEnvironment[] +) => { + const decorator = getMatchDecorator(aggregateEnvs) + + return ViewPlugin.define( + (view) => ({ + decorations: decorator.createDeco(view), + update(u) { + this.decorations = decorator.updateDeco(u, this.decorations) + }, + }), + { + decorations: (v) => v.decorations, + } + ) +} + +export class HoppEnvironmentPlugin { + private compartment = new Compartment() + + private envs: AggregateEnvironment[] = [] + + constructor( + subscribeToStream: StreamSubscriberFunc, + private editorView: Ref + ) { + this.envs = getAggregateEnvs() + + subscribeToStream(aggregateEnvs$, (envs) => { + this.envs = envs + + this.editorView.value?.dispatch({ + effects: this.compartment.reconfigure([ + cursorTooltipField(this.envs), + environmentHighlightStyle(this.envs), + ]), + }) + }) + } + + get extension() { + return this.compartment.of([ + cursorTooltipField(this.envs), + environmentHighlightStyle(this.envs), + ]) + } +} diff --git a/packages/hoppscotch-app/helpers/utils/composables.ts b/packages/hoppscotch-app/helpers/utils/composables.ts index e5ebdb437..482f35c8d 100644 --- a/packages/hoppscotch-app/helpers/utils/composables.ts +++ b/packages/hoppscotch-app/helpers/utils/composables.ts @@ -100,11 +100,20 @@ export function pluckMultipleFromRef>( return Object.fromEntries(keys.map((x) => [x, pluckRef(sourceRef, x)])) as any } +export type StreamSubscriberFunc = ( + stream: Observable, + next?: ((value: T) => void) | undefined, + error?: ((e: any) => void) | undefined, + complete?: (() => void) | undefined +) => void + /** * A composable that provides the ability to run streams * and subscribe to them and respect the component lifecycle. */ -export function useStreamSubscriber() { +export function useStreamSubscriber(): { + subscribeToStream: StreamSubscriberFunc +} { const subs: Subscription[] = [] const runAndSubscribe = ( diff --git a/packages/hoppscotch-app/newstore/environments.ts b/packages/hoppscotch-app/newstore/environments.ts index fdba6d5cb..a1e23fb84 100644 --- a/packages/hoppscotch-app/newstore/environments.ts +++ b/packages/hoppscotch-app/newstore/environments.ts @@ -1,6 +1,6 @@ import { cloneDeep } from "lodash" import isEqual from "lodash/isEqual" -import { combineLatest } from "rxjs" +import { combineLatest, Observable } from "rxjs" import { distinctUntilChanged, map, pluck } from "rxjs/operators" import DispatchingStore, { defineDispatchers, @@ -285,17 +285,22 @@ export const currentEnvironment$ = combineLatest([ }) ) +export type AggregateEnvironment = { + key: string + value: string + sourceEnv: string +} + /** * Stream returning all the environment variables accessible in * the current state (Global + The Selected Environment). * NOTE: The source environment attribute will be "Global" for Global Env as source. */ -export const aggregateEnvs$ = combineLatest([ - currentEnvironment$, - globalEnv$, -]).pipe( +export const aggregateEnvs$: Observable = combineLatest( + [currentEnvironment$, globalEnv$] +).pipe( map(([selectedEnv, globalVars]) => { - const results: { key: string; value: string; sourceEnv: string }[] = [] + const results: AggregateEnvironment[] = [] selectedEnv.variables.forEach(({ key, value }) => results.push({ key, value, sourceEnv: selectedEnv.name }) @@ -309,6 +314,29 @@ export const aggregateEnvs$ = combineLatest([ distinctUntilChanged(isEqual) ) +export function getAggregateEnvs() { + const currentEnv = getCurrentEnvironment() + + return [ + ...currentEnv.variables.map( + (x) => + { + key: x.key, + value: x.value, + sourceEnv: currentEnv.name, + } + ), + ...getGlobalVariables().map( + (x) => + { + key: x.key, + value: x.value, + sourceEnv: "Global", + } + ), + ] +} + export function getCurrentEnvironment(): Environment { if (environmentsStore.value.currentEnvironmentIndex === -1) { return { diff --git a/packages/hoppscotch-app/package.json b/packages/hoppscotch-app/package.json index 48d08086c..d841c2a34 100644 --- a/packages/hoppscotch-app/package.json +++ b/packages/hoppscotch-app/package.json @@ -51,6 +51,7 @@ "@codemirror/search": "^0.19.4", "@codemirror/state": "^0.19.6", "@codemirror/text": "^0.19.5", + "@codemirror/tooltip": "^0.19.10", "@codemirror/view": "^0.19.26", "@hoppscotch/codemirror-lang-graphql": "workspace:^0.1.0", "@hoppscotch/data": "workspace:^0.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9c56bdf62..3d4710a34 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,6 +60,7 @@ importers: '@codemirror/search': ^0.19.4 '@codemirror/state': ^0.19.6 '@codemirror/text': ^0.19.5 + '@codemirror/tooltip': ^0.19.10 '@codemirror/view': ^0.19.26 '@graphql-codegen/add': ^3.1.0 '@graphql-codegen/cli': 2.3.0 @@ -180,6 +181,7 @@ importers: '@codemirror/search': 0.19.4 '@codemirror/state': 0.19.6 '@codemirror/text': 0.19.5 + '@codemirror/tooltip': 0.19.10 '@codemirror/view': 0.19.26 '@hoppscotch/codemirror-lang-graphql': link:../codemirror-lang-graphql '@hoppscotch/data': link:../hoppscotch-data @@ -1746,7 +1748,7 @@ packages: '@codemirror/panel': 0.19.0 '@codemirror/rangeset': 0.19.2 '@codemirror/state': 0.19.6 - '@codemirror/tooltip': 0.19.8 + '@codemirror/tooltip': 0.19.10 '@codemirror/view': 0.19.26 crelt: 1.0.5 dev: false @@ -1815,13 +1817,6 @@ packages: '@codemirror/view': 0.19.26 dev: false - /@codemirror/tooltip/0.19.8: - resolution: {integrity: sha512-Xg1H50utH3z1rmyzk5l/dfE0Lko+5pkxzaVlVzAbcqHlDsG9vARDkgRX+fEEpWg/rrvR83GVQhdKwl+wNxjOAg==} - dependencies: - '@codemirror/state': 0.19.6 - '@codemirror/view': 0.19.26 - dev: false - /@codemirror/view/0.19.26: resolution: {integrity: sha512-7QfXtFLDqXY2TfdxPCQ/NvXjINGaqXQ6SAHKQmxZ+jDcTCWmhFcxaAkrDneqcfGmtp72tUPOXG9PiwCbRWgRLw==} dependencies: @@ -3506,11 +3501,11 @@ packages: ufo: 0.7.9 dev: false - /@nuxt/kit-edge/3.0.0-27307420.6a25d3e: - resolution: {integrity: sha512-JieTRigkV52VEQy+oqa6OqR/qOuL9ZmoaH9fDHNwHJXN7hLmil4HbRQ9502G7ura7hkHeAhjZTthXdQDKx1Q5Q==} + /@nuxt/kit-edge/3.0.0-27319101.3e82f0f: + resolution: {integrity: sha512-WASRt4RJp1Zdrm9AbW+diEVss6qv89cCuPbbqnqdmZMQPYepfXfB75dB/GiULeoy5sIokXJLNz7WqSCSL0INjw==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0} dependencies: - '@nuxt/schema': /@nuxt/schema-edge/3.0.0-27307420.6a25d3e + '@nuxt/schema': /@nuxt/schema-edge/3.0.0-27319101.3e82f0f consola: 2.15.3 defu: 5.0.0 dotenv: 10.0.0 @@ -3531,7 +3526,7 @@ packages: /@nuxt/kit/0.8.1-edge: resolution: {integrity: sha512-7kU+mYxRy3w9UohFK/rfrPkKXM9A4LWsTqpFN3MH7mxohy98SFBkf87B6nqE6ulXmztInK+MptS0Lr+VQa0E6w==} dependencies: - '@nuxt/kit-edge': 3.0.0-27307420.6a25d3e + '@nuxt/kit-edge': 3.0.0-27319101.3e82f0f dev: true /@nuxt/loading-screen/2.0.4: @@ -3554,8 +3549,8 @@ packages: node-fetch: 2.6.6 dev: false - /@nuxt/schema-edge/3.0.0-27307420.6a25d3e: - resolution: {integrity: sha512-QB6zMvxMQ+H5kwqd/6vZO7UAxGLIMZGV5zEc9rlYIyoilNnMO3opBJWuaUaokDLW7JpA1bGOfakLWWg8e8LGgQ==} + /@nuxt/schema-edge/3.0.0-27319101.3e82f0f: + resolution: {integrity: sha512-D5ekvoG6KV85Ko40+8j4jUtv8JifgeXoD44gY1b/dOZu++UkwH7COr+zU80UCa3hTaIcKFwQ0yRg7CTl1susTA==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0} dependencies: create-require: 1.1.1