diff --git a/packages/codemirror-lang-graphql/.gitignore b/packages/codemirror-lang-graphql/.gitignore new file mode 100644 index 00000000..0ef47320 --- /dev/null +++ b/packages/codemirror-lang-graphql/.gitignore @@ -0,0 +1,4 @@ +/node_modules +package-lock.json +/dist +/src/*.d.ts diff --git a/packages/codemirror-lang-graphql/.npmignore b/packages/codemirror-lang-graphql/.npmignore new file mode 100644 index 00000000..9bd97602 --- /dev/null +++ b/packages/codemirror-lang-graphql/.npmignore @@ -0,0 +1,5 @@ +/src +/test +/node_modules +rollup.config.js +tsconfig.json diff --git a/packages/codemirror-lang-graphql/README.md b/packages/codemirror-lang-graphql/README.md new file mode 100644 index 00000000..613036ca --- /dev/null +++ b/packages/codemirror-lang-graphql/README.md @@ -0,0 +1 @@ +A [CodeMirror 6](https://codemirror.net/6) language plugin for GraphQL \ No newline at end of file diff --git a/packages/codemirror-lang-graphql/package.json b/packages/codemirror-lang-graphql/package.json new file mode 100644 index 00000000..c147de81 --- /dev/null +++ b/packages/codemirror-lang-graphql/package.json @@ -0,0 +1,32 @@ +{ + "name": "@hoppscotch/codemirror-lang-graphql", + "version": "0.1.0", + "description": "GraphQL language support for CodeMirror", + "scripts": { + "test": "mocha test/test.js", + "prepare": "rollup -c" + }, + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.js", + "exports": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "types": "dist/index.d.ts", + "sideEffects": false, + "dependencies": { + "@codemirror/highlight": "^0.19.0", + "@codemirror/language": "^0.19.0", + "@lezer/lr": "^0.15.0" + }, + "devDependencies": { + "@lezer/generator": "^0.15.0", + "mocha": "^9.0.1", + "rollup": "^2.35.1", + "rollup-plugin-dts": "^3.0.2", + "rollup-plugin-ts": "^1.4.0", + "typescript": "^4.3.4" + }, + "license": "MIT" +} diff --git a/packages/codemirror-lang-graphql/rollup.config.js b/packages/codemirror-lang-graphql/rollup.config.js new file mode 100644 index 00000000..f4367e40 --- /dev/null +++ b/packages/codemirror-lang-graphql/rollup.config.js @@ -0,0 +1,12 @@ +import typescript from "rollup-plugin-ts" +import {lezer} from "@lezer/generator/rollup" + +export default { + input: "src/index.js", + external: id => id != "tslib" && !/^(\.?\/|\w:)/.test(id), + output: [ + {file: "dist/index.cjs", format: "cjs"}, + {dir: "./dist", format: "es"} + ], + plugins: [lezer(), typescript()] +} diff --git a/packages/codemirror-lang-graphql/src/index.js b/packages/codemirror-lang-graphql/src/index.js new file mode 100644 index 00000000..49af63df --- /dev/null +++ b/packages/codemirror-lang-graphql/src/index.js @@ -0,0 +1,43 @@ +import {parser} from "./syntax.grammar" +import {LRLanguage, LanguageSupport, indentNodeProp, foldNodeProp, foldInside, delimitedIndent} from "@codemirror/language" +import {styleTags, tags as t} from "@codemirror/highlight" + +export const GQLLanguage = LRLanguage.define({ + parser: parser.configure({ + props: [ + indentNodeProp.add({ + "SelectionSet FieldsDefinition ObjectValue SchemaDefinition RootTypeDef": delimitedIndent({ closing: "}", align: true }), + }), + foldNodeProp.add({ + Application: foldInside, + "SelectionSet FieldsDefinition ObjectValue RootOperationTypeDefinition RootTypeDef": (node) => { + return { + from: node.from, + to: node.to + } + + } + }), + styleTags({ + Name: t.definition(t.variableName), + "OperationDefinition/Name": t.definition(t.function(t.variableName)), + OperationType: t.keyword, + BooleanValue: t.bool, + StringValue: t.string, + IntValue: t.number, + FloatValue: t.number, + NullValue: t.null, + ObjectValue: t.brace, + Comment: t.lineComment, + }) + ] + }), + languageData: { + commentTokens: { line: "#" }, + closeBrackets: { brackets: ["(", "[", "{", '"', '"""'] } + } +}) + +export function GQL() { + return new LanguageSupport(GQLLanguage) +} diff --git a/packages/codemirror-lang-graphql/src/syntax.grammar b/packages/codemirror-lang-graphql/src/syntax.grammar new file mode 100644 index 00000000..dd3f2734 --- /dev/null +++ b/packages/codemirror-lang-graphql/src/syntax.grammar @@ -0,0 +1,372 @@ +@top SourceFile { + Document +} + +@precedence { + fieldDef @right, + typeDef @right +} + +Document { + Definition+ +} + +Definition { + ExecutableDefinition | + TypeSystemDefinition | + TypeSystemExtension +} + +ExecutableDefinition { + OperationDefinition | + FragmentDefinition +} + +TypeSystemDefinition { + SchemaDefinition | + TypeDefinition | + DirectiveDefinition +} + +TypeSystemExtension { + SchemaExtension | + TypeExtension +} + +SchemaDefinition { + Description? @specialize Directives? RootTypeDef +} + +RootTypeDef { + "{" RootOperationTypeDefinition+ "}" +} + +SchemaExtension { + @specialize @specialize Directives? RootTypeDef +} + +TypeExtension { + ScalarTypeExtension | + ObjectTypeExtension | + InterfaceTypeExtension | + UnionTypeExtension | + EnumTypeExtension | + InputObjectTypeExtension +} + +ScalarTypeExtension { + @specialize @specialize Name Directives +} + +ObjectTypeExtension /* precedence: right 0 */ { + @specialize @specialize Name ImplementsInterfaces? Directives? !typeDef FieldsDefinition | + @specialize @specialize Name ImplementsInterfaces? Directives? +} + +InterfaceTypeExtension /* precedence: right 0 */ { + @specialize @specialize Name ImplementsInterfaces? Directives? FieldsDefinition | + @specialize @specialize Name ImplementsInterfaces? Directives? +} + +UnionTypeExtension /* precedence: right 0 */ { + @specialize @specialize Name Directives? UnionMemberTypes | + @specialize @specialize Name Directives? +} + +EnumTypeExtension /* precedence: right 0 */ { + @specialize @specialize Name Directives? !typeDef EnumValuesDefinition | + @specialize @specialize Name Directives? +} + +InputObjectTypeExtension /* precedence: right 0 */ { + @specialize @specialize Name Directives? InputFieldsDefinition+ | + @specialize @specialize Name Directives? +} + +InputFieldsDefinition { + !fieldDef "{" InputValueDefinition+ "}" +} + +EnumValuesDefinition { + !fieldDef "{" EnumValueDefinition+ "}" +} + +EnumValueDefinition { + Description? EnumValue Directives? +} + +ImplementsInterfaces { + ImplementsInterfaces "&" NamedType | + @specialize "&"? NamedType +} + +FieldsDefinition { + !fieldDef "{" FieldDefinition+ "}" +} + +FieldDefinition { + Description? Name ArgumentsDefinition? ":" Type Directives? +} + +ArgumentsDefinition { + "(" InputValueDefinition+ ")" +} + +InputValueDefinition { + Description? Name ":" Type DefaultValue? Directives? +} + +DefaultValue { + "=" Value +} + +UnionMemberTypes { + UnionMemberTypes "|" NamedType | + "=" "|"? NamedType +} + +RootOperationTypeDefinition { + OperationType ":" NamedType +} + +OperationDefinition { + SelectionSet | + OperationType Name? VariableDefinitions? Directives? SelectionSet +} + +TypeDefinition { + ScalarTypeDefinition | + ObjectTypeDefinition | + InterfaceTypeDefinition | + UnionTypeDefinition | + EnumTypeDefinition | + InputObjectTypeDefinition +} + +ScalarTypeDefinition /* precedence: right 0 */ { + Description? @specialize Name Directives? +} + +ObjectTypeDefinition /* precedence: right 0 */ { + Description? @specialize Name ImplementsInterfaces? Directives? FieldsDefinition? +} + +InterfaceTypeDefinition /* precedence: right 0 */ { + Description? @specialize Name ImplementsInterfaces? Directives? FieldsDefinition? +} + +UnionTypeDefinition /* precedence: right 0 */ { + Description? @specialize Name Directives? UnionMemberTypes? +} + +EnumTypeDefinition /* precedence: right 0 */ { + Description? @specialize Name Directives? !typeDef EnumValuesDefinition? +} + +InputObjectTypeDefinition /* precedence: right 0 */ { + Description? @specialize Name Directives? !typeDef InputFieldsDefinition? +} + +VariableDefinitions { + "(" VariableDefinition+ ")" +} + +VariableDefinition { + Variable ":" Type DefaultValue? Directives? Comma? +} + +SelectionSet { + "{" Selection* "}" +} + +Selection { + Field | + InlineFragment | + FragmentSpread +} + +Field { + Alias? Name Arguments? Directive? SelectionSet? +} + +Alias { + Name ":" +} + +Arguments { + "(" Argument+ ")" +} + +Argument { + Name ":" Value +} + +Value { + Variable | + StringValue | + IntValue | + FloatValue | + BooleanValue | + NullValue | + EnumValue | + ListValue | + ObjectValue +} + +Variable { + "$" Name +} + +EnumValue { + Name +} + +ListValue { + "[" Value* "]" +} + +ObjectValue { + "{" ObjectField* "}" +} + +ObjectField { + Name ":" Value Comma? +} + +FragmentSpread { + "..." FragmentName Directives? +} + +FragmentDefinition { + @specialize FragmentName TypeCondition Directives? SelectionSet +} + +FragmentName { + Name +} + +InlineFragment { + "..." TypeCondition? Directives? SelectionSet +} + +TypeCondition { + @specialize NamedType +} + +Directives { + Directive+ +} + +Directive { + "@" Name Arguments? +} + +DirectiveDefinition /* precedence: right 1 */ { + Description? @specialize "@" Name ArgumentsDefinition? @specialize ? @specialize DirectiveLocations +} + +DirectiveLocations { + DirectiveLocations "|" DirectiveLocation | + "|"? DirectiveLocation +} + +DirectiveLocation { + ExecutableDirectiveLocation | + TypeSystemDirectiveLocation +} + +Type { + NamedType | + ListType | + NonNullType +} + +NamedType { + Name +} + +ListType { + "[" Type "]" +} + +NonNullType { + NamedType "!" | + ListType "!" +} + +Description { + StringValue +} + +OperationType { + @specialize + | @specialize + | @specialize +} + +BooleanValue { + @specialize + | @specialize +} + +NullValue { + @specialize +} + +ExecutableDirectiveLocation { + @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize +} + +TypeSystemDirectiveLocation { + @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize + | @specialize +} + +@skip { Whitespace | Comment } + +@tokens { + Whitespace { + std.whitespace+ + } + StringValue { + "\"\"\"" (!["] | "\\n" | "\"" "\""? !["])* "\"\"\"" | "\"" !["\\\n]* "\"" + } + IntValue { + "-"? "0" + | "-"? std.digit+ + } + + FloatValue { + IntValue ("." std.digit+ | ("e" | "E") IntValue+) + } + + @precedence { IntValue, FloatValue } + + Name { + $[_A-Za-z] $[_0-9A-Za-z]* + } + Comment { + "#" ![\n]* + } + Comma { + "," + } +} + +@detectDelim \ No newline at end of file diff --git a/packages/codemirror-lang-graphql/test/cases.txt b/packages/codemirror-lang-graphql/test/cases.txt new file mode 100644 index 00000000..0cc3621e --- /dev/null +++ b/packages/codemirror-lang-graphql/test/cases.txt @@ -0,0 +1 @@ +# TODO: Write Lezer Tests \ No newline at end of file diff --git a/packages/codemirror-lang-graphql/test/test.js b/packages/codemirror-lang-graphql/test/test.js new file mode 100644 index 00000000..5011a420 --- /dev/null +++ b/packages/codemirror-lang-graphql/test/test.js @@ -0,0 +1,17 @@ +import {GQLLanguage} from "../dist/index.js" +import {fileTests} from "lezer-generator/dist/test" + +import * as fs from "fs" +import * as path from "path" +import { fileURLToPath } from 'url'; +let caseDir = path.dirname(fileURLToPath(import.meta.url)) + +for (let file of fs.readdirSync(caseDir)) { + if (!/\.txt$/.test(file)) continue + + let name = /^[^\.]*/.exec(file)[0] + describe(name, () => { + for (let {name, run} of fileTests(fs.readFileSync(path.join(caseDir, file), "utf8"), file)) + it(name, () => run(GQLLanguage.parser)) + }) +} diff --git a/packages/codemirror-lang-graphql/tsconfig.json b/packages/codemirror-lang-graphql/tsconfig.json new file mode 100644 index 00000000..d91b0986 --- /dev/null +++ b/packages/codemirror-lang-graphql/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "strict": true, + "target": "es6", + "module": "es2020", + "newLine": "lf", + "declaration": true, + "moduleResolution": "node", + "allowJs": true, + }, + "include": ["src/*"] +} \ No newline at end of file diff --git a/packages/hoppscotch-app/assets/scss/styles.scss b/packages/hoppscotch-app/assets/scss/styles.scss index 049c1cc5..489027c5 100644 --- a/packages/hoppscotch-app/assets/scss/styles.scss +++ b/packages/hoppscotch-app/assets/scss/styles.scss @@ -32,8 +32,11 @@ } ::selection { - @apply bg-accent; - @apply text-accentContrast; + @apply bg-divider; +} + +.cm-focused { + @apply !outline-none; } input::placeholder, @@ -286,7 +289,7 @@ pre.ace_editor { } } -input[type="checkbox"] { +input[type="checkbox"].checkbox { @apply hidden; &, diff --git a/packages/hoppscotch-app/assets/scss/themes.scss b/packages/hoppscotch-app/assets/scss/themes.scss index 4d240d69..db587efd 100644 --- a/packages/hoppscotch-app/assets/scss/themes.scss +++ b/packages/hoppscotch-app/assets/scss/themes.scss @@ -52,6 +52,48 @@ --editor-theme: "twilight"; } +@mixin dark-editor-theme { + --editor-type-color: theme("colors.purple.500"); + --editor-name-color: theme("colors.blue.500"); + --editor-operator-color: theme("colors.indigo.500"); + --editor-invalid-color: theme("colors.red.500"); + --editor-separator-color: theme("colors.gray.500"); + --editor-meta-color: theme("colors.gray.500"); + --editor-variable-color: theme("colors.green.500"); + --editor-link-color: theme("colors.cyan.500"); + --editor-process-color: theme("colors.gray.400"); + --editor-constant-color: theme("colors.fuchsia.500"); + --editor-keyword-color: theme("colors.pink.500"); +} + +@mixin light-editor-theme { + --editor-type-color: theme("colors.purple.600"); + --editor-name-color: theme("colors.red.600"); + --editor-operator-color: theme("colors.indigo.600"); + --editor-invalid-color: theme("colors.red.600"); + --editor-separator-color: theme("colors.gray.600"); + --editor-meta-color: theme("colors.gray.600"); + --editor-variable-color: theme("colors.green.600"); + --editor-link-color: theme("colors.cyan.600"); + --editor-process-color: theme("colors.blue.600"); + --editor-constant-color: theme("colors.fuchsia.600"); + --editor-keyword-color: theme("colors.pink.600"); +} + +@mixin black-editor-theme { + --editor-type-color: theme("colors.purple.400"); + --editor-name-color: theme("colors.gray.400"); + --editor-operator-color: theme("colors.indigo.400"); + --editor-invalid-color: theme("colors.red.400"); + --editor-separator-color: theme("colors.gray.400"); + --editor-meta-color: theme("colors.gray.400"); + --editor-variable-color: theme("colors.green.400"); + --editor-link-color: theme("colors.cyan.400"); + --editor-process-color: theme("colors.blue.400"); + --editor-constant-color: theme("colors.fuchsia.400"); + --editor-keyword-color: theme("colors.pink.400"); +} + @mixin green-theme { --accent-color: theme("colors.green.500"); --accent-light-color: theme("colors.green.400"); @@ -146,18 +188,22 @@ @include base-theme; @include dark-theme; @include green-theme; + @include dark-editor-theme; } :root.light { @include light-theme; + @include light-editor-theme; } :root.dark { @include dark-theme; + @include dark-editor-theme; } :root.black { @include black-theme; + @include black-editor-theme; } :root[data-accent="blue"] { diff --git a/packages/hoppscotch-app/components/graphql/RequestOptions.vue b/packages/hoppscotch-app/components/graphql/RequestOptions.vue index b2f6976f..9de20b28 100644 --- a/packages/hoppscotch-app/components/graphql/RequestOptions.vue +++ b/packages/hoppscotch-app/components/graphql/RequestOptions.vue @@ -310,8 +310,6 @@ import { logHoppRequestRunToAnalytics } from "~/helpers/fb/analytics" import { getCurrentStrategyID } from "~/helpers/network" import { makeGQLRequest } from "~/helpers/types/HoppGQLRequest" import { useCodemirror } from "~/helpers/editor/codemirror" -import "codemirror/mode/javascript/javascript" -import "~/helpers/editor/modes/graphql" import jsonLinter from "~/helpers/editor/linting/json" import { createGQLQueryLinter } from "~/helpers/editor/linting/gqlQuery" import queryCompleter from "~/helpers/editor/completion/gqlQuery" diff --git a/packages/hoppscotch-app/components/graphql/Sidebar.vue b/packages/hoppscotch-app/components/graphql/Sidebar.vue index 26d96f9a..5bb07232 100644 --- a/packages/hoppscotch-app/components/graphql/Sidebar.vue +++ b/packages/hoppscotch-app/components/graphql/Sidebar.vue @@ -254,7 +254,6 @@ import { setGQLURL, setGQLVariables, } from "~/newstore/GQLSession" -import "~/helpers/editor/modes/graphql" function isTextFoundInGraphqlFieldObject( text: string, diff --git a/packages/hoppscotch-app/components/http/ImportCurl.vue b/packages/hoppscotch-app/components/http/ImportCurl.vue index ba7a2cc5..393d1868 100644 --- a/packages/hoppscotch-app/components/http/ImportCurl.vue +++ b/packages/hoppscotch-app/components/http/ImportCurl.vue @@ -30,7 +30,6 @@ import { makeRESTRequest, } from "~/helpers/types/HoppRESTRequest" import { setRESTRequest } from "~/newstore/RESTSession" -import "codemirror/mode/shell/shell" const { $toast, diff --git a/packages/hoppscotch-app/components/http/Parameters.vue b/packages/hoppscotch-app/components/http/Parameters.vue index b702eaae..6387c952 100644 --- a/packages/hoppscotch-app/components/http/Parameters.vue +++ b/packages/hoppscotch-app/components/http/Parameters.vue @@ -177,7 +177,6 @@ import { deleteAllRESTParams, setRESTParams, } from "~/newstore/RESTSession" -import "codemirror/mode/yaml/yaml" const { $toast, diff --git a/packages/hoppscotch-app/components/http/PreRequestScript.vue b/packages/hoppscotch-app/components/http/PreRequestScript.vue index b4b34aee..50d153ee 100644 --- a/packages/hoppscotch-app/components/http/PreRequestScript.vue +++ b/packages/hoppscotch-app/components/http/PreRequestScript.vue @@ -85,7 +85,6 @@ import { reactive, ref, useContext } from "@nuxtjs/composition-api" import { usePreRequestScript } from "~/newstore/RESTSession" import snippets from "~/helpers/preRequestScriptSnippets" -import "codemirror/mode/javascript/javascript" import { useCodemirror } from "~/helpers/editor/codemirror" import linter from "~/helpers/editor/linting/preRequest" import completer from "~/helpers/editor/completion/preRequest" diff --git a/packages/hoppscotch-app/components/http/RawBody.vue b/packages/hoppscotch-app/components/http/RawBody.vue index 3df017a9..1d67ed93 100644 --- a/packages/hoppscotch-app/components/http/RawBody.vue +++ b/packages/hoppscotch-app/components/http/RawBody.vue @@ -72,11 +72,6 @@ import { useCodemirror } from "~/helpers/editor/codemirror" import { getEditorLangForMimeType } from "~/helpers/editorutils" import { pluckRef } from "~/helpers/utils/composables" import { useRESTRequestBody } from "~/newstore/RESTSession" -import "codemirror/mode/yaml/yaml" -import "codemirror/mode/xml/xml" -import "codemirror/mode/css/css" -import "codemirror/mode/htmlmixed/htmlmixed" -import "codemirror/mode/javascript/javascript" const props = defineProps<{ contentType: string diff --git a/packages/hoppscotch-app/components/http/Tests.vue b/packages/hoppscotch-app/components/http/Tests.vue index 5f8d06b0..d51d2a0b 100644 --- a/packages/hoppscotch-app/components/http/Tests.vue +++ b/packages/hoppscotch-app/components/http/Tests.vue @@ -85,7 +85,6 @@ import { reactive, ref, useContext } from "@nuxtjs/composition-api" import { useTestScript } from "~/newstore/RESTSession" import testSnippets from "~/helpers/testSnippets" -import "codemirror/mode/javascript/javascript" import { useCodemirror } from "~/helpers/editor/codemirror" import linter from "~/helpers/editor/linting/testScript" import completer from "~/helpers/editor/completion/testScript" diff --git a/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue index 899e8b0e..b2c78ddb 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/HTMLLensRenderer.vue @@ -67,10 +67,6 @@ import { computed, ref, useContext, reactive } from "@nuxtjs/composition-api" import { useCodemirror } from "~/helpers/editor/codemirror" import { copyToClipboard } from "~/helpers/utils/clipboard" -import "codemirror/mode/xml/xml" -import "codemirror/mode/javascript/javascript" -import "codemirror/mode/css/css" -import "codemirror/mode/htmlmixed/htmlmixed" import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse" const props = defineProps<{ diff --git a/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue index db00a34f..994b3e18 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/JSONLensRenderer.vue @@ -147,7 +147,6 @@ import { computed, ref, useContext, reactive } from "@nuxtjs/composition-api" import { useCodemirror } from "~/helpers/editor/codemirror" import { copyToClipboard } from "~/helpers/utils/clipboard" -import "codemirror/mode/javascript/javascript" import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse" import jsonParse, { JSONObjectMember, JSONValue } from "~/helpers/jsonParse" import { getJSONOutlineAtPos } from "~/helpers/newOutline" diff --git a/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue b/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue index bc409c0a..bc36d7a6 100644 --- a/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue +++ b/packages/hoppscotch-app/components/lenses/renderers/XMLLensRenderer.vue @@ -51,7 +51,6 @@ import { computed, ref, useContext, reactive } from "@nuxtjs/composition-api" import { useCodemirror } from "~/helpers/editor/codemirror" import { copyToClipboard } from "~/helpers/utils/clipboard" -import "codemirror/mode/xml/xml" import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse" const props = defineProps<{ diff --git a/packages/hoppscotch-app/helpers/editor/codemirror.ts b/packages/hoppscotch-app/helpers/editor/codemirror.ts index 7319c741..38166855 100644 --- a/packages/hoppscotch-app/helpers/editor/codemirror.ts +++ b/packages/hoppscotch-app/helpers/editor/codemirror.ts @@ -1,215 +1,324 @@ -import CodeMirror from "codemirror" +import { + keymap, + EditorView, + ViewPlugin, + ViewUpdate, + placeholder, +} from "@codemirror/view" +import { + Extension, + EditorState, + Compartment, + EditorSelection, +} from "@codemirror/state" +import { Language, LanguageSupport } from "@codemirror/language" +import { defaultKeymap } from "@codemirror/commands" +import { Completion, autocompletion } from "@codemirror/autocomplete" +import { linter } from "@codemirror/lint" -import "codemirror-theme-github/theme/github.css" -import "codemirror/theme/base16-dark.css" -import "codemirror/theme/tomorrow-night-bright.css" +import { + watch, + ref, + Ref, + onMounted, + onBeforeUnmount, +} from "@nuxtjs/composition-api" -import "codemirror/lib/codemirror.css" -import "codemirror/addon/lint/lint.css" -import "codemirror/addon/dialog/dialog.css" -import "codemirror/addon/hint/show-hint.css" - -import "codemirror/addon/fold/foldgutter.css" -import "codemirror/addon/fold/foldgutter" -import "codemirror/addon/fold/brace-fold" -import "codemirror/addon/fold/comment-fold" -import "codemirror/addon/fold/indent-fold" -import "codemirror/addon/display/autorefresh" -import "codemirror/addon/lint/lint" -import "codemirror/addon/hint/show-hint" -import "codemirror/addon/display/placeholder" -import "codemirror/addon/edit/closebrackets" -import "codemirror/addon/search/search" -import "codemirror/addon/search/searchcursor" -import "codemirror/addon/search/jump-to-line" -import "codemirror/addon/dialog/dialog" -import "codemirror/addon/selection/active-line" - -import { watch, onMounted, ref, Ref, useContext } from "@nuxtjs/composition-api" -import { LinterDefinition } from "./linting/linter" +import { javascriptLanguage } from "@codemirror/lang-javascript" +import { jsonLanguage } from "@codemirror/lang-json" +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 { Completer } from "./completion" +import { LinterDefinition } from "./linting/linter" +import { basicSetup, baseTheme, baseHighlightStyle } from "./themes/baseTheme" + +type ExtendedEditorConfig = { + mode: string + placeholder: string + readOnly: boolean + lineWrapping: boolean +} type CodeMirrorOptions = { - extendedEditorConfig: Omit + extendedEditorConfig: Partial linter: LinterDefinition | null completer: Completer | null } -const DEFAULT_EDITOR_CONFIG: CodeMirror.EditorConfiguration = { - autoRefresh: true, - lineNumbers: true, - foldGutter: true, - autoCloseBrackets: true, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: { - "Ctrl-Space": "autocomplete", - }, - viewportMargin: Infinity, - styleActiveLine: true, +const hoppCompleterExt = (completer: Completer): Extension => { + return autocompletion({ + override: [ + async (context) => { + // Expensive operation! Disable on bigger files ? + const text = context.state.doc.toJSON().join(context.state.lineBreak) + + const line = context.state.doc.lineAt(context.pos) + const lineStart = line.from + const lineNo = line.number - 1 + const ch = context.pos - lineStart + + // Only do trigger on type when typing a word token, else stop (unless explicit) + if (!context.matchBefore(/\w+/) && !context.explicit) + return { + from: context.pos, + options: [], + } + + const result = await completer(text, { line: lineNo, ch }) + + // Use more completion features ? + const completions = + result?.completions.map((comp) => ({ + label: comp.text, + detail: comp.meta, + })) ?? [] + + return { + from: context.state.wordAt(context.pos)?.from ?? context.pos, + options: completions, + } + }, + ], + }) } -/** - * A Vue composable to mount and use Codemirror - * - * NOTE: Make sure to import all the necessary Codemirror modules, - * as this function doesn't import any other than the core - * @param el Reference to the dom node to attach to - * @param value Reference to value to read/write to - * @param options CodeMirror options to pass - */ +const hoppLinterExt = (hoppLinter: LinterDefinition): Extension => { + return linter(async (view) => { + // Requires full document scan, hence expensive on big files, force disable on big files ? + const linterResult = await hoppLinter( + view.state.doc.toJSON().join(view.state.lineBreak) + ) + + return linterResult.map((result) => { + const startPos = + view.state.doc.line(result.from.line + 1).from + result.from.ch + const endPos = view.state.doc.line(result.to.line + 1).from + result.to.ch + + return { + from: startPos, + to: endPos, + message: result.message, + severity: result.severity, + } + }) + }) +} + +const hoppLang = ( + language: Language, + linter?: LinterDefinition | undefined, + completer?: Completer | undefined +) => { + const exts: Extension[] = [] + + if (linter) exts.push(hoppLinterExt(linter)) + if (completer) exts.push(hoppCompleterExt(completer)) + + return new LanguageSupport(language, exts) +} + +const getLanguage = (langMime: string): Language | null => { + if (isJSONContentType(langMime)) { + return jsonLanguage + } else if (langMime === "application/javascript") { + return javascriptLanguage + } else if (langMime === "graphql") { + return GQLLanguage + } + + // None matched, so return null + return null +} + +const getEditorLanguage = ( + langMime: string, + linter: LinterDefinition | undefined, + completer: Completer | undefined +): Extension => + pipe( + O.fromNullable(getLanguage(langMime)), + O.map((lang) => hoppLang(lang, linter, completer)), + O.getOrElseW(() => []) + ) + export function useCodemirror( el: Ref, value: Ref, options: CodeMirrorOptions -): { cm: Ref; cursor: Ref } { - const { $colorMode } = useContext() as any +): { cursor: Ref<{ line: number; ch: number }> } { + const language = new Compartment() + const lineWrapping = new Compartment() + const placeholderConfig = new Compartment() - const cm = ref(null) - const cursor = ref({ line: 0, ch: 0 }) + const cachedCursor = ref({ + line: 0, + ch: 0, + }) + const cursor = ref({ + line: 0, + ch: 0, + }) - const updateEditorConfig = () => { - Object.keys(options.extendedEditorConfig).forEach((key) => { - // Only update options which need updating - if ( - cm.value && - cm.value?.getOption(key as any) !== - (options.extendedEditorConfig as any)[key] - ) { - cm.value?.setOption( - key as any, - (options.extendedEditorConfig as any)[key] - ) - } + const cachedValue = ref(value.value) + + const view = ref() + + const initView = (el: any) => { + 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), + ], + }), }) } - const updateLinterConfig = () => { - if (options.linter) { - cm.value?.setOption("lint", options.linter) + onMounted(() => { + if (el.value) { + if (!view.value) initView(el.value) } - } + }) - const updateCompleterConfig = () => { - if (options.completer) { - cm.value?.setOption("hintOptions", { - completeSingle: false, - hint: async (editor: CodeMirror.Editor) => { - const pos = editor.getCursor() - const text = editor.getValue() + watch(el, () => { + if (el.value) { + if (!view.value) initView(el.value) + } else { + view.value?.destroy() + view.value = undefined + } + }) - const token = editor.getTokenAt(pos) - // It's not a word token, so, just increment to skip to next - if (token.string.toUpperCase() === token.string.toLowerCase()) - token.start += 1 + onBeforeUnmount(() => { + view.value?.destroy() + }) - const result = await options.completer!(text, pos) - - if (!result) return null - - return { - from: { line: pos.line, ch: token.start }, - to: { line: pos.line, ch: token.end }, - list: result.completions - .sort((a, b) => a.score - b.score) - .map((x) => x.text), - } + watch(value, (newVal) => { + if (cachedValue.value !== newVal) { + view.value?.dispatch({ + filter: false, + changes: { + from: 0, + to: view.value.state.doc.length, + insert: newVal, }, }) } - } - - const initialize = () => { - if (!el.value) return - - cm.value = CodeMirror(el.value!, DEFAULT_EDITOR_CONFIG) - - cm.value.setValue(value.value) - - setTheme() - updateEditorConfig() - updateLinterConfig() - updateCompleterConfig() - - cm.value.on("change", (instance) => { - // External update propagation (via watchers) should be ignored - if (instance.getValue() !== value.value) { - value.value = instance.getValue() - } - }) - - cm.value.on("cursorActivity", (instance) => { - cursor.value = instance.getCursor() - }) - } - - // Boot-up CodeMirror, set the value and listeners - onMounted(() => { - initialize() }) - // Reinitialize if the target ref updates - watch(el, () => { - if (cm.value) { - const parent = cm.value.getWrapperElement() - parent.remove() - cm.value = null + watch( + () => [ + options.extendedEditorConfig.mode, + options.linter, + options.completer, + ], + () => { + view.value?.dispatch({ + effects: language.reconfigure( + getEditorLanguage( + (options.extendedEditorConfig.mode as any) ?? "", + options.linter ?? undefined, + options.completer ?? undefined + ) + ), + }) } - initialize() - }) + ) - const setTheme = () => { - if (cm.value) { - cm.value?.setOption("theme", getThemeName($colorMode.value)) + watch( + () => options.extendedEditorConfig.lineWrapping, + (newMode) => { + view.value?.dispatch({ + effects: lineWrapping.reconfigure( + newMode ? [EditorView.lineWrapping] : [] + ), + }) } - } + ) - const getThemeName = (mode: string) => { - switch (mode) { - case "system": - return "default" - case "light": - return "github" - case "dark": - return "base16-dark" - case "black": - return "tomorrow-night-bright" - default: - return "default" + watch( + () => options.extendedEditorConfig.placeholder, + (newValue) => { + view.value?.dispatch({ + effects: placeholderConfig.reconfigure(placeholder(newValue ?? "")), + }) } - } + ) - // If the editor properties are reactive, watch for updates - watch(() => options.extendedEditorConfig, updateEditorConfig, { - immediate: true, - deep: true, - }) - watch(() => options.linter, updateLinterConfig, { immediate: true }) - watch(() => options.completer, updateCompleterConfig, { immediate: true }) + watch(cursor, (newPos) => { + if (view.value) { + if ( + cachedCursor.value.line !== newPos.line || + cachedCursor.value.ch !== newPos.ch + ) { + const line = view.value.state.doc.line(newPos.line + 1) + const selUpdate = EditorSelection.cursor(line.from + newPos.ch - 1) - // Watch value updates - watch(value, (newVal) => { - // Check if we are mounted - if (cm.value) { - // Don't do anything on internal updates - if (cm.value.getValue() !== newVal) { - cm.value.setValue(newVal) + view.value?.focus() + + view.value.dispatch({ + scrollIntoView: true, + selection: selUpdate, + effects: EditorView.scrollTo.of(selUpdate), + }) } } }) - // Push cursor updates - watch(cursor, (value) => { - if (value !== cm.value?.getCursor()) { - cm.value?.focus() - cm.value?.setCursor(value) - } - }) - - // Watch color mode updates and update theme - watch(() => $colorMode.value, setTheme) - return { - cm, cursor, } } diff --git a/packages/hoppscotch-app/helpers/editor/modes/graphql.ts b/packages/hoppscotch-app/helpers/editor/modes/graphql.ts deleted file mode 100644 index 2c494988..00000000 --- a/packages/hoppscotch-app/helpers/editor/modes/graphql.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2021 GraphQL Contributors - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -import CodeMirror from "codemirror" -import { - LexRules, - ParseRules, - isIgnored, - onlineParser, - State, -} from "graphql-language-service-parser" - -/** - * The GraphQL mode is defined as a tokenizer along with a list of rules, each - * of which is either a function or an array. - * - * * Function: Provided a token and the stream, returns an expected next step. - * * Array: A list of steps to take in order. - * - * A step is either another rule, or a terminal description of a token. If it - * is a rule, that rule is pushed onto the stack and the parsing continues from - * that point. - * - * If it is a terminal description, the token is checked against it using a - * `match` function. If the match is successful, the token is colored and the - * rule is stepped forward. If the match is unsuccessful, the remainder of the - * rule is skipped and the previous rule is advanced. - * - * This parsing algorithm allows for incremental online parsing within various - * levels of the syntax tree and results in a structured `state` linked-list - * which contains the relevant information to produce valuable typeaheads. - */ -CodeMirror.defineMode("graphql", (config) => { - const parser = onlineParser({ - eatWhitespace: (stream) => stream.eatWhile(isIgnored), - lexRules: LexRules, - parseRules: ParseRules, - editorConfig: { tabSize: 2 }, - }) - - return { - config, - startState: parser.startState, - token: parser.token as unknown as CodeMirror.Mode["token"], // TODO: Check if the types are indeed compatible - indent, - electricInput: /^\s*[})\]]/, - fold: "brace", - lineComment: "#", - closeBrackets: { - pairs: '()[]{}""', - explode: "()[]{}", - }, - } -}) - -// Seems the electricInput type in @types/codemirror is wrong (i.e it is written as electricinput instead of electricInput) -function indent( - this: CodeMirror.Mode & { - electricInput?: RegExp - config?: CodeMirror.EditorConfiguration - }, - state: State, - textAfter: string -) { - const levels = state.levels - // If there is no stack of levels, use the current level. - // Otherwise, use the top level, pre-emptively dedenting for close braces. - const level = - !levels || levels.length === 0 - ? state.indentLevel - : levels[levels.length - 1] - - (this.electricInput?.test(textAfter) ? 1 : 0) - return (level || 0) * (this.config?.indentUnit || 0) -} diff --git a/packages/hoppscotch-app/helpers/editor/themes/baseTheme.ts b/packages/hoppscotch-app/helpers/editor/themes/baseTheme.ts new file mode 100644 index 00000000..4faa622b --- /dev/null +++ b/packages/hoppscotch-app/helpers/editor/themes/baseTheme.ts @@ -0,0 +1,233 @@ +import { + EditorView, + keymap, + highlightSpecialChars, + highlightActiveLine, +} from "@codemirror/view" +import { + HighlightStyle, + tags as t, + defaultHighlightStyle, +} from "@codemirror/highlight" +import { foldKeymap, foldGutter } from "@codemirror/fold" + +import { Extension, EditorState } from "@codemirror/state" +import { history, historyKeymap } from "@codemirror/history" +import { indentOnInput } from "@codemirror/language" +import { lineNumbers, highlightActiveLineGutter } from "@codemirror/gutter" +import { defaultKeymap } from "@codemirror/commands" +import { bracketMatching } from "@codemirror/matchbrackets" +import { closeBrackets, closeBracketsKeymap } from "@codemirror/closebrackets" +import { searchKeymap, highlightSelectionMatches } from "@codemirror/search" +import { autocompletion, completionKeymap } from "@codemirror/autocomplete" +import { commentKeymap } from "@codemirror/comment" +import { rectangularSelection } from "@codemirror/rectangular-selection" +import { lintKeymap } from "@codemirror/lint" + +export const baseTheme = EditorView.theme({ + "&": { + fontSize: "var(--body-font-size)", + }, + ".cm-content": { + caretColor: "var(--secondary-light-color)", + fontFamily: "var(--font-mono)", + backgroundColor: "var(--primary-color)", + }, + ".cm-cursor": { + borderColor: "var(--secondary-color)", + }, + ".cm-selectionBackground, .cm-content ::selection, .cm-line ::selection": { + backgroundColor: "var(--divider-color)", + }, + ".cm-panels": { + backgroundColor: "var(--primary-light-color)", + color: "var(--secondary-light-color)", + }, + ".cm-panels.cm-panels-top": { + borderBottom: "1px solid var(--divider-light-color)", + }, + ".cm-panels.cm-panels-bottom": { + borderTop: "1px solid var(--divider-light-color)", + }, + ".cm-search": { + display: "flex", + alignItems: "center", + flexWrap: "nowrap", + flexShrink: 0, + overflow: "auto", + }, + ".cm-search label": { + display: "inline-flex", + alignItems: "center", + }, + ".cm-textfield": { + backgroundColor: "var(--primary-dark-color)", + color: "var(--secondary-light-color)", + borderColor: "var(--divider-light-color)", + borderRadius: "3px", + }, + ".cm-button": { + backgroundColor: "var(--primary-dark-color)", + color: "var(--secondary-light-color)", + backgroundImage: "none", + border: "none", + }, + ".cm-tooltip": { + backgroundColor: "var(--primary-dark-color)", + color: "var(--secondary-light-color)", + border: "none", + borderRadius: "3px", + }, + ".cm-completionLabel": { + color: "var(--secondary-color)", + }, + ".cm-tooltip.cm-tooltip-autocomplete > ul": { + fontFamily: "var(--font-mono)", + }, + ".cm-tooltip-autocomplete ul li[aria-selected]": { + backgroundColor: "var(--accent-dark-color)", + color: "var(--accent-contrast-color)", + }, + ".cm-tooltip-autocomplete ul li[aria-selected] .cm-completionLabel": { + color: "var(--accent-contrast-color)", + }, + ".cm-activeLine": { backgroundColor: "var(--primary-light-color)" }, + ".cm-searchMatch": { + outline: "1px solid var(--accent-dark-color)", + }, + ".cm-selectionMatch": { + outline: "1px solid var(--accent-dark-color)", + }, + ".cm-matchingBracket, .cm-nonmatchingBracket": { + backgroundColor: "var(--divider-color)", + outline: "1px solid var(--accent-dark-color)", + }, + ".cm-gutters": { + fontFamily: "var(--font-mono)", + backgroundColor: "var(--primary-color)", + borderColor: "var(--divider-light-color)", + }, + ".cm-lineNumbers": { + minWidth: "3em", + color: "var(--secondary-light-color)", + }, + ".cm-foldGutter": { + minWidth: "2em", + color: "var(--secondary-light-color)", + }, + ".cm-foldGutter .cm-gutterElement": { + textAlign: "center", + }, + ".cm-line": { + paddingLeft: "0.5em", + paddingRight: "0.5em", + color: "var(--secondary-dark-color)", + }, + ".cm-activeLineGutter": { + backgroundColor: "var(--primary-dark-color)", + }, + ".cm-scroller::-webkit-scrollbar": { + display: "none", + }, +}) + +const editorTypeColor = "var(--editor-type-color)" +const editorNameColor = "var(--editor-name-color)" +const editorOperatorColor = "var(--editor-operator-color)" +const editorInvalidColor = "var(--editor-invalid-color)" +const editorSeparatorColor = "var(--editor-separator-color)" +const editorMetaColor = "var(--editor-meta-color)" +const editorVariableColor = "var(--editor-variable-color)" +const editorLinkColor = "var(--editor-link-color)" +const editorProcessColor = "var(--editor-process-color)" +const editorConstantColor = "var(--editor-constant-color)" +const editorKeywordColor = "var(--editor-keyword-color)" + +export const baseHighlightStyle = HighlightStyle.define([ + { tag: t.keyword, color: editorKeywordColor }, + { + tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName], + color: editorNameColor, + }, + { + tag: [t.function(t.variableName), t.labelName], + color: editorVariableColor, + }, + { + tag: [t.color, t.constant(t.name), t.standard(t.name)], + color: editorConstantColor, + }, + { tag: [t.definition(t.name), t.separator], color: editorSeparatorColor }, + { + tag: [ + t.typeName, + t.className, + t.number, + t.changed, + t.annotation, + t.modifier, + t.self, + t.namespace, + ], + color: editorTypeColor, + }, + { + tag: [ + t.operator, + t.operatorKeyword, + t.url, + t.escape, + t.regexp, + t.link, + t.special(t.string), + ], + color: editorOperatorColor, + }, + { tag: [t.meta, t.comment], color: editorMetaColor }, + { tag: t.strong, fontWeight: "bold" }, + { tag: t.emphasis, fontStyle: "italic" }, + { tag: t.strikethrough, textDecoration: "line-through" }, + { tag: t.link, color: editorLinkColor, textDecoration: "underline" }, + { tag: t.heading, fontWeight: "bold", color: editorNameColor }, + { + tag: [t.atom, t.bool, t.special(t.variableName)], + color: editorConstantColor, + }, + { + tag: [t.processingInstruction, t.string, t.inserted], + color: editorProcessColor, + }, + { tag: t.invalid, color: editorInvalidColor }, +]) + +const baseFoldStyle = foldGutter({ + openText: "▾", + closedText: "▸", +}) + +export const basicSetup: Extension = [ + lineNumbers(), + highlightActiveLineGutter(), + highlightSpecialChars(), + history(), + baseFoldStyle, + EditorState.allowMultipleSelections.of(true), + indentOnInput(), + defaultHighlightStyle.fallback, + bracketMatching(), + closeBrackets(), + autocompletion(), + rectangularSelection(), + highlightActiveLine(), + highlightSelectionMatches(), + keymap.of([ + ...closeBracketsKeymap, + ...defaultKeymap, + ...searchKeymap, + ...historyKeymap, + ...foldKeymap, + ...commentKeymap, + ...completionKeymap, + ...lintKeymap, + ]), +] diff --git a/packages/hoppscotch-app/package.json b/packages/hoppscotch-app/package.json index 2006c9d2..49ea7b5e 100644 --- a/packages/hoppscotch-app/package.json +++ b/packages/hoppscotch-app/package.json @@ -34,6 +34,25 @@ }, "dependencies": { "@apollo/client": "^3.4.17", + "@codemirror/autocomplete": "^0.19.4", + "@codemirror/closebrackets": "^0.19.0", + "@codemirror/commands": "^0.19.5", + "@codemirror/comment": "^0.19.0", + "@codemirror/fold": "^0.19.1", + "@codemirror/gutter": "^0.19.4", + "@codemirror/highlight": "^0.19.0", + "@codemirror/history": "^0.19.0", + "@codemirror/lang-javascript": "^0.19.2", + "@codemirror/lang-json": "^0.19.1", + "@codemirror/language": "^0.19.3", + "@codemirror/lint": "^0.19.2", + "@codemirror/matchbrackets": "^0.19.3", + "@codemirror/rectangular-selection": "^0.19.1", + "@codemirror/search": "^0.19.2", + "@codemirror/state": "^0.19.3", + "@codemirror/text": "^0.19.5", + "@codemirror/view": "^0.19.12", + "@hoppscotch/codemirror-lang-graphql": "workspace:^0.1.0", "@hoppscotch/js-sandbox": "workspace:^1.0.0", "@nuxtjs/axios": "^5.13.6", "@nuxtjs/composition-api": "^0.30.0", @@ -48,8 +67,6 @@ "acorn": "^8.5.0", "acorn-walk": "^8.2.0", "axios": "^0.24.0", - "codemirror": "^5.63.3", - "codemirror-theme-github": "^1.0.0", "core-js": "^3.19.1", "esprima": "^4.0.1", "firebase": "^9.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5e143f2..fd17c6a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,11 +15,52 @@ importers: '@commitlint/cli': 14.1.0 '@commitlint/config-conventional': 14.1.0 + packages/codemirror-lang-graphql: + specifiers: + '@codemirror/highlight': ^0.19.0 + '@codemirror/language': ^0.19.0 + '@lezer/generator': ^0.15.0 + '@lezer/lr': ^0.15.0 + mocha: ^9.0.1 + rollup: ^2.35.1 + rollup-plugin-dts: ^3.0.2 + rollup-plugin-ts: ^1.4.0 + typescript: ^4.3.4 + dependencies: + '@codemirror/highlight': 0.19.6 + '@codemirror/language': 0.19.3 + '@lezer/lr': 0.15.4 + devDependencies: + '@lezer/generator': 0.15.2 + mocha: 9.1.3 + rollup: 2.59.0 + rollup-plugin-dts: 3.0.2_rollup@2.59.0+typescript@4.4.4 + rollup-plugin-ts: 1.4.7_rollup@2.59.0+typescript@4.4.4 + typescript: 4.4.4 + packages/hoppscotch-app: specifiers: '@apollo/client': ^3.4.17 '@babel/core': ^7.16.0 '@babel/preset-env': ^7.16.0 + '@codemirror/autocomplete': ^0.19.4 + '@codemirror/closebrackets': ^0.19.0 + '@codemirror/commands': ^0.19.5 + '@codemirror/comment': ^0.19.0 + '@codemirror/fold': ^0.19.1 + '@codemirror/gutter': ^0.19.4 + '@codemirror/highlight': ^0.19.0 + '@codemirror/history': ^0.19.0 + '@codemirror/lang-javascript': ^0.19.2 + '@codemirror/lang-json': ^0.19.1 + '@codemirror/language': ^0.19.3 + '@codemirror/lint': ^0.19.2 + '@codemirror/matchbrackets': ^0.19.3 + '@codemirror/rectangular-selection': ^0.19.1 + '@codemirror/search': ^0.19.2 + '@codemirror/state': ^0.19.3 + '@codemirror/text': ^0.19.5 + '@codemirror/view': ^0.19.12 '@graphql-codegen/add': ^3.1.0 '@graphql-codegen/cli': 2.2.2 '@graphql-codegen/typed-document-node': ^2.2.0 @@ -28,6 +69,7 @@ importers: '@graphql-codegen/typescript-urql-graphcache': ^2.2.1 '@graphql-codegen/urql-introspection': ^2.1.0 '@graphql-typed-document-node/core': ^3.1.0 + '@hoppscotch/codemirror-lang-graphql': workspace:^0.1.0 '@hoppscotch/js-sandbox': workspace:^1.0.0 '@nuxt/types': ^2.15.8 '@nuxt/typescript-build': ^2.1.0 @@ -64,8 +106,6 @@ importers: axios: ^0.24.0 babel-core: ^7.0.0-bridge.0 babel-jest: ^27.3.1 - codemirror: ^5.63.3 - codemirror-theme-github: ^1.0.0 core-js: ^3.19.1 eslint: ^8.2.0 eslint-config-prettier: ^8.3.0 @@ -125,6 +165,25 @@ importers: yargs-parser: ^20.2.9 dependencies: '@apollo/client': 3.4.17_f3f7eb5e21785ef7d5faca94c1a68824 + '@codemirror/autocomplete': 0.19.4 + '@codemirror/closebrackets': 0.19.0 + '@codemirror/commands': 0.19.5 + '@codemirror/comment': 0.19.0 + '@codemirror/fold': 0.19.1 + '@codemirror/gutter': 0.19.4 + '@codemirror/highlight': 0.19.6 + '@codemirror/history': 0.19.0 + '@codemirror/lang-javascript': 0.19.2 + '@codemirror/lang-json': 0.19.1 + '@codemirror/language': 0.19.3 + '@codemirror/lint': 0.19.2 + '@codemirror/matchbrackets': 0.19.3 + '@codemirror/rectangular-selection': 0.19.1 + '@codemirror/search': 0.19.2 + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + '@hoppscotch/codemirror-lang-graphql': link:../codemirror-lang-graphql '@hoppscotch/js-sandbox': link:../hoppscotch-js-sandbox '@nuxtjs/axios': 5.13.6 '@nuxtjs/composition-api': 0.30.0_nuxt@2.15.8 @@ -133,14 +192,12 @@ importers: '@nuxtjs/robots': 2.5.0 '@nuxtjs/sitemap': 2.4.0 '@nuxtjs/toast': 3.3.1 - '@urql/core': 2.3.5_graphql@15.7.2 + '@urql/core': 2.3.4_graphql@15.7.2 '@urql/exchange-auth': 0.1.6_graphql@15.7.2 '@urql/exchange-graphcache': 4.3.5_graphql@15.7.2 acorn: 8.5.0 acorn-walk: 8.2.0 axios: 0.24.0 - codemirror: 5.63.3 - codemirror-theme-github: 1.0.0 core-js: 3.19.1 esprima: 4.0.1 firebase: 9.4.1 @@ -203,7 +260,7 @@ importers: '@types/esprima': 4.0.3 '@types/lodash': 4.14.176 '@types/splitpanes': 2.2.1 - '@urql/devtools': 2.0.3_@urql+core@2.3.5+graphql@15.7.2 + '@urql/devtools': 2.0.3_@urql+core@2.3.4+graphql@15.7.2 '@vue/runtime-dom': 3.2.21 '@vue/test-utils': 1.2.2 babel-core: 7.0.0-bridge.0_@babel+core@7.16.0 @@ -497,7 +554,7 @@ packages: resolution: {integrity: sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.0 + '@babel/types': 7.16.0 jsesc: 2.5.2 source-map: 0.5.7 dev: false @@ -1429,7 +1486,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false /@babel/plugin-transform-shorthand-properties/7.16.0_@babel+core@7.16.0: resolution: {integrity: sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==} @@ -1621,8 +1677,8 @@ packages: '@babel/generator': 7.16.0 '@babel/helper-function-name': 7.16.0 '@babel/helper-split-export-declaration': 7.16.0 - '@babel/parser': 7.12.16 - '@babel/types': 7.12.13 + '@babel/parser': 7.16.3 + '@babel/types': 7.16.0 debug: 4.3.2 globals: 11.12.0 lodash: 4.17.21 @@ -1639,8 +1695,8 @@ packages: '@babel/helper-function-name': 7.16.0 '@babel/helper-hoist-variables': 7.16.0 '@babel/helper-split-export-declaration': 7.16.0 - '@babel/parser': 7.15.8 - '@babel/types': 7.15.6 + '@babel/parser': 7.16.3 + '@babel/types': 7.16.0 debug: 4.3.2 globals: 11.12.0 transitivePeerDependencies: @@ -1714,6 +1770,190 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@codemirror/autocomplete/0.19.4: + resolution: {integrity: sha512-Wuuf4xZ9opIpUwMvxFMknC1C202qtTx1q5bS1GuMnTK4lBYoG+tekpAqlLBF3x6fEe2+fw6dRLwYTigtCuS7pQ==} + dependencies: + '@codemirror/language': 0.19.3 + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/tooltip': 0.19.4 + '@codemirror/view': 0.19.12 + '@lezer/common': 0.15.7 + dev: false + + /@codemirror/closebrackets/0.19.0: + resolution: {integrity: sha512-dFWX5OEVYWRNtGaifSbwIAlymnRRjxWMiMbffbAjF7p0zfGHDbdGkiT56q3Xud63h5/tQdSo5dK1iyNTzHz5vg==} + dependencies: + '@codemirror/language': 0.19.3 + '@codemirror/rangeset': 0.19.1 + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/commands/0.19.5: + resolution: {integrity: sha512-8PZOtx7d/GbKhFYA88zs2wINDtaUgj3pEjLYScKTd/Vsyw8qOp86tJQQNnMFTRZj/ISQl9Lbg3aAmHvroMqspw==} + dependencies: + '@codemirror/language': 0.19.3 + '@codemirror/matchbrackets': 0.19.3 + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + '@lezer/common': 0.15.7 + dev: false + + /@codemirror/comment/0.19.0: + resolution: {integrity: sha512-3hqAd0548fxqOBm4khFMcXVIivX8p0bSlbAuZJ6PNoUn/0wXhxkxowPp0FmFzU2+y37Z+ZQF5cRB5EREWPRIiQ==} + dependencies: + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/fold/0.19.1: + resolution: {integrity: sha512-3GwQpxgv03urb8BPBvX1JSjl+uMXKqngRG6qHZXSM2FefxFKvTuyL44MCb35aodtfKjGwoxizk+7b6CbAOLyOw==} + dependencies: + '@codemirror/gutter': 0.19.4 + '@codemirror/language': 0.19.3 + '@codemirror/rangeset': 0.19.1 + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/gutter/0.19.4: + resolution: {integrity: sha512-zcDtGafuzLs9mvSBqHVuLNbS4UpHBo1+DRY6NtZfC31bV8abDxOPgokq2+6UsVPQp+RA1LgmPHatp4gOYSM+cA==} + dependencies: + '@codemirror/rangeset': 0.19.1 + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/highlight/0.19.6: + resolution: {integrity: sha512-+eibu6on9quY8uN3xJ/n3rH+YIDLlpX7YulVmFvqAIz/ukRQ5tWaBmB7fMixHmnmRIRBRZgB8rNtonuMwZSAHQ==} + dependencies: + '@codemirror/language': 0.19.3 + '@codemirror/rangeset': 0.19.1 + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + '@lezer/common': 0.15.7 + style-mod: 4.0.0 + dev: false + + /@codemirror/history/0.19.0: + resolution: {integrity: sha512-E0H+lncH66IMDhaND9jgkjE7s0dhYfjCPmS+Ig2Yes9I8+UIEecIdObj8c8HPCFGctGg3fxXqRAw2mdHl2Wouw==} + dependencies: + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/lang-javascript/0.19.2: + resolution: {integrity: sha512-qNFjCSTWOTZ/KusoVx3CxjmNS37DrhVoVO9E1IkrIMVC3tkk8Hs2eA6HNMxT4VGp5O+0yBmf1DE2o5QQSMs0jg==} + dependencies: + '@codemirror/autocomplete': 0.19.4 + '@codemirror/highlight': 0.19.6 + '@codemirror/language': 0.19.3 + '@codemirror/lint': 0.19.2 + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + '@lezer/javascript': 0.15.0 + dev: false + + /@codemirror/lang-json/0.19.1: + resolution: {integrity: sha512-66K5TT9HO0ODtpjY+3Ub6t3r0OB1d27P+Kl5oygk4tDavHUBpsyHTJRFw/CdeRM2VwjbpBfctGm/cTrSthFDZg==} + dependencies: + '@codemirror/highlight': 0.19.6 + '@codemirror/language': 0.19.3 + '@lezer/json': 0.15.0 + dev: false + + /@codemirror/language/0.19.3: + resolution: {integrity: sha512-6vjkRYHRJg/z9wdAk75nU2fQwCJBsh2HpkIjKXIHfzISSgLt5qSDxVhPd8Uu8PD5WMmFFP8tX7I9kdIt873o0A==} + dependencies: + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + '@lezer/common': 0.15.7 + '@lezer/lr': 0.15.4 + dev: false + + /@codemirror/lint/0.19.2: + resolution: {integrity: sha512-477qvXWwuf24YsBi1DzjrGyzM+qfPe5L4xEHGxQTGOMq6R0+QAFKppOJsxN3y7gzDpLrZSYZdhJzWevOuliZQg==} + dependencies: + '@codemirror/panel': 0.19.0 + '@codemirror/state': 0.19.3 + '@codemirror/tooltip': 0.19.4 + '@codemirror/view': 0.19.12 + crelt: 1.0.5 + dev: false + + /@codemirror/matchbrackets/0.19.3: + resolution: {integrity: sha512-ljkrBxaLgh8jesroUiBa57pdEwqJamxkukXrJpL9LdyFZVJaF+9TldhztRaMsMZO1XnCSSHQ9sg32iuHo7Sc2g==} + dependencies: + '@codemirror/language': 0.19.3 + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + '@lezer/common': 0.15.7 + dev: false + + /@codemirror/panel/0.19.0: + resolution: {integrity: sha512-LJuu49xnuhaAztlhnLJQ57ddOirSyf8/lnl7twsQUG/05RkxodBZ9F7q8r5AOLqOkaQOy9WySEKX1Ur8lD9Q5w==} + dependencies: + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/rangeset/0.19.1: + resolution: {integrity: sha512-WaKTEw8JB/3QFlQzpdgRoklopcWvG8O/Xp+rxxOfFKYTaeaejpY/tjpyBBg+Ea65Ka3m7+pPp9d5j/oR2rd9NA==} + dependencies: + '@codemirror/state': 0.19.3 + dev: false + + /@codemirror/rectangular-selection/0.19.1: + resolution: {integrity: sha512-9ElnqOg3mpZIWe0prPRd1SZ48Q9QB3bR8Aocq8UtjboJSUG8ABhRrbuTZMW/rMqpBPSjVpCe9xkCCkEQMYQVmw==} + dependencies: + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/search/0.19.2: + resolution: {integrity: sha512-TrRxUxyJ/a7HXtUvMZhgkOUbKE1xO33UhXjn1XACEHKWhgovw1vEeEEti9dZejN8/QOOFJed39InUxmp7oQ8HA==} + dependencies: + '@codemirror/panel': 0.19.0 + '@codemirror/rangeset': 0.19.1 + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + '@codemirror/view': 0.19.12 + crelt: 1.0.5 + dev: false + + /@codemirror/state/0.19.3: + resolution: {integrity: sha512-mMCOQWB4Kua/XPYRsY95IwX+uDcoD+n4G0FTDi0jNJHYoyWTkPpHjT6zt6mfl4kpqwqBJ8/WQBuztvpstblvvQ==} + dependencies: + '@codemirror/text': 0.19.5 + dev: false + + /@codemirror/text/0.19.5: + resolution: {integrity: sha512-Syu5Xc7tZzeUAM/y4fETkT0zgGr48rDG+w4U38bPwSIUr+L9S/7w2wDE1WGNzjaZPz12F6gb1gxWiSTg9ocLow==} + dev: false + + /@codemirror/tooltip/0.19.4: + resolution: {integrity: sha512-DTv6SOzjw8LbHdTd2FszpIkQCUKRl0dqh1pWqawR31Lu/ZCz1nOiOY1sxkiEZVXMTFg44V0Uff0YlY6mTVK2DQ==} + dependencies: + '@codemirror/state': 0.19.3 + '@codemirror/view': 0.19.12 + dev: false + + /@codemirror/view/0.19.12: + resolution: {integrity: sha512-nvgqUaIGaRfCwpa/BI83SsOOenEoxBp6PlXBdw+jSfxgYGAYIdB3kuPzExPixZemvu7+ZoJRO2iEjCKigLIOaA==} + dependencies: + '@codemirror/rangeset': 0.19.1 + '@codemirror/state': 0.19.3 + '@codemirror/text': 0.19.5 + style-mod: 4.0.0 + w3c-keyname: 2.2.4 + dev: false + /@commitlint/cli/14.1.0: resolution: {integrity: sha512-Orq62jkl9qAGvjFqhehtAqjGY/duJ8hIRPPIHmGR2jIB96D4VTmazS3ZvqJz2Q9kKr61mLAk/171zm0FVzQCYA==} engines: {node: '>=v12'} @@ -2145,7 +2385,7 @@ packages: '@firebase/logger': 0.3.2 '@firebase/util': 1.4.2 '@firebase/webchannel-wrapper': 0.6.1 - '@grpc/grpc-js': 1.4.4 + '@grpc/grpc-js': 1.4.2 '@grpc/proto-loader': 0.6.6 node-fetch: 2.6.5 tslib: 2.3.1 @@ -3219,8 +3459,8 @@ packages: dependencies: graphql: 15.7.2 - /@grpc/grpc-js/1.4.4: - resolution: {integrity: sha512-a6222b7Dl6fIlMgzVl7e+NiRoLiZFbpcwvBH2Oli56Bn7W4/3Ld+86hK4ffPn5rx2DlDidmIcvIJiOQXyhv9gA==} + /@grpc/grpc-js/1.4.2: + resolution: {integrity: sha512-aUN6oGk9un8rfYWz73nQgFxPCYJQYd8LpIGguZHBsNduBMyqG6EWANrsVBuTG+nl/l4dKb3x+qi1l9+oxDxqGg==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.6.6 @@ -3300,7 +3540,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 chalk: 4.1.2 jest-message-util: 27.3.1 jest-util: 27.3.1 @@ -3321,7 +3561,7 @@ packages: '@jest/test-result': 27.3.1 '@jest/transform': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -3358,7 +3598,7 @@ packages: dependencies: '@jest/fake-timers': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 jest-mock: 27.3.0 dev: true @@ -3368,7 +3608,7 @@ packages: dependencies: '@jest/types': 27.2.5 '@sinonjs/fake-timers': 8.0.1 - '@types/node': 16.11.7 + '@types/node': 16.11.6 jest-message-util: 27.3.1 jest-mock: 27.3.0 jest-util: 27.3.1 @@ -3397,7 +3637,7 @@ packages: '@jest/test-result': 27.3.1 '@jest/transform': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -3492,7 +3732,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.11.7 + '@types/node': 16.11.6 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -3501,6 +3741,38 @@ packages: resolution: {integrity: sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==} dev: false + /@lezer/common/0.15.7: + resolution: {integrity: sha512-Rw8TDJnBzZnkyzIXs1Tmmd241FrBLJBj8gkdy3y0joGFb8Z4I/joKEsR+gv1pb13o1TMsZxm3fmP+d/wPt2CTQ==} + + /@lezer/generator/0.15.2: + resolution: {integrity: sha512-nxY6TTj0ZAcAvg1zEeaZnt1xODdyPhD0lTaPOgcGOVFHhwwx0Oz7CxZB7Rh+xRCXFr5kJWDtM1uXPp80UZjhAg==} + hasBin: true + dependencies: + '@lezer/common': 0.15.7 + '@lezer/lr': 0.15.4 + dev: true + + /@lezer/javascript/0.15.0: + resolution: {integrity: sha512-euFjbbyYmxpBls9FyBAKnGLEjaMFqfHvhfueA7M1PitZdieHu8KSblutmcwjpWKIV4eH4uElMZO2cPVe0aFxXA==} + dependencies: + '@lezer/lr': 0.15.4 + dev: false + + /@lezer/json/0.15.0: + resolution: {integrity: sha512-OsMjjBkTkeQ15iMCu5U1OiBubRC4V9Wm03zdIlUgNZ20aUPx5DWDRqUc5wG41JXVSj7Lxmo+idlFCfBBdxB8sw==} + dependencies: + '@lezer/lr': 0.15.4 + dev: false + + /@lezer/lr/0.15.4: + resolution: {integrity: sha512-vwgG80sihEGJn6wJp6VijXrnzVai/KPva/OzYKaWvIx0IiXKjoMQ8UAwcgpSBwfS4Fbz3IKOX/cCNXU3r1FvpQ==} + dependencies: + '@lezer/common': 0.15.7 + + /@mdn/browser-compat-data/4.0.9: + resolution: {integrity: sha512-6Viqyrqpb7fVXJ5VoIIu5UdQR9ftk1kvh4X40FQhy5IOFnawQ38CpEZw34ZPOtpVed72W27m3gRSJo+4qAFuqA==} + dev: true + /@microsoft/fetch-event-source/2.0.1: resolution: {integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==} dev: false @@ -3701,8 +3973,8 @@ packages: ufo: 0.7.9 dev: false - /@nuxt/kit-edge/3.0.0-27277498.850ef69: - resolution: {integrity: sha512-nlRbNf0wZwIuDzUs20AE9O4bE1rcIv3yaA/oYFhqUlXumiEDqHPmiuDAL5Trbe+E3Ut7EmZxgrcwUgQ0zQ8fuQ==} + /@nuxt/kit-edge/3.0.0-27282876.f298386: + resolution: {integrity: sha512-aalz5d3rJz/iIGBhQKI3KXkTChZa5P+X2nHXBl3+iESTI8eq/LlmyrGcRyCBU10EV4wDIoWmqi9lOShESf2bCg==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0} dependencies: consola: 2.15.3 @@ -3723,13 +3995,13 @@ packages: std-env: 3.0.1 ufo: 0.7.9 unctx: 1.0.2 - untyped: 0.2.13 + untyped: 0.2.12 dev: true /@nuxt/kit/0.7.0-edge: resolution: {integrity: sha512-3+azijGDlERcmhK/Gp97cn8+I++/pn/AmYcj7ceRF++6T86ohckAY0ip/+y4dLlWJ0AGnwB6x4gybG03ltEPew==} dependencies: - '@nuxt/kit-edge': 3.0.0-27277498.850ef69 + '@nuxt/kit-edge': 3.0.0-27282876.f298386 jiti: 1.12.9 dev: true @@ -3976,7 +4248,7 @@ packages: nuxt: ^2.15 vue: ^2 dependencies: - '@vue/composition-api': 1.3.3 + '@vue/composition-api': 1.4.0 defu: 5.0.0 estree-walker: 2.0.2 fs-extra: 9.1.0 @@ -4580,7 +4852,7 @@ packages: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.34 - '@types/node': 16.11.6 + '@types/node': 12.20.12 /@types/browserslist/4.15.0: resolution: {integrity: sha512-h9LyKErRGZqMsHh9bd+FE8yCIal4S0DxKTOeui56VgVXqa66TKiuaIUxCAI7c1O0LjaUzOTcsMyOpO9GetozRA==} @@ -4601,7 +4873,7 @@ packages: /@types/clean-css/4.2.5: resolution: {integrity: sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==} dependencies: - '@types/node': 16.11.6 + '@types/node': 12.20.12 source-map: 0.6.1 dev: true @@ -4646,7 +4918,7 @@ packages: '@types/connect': 3.4.35 '@types/express': 4.17.13 '@types/keygrip': 1.0.2 - '@types/node': 16.11.6 + '@types/node': 16.11.7 dev: false /@types/cors/2.8.10: @@ -4700,13 +4972,13 @@ packages: /@types/fs-capacitor/2.0.0: resolution: {integrity: sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==} dependencies: - '@types/node': 16.11.6 + '@types/node': 16.11.7 dev: false /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 16.11.7 + '@types/node': 16.11.6 dev: true /@types/html-minifier-terser/5.1.2: @@ -4809,7 +5081,7 @@ packages: '@types/http-errors': 1.8.1 '@types/keygrip': 1.0.2 '@types/koa-compose': 3.2.5 - '@types/node': 16.11.6 + '@types/node': 16.11.7 dev: false /@types/less/3.0.2: @@ -4838,14 +5110,14 @@ packages: /@types/node-fetch/2.5.12: resolution: {integrity: sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==} dependencies: - '@types/node': 16.11.6 + '@types/node': 16.11.7 form-data: 3.0.1 dev: false /@types/node-sass/4.11.2: resolution: {integrity: sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==} dependencies: - '@types/node': 16.11.6 + '@types/node': 12.20.12 dev: true /@types/node/10.17.60: @@ -4859,6 +5131,10 @@ packages: resolution: {integrity: sha512-+5haRZ9uzI7rYqzDznXgkuacqb6LJhAti8mzZKWxIXn/WEtvB+GHVJ7AuMwcN1HMvXOSJcrvA6PPoYHYOYYebA==} dev: false + /@types/node/15.14.9: + resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + dev: true + /@types/node/16.11.6: resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} @@ -4869,6 +5145,10 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true + /@types/object-path/0.11.1: + resolution: {integrity: sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==} + dev: true + /@types/optimize-css-assets-webpack-plugin/5.0.3: resolution: {integrity: sha512-PJgbI4KplJfyxKWVrBbEL+rePEBqeozJRMT0mBL3ynhvngASBV/XJ+BneLuJN74RjjMzO0gA5ns80mgubQdZAA==} dependencies: @@ -4916,15 +5196,19 @@ packages: /@types/sass/1.43.0: resolution: {integrity: sha512-DPSXNJ1rYLo88GyF9tuB4bsYGfpKI1a4+wOQmc+LI1SUoocm9QLRSpz0GxxuyjmJsYFIQo/dDlRSSpIXngff+w==} dependencies: - '@types/node': 16.11.6 + '@types/node': 12.20.12 dev: true /@types/sax/1.2.3: resolution: {integrity: sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==} dependencies: - '@types/node': 16.11.6 + '@types/node': 12.20.36 dev: false + /@types/semver/7.3.9: + resolution: {integrity: sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==} + dev: true + /@types/serve-static/1.13.9: resolution: {integrity: sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==} dependencies: @@ -4984,6 +5268,10 @@ packages: /@types/throttle-debounce/2.1.0: resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + /@types/ua-parser-js/0.7.36: + resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} + dev: true + /@types/uglify-js/3.13.1: resolution: {integrity: sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==} dependencies: @@ -5012,7 +5300,7 @@ packages: /@types/webpack-sources/3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 16.11.6 + '@types/node': 12.20.12 '@types/source-list-map': 0.1.2 source-map: 0.7.3 @@ -5041,7 +5329,7 @@ packages: /@types/websocket/1.0.2: resolution: {integrity: sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ==} dependencies: - '@types/node': 16.11.6 + '@types/node': 16.11.7 dev: false /@types/websocket/1.0.4: @@ -5053,7 +5341,7 @@ packages: /@types/ws/7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 16.11.6 + '@types/node': 16.11.7 dev: false /@types/ws/8.2.0: @@ -5291,11 +5579,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.3.1 - eslint-visitor-keys: 3.1.0 + eslint-visitor-keys: 3.0.0 dev: true - /@urql/core/2.3.5_graphql@15.7.2: - resolution: {integrity: sha512-kM/um4OjXmuN6NUS/FSm7dESEKWT7By1kCRCmjvU4+4uEoF1cd4TzIhQ7J1I3zbDAFhZzmThq9X0AHpbHAn3bA==} + /@ungap/promise-all-settled/1.1.2: + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + dev: true + + /@urql/core/2.3.4_graphql@15.7.2: + resolution: {integrity: sha512-KXeR55ONqkTZ2gwNgyFGJEGRp1/jEnyqkFjEguknnG6GFaikAwAX0TMijKcX6ZQ4qE59cDtVEtSbqpVkd9XNmA==} peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: @@ -5304,13 +5596,13 @@ packages: wonka: 4.0.15 dev: false - /@urql/devtools/2.0.3_@urql+core@2.3.5+graphql@15.7.2: + /@urql/devtools/2.0.3_@urql+core@2.3.4+graphql@15.7.2: resolution: {integrity: sha512-TktPLiBS9LcBPHD6qcnb8wqOVcg3Bx0iCtvQ80uPpfofwwBGJmqnQTjUdEFU6kwaLOFZULQ9+Uo4831G823mQw==} peerDependencies: '@urql/core': '>= 1.14.0' graphql: '>= 0.11.0' dependencies: - '@urql/core': 2.3.5_graphql@15.7.2 + '@urql/core': 2.3.4_graphql@15.7.2 graphql: 15.7.2 wonka: 4.0.15 dev: true @@ -5320,7 +5612,7 @@ packages: peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: - '@urql/core': 2.3.5_graphql@15.7.2 + '@urql/core': 2.3.4_graphql@15.7.2 graphql: 15.7.2 wonka: 4.0.15 dev: false @@ -5330,7 +5622,7 @@ packages: peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: - '@urql/core': 2.3.5_graphql@15.7.2 + '@urql/core': 2.3.4_graphql@15.7.2 graphql: 15.7.2 wonka: 4.0.15 dev: false @@ -5461,8 +5753,8 @@ packages: prettier: 2.4.1 dev: false - /@vue/composition-api/1.3.3: - resolution: {integrity: sha512-mjhfLjpCBecARYVJX65F0TYerlJQWtEgKjom4Btuu0x7k701EcvL66zyWQryf64HuIj9YR4h6aNRhM0AP/E3eQ==} + /@vue/composition-api/1.4.0: + resolution: {integrity: sha512-fanqJw1cqhkfS1dcpFY52CeR0aWDBr7ub/0ObPWqMnNPdRsMi1gX04Q3aLeRtJEuVeCFewNbqvkPskkSPTVaXQ==} peerDependencies: vue: '>= 2.5 < 3' dependencies: @@ -5640,6 +5932,11 @@ packages: '@xtuc/long': 4.2.2 dev: false + /@wessberg/stringutil/1.0.19: + resolution: {integrity: sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==} + engines: {node: '>=8.0.0'} + dev: true + /@windicss/config/1.5.1: resolution: {integrity: sha512-nWNgvvJj9RcYhLcqwju/Z8FfaHRjyWHDYS3IgY7lWUM+vWTLFuKqhavKfC1589kdYjiO9JeX07Vg+YzfcxP0Yw==} dependencies: @@ -5667,7 +5964,7 @@ packages: /@wry/context/0.4.4: resolution: {integrity: sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==} dependencies: - '@types/node': 16.11.6 + '@types/node': 16.11.7 tslib: 1.14.1 dev: false @@ -6007,7 +6304,7 @@ packages: engines: {node: '>=8', npm: '>=6'} dependencies: '@babel/generator': 7.14.8 - '@babel/parser': 7.16.2 + '@babel/parser': 7.16.3 '@babel/types': 7.15.0 apollo-env: 0.10.1 apollo-language-server: 1.26.5_typescript@4.4.4 @@ -7034,6 +7331,10 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true + /browser-stdout/1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true + /browserify-aes/1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} dependencies: @@ -7089,6 +7390,34 @@ packages: pako: 1.0.11 dev: false + /browserslist-generator/1.0.64: + resolution: {integrity: sha512-70g7RMq7eKVc2NnvybDtF+G6A6vVnF5fLXJ3qQqiquDb5t8O2OWUzux0F2/+Z7Cix9ZR1NdTfaAQl9AZyCB3Dw==} + engines: {node: '>=8.0.0'} + dependencies: + '@mdn/browser-compat-data': 4.0.9 + '@types/object-path': 0.11.1 + '@types/semver': 7.3.9 + '@types/ua-parser-js': 0.7.36 + browserslist: 4.17.1 + caniuse-lite: 1.0.30001274 + isbot: 3.3.3 + object-path: 0.11.8 + semver: 7.3.5 + ua-parser-js: 0.7.31 + dev: true + + /browserslist/4.17.1: + resolution: {integrity: sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001274 + electron-to-chromium: 1.3.886 + escalade: 3.1.1 + nanocolors: 0.1.12 + node-releases: 1.1.77 + dev: true + /browserslist/4.17.5: resolution: {integrity: sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -7172,8 +7501,8 @@ packages: engines: {node: '>= 0.8'} dev: false - /cac/6.7.12: - resolution: {integrity: sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==} + /cac/6.7.11: + resolution: {integrity: sha512-m4xrA2MKfid6uDV2j2+0mXrtPGxlvAW0y+7Gnn2P8WVMSG+4e4tcoYX++94ZPblPfpBccJ5e7HvKdghlX5yiDA==} engines: {node: '>=8'} dev: true @@ -7744,14 +8073,6 @@ packages: resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} engines: {node: '>=0.10.0'} - /codemirror-theme-github/1.0.0: - resolution: {integrity: sha512-suheFec2wlI4klyqn61MOFXjjrKPZiNY7d2py0OvTd5Z+7AsNxoGKDaS/HI59y7EAG1SkkXW/JQ1Rt2gDMxHfA==} - dev: false - - /codemirror/5.63.3: - resolution: {integrity: sha512-1C+LELr+5grgJYqwZKqxrcbPsHFHapVaVAloBsFBASbpLnQqLw1U8yXJ3gT5D+rhxIiSpo+kTqN+hQ+9ialIXw==} - dev: false - /collect-v8-coverage/1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true @@ -7845,6 +8166,16 @@ packages: dot-prop: 5.3.0 dev: true + /compatfactory/0.0.9_typescript@4.4.4: + resolution: {integrity: sha512-WzoRZSBtsC5TT2J+MZNlo4Qpssf7ofSaRJUT3hN8nNeGilKOnTjR707k+hUU7QhVbyg3cmfWJlabTfMZgZtvEA==} + engines: {node: '>=10.0.0'} + peerDependencies: + typescript: '>=3.x || >= 4.x' + dependencies: + helpertypes: 0.0.4 + typescript: 4.4.4 + dev: true + /component-bind/1.0.0: resolution: {integrity: sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=} dev: false @@ -8142,6 +8473,10 @@ packages: /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + /crelt/1.0.5: + resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==} + dev: false + /cross-fetch/3.0.6: resolution: {integrity: sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==} dependencies: @@ -8180,6 +8515,13 @@ packages: undici: 4.9.5 dev: true + /crosspath/0.0.9: + resolution: {integrity: sha512-lhDiWhqHk1IQ0BiGN9/Ji7qEr9LwCG8taDCTgihII/6b91my+GvTNXDB7eKh/FySz488tkt2IboqBJTSZtc4Fw==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/node': 15.14.9 + dev: true + /crypto-browserify/3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} dependencies: @@ -8239,7 +8581,7 @@ packages: camelcase: 6.2.0 cssesc: 3.0.0 icss-utils: 4.1.1 - loader-utils: 2.0.2 + loader-utils: 2.0.1 postcss: 7.0.39 postcss-modules-extract-imports: 2.0.0 postcss-modules-local-by-default: 3.0.3 @@ -8517,7 +8859,6 @@ packages: dependencies: ms: 2.1.2 supports-color: 8.1.1 - dev: false /debug/4.3.2_supports-color@9.0.2: resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} @@ -8544,6 +8885,11 @@ packages: resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} engines: {node: '>=0.10.0'} + /decamelize/4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: true + /decimal.js/10.3.1: resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} dev: true @@ -8718,6 +9064,11 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + /diff/5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + dev: true + /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: @@ -8968,12 +9319,12 @@ packages: - utf-8-validate dev: false - /engine.io-client/6.0.3: - resolution: {integrity: sha512-IH8ZhDIwiLv0d/wXVzmjfV9Y82hbJIDhCGSVUV8o1kcpDe2I6Y3bZA3ZbJy4Ls7k7IVmcy/qn4k9RKWFhUGf5w==} + /engine.io-client/6.0.2: + resolution: {integrity: sha512-cAep9lhZV6Q8jMXx3TNSU5cydMzMed8/O7Tz5uzyqZvpNPtQ3WQXrLYGADxlsuaFmOLN7wZLmT7ImiFhUOku8g==} dependencies: '@socket.io/component-emitter': 3.0.0 debug: 4.3.2 - engine.io-parser: 5.0.2 + engine.io-parser: 5.0.1 has-cors: 1.1.0 parseqs: 0.0.6 parseuri: 0.0.6 @@ -9003,8 +9354,8 @@ packages: base64-arraybuffer: 0.1.4 dev: false - /engine.io-parser/5.0.2: - resolution: {integrity: sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==} + /engine.io-parser/5.0.1: + resolution: {integrity: sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==} engines: {node: '>=10.0.0'} dependencies: base64-arraybuffer: 1.0.1 @@ -9447,11 +9798,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint-visitor-keys/3.1.0: - resolution: {integrity: sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint-webpack-plugin/2.5.4_eslint@8.2.0: resolution: {integrity: sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==} engines: {node: '>= 10.13.0'} @@ -9766,7 +10112,7 @@ packages: peerDependencies: webpack: ^4.4.0 || ^5.0.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.1 normalize-url: 1.9.1 schema-utils: 1.0.0 webpack: 4.46.0 @@ -9898,7 +10244,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.1 schema-utils: 3.1.1 dev: true @@ -9908,7 +10254,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.1 schema-utils: 3.1.1 webpack: 4.46.0 dev: false @@ -10413,7 +10759,6 @@ packages: minimatch: 3.0.4 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false /glob/7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} @@ -10642,7 +10987,15 @@ packages: graphql: '>= 15.5.0 <= 16.0.0-experimental-stream-defer.5' dependencies: graphql: 15.7.2 - graphql-language-service-types: 1.8.3_graphql@15.7.2 + graphql-language-service-types: 1.8.2_graphql@15.7.2 + dev: false + + /graphql-language-service-types/1.8.2_graphql@15.7.2: + resolution: {integrity: sha512-Sj07RHnMwAhEvAt7Jdt1l/x56ZpoNh+V6g+T58CF6GiYqI5l4vXqqRB4d4xHDcNQX98GpJfnf3o8BqPgP3C5Sw==} + peerDependencies: + graphql: '>= v14.5.0 <= 15.5.0' + dependencies: + graphql: 15.7.2 dev: false /graphql-language-service-types/1.8.3_graphql@15.7.2: @@ -10787,6 +11140,11 @@ packages: engines: {node: '>= 10.x'} dev: false + /growl/1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + dev: true + /gzip-size/6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -10960,6 +11318,11 @@ packages: capital-case: 1.0.4 tslib: 2.3.1 + /helpertypes/0.0.4: + resolution: {integrity: sha512-q8f29R4Rdw9n5L4vGmUR8Ld6CXbxPxA7Xrcs4vto3K6w0LSF13TnWSm67uDrZRulf3t/ZHKCfeZ0qIletxSEow==} + engines: {node: '>=10.0.0'} + dev: true + /hex-color-regex/1.1.0: resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} dev: false @@ -11732,6 +12095,11 @@ packages: resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} engines: {node: '>=0.10.0'} + /is-plain-obj/2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + /is-plain-obj/3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -11885,6 +12253,11 @@ packages: resolution: {integrity: sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=} dev: false + /isbot/3.3.3: + resolution: {integrity: sha512-a3HFPPsvtLroqpuTHHJTaUpPHUO0vjPbptJDzJYkymRvOI8tugWM6zE2oq22w5VOq4A5hrX+YRS7VdIPAgWLfw==} + engines: {node: '>=12'} + dev: true + /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} @@ -12003,7 +12376,7 @@ packages: '@jest/environment': 27.3.1 '@jest/test-result': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -12135,7 +12508,7 @@ packages: '@jest/environment': 27.3.1 '@jest/fake-timers': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 jest-mock: 27.3.0 jest-util: 27.3.1 jsdom: 16.7.0 @@ -12153,7 +12526,7 @@ packages: '@jest/environment': 27.3.1 '@jest/fake-timers': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 jest-mock: 27.3.0 jest-util: 27.3.1 dev: true @@ -12174,7 +12547,7 @@ packages: dependencies: '@jest/types': 27.2.5 '@types/graceful-fs': 4.1.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.8 @@ -12197,7 +12570,7 @@ packages: '@jest/source-map': 27.0.6 '@jest/test-result': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 chalk: 4.1.2 co: 4.6.0 expect: 27.3.1 @@ -12277,7 +12650,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 dev: true /jest-pnp-resolver/1.2.2_jest-resolve@27.3.1: @@ -12338,7 +12711,7 @@ packages: '@jest/test-result': 27.3.1 '@jest/transform': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 @@ -12406,7 +12779,7 @@ packages: resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 16.11.7 + '@types/node': 16.11.6 graceful-fs: 4.2.8 dev: true @@ -12447,7 +12820,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 chalk: 4.1.2 ci-info: 3.2.0 graceful-fs: 4.2.8 @@ -12472,7 +12845,7 @@ packages: dependencies: '@jest/test-result': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.7 + '@types/node': 16.11.6 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.3.1 @@ -12491,7 +12864,7 @@ packages: resolution: {integrity: sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.11.7 + '@types/node': 16.11.6 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -12986,15 +13359,6 @@ packages: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.0 - dev: true - - /loader-utils/2.0.2: - resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} - engines: {node: '>=8.9.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.0 /locate-path/2.0.0: resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} @@ -13616,6 +13980,37 @@ packages: resolution: {integrity: sha512-EXpbSPqSQLR9NEdB25uoyIYLSUvAqDEI7wUeM1HwXHsPF5Gx7cP7kuby5Mz2LfCPxBrgMnbcyPhcTCJRTQ+uvA==} dev: true + /mocha/9.1.3: + resolution: {integrity: sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==} + engines: {node: '>= 12.0.0'} + hasBin: true + dependencies: + '@ungap/promise-all-settled': 1.1.2 + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.2 + debug: 4.3.2_supports-color@8.1.1 + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.1.7 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 3.0.4 + ms: 2.1.3 + nanoid: 3.1.25 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + which: 2.0.2 + workerpool: 6.1.5 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + dev: true + /moment/2.29.1: resolution: {integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==} dev: false @@ -13683,6 +14078,16 @@ packages: dev: false optional: true + /nanocolors/0.1.12: + resolution: {integrity: sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==} + dev: true + + /nanoid/3.1.25: + resolution: {integrity: sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanoid/3.1.30: resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -13824,6 +14229,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /node-releases/1.1.77: + resolution: {integrity: sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==} + dev: true + /node-releases/2.0.1: resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} @@ -14056,7 +14465,6 @@ packages: /object-path/0.11.8: resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} engines: {node: '>= 10.12.0'} - dev: false /object-treeify/1.1.33: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} @@ -15625,7 +16033,6 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - dev: false /randomfill/1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} @@ -15864,9 +16271,9 @@ packages: dependencies: '@babel/core': 7.16.0 '@babel/generator': 7.16.0 - '@babel/parser': 7.16.2 + '@babel/parser': 7.16.3 '@babel/runtime': 7.16.0 - '@babel/traverse': 7.16.0 + '@babel/traverse': 7.16.3 '@babel/types': 7.16.0 babel-preset-fbjs: 3.4.0_@babel+core@7.16.0 chalk: 4.1.2 @@ -16073,6 +16480,62 @@ packages: sprintf-js: 1.1.2 dev: false + /rollup-plugin-dts/3.0.2_rollup@2.59.0+typescript@4.4.4: + resolution: {integrity: sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw==} + engines: {node: '>=v12.22.1'} + peerDependencies: + rollup: ^2.48.0 + typescript: ^4.2.4 + dependencies: + magic-string: 0.25.7 + rollup: 2.59.0 + typescript: 4.4.4 + optionalDependencies: + '@babel/code-frame': 7.16.0 + dev: true + + /rollup-plugin-ts/1.4.7_rollup@2.59.0+typescript@4.4.4: + resolution: {integrity: sha512-Qvmu8GVQ1+F4wcfr+S9iWVcG2PCLZMZ85ZpCZm5zTFmX2Z7hLbXePOWuReWO+7/fS3F1ysUzj/smFYQd026Juw==} + engines: {node: '>=10.0.0'} + peerDependencies: + rollup: '>=1.x || >=2.x' + typescript: '>=3.2.x || >= 4.x' + dependencies: + '@babel/core': 7.16.0 + '@babel/plugin-proposal-async-generator-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-json-strings': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-catch-binding': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-runtime': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/runtime': 7.16.0 + '@rollup/pluginutils': 4.1.1 + '@types/babel__core': 7.1.16 + '@wessberg/stringutil': 1.0.19 + browserslist: 4.17.5 + browserslist-generator: 1.0.64 + chalk: 4.1.2 + compatfactory: 0.0.9_typescript@4.4.4 + crosspath: 0.0.9 + magic-string: 0.25.7 + rollup: 2.59.0 + ts-clone-node: 0.3.28_typescript@4.4.4 + tslib: 2.3.1 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + + /rollup/2.59.0: + resolution: {integrity: sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -16137,7 +16600,7 @@ packages: optional: true dependencies: klona: 2.0.5 - loader-utils: 2.0.2 + loader-utils: 2.0.1 neo-async: 2.6.2 sass: 1.43.4 schema-utils: 3.1.1 @@ -16161,7 +16624,7 @@ packages: optional: true dependencies: klona: 2.0.5 - loader-utils: 2.0.2 + loader-utils: 2.0.1 neo-async: 2.6.2 sass: 1.43.4 schema-utils: 3.1.1 @@ -16340,6 +16803,12 @@ packages: randombytes: 2.1.0 dev: false + /serialize-javascript/6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-placeholder/1.2.4: resolution: {integrity: sha512-jWD9cZXLcr4vHTTL5KEPIUBUYyOWN/z6v/tn0l6XxFhi9iqV3Fc5Y1aFeduUyz+cx8sALzGCUczkPfeOlrq9jg==} dependencies: @@ -16594,7 +17063,7 @@ packages: '@socket.io/component-emitter': 3.0.0 backo2: 1.0.2 debug: 4.3.2 - engine.io-client: 6.0.3 + engine.io-client: 6.0.2 parseuri: 0.0.6 socket.io-parser: 4.1.1 transitivePeerDependencies: @@ -17005,6 +17474,10 @@ packages: engines: {node: '>=8'} dev: true + /style-mod/4.0.0: + resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==} + dev: false + /style-resources-loader/1.4.1_webpack@4.46.0: resolution: {integrity: sha512-UaAoQXq20relw6B633z4QZDxDyW7gevTt1e0y3MZtzdZfnvB90UL658czAgNc609Y7Kn5ErdthK9bSVhnykBUA==} engines: {node: '>=8.9'} @@ -17012,7 +17485,7 @@ packages: webpack: ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: glob: 7.2.0 - loader-utils: 2.0.2 + loader-utils: 2.0.1 schema-utils: 3.1.1 webpack: 4.46.0 dev: false @@ -17493,7 +17966,7 @@ packages: dependencies: json-parse-better-errors: 1.0.2 loader-runner: 4.2.0 - loader-utils: 2.0.2 + loader-utils: 2.0.1 neo-async: 2.6.2 schema-utils: 3.1.1 webpack: 4.46.0 @@ -17669,6 +18142,16 @@ packages: engines: {node: '>=8'} dev: true + /ts-clone-node/0.3.28_typescript@4.4.4: + resolution: {integrity: sha512-NHNYN/memcKz+9QDSO6+7r4QtlFQSV2lOWG1yZFWWO/3KrmRFdariuvgdwonvRMaKEuWScAk3ucPm3m312u4JQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + typescript: ^3.x || ^4.x + dependencies: + compatfactory: 0.0.9_typescript@4.4.4 + typescript: 4.4.4 + dev: true + /ts-invariant/0.3.3: resolution: {integrity: sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ==} dependencies: @@ -17760,7 +18243,7 @@ packages: dependencies: chalk: 4.1.2 enhanced-resolve: 4.5.0 - loader-utils: 2.0.2 + loader-utils: 2.0.1 micromatch: 4.0.4 semver: 7.3.5 typescript: 4.2.4 @@ -18127,8 +18610,8 @@ packages: has-value: 0.3.1 isobject: 3.0.1 - /untyped/0.2.13: - resolution: {integrity: sha512-dnvCmDKTb+zg504JyQ9h1sWINAyxnP6KgmvUH6s6BjLV+3fvjZTiUklL15VvEqpDjy4Leq/xzlZ+JxskeoM5mg==} + /untyped/0.2.12: + resolution: {integrity: sha512-mdMpwUHnJUQDpEmuByMuLxYdrPVlA98a1/b8MgoFoasR5tJTfsNbhAPfceAgFqMd/E05427T7MXgJGqdtDF/bQ==} dev: true /upath/1.2.0: @@ -18195,7 +18678,7 @@ packages: optional: true dependencies: file-loader: 6.2.0 - loader-utils: 2.0.2 + loader-utils: 2.0.1 mime-types: 2.1.33 schema-utils: 3.1.1 dev: true @@ -18211,7 +18694,7 @@ packages: optional: true dependencies: file-loader: 6.2.0_webpack@4.46.0 - loader-utils: 2.0.2 + loader-utils: 2.0.1 mime-types: 2.1.33 schema-utils: 3.1.1 webpack: 4.46.0 @@ -18648,6 +19131,10 @@ packages: browser-process-hrtime: 1.0.0 dev: true + /w3c-keyname/2.2.4: + resolution: {integrity: sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==} + dev: false + /w3c-xmlserializer/2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} engines: {node: '>=10'} @@ -18889,7 +19376,7 @@ packages: hasBin: true dependencies: '@windicss/plugin-utils': 1.5.1 - cac: 6.7.12 + cac: 6.7.11 connect: 3.7.0 declass: 0.0.1 fast-glob: 3.2.7 @@ -18904,7 +19391,7 @@ packages: dependencies: '@windicss/plugin-utils': 1.5.1 debug: 4.3.2 - loader-utils: 2.0.2 + loader-utils: 2.0.1 lodash: 4.17.21 magic-string: 0.25.7 upath: 2.0.1 @@ -18948,6 +19435,10 @@ packages: schema-utils: 3.1.1 dev: true + /workerpool/6.1.5: + resolution: {integrity: sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==} + dev: true + /wrap-ansi/3.0.1: resolution: {integrity: sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=} engines: {node: '>=4'} @@ -19141,10 +19632,25 @@ packages: camelcase: 5.3.1 decamelize: 1.2.0 + /yargs-parser/20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + /yargs-unparser/2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.2.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + dev: true + /yargs/15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'}