diff --git a/.changeset/soft-spoons-love.md b/.changeset/soft-spoons-love.md new file mode 100644 index 00000000000..efecb4a8f13 --- /dev/null +++ b/.changeset/soft-spoons-love.md @@ -0,0 +1,6 @@ +--- +'codemirror-graphql': minor +'example-cm6-graphql-parcel': patch +--- + +Added Codemirror 6 legacy support diff --git a/examples/cm6-graphql-parcel/.gitignore b/examples/cm6-graphql-parcel/.gitignore new file mode 100644 index 00000000000..ceddaa37f12 --- /dev/null +++ b/examples/cm6-graphql-parcel/.gitignore @@ -0,0 +1 @@ +.cache/ diff --git a/examples/cm6-graphql-parcel/README.md b/examples/cm6-graphql-parcel/README.md new file mode 100644 index 00000000000..5bcf6145766 --- /dev/null +++ b/examples/cm6-graphql-parcel/README.md @@ -0,0 +1,9 @@ +## Codemirror 6 Parcel Example + +This example demonstrates how to transpile your own custom ES6 Codemirror 6 GraphQL implementation with parcel bundler. + +### Setup + +1. `yarn` and `yarn build` at the root of this repository, if you have not already. +1. `yarn start` from this folder to start parcel dev mode. +1. `yarn build` to find production ready files. diff --git a/examples/cm6-graphql-parcel/package.json b/examples/cm6-graphql-parcel/package.json new file mode 100644 index 00000000000..31ea8d9b000 --- /dev/null +++ b/examples/cm6-graphql-parcel/package.json @@ -0,0 +1,35 @@ +{ + "name": "example-cm6-graphql-parcel", + "version": "1.1.10-alpha.8", + "license": "MIT", + "description": "GraphiQL Parcel Example", + "main": "index.js", + "private": true, + "scripts": { + "start": "parcel src/index.html -p 8080", + "build": "parcel build src/index.html --public-url /" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "dependencies": { + "@codemirror/basic-setup": "^0.19.0", + "@codemirror/stream-parser": "^0.19.2", + "codemirror-graphql": "^1.1.0", + "graphql": "16.0.0-experimental-stream-defer.5", + "typescript": "^3.4.4" + }, + "devDependencies": { + "parcel-bundler": "^1.12.4", + "worker-loader": "^2.0.0" + } +} diff --git a/examples/cm6-graphql-parcel/src/index.html b/examples/cm6-graphql-parcel/src/index.html new file mode 100644 index 00000000000..e75f67f4c7f --- /dev/null +++ b/examples/cm6-graphql-parcel/src/index.html @@ -0,0 +1,23 @@ + + + + + + + CM6 GraphQL Editor Example + + + +
+ + + diff --git a/examples/cm6-graphql-parcel/src/index.ts b/examples/cm6-graphql-parcel/src/index.ts new file mode 100644 index 00000000000..b792a954713 --- /dev/null +++ b/examples/cm6-graphql-parcel/src/index.ts @@ -0,0 +1,23 @@ +import { EditorState, EditorView, basicSetup } from '@codemirror/basic-setup'; +import { StreamLanguage } from '@codemirror/stream-parser'; +import { graphql } from 'codemirror-graphql/cm6-legacy/mode'; +import query from './sample-query'; + +const state = EditorState.create({ + doc: query, + extensions: [ + basicSetup, + StreamLanguage.define(graphql), + // javascript(), + ], +}); + +const view = new EditorView({ + state, + parent: document.querySelector('#editor')!, +}); + +// Hot Module Replacement +if (module.hot) { + module.hot.accept(); +} diff --git a/examples/cm6-graphql-parcel/src/sample-query.ts b/examples/cm6-graphql-parcel/src/sample-query.ts new file mode 100644 index 00000000000..f6fe841c577 --- /dev/null +++ b/examples/cm6-graphql-parcel/src/sample-query.ts @@ -0,0 +1,57 @@ +const query = /* GraphQL */ ` + # 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. + + query queryName($foo: TestInput, $site: TestEnum = RED) { + testAlias: hasArgs(string: "testString") + ... on Test { + hasArgs( + listEnum: [RED, GREEN, BLUE] + int: 1 + listFloat: [1.23, 1.3e-1, -1.35384e+3] + boolean: true + id: 123 + object: $foo + enum: $site + ) + } + test @include(if: true) { + union { + __typename + } + } + ...frag + ... @skip(if: false) { + id + } + ... { + id + } + } + + mutation mutationName { + setString(value: "newString") + } + + subscription subscriptionName { + subscribeToTest(id: "anId") { + ... on Test { + id + } + } + } + + fragment frag on Test { + test @include(if: true) { + union { + __typename + } + } + } +`; + +export default query; diff --git a/examples/cm6-graphql-parcel/tsconfig.json b/examples/cm6-graphql-parcel/tsconfig.json new file mode 100644 index 00000000000..b760a1ab436 --- /dev/null +++ b/examples/cm6-graphql-parcel/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "sourceMap": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react" + }, + "include": ["src"] +} diff --git a/packages/codemirror-graphql/.gitignore b/packages/codemirror-graphql/.gitignore index efe6247bcaa..fbeeeac5181 100644 --- a/packages/codemirror-graphql/.gitignore +++ b/packages/codemirror-graphql/.gitignore @@ -10,4 +10,5 @@ coverage/ /utils /variables /results +/cm6-legacy /__tests__ diff --git a/packages/codemirror-graphql/package.json b/packages/codemirror-graphql/package.json index 2e65fc1cae9..d76a922b07a 100644 --- a/packages/codemirror-graphql/package.json +++ b/packages/codemirror-graphql/package.json @@ -32,7 +32,7 @@ "build": "yarn build-clean && yarn build-js && yarn build-esm && yarn build-flow .", "build-js": "yarn tsc", "build-esm": "cross-env ESM=true yarn tsc --project tsconfig.esm.json && node ../../resources/renameFileExtensions.js './esm/{**,!**/__tests__/}/*.js' . .esm.js", - "build-clean": "rimraf {mode,hint,info,jump,lint}.{js,esm.js,js.flow,js.map,d.ts,d.ts.map} && rimraf esm results utils variables coverage __tests__", + "build-clean": "rimraf {mode,hint,info,jump,lint}.{js,esm.js,js.flow,js.map,d.ts,d.ts.map} && rimraf esm results utils variables coverage cm6-legacy __tests__", "build-flow": "node ../../resources/buildFlow.js", "watch": "babel --optional runtime resources/watch.js | node", "test": "jest", @@ -43,6 +43,7 @@ "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { + "@codemirror/stream-parser": "^0.19.2", "graphql-language-service-interface": "^2.9.0", "graphql-language-service-parser": "^1.10.0" }, diff --git a/packages/codemirror-graphql/src/cm6-legacy/mode.ts b/packages/codemirror-graphql/src/cm6-legacy/mode.ts new file mode 100644 index 00000000000..6a0daeda951 --- /dev/null +++ b/packages/codemirror-graphql/src/cm6-legacy/mode.ts @@ -0,0 +1,6 @@ +import type { StreamParser } from '@codemirror/stream-parser'; +import graphqlModeFactory from '../utils/mode-factory'; + +// Types of property 'token' are incompatible. +// Type '((stream: StringStream, state: any) => string | null) | undefined' is not comparable to type '(stream: StringStream, state: any) => string | null'. +export const graphql = (graphqlModeFactory({}) as unknown) as StreamParser; diff --git a/packages/codemirror-graphql/src/mode.ts b/packages/codemirror-graphql/src/mode.ts index ffe8a9e917a..61a2a47fc14 100644 --- a/packages/codemirror-graphql/src/mode.ts +++ b/packages/codemirror-graphql/src/mode.ts @@ -8,73 +8,6 @@ */ import CodeMirror from 'codemirror'; -import { - LexRules, - ParseRules, - isIgnored, - onlineParser, - State, -} from 'graphql-language-service-parser'; +import modeFactory from './utils/mode-factory'; -/** - * 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: config.tabSize }, - }); - - 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); -} +CodeMirror.defineMode('graphql', modeFactory); diff --git a/packages/codemirror-graphql/src/utils/mode-factory.ts b/packages/codemirror-graphql/src/utils/mode-factory.ts new file mode 100644 index 00000000000..f773cfcf1cc --- /dev/null +++ b/packages/codemirror-graphql/src/utils/mode-factory.ts @@ -0,0 +1,64 @@ +/** + * 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, +} from 'graphql-language-service-parser'; +import indent from './mode-indent'; + +/** + * 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. + */ +const graphqlModeFactory: CodeMirror.ModeFactory = config => { + const parser = onlineParser({ + eatWhitespace: stream => stream.eatWhile(isIgnored), + lexRules: LexRules, + parseRules: ParseRules, + editorConfig: { tabSize: config.tabSize }, + }); + + return { + config, + startState: parser.startState, + token: (parser.token as unknown) as NonNullable< + CodeMirror.Mode['token'] + >, // TODO: Check if the types are indeed compatible + indent, + electricInput: /^\s*[})\]]/, + fold: 'brace', + lineComment: '#', + closeBrackets: { + pairs: '()[]{}""', + explode: '()[]{}', + }, + }; +}; + +export default graphqlModeFactory; diff --git a/packages/codemirror-graphql/src/utils/mode-indent.ts b/packages/codemirror-graphql/src/utils/mode-indent.ts new file mode 100644 index 00000000000..3d387a9cf7d --- /dev/null +++ b/packages/codemirror-graphql/src/utils/mode-indent.ts @@ -0,0 +1,31 @@ +/** + * 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 { State } from 'graphql-language-service-parser'; + +// Seems the electricInput type in @types/codemirror is wrong (i.e it is written as electricinput instead of electricInput) +export default 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/yarn.lock b/yarn.lock index ec6d6f97b24..04212ecd387 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3110,6 +3110,224 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@codemirror/autocomplete@^0.19.0": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-0.19.8.tgz#a4a886089f0248a0d1ccdc11d9f8560c0b2c2abd" + integrity sha512-o4I1pRlFjhBHOYab+QfpKcW0B8FqAH+2pdmCYrkTz3bm1djVwhlMEhv1s/aTKhdjLtkfZFUbdHBi+8xe22wUCA== + dependencies: + "@codemirror/language" "^0.19.0" + "@codemirror/state" "^0.19.4" + "@codemirror/text" "^0.19.2" + "@codemirror/tooltip" "^0.19.0" + "@codemirror/view" "^0.19.0" + "@lezer/common" "^0.15.0" + +"@codemirror/basic-setup@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@codemirror/basic-setup/-/basic-setup-0.19.0.tgz#dc84dd735c8a88dd38c9dcc80cbfefa31d7e8f20" + integrity sha512-Yhrf7fIz8+INHWOhpWeRwbs8fpc0KsydX9baD7TyYqniLVWyTi0Hwm52mr0f5O+k4YaJPeHAgT3x9gzDXZIvOw== + dependencies: + "@codemirror/autocomplete" "^0.19.0" + "@codemirror/closebrackets" "^0.19.0" + "@codemirror/commands" "^0.19.0" + "@codemirror/comment" "^0.19.0" + "@codemirror/fold" "^0.19.0" + "@codemirror/gutter" "^0.19.0" + "@codemirror/highlight" "^0.19.0" + "@codemirror/history" "^0.19.0" + "@codemirror/language" "^0.19.0" + "@codemirror/lint" "^0.19.0" + "@codemirror/matchbrackets" "^0.19.0" + "@codemirror/rectangular-selection" "^0.19.0" + "@codemirror/search" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/closebrackets@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@codemirror/closebrackets/-/closebrackets-0.19.0.tgz#69fdcee85779d638a00a42becd9f53a33a26d77f" + integrity sha512-dFWX5OEVYWRNtGaifSbwIAlymnRRjxWMiMbffbAjF7p0zfGHDbdGkiT56q3Xud63h5/tQdSo5dK1iyNTzHz5vg== + dependencies: + "@codemirror/language" "^0.19.0" + "@codemirror/rangeset" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/text" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/commands@^0.19.0": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-0.19.5.tgz#2607b5c12c5c96df2cabce2e43f6285c07cfaf11" + integrity sha512-8PZOtx7d/GbKhFYA88zs2wINDtaUgj3pEjLYScKTd/Vsyw8qOp86tJQQNnMFTRZj/ISQl9Lbg3aAmHvroMqspw== + dependencies: + "@codemirror/language" "^0.19.0" + "@codemirror/matchbrackets" "^0.19.0" + "@codemirror/state" "^0.19.2" + "@codemirror/text" "^0.19.0" + "@codemirror/view" "^0.19.0" + "@lezer/common" "^0.15.0" + +"@codemirror/comment@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@codemirror/comment/-/comment-0.19.0.tgz#4f23497924e9346898c2e0123011acc535a0bea6" + integrity sha512-3hqAd0548fxqOBm4khFMcXVIivX8p0bSlbAuZJ6PNoUn/0wXhxkxowPp0FmFzU2+y37Z+ZQF5cRB5EREWPRIiQ== + dependencies: + "@codemirror/state" "^0.19.0" + "@codemirror/text" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/fold@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@codemirror/fold/-/fold-0.19.1.tgz#52000ff329ab69c4ba32e94401777941e29d8ad0" + integrity sha512-3GwQpxgv03urb8BPBvX1JSjl+uMXKqngRG6qHZXSM2FefxFKvTuyL44MCb35aodtfKjGwoxizk+7b6CbAOLyOw== + dependencies: + "@codemirror/gutter" "^0.19.0" + "@codemirror/language" "^0.19.0" + "@codemirror/rangeset" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/gutter@^0.19.0", "@codemirror/gutter@^0.19.4": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@codemirror/gutter/-/gutter-0.19.5.tgz#b90527832c3f3066d1aeb53b003a764b5a561cfc" + integrity sha512-Vqy+RXgBdnmbxNYx4/irQcfU9ecFz8SB/vhDOeHHSGtDqs+TihYHnHgBZLz6uILEG0YIjp0/zYY3P2NgZ/iyEg== + dependencies: + "@codemirror/rangeset" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/highlight@^0.19.0": + version "0.19.6" + resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.19.6.tgz#7f2e066f83f5649e8e0748a3abe0aaeaf64b8ac2" + integrity sha512-+eibu6on9quY8uN3xJ/n3rH+YIDLlpX7YulVmFvqAIz/ukRQ5tWaBmB7fMixHmnmRIRBRZgB8rNtonuMwZSAHQ== + dependencies: + "@codemirror/language" "^0.19.0" + "@codemirror/rangeset" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + "@lezer/common" "^0.15.0" + style-mod "^4.0.0" + +"@codemirror/history@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.19.0.tgz#cc8095c927c9566f7b69fa404074edde4c54d39c" + integrity sha512-E0H+lncH66IMDhaND9jgkjE7s0dhYfjCPmS+Ig2Yes9I8+UIEecIdObj8c8HPCFGctGg3fxXqRAw2mdHl2Wouw== + dependencies: + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/language@^0.19.0": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.19.5.tgz#4d816ce3f72974ad443cbf1a18ff4fcd1e56f1d0" + integrity sha512-FnIST07vaM99mv1mJaMMLvxiHSDGgP3wdlcEZzmidndWdbxjrYYYnJzVUOEkeZJNGOfrtPRMF62UCyrTjQMR3g== + dependencies: + "@codemirror/state" "^0.19.0" + "@codemirror/text" "^0.19.0" + "@codemirror/view" "^0.19.0" + "@lezer/common" "^0.15.5" + "@lezer/lr" "^0.15.0" + +"@codemirror/lint@^0.19.0": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-0.19.3.tgz#84101d0967fea8df114a8f0f79965c22ccd3b3cc" + integrity sha512-+c39s05ybD2NjghxkPFsUbH/qBL0cdzKmtHbzUm0RVspeL2OiP7uHYJ6J5+Qr9RjMIPWzcqSauRqxfmCrctUfg== + dependencies: + "@codemirror/gutter" "^0.19.4" + "@codemirror/panel" "^0.19.0" + "@codemirror/rangeset" "^0.19.1" + "@codemirror/state" "^0.19.4" + "@codemirror/tooltip" "^0.19.5" + "@codemirror/view" "^0.19.0" + crelt "^1.0.5" + +"@codemirror/matchbrackets@^0.19.0": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@codemirror/matchbrackets/-/matchbrackets-0.19.3.tgz#1f430ada6fa21af2205280ff344ef57bb95dd3cb" + integrity sha512-ljkrBxaLgh8jesroUiBa57pdEwqJamxkukXrJpL9LdyFZVJaF+9TldhztRaMsMZO1XnCSSHQ9sg32iuHo7Sc2g== + dependencies: + "@codemirror/language" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + "@lezer/common" "^0.15.0" + +"@codemirror/panel@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@codemirror/panel/-/panel-0.19.0.tgz#18c7a253a7a1ef686bece1ef13ec0e5eb6603265" + integrity sha512-LJuu49xnuhaAztlhnLJQ57ddOirSyf8/lnl7twsQUG/05RkxodBZ9F7q8r5AOLqOkaQOy9WySEKX1Ur8lD9Q5w== + dependencies: + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/rangeset@^0.19.0", "@codemirror/rangeset@^0.19.1": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.19.2.tgz#d7a999e4273c00fecef4aba8535a426073cdcddf" + integrity sha512-5d+X8LtmeZtfFtKrSx57bIHRUpKv2HD0b74clp4fGA7qJLLfYehF6FGkJJxJb8lKsqAga1gdjjWr0jiypmIxoQ== + dependencies: + "@codemirror/state" "^0.19.0" + +"@codemirror/rectangular-selection@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@codemirror/rectangular-selection/-/rectangular-selection-0.19.1.tgz#5a88ece4fb68ce5682539497db8a64fc015aae63" + integrity sha512-9ElnqOg3mpZIWe0prPRd1SZ48Q9QB3bR8Aocq8UtjboJSUG8ABhRrbuTZMW/rMqpBPSjVpCe9xkCCkEQMYQVmw== + dependencies: + "@codemirror/state" "^0.19.0" + "@codemirror/text" "^0.19.4" + "@codemirror/view" "^0.19.0" + +"@codemirror/search@^0.19.0": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-0.19.2.tgz#d549c3daa527e17c173cdfc90b7c1b02deab1502" + integrity sha512-TrRxUxyJ/a7HXtUvMZhgkOUbKE1xO33UhXjn1XACEHKWhgovw1vEeEEti9dZejN8/QOOFJed39InUxmp7oQ8HA== + dependencies: + "@codemirror/panel" "^0.19.0" + "@codemirror/rangeset" "^0.19.0" + "@codemirror/state" "^0.19.2" + "@codemirror/text" "^0.19.0" + "@codemirror/view" "^0.19.0" + crelt "^1.0.5" + +"@codemirror/state@^0.19.0", "@codemirror/state@^0.19.2", "@codemirror/state@^0.19.3", "@codemirror/state@^0.19.4": + version "0.19.6" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.19.6.tgz#d631f041d39ce41b7891b099fca26cb1fdb9763e" + integrity sha512-sqIQZE9VqwQj7D4c2oz9mfLhlT1ElAzGB5lO1lE33BPyrdNy1cJyCIOecT4cn4VeJOFrnjOeu+IftZ3zqdFETw== + dependencies: + "@codemirror/text" "^0.19.0" + +"@codemirror/stream-parser@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@codemirror/stream-parser/-/stream-parser-0.19.2.tgz#793428e55aa7b9daa64cb733973e5d5e3d9a2306" + integrity sha512-hBKRQlyu8GUOrY33xZ6/1kAfNZ8ZUm6cX9a7mPx8zAAqnpz/fpksC/qJRrkg1mPMBwxm+JG4fqAwDGJ3gLVniQ== + dependencies: + "@codemirror/highlight" "^0.19.0" + "@codemirror/language" "^0.19.0" + "@codemirror/state" "^0.19.0" + "@codemirror/text" "^0.19.0" + "@lezer/common" "^0.15.0" + "@lezer/lr" "^0.15.0" + +"@codemirror/text@^0.19.0", "@codemirror/text@^0.19.2", "@codemirror/text@^0.19.4": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.19.5.tgz#75033af2476214e79eae22b81ada618815441c18" + integrity sha512-Syu5Xc7tZzeUAM/y4fETkT0zgGr48rDG+w4U38bPwSIUr+L9S/7w2wDE1WGNzjaZPz12F6gb1gxWiSTg9ocLow== + +"@codemirror/tooltip@^0.19.0", "@codemirror/tooltip@^0.19.5": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@codemirror/tooltip/-/tooltip-0.19.8.tgz#f9675c3690e8dafb00a5c8c1cb86d960b99b9235" + integrity sha512-Xg1H50utH3z1rmyzk5l/dfE0Lko+5pkxzaVlVzAbcqHlDsG9vARDkgRX+fEEpWg/rrvR83GVQhdKwl+wNxjOAg== + dependencies: + "@codemirror/state" "^0.19.0" + "@codemirror/view" "^0.19.0" + +"@codemirror/view@^0.19.0": + version "0.19.20" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.19.20.tgz#77969ff93cb097e3d4c9245b32e220efb80131be" + integrity sha512-j4cI/Egdhha77pMfKQQWZmpkcF7vhe21LqdZs8hsG09OtvsPVCHUXmfB0u7nMpcX1JR8aZ3ob9g6FMr+OVtjgA== + dependencies: + "@codemirror/rangeset" "^0.19.0" + "@codemirror/state" "^0.19.3" + "@codemirror/text" "^0.19.0" + style-mod "^4.0.0" + w3c-keyname "^2.2.4" + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -3803,6 +4021,18 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@lezer/common@^0.15.0", "@lezer/common@^0.15.5": + version "0.15.8" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.8.tgz#e9d87b5f05c18feb51b7f04d74b124caea32a94b" + integrity sha512-zpS/xty48huX4uBidupmWDYCRBYpVtoTiFhzYhd6GsQwU67WsdSImdWzZJDrF/DhcQ462wyrZahHlo2grFB5ig== + +"@lezer/lr@^0.15.0": + version "0.15.4" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-0.15.4.tgz#634670d7224040fddac1370af01211eecd9ac0a0" + integrity sha512-vwgG80sihEGJn6wJp6VijXrnzVai/KPva/OzYKaWvIx0IiXKjoMQ8UAwcgpSBwfS4Fbz3IKOX/cCNXU3r1FvpQ== + dependencies: + "@lezer/common" "^0.15.0" + "@manypkg/cli@^0.17.0": version "0.17.0" resolved "https://registry.yarnpkg.com/@manypkg/cli/-/cli-0.17.0.tgz#d5b91a150acca808a53bcc90046712a6efb44f5d" @@ -8423,6 +8653,11 @@ create-react-context@0.3.0, create-react-context@^0.3.0: gud "^1.0.0" warning "^4.0.3" +crelt@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" + integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== + cross-env@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -18063,15 +18298,6 @@ react-textarea-autosize@^7.1.0: "@babel/runtime" "^7.1.2" prop-types "^15.6.0" -react@16.13.1, react@^16.12.0, react@^16.8.3: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - react@17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -18080,6 +18306,15 @@ react@17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" +react@^16.12.0, react@^16.8.3: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + react@^16.13.1: version "16.14.0" resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" @@ -19972,6 +20207,11 @@ style-loader@^1.0.0, style-loader@^1.1.3: loader-utils "^2.0.0" schema-utils "^2.6.6" +style-mod@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" + integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== + styled-system@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/styled-system/-/styled-system-5.1.5.tgz#e362d73e1dbb5641a2fd749a6eba1263dc85075e" @@ -21119,6 +21359,11 @@ w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: dependencies: browser-process-hrtime "^1.0.0" +w3c-keyname@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b" + integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw== + w3c-xmlserializer@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"