A monorepo containing jupyter-blocks and jupyter-tidyblocks. Blockly extension for JupyterLab.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Clean up and use a CodeCell to render and execute the code

hbcarlos acd288d4 dce59aad

+347 -56
+23 -1
.eslintignore
··· 1 - node_modules 1 + **/node_modules 2 + **/lib 3 + **/package.json 4 + **/patches 2 5 dist 3 6 coverage 4 7 **/*.d.ts 5 8 tests 9 + 10 + .github 11 + binder 12 + jupyterlab_blockly/labextension 13 + .eslintignore 14 + .eslintrc.js 15 + .gitignore 16 + .pre-commit-config.yaml 17 + .prettierignore 18 + .prettierrc 19 + CHANGELOG.md 20 + install.json 21 + LICENSE 22 + MANIFEST.in 23 + pyproject.toml 24 + README.md 25 + RELEASE.md 26 + tsconfig.json 27 + yarn.lock
+7 -6
.eslintrc.js
··· 3 3 'eslint:recommended', 4 4 'plugin:@typescript-eslint/eslint-recommended', 5 5 'plugin:@typescript-eslint/recommended', 6 - 'plugin:prettier/recommended' 6 + 'plugin:prettier/recommended', 7 + 'plugin:react/recommended' 7 8 ], 8 9 parser: '@typescript-eslint/parser', 9 10 parserOptions: { ··· 15 16 '@typescript-eslint/naming-convention': [ 16 17 'error', 17 18 { 18 - 'selector': 'interface', 19 - 'format': ['PascalCase'], 20 - 'custom': { 21 - 'regex': '^I[A-Z]', 22 - 'match': true 19 + selector: 'interface', 20 + format: ['PascalCase'], 21 + custom: { 22 + regex: '^I[A-Z]', 23 + match: true 23 24 } 24 25 } 25 26 ],
+28
.github/workflows/binder-on-pr.yml
··· 1 + # Reference https://mybinder.readthedocs.io/en/latest/howto/gh-actions-badges.html 2 + name: Binder Badge 3 + on: 4 + pull_request_target: 5 + types: [opened] 6 + 7 + permissions: 8 + pull-requests: write 9 + jobs: 10 + binder: 11 + runs-on: ubuntu-latest 12 + steps: 13 + - name: comment on PR with Binder link 14 + uses: actions/github-script@v3 15 + with: 16 + github-token: ${{secrets.GITHUB_TOKEN}} 17 + script: | 18 + var PR_HEAD_USERREPO = process.env.PR_HEAD_USERREPO; 19 + var PR_HEAD_REF = process.env.PR_HEAD_REF; 20 + github.issues.createComment({ 21 + issue_number: context.issue.number, 22 + owner: context.repo.owner, 23 + repo: context.repo.repo, 24 + body: `[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/${PR_HEAD_USERREPO}/${PR_HEAD_REF}?urlpath=lab) :point_left: Launch a Binder on branch _${PR_HEAD_USERREPO}/${PR_HEAD_REF}_` 25 + }) 26 + env: 27 + PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} 28 + PR_HEAD_USERREPO: ${{ github.event.pull_request.head.repo.full_name }}
+11
.pre-commit-config.yaml
··· 1 + repos: 2 + - repo: local 3 + hooks: 4 + - id: prettier 5 + name: prettier 6 + entry: 'npm run prettier' 7 + language: node 8 + - id: eslint 9 + name: eslint 10 + entry: 'npm run eslint' 11 + language: node
+3 -2
.prettierrc
··· 1 1 { 2 2 "singleQuote": true, 3 3 "trailingComma": "none", 4 - "arrowParens": "avoid" 5 - } 4 + "arrowParens": "avoid", 5 + "endOfLine": "auto" 6 + }
+12 -10
README.md
··· 5 5 Blockly extension for JupyterLab. 6 6 7 7 ## Blockly 8 + 8 9 Blockly is a library from Google for building beginner-friendly block-based programming languages. 9 10 10 11 Docs: https://developers.google.com/blockly/guides/overview 11 12 Repo: https://github.com/google/blockly 12 13 13 - 14 14 ## Requirements 15 15 16 - * JupyterLab == 3.4 16 + - JupyterLab == 3.4 17 17 18 18 ## Install 19 19 20 20 To install the extension, execute: 21 21 22 22 ```bash 23 - micromamba create -n blockly -c conda-forge python ipykernel xeus-python xeus-lua 23 + micromamba create -n blockly -c conda-forge python jupyterlab==3.4 ipykernel xeus-python xeus-lua jupyterlab-language-pack-es-ES jupyterlab-language-pack-fr-FR 24 24 micromamba activate blockly 25 25 pip install jupyterlab_blockly 26 26 ``` 27 27 28 28 #### Kernels 29 - * ipykernel 30 - * xeus-python 31 - * xeus-lua 32 - * [JavaScript](https://github.com/n-riesco/ijavascript#installation) 33 - * [JavaScript](https://github.com/yunabe/tslab) 29 + 30 + - ipykernel 31 + - xeus-python 32 + - xeus-lua 33 + - [JavaScript](https://github.com/n-riesco/ijavascript#installation) 34 + - [JavaScript](https://github.com/yunabe/tslab) 34 35 35 36 ## Uninstall 36 37 ··· 40 41 pip uninstall jupyterlab_blockly 41 42 ``` 42 43 43 - 44 44 ## Contributing 45 45 46 46 ### Development install ··· 52 52 `yarn` or `npm` in lieu of `jlpm` below. 53 53 54 54 ```bash 55 - micromamba create -n blockly -c conda-forge python nodejs yarn jupyterlab==3.4 jupyter-packaging 55 + micromamba create -n blockly -c conda-forge python nodejs pre-commit yarn jupyterlab==3.4 jupyter-packaging jupyterlab-language-pack-es-ES jupyterlab-language-pack-fr-FR ipykernel xeus-python xeus-lua 56 56 micromamba activate blockly 57 57 # Clone the repo to your local environment 58 58 # Change directory to the jupyterlab_blockly directory 59 59 # Install package in development mode 60 60 pip install -e . 61 + # Installing pre-commit to run command when adding commits 62 + pre-commit install 61 63 # Link your development version of the extension with JupyterLab 62 64 jupyter labextension develop . --overwrite 63 65 # Rebuild extension Typescript source after making changes
+1 -1
RELEASE.md
··· 15 15 pip install build twine 16 16 ``` 17 17 18 - To create a Python source package (``.tar.gz``) and the binary package (`.whl`) in the `dist/` directory, do: 18 + To create a Python source package (`.tar.gz`) and the binary package (`.whl`) in the `dist/` directory, do: 19 19 20 20 ```bash 21 21 python -m build
+9 -1
package.json
··· 37 37 "clean:lib": "rimraf lib tsconfig.tsbuildinfo", 38 38 "clean:labextension": "rimraf jupyterlab_blockly/labextension", 39 39 "clean:all": "jlpm run clean:lib && jlpm run clean:labextension", 40 - "eslint": "eslint . --ext .ts,.tsx --fix", 40 + "eslint": "jlpm eslint:check --fix", 41 41 "eslint:check": "eslint . --ext .ts,.tsx", 42 42 "install:extension": "jlpm run build", 43 + "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", 44 + "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", 45 + "prettier": "jlpm prettier:base --write --list-different", 46 + "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css}\"", 47 + "prettier:check": "jlpm prettier:base --check", 43 48 "watch": "run-p watch:src watch:labextension", 44 49 "watch:src": "tsc -w", 45 50 "watch:labextension": "jupyter labextension watch .", ··· 48 53 "dependencies": { 49 54 "@jupyterlab/application": "^3.4", 50 55 "@jupyterlab/apputils": "^3.4", 56 + "@jupyterlab/cells": "^3.4", 57 + "@jupyterlab/codeeditor": "^3.4", 51 58 "@jupyterlab/coreutils": "^5.4", 52 59 "@jupyterlab/docregistry": "^3.4", 53 60 "@jupyterlab/filebrowser": "^3.4", ··· 72 79 "eslint": "^8.9.0", 73 80 "eslint-config-prettier": "^8.4.0", 74 81 "eslint-plugin-prettier": "^4.0.0", 82 + "eslint-plugin-react": "^7.30.0", 75 83 "npm-run-all": "^4.1.5", 76 84 "prettier": "^2.5.1", 77 85 "rimraf": "^3.0.2",
patches/@jupyterlab+codeeditor+3.4.2.patch patches/@jupyterlab+codeeditor+3.4.3.patch
+12 -1
src/factory.ts
··· 4 4 DocumentModel 5 5 } from '@jupyterlab/docregistry'; 6 6 import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; 7 + import { IEditorMimeTypeService } from '@jupyterlab/codeeditor'; 7 8 8 9 import { BlocklyEditor, BlocklyPanel } from './widget'; 9 10 import { BlocklyRegistry } from './registry'; ··· 18 19 > { 19 20 private _registry: BlocklyRegistry; 20 21 private _rendermime: IRenderMimeRegistry; 22 + private _mimetypeService: IEditorMimeTypeService; 21 23 22 24 /** 23 25 * Constructor of BlocklyEditorFactory. ··· 28 30 super(options); 29 31 this._registry = new BlocklyRegistry(); 30 32 this._rendermime = options.rendermime; 33 + this._mimetypeService = options.mimetypeService; 31 34 } 32 35 33 36 get registry(): BlocklyRegistry { ··· 43 46 protected createNewWidget( 44 47 context: DocumentRegistry.IContext<DocumentModel> 45 48 ): BlocklyEditor { 46 - const manager = new BlocklyManager(this._registry, context.sessionContext); 49 + const manager = new BlocklyManager( 50 + this._registry, 51 + context.sessionContext, 52 + this._mimetypeService 53 + ); 47 54 const content = new BlocklyPanel(context, manager, this._rendermime); 48 55 return new BlocklyEditor({ context, content, manager }); 49 56 } ··· 55 62 * A rendermime instance. 56 63 */ 57 64 rendermime: IRenderMimeRegistry; 65 + /* 66 + * A mimeType service instance. 67 + */ 68 + mimetypeService: IEditorMimeTypeService; 58 69 } 59 70 }
+6 -1
src/index.ts
··· 6 6 import { jsonIcon } from '@jupyterlab/ui-components'; 7 7 import { WidgetTracker } from '@jupyterlab/apputils'; 8 8 import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; 9 + import { IEditorServices } from '@jupyterlab/codeeditor'; 9 10 import { ICommandPalette } from '@jupyterlab/apputils'; 10 11 import { IFileBrowserFactory } from '@jupyterlab/filebrowser'; 11 12 import { ILauncher } from '@jupyterlab/launcher'; ··· 43 44 requires: [ 44 45 ILayoutRestorer, 45 46 IRenderMimeRegistry, 47 + IEditorServices, 46 48 IFileBrowserFactory, 47 49 ISettingRegistry, 48 50 ITranslator ··· 53 55 app: JupyterFrontEnd, 54 56 restorer: ILayoutRestorer, 55 57 rendermime: IRenderMimeRegistry, 58 + editorServices: IEditorServices, 56 59 browserFactory: IFileBrowserFactory, 57 60 settings: ISettingRegistry, 58 61 translator: ITranslator, ··· 97 100 shutdownOnClose: true, 98 101 99 102 // The rendermime instance, necessary to render the outputs 100 - // after a code execution. 103 + // after a code execution. And the mimeType service to get the 104 + // mimeType from the kernel language 101 105 rendermime: rendermime, 106 + mimetypeService: editorServices.mimeTypeService, 102 107 103 108 // The translator instance, used for the internalization of the plugin. 104 109 translator: translator
+32 -15
src/layout.ts
··· 1 - import { SimplifiedOutputArea, OutputAreaModel } from '@jupyterlab/outputarea'; 2 1 import { IRenderMimeRegistry } from '@jupyterlab/rendermime'; 3 2 import { ISessionContext, showErrorMessage } from '@jupyterlab/apputils'; 3 + import { CodeCell, CodeCellModel } from '@jupyterlab/cells'; 4 4 5 5 import { Message } from '@lumino/messaging'; 6 6 import { PartialJSONValue } from '@lumino/coreutils'; ··· 21 21 private _manager: BlocklyManager; 22 22 private _workspace: Blockly.WorkspaceSvg; 23 23 private _sessionContext: ISessionContext; 24 - private _outputArea: SimplifiedOutputArea; 24 + private _cell: CodeCell; 25 25 26 26 /** 27 27 * Construct a `BlocklyLayout`. ··· 40 40 // and the output area to render the execution replies. 41 41 this._host = document.createElement('div'); 42 42 43 - // Creating a SimplifiedOutputArea widget to render the 43 + // Creating a CodeCell widget to render the code and 44 44 // outputs from the execution reply. 45 - this._outputArea = new SimplifiedOutputArea({ 46 - model: new OutputAreaModel({ trusted: true }), 45 + this._cell = new CodeCell({ 46 + model: new CodeCellModel({}), 47 47 rendermime 48 48 }); 49 + // Trust the outputs and set the mimeType for the code 50 + this._cell.readOnly = true; 51 + this._cell.model.trusted = true; 52 + this._cell.model.mimeType = this._manager.mimeType; 53 + 54 + this._manager.changed.connect(this._onManagerChanged, this); 49 55 } 50 56 51 57 get workspace(): PartialJSONValue { ··· 99 105 run(): void { 100 106 // Serializing our workspace into the chosen language generator. 101 107 const code = this._manager.generator.workspaceToCode(this._workspace); 108 + this._cell.model.sharedModel.setSource(code); 109 + this.addWidget(this._cell); 110 + this._resizeWorkspace(); 102 111 103 112 // Execute the code using the kernel, by using a static method from the 104 113 // same class to make an execution request. ··· 111 120 ` 112 121 ); 113 122 } else { 114 - SimplifiedOutputArea.execute(code, this._outputArea, this._sessionContext) 115 - .then(resp => { 116 - this.addWidget(this._outputArea); 117 - this._resizeWorkspace(); 118 - }) 123 + CodeCell.execute(this._cell, this._sessionContext) 124 + .then(() => this._resizeWorkspace()) 119 125 .catch(e => console.error(e)); 120 126 } 121 127 } ··· 155 161 private _resizeWorkspace(): void { 156 162 //Resize logic. 157 163 const rect = this.parent.node.getBoundingClientRect(); 158 - const { height } = this._outputArea.node.getBoundingClientRect(); 159 - this._host.style.width = rect.width + 'px'; 164 + const { height } = this._cell.node.getBoundingClientRect(); 160 165 const margin = rect.height / 3; 161 166 162 167 if (height > margin) { 163 168 this._host.style.height = rect.height - margin + 'px'; 164 - this._outputArea.node.style.height = margin + 'px'; 165 - this._outputArea.node.style.overflowY = 'scroll'; 169 + this._cell.node.style.height = margin + 'px'; 170 + this._cell.node.style.overflowY = 'scroll'; 166 171 } else { 167 172 this._host.style.height = rect.height - height + 'px'; 168 - this._outputArea.node.style.overflowY = 'hidden'; 173 + this._cell.node.style.overflowY = 'scroll'; 169 174 } 170 175 171 176 Blockly.svgResize(this._workspace); 177 + } 178 + 179 + private _onManagerChanged( 180 + sender: BlocklyManager, 181 + change: BlocklyManager.Change 182 + ) { 183 + if (change === 'kernel') { 184 + // Serializing our workspace into the chosen language generator. 185 + const code = this._manager.generator.workspaceToCode(this._workspace); 186 + this._cell.model.sharedModel.setSource(code); 187 + this._cell.model.mimeType = this._manager.mimeType; 188 + } 172 189 } 173 190 }
+24 -1
src/manager.ts
··· 1 1 import { ISessionContext } from '@jupyterlab/apputils'; 2 + import { IEditorMimeTypeService } from '@jupyterlab/codeeditor'; 2 3 import { KernelSpec, KernelConnection } from '@jupyterlab/services'; 3 4 import { IChangedArgs } from '@jupyterlab/coreutils'; 4 5 ··· 20 21 private _registry: BlocklyRegistry; 21 22 private _selectedKernel: KernelSpec.ISpecModel; 22 23 private _sessionContext: ISessionContext; 24 + private _mimetypeService: IEditorMimeTypeService; 23 25 private _changed: Signal<this, BlocklyManager.Change>; 24 26 25 27 /** 26 28 * Constructor of BlocklyManager. 27 29 */ 28 - constructor(registry: BlocklyRegistry, sessionContext: ISessionContext) { 30 + constructor( 31 + registry: BlocklyRegistry, 32 + sessionContext: ISessionContext, 33 + mimetypeService: IEditorMimeTypeService 34 + ) { 29 35 this._registry = registry; 30 36 this._sessionContext = sessionContext; 37 + this._mimetypeService = mimetypeService; 31 38 32 39 this._toolbox = this._registry.toolboxes.get('default'); 33 40 this._generator = this._registry.generators.get('python'); ··· 41 48 */ 42 49 get toolbox(): JSONObject { 43 50 return this._toolbox; 51 + } 52 + 53 + /** 54 + * Returns the mimeType for the selected kernel. 55 + * 56 + * Note: We need the mimeType for the syntax highlighting 57 + * when rendering the code. 58 + */ 59 + get mimeType(): string { 60 + if (this._selectedKernel) { 61 + return this._mimetypeService.getMimeTypeByLanguage({ 62 + name: this._selectedKernel.language 63 + }); 64 + } else { 65 + return 'text/plain'; 66 + } 44 67 } 45 68 46 69 /**
+3 -3
style/base.css
··· 1 1 .jp-blockly-button:hover { 2 - background-color: transparent !important; 2 + background-color: transparent !important; 3 3 } 4 4 5 5 .jp-blockly-runButton { 6 - background-color: var(--md-green-500) 6 + background-color: var(--md-green-500); 7 7 } 8 8 9 9 .jp-blockly-runButton:hover { 10 - background-color: var(--md-green-700) 10 + background-color: var(--md-green-700); 11 11 }
+1 -1
tsconfig.json
··· 19 19 }, 20 20 "include": ["src/**/*.ts", "src/**/*.tsx", "style/icons"], 21 21 "exclude": ["node_modules"] 22 - } 22 + }
+175 -13
yarn.lock
··· 201 201 sanitize-html "~2.5.3" 202 202 url "^0.11.0" 203 203 204 + "@jupyterlab/attachments@^3.4.3": 205 + version "3.4.3" 206 + resolved "https://registry.yarnpkg.com/@jupyterlab/attachments/-/attachments-3.4.3.tgz#a958bb529c3f606694d0b60211b7b8b882a1ebf7" 207 + integrity sha512-/Gwi00nwC294iUUM5yFu3RkN0Ds5aJV0w2j0b+FLZsJONy2BYfRSgYYAnm67483vuVu7zZU5umPS1UWLPXIMbg== 208 + dependencies: 209 + "@jupyterlab/nbformat" "^3.4.3" 210 + "@jupyterlab/observables" "^4.4.3" 211 + "@jupyterlab/rendermime" "^3.4.3" 212 + "@jupyterlab/rendermime-interfaces" "^3.4.3" 213 + "@lumino/disposable" "^1.10.0" 214 + "@lumino/signaling" "^1.10.0" 215 + 204 216 "@jupyterlab/builder@^3.4": 205 217 version "3.4.3" 206 218 resolved "https://registry.yarnpkg.com/@jupyterlab/builder/-/builder-3.4.3.tgz#060596148fb248e27526a7f7519836229b2010db" ··· 266 278 typescript "~4.1.3" 267 279 verdaccio "^5.1.1" 268 280 269 - "@jupyterlab/codeeditor@^3.4.3": 281 + "@jupyterlab/cells@^3.4": 282 + version "3.4.3" 283 + resolved "https://registry.yarnpkg.com/@jupyterlab/cells/-/cells-3.4.3.tgz#67f318d0d142716653fc5fda01b16dae99c89e80" 284 + integrity sha512-ablkAPBd6w0Wxo1gi3VYEKX9HxexGHb7X2xbiglosuiBrng6a/4Ozata9vPiZbjNCmvFmstQF3HcVr5lg/Hv6A== 285 + dependencies: 286 + "@jupyterlab/apputils" "^3.4.3" 287 + "@jupyterlab/attachments" "^3.4.3" 288 + "@jupyterlab/codeeditor" "^3.4.3" 289 + "@jupyterlab/codemirror" "^3.4.3" 290 + "@jupyterlab/coreutils" "^5.4.3" 291 + "@jupyterlab/filebrowser" "^3.4.3" 292 + "@jupyterlab/nbformat" "^3.4.3" 293 + "@jupyterlab/observables" "^4.4.3" 294 + "@jupyterlab/outputarea" "^3.4.3" 295 + "@jupyterlab/rendermime" "^3.4.3" 296 + "@jupyterlab/services" "^6.4.3" 297 + "@jupyterlab/shared-models" "^3.4.3" 298 + "@jupyterlab/ui-components" "^3.4.3" 299 + "@lumino/algorithm" "^1.9.0" 300 + "@lumino/coreutils" "^1.11.0" 301 + "@lumino/domutils" "^1.8.0" 302 + "@lumino/dragdrop" "^1.13.0" 303 + "@lumino/messaging" "^1.10.0" 304 + "@lumino/polling" "^1.9.0" 305 + "@lumino/signaling" "^1.10.0" 306 + "@lumino/virtualdom" "^1.14.0" 307 + "@lumino/widgets" "^1.30.0" 308 + marked "^4.0.10" 309 + react "^17.0.1" 310 + 311 + "@jupyterlab/codeeditor@^3.4", "@jupyterlab/codeeditor@^3.4.3": 270 312 version "3.4.3" 271 313 resolved "https://registry.yarnpkg.com/@jupyterlab/codeeditor/-/codeeditor-3.4.3.tgz#f69dbd1f25307382b863ecbe9b4f0a5037e264c0" 272 314 integrity sha512-xnEMGS6Y6UlPQi+suFCrf7rPPnNbC6hRI+yBgsK82O7MiMjHIti/V1dcjP93xjvTuCZexO8qCtRRLoMtTSELWA== ··· 378 420 "@lumino/widgets" "^1.30.0" 379 421 yjs "^13.5.17" 380 422 381 - "@jupyterlab/filebrowser@^3.4": 423 + "@jupyterlab/filebrowser@^3.4", "@jupyterlab/filebrowser@^3.4.3": 382 424 version "3.4.3" 383 425 resolved "https://registry.yarnpkg.com/@jupyterlab/filebrowser/-/filebrowser-3.4.3.tgz#73d288a3a103d13c83734bd23647d1479bd297ec" 384 426 integrity sha512-VlUcEvRAG/eAkxgk90MKKbAYUv3BORxfp9VXUdRm/YOW66ZborF6TNbzjYh9C7L7psXAcpzQ+85p73o25iMDoA== ··· 438 480 "@lumino/messaging" "^1.10.0" 439 481 "@lumino/signaling" "^1.10.0" 440 482 441 - "@jupyterlab/outputarea@^3.4": 483 + "@jupyterlab/outputarea@^3.4", "@jupyterlab/outputarea@^3.4.3": 442 484 version "3.4.3" 443 485 resolved "https://registry.yarnpkg.com/@jupyterlab/outputarea/-/outputarea-3.4.3.tgz#285bb767334d82bbbb3b94f80cefeee746972c3d" 444 486 integrity sha512-acckQMJZOR9D1gcKhaBtP6seopjDpZXYChF9ZeuwgnJJNc+ct3V3iL5lAn+Y2l9BslGP5ogbhT7DDNVsXU8eoQ== ··· 1295 1337 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 1296 1338 integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 1297 1339 1340 + array-includes@^3.1.4, array-includes@^3.1.5: 1341 + version "3.1.5" 1342 + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" 1343 + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== 1344 + dependencies: 1345 + call-bind "^1.0.2" 1346 + define-properties "^1.1.4" 1347 + es-abstract "^1.19.5" 1348 + get-intrinsic "^1.1.1" 1349 + is-string "^1.0.7" 1350 + 1298 1351 array-union@^2.1.0: 1299 1352 version "2.1.0" 1300 1353 resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 1301 1354 integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 1355 + 1356 + array.prototype.flatmap@^1.3.0: 1357 + version "1.3.0" 1358 + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" 1359 + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== 1360 + dependencies: 1361 + call-bind "^1.0.2" 1362 + define-properties "^1.1.3" 1363 + es-abstract "^1.19.2" 1364 + es-shim-unscopables "^1.0.0" 1302 1365 1303 1366 asn1@~0.2.3: 1304 1367 version "0.2.6" ··· 1647 1710 integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 1648 1711 1649 1712 colorette@^2.0.14: 1650 - version "2.0.18" 1651 - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.18.tgz#4c260bcf86437ce94fa58e2e49a83b623f3c4d66" 1652 - integrity sha512-rHDY1i4V4JBCXHnHwaVyA202CKSj2kUrjI5cSJQbTdnFeI4ShV3e19Fe7EQfzL2tjSrvYyWugdGAtEc1lLvGDg== 1713 + version "2.0.19" 1714 + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" 1715 + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== 1653 1716 1654 1717 combined-stream@^1.0.6, combined-stream@~1.0.6: 1655 1718 version "1.0.8" ··· 1990 2053 dependencies: 1991 2054 path-type "^4.0.0" 1992 2055 2056 + doctrine@^2.1.0: 2057 + version "2.1.0" 2058 + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 2059 + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 2060 + dependencies: 2061 + esutils "^2.0.2" 2062 + 1993 2063 doctrine@^3.0.0: 1994 2064 version "3.0.0" 1995 2065 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" ··· 2155 2225 dependencies: 2156 2226 is-arrayish "^0.2.1" 2157 2227 2158 - es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5: 2228 + es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: 2159 2229 version "1.20.1" 2160 2230 resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" 2161 2231 integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== ··· 2188 2258 version "0.9.3" 2189 2259 resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" 2190 2260 integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== 2261 + 2262 + es-shim-unscopables@^1.0.0: 2263 + version "1.0.0" 2264 + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" 2265 + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== 2266 + dependencies: 2267 + has "^1.0.3" 2191 2268 2192 2269 es-to-primitive@^1.2.1: 2193 2270 version "1.2.1" ··· 2286 2363 dependencies: 2287 2364 prettier-linter-helpers "^1.0.0" 2288 2365 2366 + eslint-plugin-react@^7.30.0: 2367 + version "7.30.0" 2368 + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" 2369 + integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== 2370 + dependencies: 2371 + array-includes "^3.1.5" 2372 + array.prototype.flatmap "^1.3.0" 2373 + doctrine "^2.1.0" 2374 + estraverse "^5.3.0" 2375 + jsx-ast-utils "^2.4.1 || ^3.0.0" 2376 + minimatch "^3.1.2" 2377 + object.entries "^1.1.5" 2378 + object.fromentries "^2.0.5" 2379 + object.hasown "^1.1.1" 2380 + object.values "^1.1.5" 2381 + prop-types "^15.8.1" 2382 + resolve "^2.0.0-next.3" 2383 + semver "^6.3.0" 2384 + string.prototype.matchall "^4.0.7" 2385 + 2289 2386 eslint-scope@5.1.1, eslint-scope@^5.1.1: 2290 2387 version "5.1.1" 2291 2388 resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" ··· 2393 2490 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 2394 2491 integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 2395 2492 2396 - estraverse@^5.1.0, estraverse@^5.2.0: 2493 + estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: 2397 2494 version "5.3.0" 2398 2495 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 2399 2496 integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== ··· 3163 3260 dependencies: 3164 3261 ci-info "^2.0.0" 3165 3262 3166 - is-core-module@^2.8.1: 3263 + is-core-module@^2.2.0, is-core-module@^2.8.1: 3167 3264 version "2.9.0" 3168 3265 resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" 3169 3266 integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== ··· 3488 3585 json-schema "0.4.0" 3489 3586 verror "1.10.0" 3490 3587 3588 + "jsx-ast-utils@^2.4.1 || ^3.0.0": 3589 + version "3.3.0" 3590 + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" 3591 + integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== 3592 + dependencies: 3593 + array-includes "^3.1.4" 3594 + object.assign "^4.1.2" 3595 + 3491 3596 jwa@^1.4.1: 3492 3597 version "1.4.1" 3493 3598 resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" ··· 4173 4278 has-symbols "^1.0.1" 4174 4279 object-keys "^1.1.1" 4175 4280 4281 + object.entries@^1.1.5: 4282 + version "1.1.5" 4283 + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" 4284 + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== 4285 + dependencies: 4286 + call-bind "^1.0.2" 4287 + define-properties "^1.1.3" 4288 + es-abstract "^1.19.1" 4289 + 4290 + object.fromentries@^2.0.5: 4291 + version "2.0.5" 4292 + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" 4293 + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== 4294 + dependencies: 4295 + call-bind "^1.0.2" 4296 + define-properties "^1.1.3" 4297 + es-abstract "^1.19.1" 4298 + 4299 + object.hasown@^1.1.1: 4300 + version "1.1.1" 4301 + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" 4302 + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== 4303 + dependencies: 4304 + define-properties "^1.1.4" 4305 + es-abstract "^1.19.5" 4306 + 4307 + object.values@^1.1.5: 4308 + version "1.1.5" 4309 + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" 4310 + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== 4311 + dependencies: 4312 + call-bind "^1.0.2" 4313 + define-properties "^1.1.3" 4314 + es-abstract "^1.19.1" 4315 + 4176 4316 on-finished@2.4.1: 4177 4317 version "2.4.1" 4178 4318 resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" ··· 4368 4508 resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 4369 4509 integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 4370 4510 4371 - path-parse@^1.0.7: 4511 + path-parse@^1.0.6, path-parse@^1.0.7: 4372 4512 version "1.0.7" 4373 4513 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 4374 4514 integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== ··· 4569 4709 resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 4570 4710 integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== 4571 4711 4572 - prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: 4712 + prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: 4573 4713 version "15.8.1" 4574 4714 resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 4575 4715 integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== ··· 4771 4911 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 4772 4912 integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 4773 4913 4774 - regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: 4914 + regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: 4775 4915 version "1.4.3" 4776 4916 resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" 4777 4917 integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== ··· 4903 5043 path-parse "^1.0.7" 4904 5044 supports-preserve-symlinks-flag "^1.0.0" 4905 5045 5046 + resolve@^2.0.0-next.3: 5047 + version "2.0.0-next.3" 5048 + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" 5049 + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== 5050 + dependencies: 5051 + is-core-module "^2.2.0" 5052 + path-parse "^1.0.6" 5053 + 4906 5054 responselike@^1.0.2: 4907 5055 version "1.0.2" 4908 5056 resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" ··· 5035 5183 dependencies: 5036 5184 lru-cache "^6.0.0" 5037 5185 5038 - semver@^6.0.0, semver@^6.2.0: 5186 + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 5039 5187 version "6.3.0" 5040 5188 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 5041 5189 integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== ··· 5269 5417 emoji-regex "^8.0.0" 5270 5418 is-fullwidth-code-point "^3.0.0" 5271 5419 strip-ansi "^6.0.1" 5420 + 5421 + string.prototype.matchall@^4.0.7: 5422 + version "4.0.7" 5423 + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" 5424 + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== 5425 + dependencies: 5426 + call-bind "^1.0.2" 5427 + define-properties "^1.1.3" 5428 + es-abstract "^1.19.1" 5429 + get-intrinsic "^1.1.1" 5430 + has-symbols "^1.0.3" 5431 + internal-slot "^1.0.3" 5432 + regexp.prototype.flags "^1.4.1" 5433 + side-channel "^1.0.4" 5272 5434 5273 5435 string.prototype.padend@^3.0.0: 5274 5436 version "3.1.3"