├── dev ├── .tmp │ └── .gitignore ├── assets │ ├── codex2x.png │ ├── json-preview.js │ └── demo.css ├── server.js └── example-dev.html ├── .gitignore ├── .npmignore ├── .github ├── FUNDING.yml └── workflows │ ├── npm-publish.yml │ └── eslint.yml ├── postcss.config.js ├── .eslintrc ├── src ├── utils │ ├── isPromise.js │ └── dom.js ├── index.css ├── uploader.js ├── ui.js └── index.js ├── README_AT_DEVELOPMENT.md ├── .gitmodules ├── vite.config.js ├── LICENSE ├── package.json ├── README.md └── yarn.lock /dev/.tmp/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | npm-debug.log 3 | .idea/ 4 | .DS_Store 5 | dist 6 | -------------------------------------------------------------------------------- /dev/assets/codex2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaaaaaaaaaai/image-with-link/master/dev/assets/codex2x.png -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | dev/ 3 | src/ 4 | .babelrc 5 | .eslintrc 6 | vite.config.js 7 | postcss.config.js 8 | yarn.lock 9 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: neSpecc 4 | open_collective: editorjs 5 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('postcss-nested-ancestors'), 4 | require('postcss-nested'), 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "codex" 4 | ], 5 | "globals": { 6 | "fetch": true, 7 | "ImageConfig": true, 8 | "ImageToolData": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/utils/isPromise.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Check if passed object is a Promise 3 | * 4 | * @param {*} object - object to check 5 | * @returns {boolean} 6 | */ 7 | export default function isPromise(object) { 8 | return object && typeof object.then === 'function'; 9 | } 10 | -------------------------------------------------------------------------------- /README_AT_DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | ### npmへのpublish方法 2 | 3 | npm adduser 4 | npm version [patch|minor|major| 5 | 6 | npm publish ./ 7 | git push origin tags/v1.0.4 8 | 9 | ### 開発開始手順 10 | yarn install 11 | 12 | node server.jsでアップロードAPIを起動 13 | だけど、uploadしたURLが絶対パスになってしまうので修正が必要 14 | 決め打ちで画像を戻している。 15 | 16 | 17 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "dev/tools/paragraph"] 2 | path = dev/tools/paragraph 3 | url = https://github.com/editor-js/paragraph 4 | [submodule "dev/tools/header"] 5 | path = dev/tools/header 6 | url = https://github.com/editor-js/header 7 | [submodule "dev/tools/delimiter"] 8 | path = dev/tools/delimiter 9 | url = https://github.com/editor-js/delimiter 10 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish package to NPM 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | publish-and-notify: 10 | uses: codex-team/github-workflows/.github/workflows/npm-publish-and-notify-reusable.yml@main 11 | secrets: 12 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 13 | CODEX_BOT_NOTIFY_EDITORJS_PUBLIC_CHAT: ${{ secrets.CODEX_BOT_NOTIFY_EDITORJS_PUBLIC_CHAT }} 14 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js"; 3 | import * as pkg from "./package.json"; 4 | 5 | const NODE_ENV = process.argv.mode || "development"; 6 | const VERSION = pkg.version; 7 | 8 | export default { 9 | build: { 10 | copyPublicDir: false, 11 | lib: { 12 | entry: path.resolve(__dirname, "src", "index.js"), 13 | name: "ImageTool", 14 | fileName: "image", 15 | }, 16 | }, 17 | define: { 18 | NODE_ENV: JSON.stringify(NODE_ENV), 19 | VERSION: JSON.stringify(VERSION), 20 | }, 21 | 22 | plugins: [cssInjectedByJsPlugin()], 23 | }; 24 | -------------------------------------------------------------------------------- /.github/workflows/eslint.yml: -------------------------------------------------------------------------------- 1 | name: ESLint CodeX 2 | 3 | on: [pull_request] 4 | 5 | jobs: 6 | lint: 7 | name: ESlint 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | 12 | - name: Cache node modules 13 | uses: actions/cache@v1 14 | with: 15 | path: node_modules 16 | key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} 17 | restore-keys: | 18 | ${{ runner.OS }}-build-${{ env.cache-name }}- 19 | ${{ runner.OS }}-build- 20 | ${{ runner.OS }}- 21 | 22 | - run: yarn install 23 | 24 | - run: yarn lint 25 | -------------------------------------------------------------------------------- /src/utils/dom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Helper for making Elements with attributes 3 | * 4 | * @param {string} tagName - new Element tag name 5 | * @param {Array|string} classNames - list or name of CSS class 6 | * @param {object} attributes - any attributes 7 | * @returns {Element} 8 | */ 9 | export function make(tagName, classNames = null, attributes = {}) { 10 | const el = document.createElement(tagName); 11 | 12 | if (Array.isArray(classNames)) { 13 | el.classList.add(...classNames); 14 | } else if (classNames) { 15 | el.classList.add(classNames); 16 | } 17 | 18 | for (const attrName in attributes) { 19 | el[attrName] = attributes[attrName]; 20 | } 21 | 22 | return el; 23 | }; 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 СodeX 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "editorjs-image-with-link", 3 | "version": "1.0.7", 4 | "keywords": [ 5 | "codex editor", 6 | "image", 7 | "editor.js", 8 | "editorjs" 9 | ], 10 | "description": "Image Tool for Editor.js", 11 | "license": "MIT", 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/kaaaaaaaaaaai/image-with-link.git" 15 | }, 16 | "files": [ 17 | "dist" 18 | ], 19 | "main": "./dist/image.umd.js", 20 | "module": "./dist/image.mjs", 21 | "exports": { 22 | ".": { 23 | "import": "./dist/image.mjs", 24 | "require": "./dist/image.umd.js" 25 | } 26 | }, 27 | "scripts": { 28 | "dev": "vite", 29 | "build": "vite build", 30 | "lint": "eslint src/ --ext .js", 31 | "lint:errors": "eslint src/ --ext .js --quiet", 32 | "lint:fix": "eslint src/ --ext .js --fix" 33 | }, 34 | "author": "CodeX ", 35 | "devDependencies": { 36 | "@codexteam/ajax": "^4.2.0", 37 | "eslint": "^6.8.0", 38 | "eslint-config-codex": "^1.3.3", 39 | "eslint-loader": "^4.0.0", 40 | "formidable": "^1.2.1", 41 | "postcss-nested": "^4.1.0", 42 | "postcss-nested-ancestors": "^2.0.0", 43 | "request": "^2.88.0", 44 | "vite": "^4.5.0", 45 | "vite-plugin-css-injected-by-js": "^3.3.0" 46 | }, 47 | "dependencies": { 48 | "@codexteam/icons": "^0.0.6" 49 | }, 50 | "bugs": { 51 | "url": "https://github.com/kaaaaaaaaaaai/image-with-link/issues" 52 | }, 53 | "homepage": "https://github.com/kaaaaaaaaaaai/image-with-link#readme" 54 | } 55 | -------------------------------------------------------------------------------- /dev/assets/json-preview.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Module to compose output JSON preview 3 | */ 4 | const cPreview = (function (module) { 5 | /** 6 | * Shows JSON in pretty preview 7 | * @param {object} output - what to show 8 | * @param {Element} holder - where to show 9 | */ 10 | module.show = function(output, holder) { 11 | /** Make JSON pretty */ 12 | output = JSON.stringify( output, null, 4 ); 13 | /** Encode HTML entities */ 14 | output = encodeHTMLEntities( output ); 15 | /** Stylize! */ 16 | output = stylize( output ); 17 | holder.innerHTML = output; 18 | }; 19 | 20 | /** 21 | * Converts '>', '<', '&' symbols to entities 22 | */ 23 | function encodeHTMLEntities(string) { 24 | return string.replace(/&/g, '&').replace(//g, '>'); 25 | } 26 | 27 | /** 28 | * Some styling magic 29 | */ 30 | function stylize(string) { 31 | /** Stylize JSON keys */ 32 | string = string.replace( /"(\w+)"\s?:/g, '"$1" :'); 33 | /** Stylize tool names */ 34 | string = string.replace( /"(paragraph|quote|list|header|link|code|image|delimiter|raw|checklist|table|embed|warning)"/g, '"$1"'); 35 | /** Stylize HTML tags */ 36 | string = string.replace( /(<[\/a-z]+(>)?)/gi, '$1' ); 37 | /** Stylize strings */ 38 | string = string.replace( /"([^"]+)"/gi, '"$1"' ); 39 | /** Boolean/Null */ 40 | string = string.replace( /\b(true|false|null)\b/gi, '$1' ); 41 | return string; 42 | } 43 | 44 | return module; 45 | })({}); 46 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | .image-tool { 2 | --bg-color: #cdd1e0; 3 | --front-color: #388ae5; 4 | --border-color: #e8e8eb; 5 | 6 | &__image { 7 | border-radius: 3px; 8 | overflow: hidden; 9 | margin-bottom: 10px; 10 | 11 | &-picture { 12 | max-width: 100%; 13 | vertical-align: bottom; 14 | display: block; 15 | margin: 0 auto; 16 | } 17 | 18 | &-preloader { 19 | width: 50px; 20 | height: 50px; 21 | border-radius: 50%; 22 | background-size: cover; 23 | margin: auto; 24 | position: relative; 25 | background-color: var(--bg-color); 26 | background-position: center center; 27 | 28 | &::after { 29 | content: ""; 30 | position: absolute; 31 | z-index: 3; 32 | width: 60px; 33 | height: 60px; 34 | border-radius: 50%; 35 | border: 2px solid var(--bg-color); 36 | border-top-color: var(--front-color); 37 | left: 50%; 38 | top: 50%; 39 | margin-top: -30px; 40 | margin-left: -30px; 41 | animation: image-preloader-spin 2s infinite linear; 42 | box-sizing: border-box; 43 | } 44 | } 45 | } 46 | 47 | &__caption { 48 | font-style: italic; 49 | font-size: 12px; 50 | margin-bottom: 6px; 51 | padding: 6px; 52 | &[contentEditable="true"][data-placeholder]::before { 53 | position: absolute !important; 54 | content: attr(data-placeholder); 55 | color: #707684; 56 | font-weight: normal; 57 | display: none; 58 | } 59 | 60 | &[contentEditable="true"][data-placeholder]:empty { 61 | &::before { 62 | display: block; 63 | } 64 | 65 | &:focus::before { 66 | display: none; 67 | } 68 | } 69 | } 70 | &__link { 71 | font-style: italic; 72 | font-size: 12px; 73 | padding: 6px; 74 | &[contentEditable="true"][data-placeholder]::before { 75 | position: absolute !important; 76 | content: attr(data-placeholder); 77 | color: #707684; 78 | font-weight: normal; 79 | display: none; 80 | } 81 | 82 | &[contentEditable="true"][data-placeholder]:empty { 83 | &::before { 84 | display: block; 85 | } 86 | 87 | &:focus::before { 88 | display: none; 89 | } 90 | } 91 | } 92 | 93 | &--empty { 94 | ^&__image { 95 | display: none; 96 | } 97 | } 98 | 99 | &--empty, 100 | &--loading { 101 | ^&__caption { 102 | display: none; 103 | } 104 | ^&__link { 105 | display: none; 106 | } 107 | } 108 | 109 | .cdx-button { 110 | display: flex; 111 | align-items: center; 112 | justify-content: center; 113 | 114 | svg { 115 | height: auto; 116 | margin: 0 6px 0 0; 117 | } 118 | } 119 | 120 | &--filled { 121 | .cdx-button { 122 | display: none; 123 | } 124 | 125 | ^&__image { 126 | &-preloader { 127 | display: none; 128 | } 129 | } 130 | } 131 | 132 | &--loading { 133 | ^&__image { 134 | min-height: 200px; 135 | display: flex; 136 | border: 1px solid var(--border-color); 137 | background-color: #fff; 138 | 139 | &-picture { 140 | display: none; 141 | } 142 | } 143 | 144 | .cdx-button { 145 | display: none; 146 | } 147 | } 148 | } 149 | 150 | @keyframes image-preloader-spin { 151 | 0% { 152 | transform: rotate(0deg); 153 | } 154 | 100% { 155 | transform: rotate(360deg); 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /dev/assets/demo.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Styles for the example page 3 | */ 4 | body { 5 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; 6 | font-size: 14px; 7 | line-height: 1.5em; 8 | margin: 0; 9 | } 10 | 11 | .ce-example { 12 | font-size: 16.2px; 13 | } 14 | 15 | .ce-example__header { 16 | border-bottom: 1px solid #E8E8EB; 17 | height: 50px; 18 | line-height: 50px; 19 | display: flex; 20 | padding: 0 30px; 21 | margin-bottom: 30px; 22 | flex-wrap: wrap; 23 | } 24 | 25 | .ce-example__header a { 26 | color: inherit; 27 | text-decoration: none; 28 | } 29 | 30 | .ce-example__header-logo { 31 | font-weight: bold; 32 | } 33 | 34 | .ce-example__header-menu { 35 | margin-left: auto; 36 | } 37 | 38 | @media all and (max-width: 730px){ 39 | .ce-example__header-menu { 40 | margin-left: 0; 41 | margin-top: 10px; 42 | flex-basis: 100%; 43 | font-size: 14px; 44 | } 45 | } 46 | 47 | .ce-example__header-menu a { 48 | margin-left: 20px; 49 | } 50 | 51 | @media all and (max-width: 730px){ 52 | .ce-example__header-menu a { 53 | margin-left: 0; 54 | margin-right: 15px; 55 | } 56 | } 57 | 58 | .ce-example__content { 59 | max-width: 1100px; 60 | margin: 0 auto; 61 | -webkit-font-smoothing: antialiased; 62 | -moz-osx-font-smoothing: grayscale; 63 | } 64 | 65 | .ce-example__content--small { 66 | max-width: 500px; 67 | border-left: 1px solid #eee; 68 | border-right: 1px solid #eee; 69 | padding: 0 15px; 70 | } 71 | 72 | .ce-example__output { 73 | background: #1B202B; 74 | overflow-x: auto; 75 | padding: 0 30px; 76 | } 77 | 78 | .ce-example__output-content { 79 | max-width: 650px; 80 | margin: 30px auto; 81 | color: #ABADC3; 82 | font-family: 'PT Mono', Menlo, Monaco, Consolas, Courier New, monospace; 83 | font-size: 13.3px; 84 | } 85 | 86 | .ce-example__output-content:empty { 87 | display: none; 88 | } 89 | 90 | .ce-example__button { 91 | display: block; 92 | margin: 50px auto; 93 | max-width: 180px; 94 | background: #4A9DF8; 95 | padding: 17px 30px; 96 | box-shadow: 0 22px 18px -4px rgba(137, 207, 255, 0.77); 97 | transition: all 150ms ease; 98 | cursor: pointer; 99 | border-radius: 31px; 100 | color: #fff; 101 | font-family: 'PT Mono', Menlo, Monaco, Consolas, Courier New, monospace; 102 | text-align: center; 103 | } 104 | 105 | .ce-example__button:hover { 106 | background: #3D8DE5; 107 | transform: translateY(2px); 108 | box-shadow: 0 20px 15px -4px rgba(137, 207, 255, 0.77); 109 | } 110 | 111 | .ce-example__output-footer { 112 | padding: 30px 0; 113 | font-size: 14.2px; 114 | letter-spacing: 0.3px; 115 | text-align: center; 116 | } 117 | 118 | .ce-example__output-footer a { 119 | color: #fff; 120 | text-decoration: none; 121 | } 122 | 123 | @media all and (max-width: 730px){ 124 | .ce-example__header, 125 | .ce-example__content{ 126 | padding: 0 20px; 127 | } 128 | } 129 | 130 | /** 131 | * JSON highlighter 132 | */ 133 | .sc_attr { 134 | color: rgb(148, 162, 192); 135 | } 136 | .sc_key { 137 | color: rgb(190, 213, 255); 138 | } 139 | .sc_toolname { 140 | color: rgb(15, 205, 251); 141 | } 142 | .sc_tag { 143 | color: rgb(4, 131, 216); 144 | } 145 | .sc_bool { 146 | color: rgb(247, 60, 173); 147 | } 148 | 149 | .ce-example .ce-block:first-of-type h2.ce-header{ 150 | font-size: 50px; 151 | } 152 | 153 | .ce-example h2.ce-header{ 154 | font-size: 30px; 155 | } 156 | 157 | .ce-example h3.ce-header { 158 | font-size: 24px; 159 | } 160 | 161 | .ce-example h4.ce-header { 162 | font-size: 18px; 163 | } 164 | -------------------------------------------------------------------------------- /src/uploader.js: -------------------------------------------------------------------------------- 1 | import ajax from '@codexteam/ajax'; 2 | import isPromise from './utils/isPromise'; 3 | 4 | /** 5 | * Module for file uploading. Handle 3 scenarios: 6 | * 1. Select file from device and upload 7 | * 2. Upload by pasting URL 8 | * 3. Upload by pasting file from Clipboard or by Drag'n'Drop 9 | */ 10 | export default class Uploader { 11 | /** 12 | * @param {object} params - uploader module params 13 | * @param {ImageConfig} params.config - image tool config 14 | * @param {Function} params.onUpload - one callback for all uploading (file, url, d-n-d, pasting) 15 | * @param {Function} params.onError - callback for uploading errors 16 | */ 17 | constructor({ config, onUpload, onError }) { 18 | this.config = config; 19 | this.onUpload = onUpload; 20 | this.onError = onError; 21 | } 22 | 23 | /** 24 | * Handle clicks on the upload file button 25 | * Fires ajax.transport() 26 | * 27 | * @param {Function} onPreview - callback fired when preview is ready 28 | */ 29 | uploadSelectedFile({ onPreview }) { 30 | const preparePreview = function (file) { 31 | const reader = new FileReader(); 32 | 33 | reader.readAsDataURL(file); 34 | reader.onload = (e) => { 35 | onPreview(e.target.result); 36 | }; 37 | }; 38 | 39 | /** 40 | * Custom uploading 41 | * or default uploading 42 | */ 43 | let upload; 44 | 45 | // custom uploading 46 | if (this.config.uploader && typeof this.config.uploader.uploadByFile === 'function') { 47 | upload = ajax.selectFiles({ accept: this.config.types }).then((files) => { 48 | preparePreview(files[0]); 49 | 50 | const customUpload = this.config.uploader.uploadByFile(files[0]); 51 | 52 | if (!isPromise(customUpload)) { 53 | console.warn('Custom uploader method uploadByFile should return a Promise'); 54 | } 55 | 56 | return customUpload; 57 | }); 58 | 59 | // default uploading 60 | } else { 61 | upload = ajax.transport({ 62 | url: this.config.endpoints.byFile, 63 | data: this.config.additionalRequestData, 64 | accept: this.config.types, 65 | headers: this.config.additionalRequestHeaders, 66 | beforeSend: (files) => { 67 | preparePreview(files[0]); 68 | }, 69 | fieldName: this.config.field, 70 | }).then((response) => response.body); 71 | } 72 | 73 | upload.then((response) => { 74 | this.onUpload(response); 75 | }).catch((error) => { 76 | this.onError(error); 77 | }); 78 | } 79 | 80 | /** 81 | * Handle clicks on the upload file button 82 | * Fires ajax.post() 83 | * 84 | * @param {string} url - image source url 85 | */ 86 | uploadByUrl(url) { 87 | let upload; 88 | 89 | /** 90 | * Custom uploading 91 | */ 92 | if (this.config.uploader && typeof this.config.uploader.uploadByUrl === 'function') { 93 | upload = this.config.uploader.uploadByUrl(url); 94 | 95 | if (!isPromise(upload)) { 96 | console.warn('Custom uploader method uploadByUrl should return a Promise'); 97 | } 98 | } else { 99 | /** 100 | * Default uploading 101 | */ 102 | upload = ajax.post({ 103 | url: this.config.endpoints.byUrl, 104 | data: Object.assign({ 105 | url: url, 106 | }, this.config.additionalRequestData), 107 | type: ajax.contentType.JSON, 108 | headers: this.config.additionalRequestHeaders, 109 | }).then(response => response.body); 110 | } 111 | 112 | upload.then((response) => { 113 | this.onUpload(response); 114 | }).catch((error) => { 115 | this.onError(error); 116 | }); 117 | } 118 | 119 | /** 120 | * Handle clicks on the upload file button 121 | * Fires ajax.post() 122 | * 123 | * @param {File} file - file pasted by drag-n-drop 124 | * @param {Function} onPreview - file pasted by drag-n-drop 125 | */ 126 | uploadByFile(file, { onPreview }) { 127 | /** 128 | * Load file for preview 129 | * 130 | * @type {FileReader} 131 | */ 132 | const reader = new FileReader(); 133 | 134 | reader.readAsDataURL(file); 135 | reader.onload = (e) => { 136 | onPreview(e.target.result); 137 | }; 138 | 139 | let upload; 140 | 141 | /** 142 | * Custom uploading 143 | */ 144 | if (this.config.uploader && typeof this.config.uploader.uploadByFile === 'function') { 145 | upload = this.config.uploader.uploadByFile(file); 146 | 147 | if (!isPromise(upload)) { 148 | console.warn('Custom uploader method uploadByFile should return a Promise'); 149 | } 150 | } else { 151 | /** 152 | * Default uploading 153 | */ 154 | const formData = new FormData(); 155 | 156 | formData.append(this.config.field, file); 157 | 158 | if (this.config.additionalRequestData && Object.keys(this.config.additionalRequestData).length) { 159 | Object.entries(this.config.additionalRequestData).forEach(([name, value]) => { 160 | formData.append(name, value); 161 | }); 162 | } 163 | 164 | upload = ajax.post({ 165 | url: this.config.endpoints.byFile, 166 | data: formData, 167 | type: ajax.contentType.JSON, 168 | headers: this.config.additionalRequestHeaders, 169 | }).then(response => response.body); 170 | } 171 | 172 | upload.then((response) => { 173 | this.onUpload(response); 174 | }).catch((error) => { 175 | this.onError(error); 176 | }); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /dev/server.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample HTTP server for accept uploaded images 3 | * [!] Use it only for debugging purposes 4 | * 5 | * How to use [requires Node.js 10.0.0+ and npm install]: 6 | * 7 | * 1. $ node dev/server.js 8 | * 2. set 'endpoints' at the Image Tools 'config' in example.html 9 | * endpoints : { 10 | * byFile: 'http://localhost:8008/uploadFile', 11 | * byUrl: 'http://localhost:8008/fetchUrl' 12 | * } 13 | * 14 | */ 15 | const http = require('http'); 16 | const formidable = require('formidable'); 17 | const { parse } = require('querystring'); 18 | const fs = require('fs'); 19 | const request = require('request'); 20 | const crypto = require('crypto'); 21 | 22 | class ServerExample { 23 | constructor({port, fieldName}) { 24 | this.uploadDir = __dirname + '/\.tmp'; 25 | this.fieldName = fieldName; 26 | this.server = http.createServer((req, res) => { 27 | this.onRequest(req, res); 28 | }).listen(port); 29 | 30 | this.server.on('listening', () => { 31 | console.log('Server is listening ' + port + '...'); 32 | }); 33 | 34 | this.server.on('error', (error) => { 35 | console.log('Failed to run server', error); 36 | }); 37 | } 38 | 39 | /** 40 | * Request handler 41 | * @param {http.IncomingMessage} request 42 | * @param {http.ServerResponse} response 43 | */ 44 | onRequest(request, response) { 45 | this.allowCors(response); 46 | 47 | const {method, url} = request; 48 | 49 | if (method.toLowerCase() !== 'post') { 50 | response.end(); 51 | return; 52 | } 53 | 54 | console.log('Got request on the ', url); 55 | 56 | switch (url) { 57 | case '/uploadFile': 58 | this.uploadFile(request, response); 59 | break; 60 | case '/fetchUrl': 61 | this.fetchUrl(request, response); 62 | break; 63 | } 64 | } 65 | 66 | /** 67 | * Allows CORS requests for debugging 68 | * @param response 69 | */ 70 | allowCors(response) { 71 | response.setHeader('Access-Control-Allow-Origin', '*'); 72 | response.setHeader('Access-Control-Allow-Credentials', 'true'); 73 | response.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT'); 74 | response.setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers'); 75 | } 76 | 77 | /** 78 | * Handles uploading by file 79 | * @param request 80 | * @param response 81 | */ 82 | uploadFile(request, response) { 83 | let responseJson = { 84 | success: 0 85 | }; 86 | 87 | this.getForm(request) 88 | .then(({files}) => { 89 | let image = files[this.fieldName] || {}; 90 | 91 | responseJson.success = 1; 92 | responseJson.file = { 93 | url: "http://localhost:63343/image-with-link/dev/.tmp/upload_c34c224f108da42de3985fdbfe19813c.png", 94 | name: image.name, 95 | size: image.size 96 | }; 97 | }) 98 | .catch((error) => { 99 | console.log('Uploading error', error); 100 | }) 101 | .finally(() => { 102 | response.writeHead(200, {'Content-Type': 'application/json'}); 103 | response.end(JSON.stringify(responseJson)); 104 | }); 105 | } 106 | 107 | /** 108 | * Handles uploading by URL 109 | * @param request 110 | * @param response 111 | */ 112 | fetchUrl(request, response) { 113 | let responseJson = { 114 | success: 0 115 | }; 116 | 117 | this.getForm(request) 118 | .then(({files, fields}) => { 119 | let url = fields.url; 120 | 121 | const results = url.match(/https?:\/\/\S+\.(gif|jpe?g|tiff|png|svg|webp)(\?[a-z0-9=]*)?$/i); 122 | const extension = results ? results[1] : '.png'; 123 | 124 | let filename = this.uploadDir + '/' + this.md5(url) + `.${extension}`; 125 | 126 | return this.downloadImage(url, filename) 127 | .then((path) => { 128 | responseJson.success = 1; 129 | responseJson.file = { 130 | url: path 131 | }; 132 | }); 133 | }) 134 | .catch((error) => { 135 | console.log('Uploading error', error); 136 | }) 137 | .finally(() => { 138 | response.writeHead(200, {'Content-Type': 'application/json'}); 139 | response.end(JSON.stringify(responseJson)); 140 | }); 141 | } 142 | 143 | /** 144 | * Accepts post form data 145 | * @param request 146 | * @return {Promise<{files: object, fields: object}>} 147 | */ 148 | getForm(request) { 149 | return new Promise((resolve, reject) => { 150 | const form = new formidable.IncomingForm(); 151 | 152 | form.uploadDir = this.uploadDir; 153 | form.keepExtensions = true; 154 | 155 | form.parse(request, (err, fields, files) => { 156 | if (err) { 157 | reject(err); 158 | } else { 159 | console.log('fields', fields); 160 | console.log('files', files); 161 | resolve({files, fields}); 162 | } 163 | }); 164 | }); 165 | } 166 | 167 | /** 168 | * Download image by Url 169 | * @param {string} uri - endpoint 170 | * @param {string} filename - path for file saving 171 | * @return {Promise} - filename 172 | */ 173 | downloadImage(uri, filename) { 174 | return new Promise((resolve, reject) => { 175 | request.head(uri, function (err, res, body) { 176 | request(uri).pipe(fs.createWriteStream(filename).on('erorr', reject)) 177 | .on('close', () => { 178 | resolve(filename); 179 | }); 180 | }); 181 | }); 182 | } 183 | 184 | /** 185 | * Generates md5 hash for string 186 | * @param string 187 | * @return {string} 188 | */ 189 | md5(string) { 190 | return crypto.createHash('md5').update(string).digest('hex'); 191 | } 192 | } 193 | 194 | new ServerExample({ 195 | port: 8008, 196 | fieldName: 'image' 197 | }); -------------------------------------------------------------------------------- /src/ui.js: -------------------------------------------------------------------------------- 1 | import { IconPicture } from '@codexteam/icons'; 2 | import { make } from './utils/dom'; 3 | 4 | /** 5 | * Class for working with UI: 6 | * - rendering base structure 7 | * - show/hide preview 8 | * - apply tune view 9 | */ 10 | export default class Ui { 11 | /** 12 | * @param {object} ui - image tool Ui module 13 | * @param {object} ui.api - Editor.js API 14 | * @param {ImageConfig} ui.config - user config 15 | * @param {Function} ui.onSelectFile - callback for clicks on Select file button 16 | * @param {boolean} ui.readOnly - read-only mode flag 17 | */ 18 | constructor({ api, config, onSelectFile, readOnly }) { 19 | this.api = api; 20 | this.config = config; 21 | this.onSelectFile = onSelectFile; 22 | this.readOnly = readOnly; 23 | this.nodes = { 24 | wrapper: make('div', [this.CSS.baseClass, this.CSS.wrapper]), 25 | imageContainer: make('div', [ this.CSS.imageContainer ]), 26 | fileButton: this.createFileButton(), 27 | imageEl: undefined, 28 | imagePreloader: make('div', this.CSS.imagePreloader), 29 | caption: make('div', [this.CSS.input, this.CSS.caption], { 30 | contentEditable: !this.readOnly, 31 | }), 32 | link: make('div', [this.CSS.input, this.CSS.link], { 33 | contentEditable: !this.readOnly, 34 | }), 35 | }; 36 | 37 | /** 38 | * Create base structure 39 | * 40 | * 41 | * 42 | * 43 | * 44 | * 45 | * 46 | */ 47 | this.nodes.caption.dataset.placeholder = this.config.captionPlaceholder; 48 | this.nodes.link.dataset.placeholder = this.config.linkPlaceholder; 49 | this.nodes.imageContainer.appendChild(this.nodes.imagePreloader); 50 | this.nodes.wrapper.appendChild(this.nodes.imageContainer); 51 | this.nodes.wrapper.appendChild(this.nodes.caption); 52 | this.nodes.wrapper.appendChild(this.nodes.link); 53 | this.nodes.wrapper.appendChild(this.nodes.fileButton); 54 | } 55 | 56 | /** 57 | * CSS classes 58 | * 59 | * @returns {object} 60 | */ 61 | get CSS() { 62 | return { 63 | baseClass: this.api.styles.block, 64 | loading: this.api.styles.loader, 65 | input: this.api.styles.input, 66 | button: this.api.styles.button, 67 | 68 | /** 69 | * Tool's classes 70 | */ 71 | wrapper: 'image-tool', 72 | imageContainer: 'image-tool__image', 73 | imagePreloader: 'image-tool__image-preloader', 74 | imageEl: 'image-tool__image-picture', 75 | caption: 'image-tool__caption', 76 | //TODO: add link class 77 | link: 'image-tool__link', 78 | }; 79 | }; 80 | 81 | /** 82 | * Ui statuses: 83 | * - empty 84 | * - uploading 85 | * - filled 86 | * 87 | * @returns {{EMPTY: string, UPLOADING: string, FILLED: string}} 88 | */ 89 | static get status() { 90 | return { 91 | EMPTY: 'empty', 92 | UPLOADING: 'loading', 93 | FILLED: 'filled', 94 | }; 95 | } 96 | 97 | /** 98 | * Renders tool UI 99 | * 100 | * @param {ImageToolData} toolData - saved tool data 101 | * @returns {Element} 102 | */ 103 | render(toolData) { 104 | if (!toolData.file || Object.keys(toolData.file).length === 0) { 105 | this.toggleStatus(Ui.status.EMPTY); 106 | } else { 107 | this.toggleStatus(Ui.status.UPLOADING); 108 | } 109 | 110 | return this.nodes.wrapper; 111 | } 112 | 113 | /** 114 | * Creates upload-file button 115 | * 116 | * @returns {Element} 117 | */ 118 | createFileButton() { 119 | const button = make('div', [ this.CSS.button ]); 120 | 121 | button.innerHTML = this.config.buttonContent || `${IconPicture} ${this.api.i18n.t('Select an Image')}`; 122 | 123 | button.addEventListener('click', () => { 124 | this.onSelectFile(); 125 | }); 126 | 127 | return button; 128 | } 129 | 130 | /** 131 | * Shows uploading preloader 132 | * 133 | * @param {string} src - preview source 134 | * @returns {void} 135 | */ 136 | showPreloader(src) { 137 | this.nodes.imagePreloader.style.backgroundImage = `url(${src})`; 138 | 139 | this.toggleStatus(Ui.status.UPLOADING); 140 | } 141 | 142 | /** 143 | * Hide uploading preloader 144 | * 145 | * @returns {void} 146 | */ 147 | hidePreloader() { 148 | this.nodes.imagePreloader.style.backgroundImage = ''; 149 | this.toggleStatus(Ui.status.EMPTY); 150 | } 151 | 152 | /** 153 | * Shows an image 154 | * 155 | * @param {string} url - image source 156 | * @returns {void} 157 | */ 158 | fillImage(url) { 159 | /** 160 | * Check for a source extension to compose element correctly: video tag for mp4, img — for others 161 | */ 162 | const tag = /\.mp4$/.test(url) ? 'VIDEO' : 'IMG'; 163 | 164 | const attributes = { 165 | src: url, 166 | }; 167 | 168 | /** 169 | * We use eventName variable because IMG and VIDEO tags have different event to be called on source load 170 | * - IMG: load 171 | * - VIDEO: loadeddata 172 | * 173 | * @type {string} 174 | */ 175 | let eventName = 'load'; 176 | 177 | /** 178 | * Update attributes and eventName if source is a mp4 video 179 | */ 180 | if (tag === 'VIDEO') { 181 | /** 182 | * Add attributes for playing muted mp4 as a gif 183 | * 184 | * @type {boolean} 185 | */ 186 | attributes.autoplay = true; 187 | attributes.loop = true; 188 | attributes.muted = true; 189 | attributes.playsinline = true; 190 | 191 | /** 192 | * Change event to be listened 193 | * 194 | * @type {string} 195 | */ 196 | eventName = 'loadeddata'; 197 | } 198 | 199 | /** 200 | * Compose tag with defined attributes 201 | * 202 | * @type {Element} 203 | */ 204 | this.nodes.imageEl = make(tag, this.CSS.imageEl, attributes); 205 | 206 | /** 207 | * Add load event listener 208 | */ 209 | this.nodes.imageEl.addEventListener(eventName, () => { 210 | this.toggleStatus(Ui.status.FILLED); 211 | 212 | /** 213 | * Preloader does not exists on first rendering with presaved data 214 | */ 215 | if (this.nodes.imagePreloader) { 216 | this.nodes.imagePreloader.style.backgroundImage = ''; 217 | } 218 | }); 219 | 220 | this.nodes.imageContainer.appendChild(this.nodes.imageEl); 221 | } 222 | 223 | /** 224 | * Shows caption input 225 | * 226 | * @param {string} text - caption text 227 | * @returns {void} 228 | */ 229 | fillCaption(text) { 230 | if (this.nodes.caption) { 231 | this.nodes.caption.innerHTML = text; 232 | } 233 | } 234 | 235 | fillLink(text) { 236 | if (this.nodes.link) { 237 | this.nodes.link.innerHTML = text; 238 | } 239 | } 240 | 241 | /** 242 | * Changes UI status 243 | * 244 | * @param {string} status - see {@link Ui.status} constants 245 | * @returns {void} 246 | */ 247 | toggleStatus(status) { 248 | for (const statusType in Ui.status) { 249 | if (Object.prototype.hasOwnProperty.call(Ui.status, statusType)) { 250 | this.nodes.wrapper.classList.toggle(`${this.CSS.wrapper}--${Ui.status[statusType]}`, status === Ui.status[statusType]); 251 | } 252 | } 253 | } 254 | 255 | /** 256 | * Apply visual representation of activated tune 257 | * 258 | * @param {string} tuneName - one of available tunes {@link Tunes.tunes} 259 | * @param {boolean} status - true for enable, false for disable 260 | * @returns {void} 261 | */ 262 | applyTune(tuneName, status) { 263 | this.nodes.wrapper.classList.toggle(`${this.CSS.wrapper}--${tuneName}`, status); 264 | } 265 | } 266 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | If you give stars, it motivates me. 2 | 3 | # Image Tool forked from Editor.js 4 | 5 | Image Block for the [Editor.js](https://editorjs.io). 6 | 7 | Differences with the editorjs Image Tool: 8 | - Blocktune has been removed. 9 | - Images are default-centered. 10 | - Input for adding links to images has been added. 11 | 12 | Everything else remains the same. 13 | 14 | ## Installation 15 | 16 | Get the package 17 | 18 | ```shell 19 | npm i editorjs-image-with-link 20 | ``` 21 | 22 | Include module at your application 23 | 24 | ```javascript 25 | import ImageTool from 'editorjs-image-with-link'; 26 | ``` 27 | 28 | ## Usage 29 | 30 | Add a new Tool to the `tools` property of the Editor.js initial config. 31 | 32 | ```javascript 33 | import ImageTool from 'editorjs-image-with-link'; 34 | 35 | // or if you inject ImageTool via standalone script 36 | const ImageTool = window.ImageTool; 37 | 38 | var editor = EditorJS({ 39 | ... 40 | 41 | tools: { 42 | ... 43 | image: { 44 | class: ImageTool, 45 | config: { 46 | endpoints: { 47 | byFile: 'http://localhost:8008/uploadFile', // Your backend file uploader endpoint 48 | byUrl: 'http://localhost:8008/fetchUrl', // Your endpoint that provides uploading by Url 49 | } 50 | } 51 | } 52 | } 53 | 54 | ... 55 | }); 56 | ``` 57 | 58 | ## Config Params 59 | 60 | Image Tool supports these configuration parameters: 61 | 62 | | Field | Type | Description | 63 | | ----- | -------- | ------------------ | 64 | | endpoints | `{byFile: string, byUrl: string}` | Endpoints for file uploading.
Contains 2 fields:
__byFile__ - for file uploading
__byUrl__ - for uploading by URL | 65 | | field | `string` | (default: `image`) Name of uploaded image field in POST request | 66 | | types | `string` | (default: `image/*`) Mime-types of files that can be [accepted with file selection](https://github.com/codex-team/ajax#accept-string).| 67 | | additionalRequestData | `object` | Object with any data you want to send with uploading requests | 68 | | additionalRequestHeaders | `object` | Object with any custom headers which will be added to request. [See example](https://github.com/codex-team/ajax/blob/e5bc2a2391a18574c88b7ecd6508c29974c3e27f/README.md#headers-object) | 69 | | captionPlaceholder | `string` | (default: `Caption`) Placeholder for Caption input | 70 | | buttonContent | `string` | Allows to override HTML content of «Select file» button | 71 | | uploader | `{{uploadByFile: function, uploadByUrl: function}}` | Optional custom uploading methods. See details below. | 72 | | actions | `array` | Array with custom actions to show in the tool's settings menu. See details below. | 73 | 74 | Note that if you don't implement your custom uploader methods, the `endpoints` param is required. 75 | 76 | ## Tool's settings 77 | 78 | ![](https://capella.pics/c74cdeec-3405-48ac-a960-f784188cf9b4.jpg) 79 | 80 | 1. Add border 81 | 82 | 2. Stretch to full-width 83 | 84 | 3. Add background 85 | 86 | Add extra setting-buttons by adding them to the `actions`-array in the configuration: 87 | ```js 88 | actions: [ 89 | { 90 | name: 'new_button', 91 | icon: '...', 92 | title: 'New Button', 93 | toggle: true, 94 | action: (name) => { 95 | alert(`${name} button clicked`); 96 | } 97 | } 98 | ] 99 | ``` 100 | 101 | **_NOTE:_** return value of `action` callback for settings whether action button should be toggled or not is *deprecated*. Consider using `toggle` option instead. 102 | 103 | ## Output data 104 | 105 | This Tool returns `data` with following format 106 | 107 | | Field | Type | Description | 108 | |----------------|-----------|-------------------------------------------------------------------------------------------| 109 | | file | `object` | Uploaded file data. Any data got from backend uploader. Always contain the `url` property | 110 | | caption | `string` | image's caption | 111 | | link | `string` | link url | 112 | 113 | 114 | ```json 115 | { 116 | "type" : "image", 117 | "data" : { 118 | "file": { 119 | "url" : "https://www.tesla.com/tesla_theme/assets/img/_vehicle_redesign/roadster_and_semi/roadster/hero.jpg" 120 | }, 121 | "caption" : "Roadster // tesla.com", 122 | "link" : "https://www.tesla.com/roadster" 123 | } 124 | } 125 | ``` 126 | 127 | ## Backend response format 128 | 129 | This Tool works by one of the following schemes: 130 | 131 | 1. Uploading files from the device 132 | 2. Uploading by URL (handle image-like URL's pasting) 133 | 3. Uploading by drag-n-drop file 134 | 4. Uploading by pasting from Clipboard 135 | 136 | ### Uploading files from device 137 | 138 | Scenario: 139 | 140 | 1. User select file from the device 141 | 2. Tool sends it to **your** backend (on `config.endpoints.byFile` route) 142 | 3. Your backend should save file and return file data with JSON at specified format. 143 | 4. Image tool shows saved image and stores server answer 144 | 145 | So, you can implement backend for file saving by your own way. It is a specific and trivial task depending on your 146 | environment and stack. 147 | 148 | The tool executes the request as [`multipart/form-data`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST), with the key as the value of `field` in configuration. 149 | 150 | The response of your uploader **should** cover the following format: 151 | 152 | ```json5 153 | { 154 | "success" : 1, 155 | "file": { 156 | "url" : "https://www.tesla.com/tesla_theme/assets/img/_vehicle_redesign/roadster_and_semi/roadster/hero.jpg", 157 | // ... and any additional fields you want to store, such as width, height, color, extension, etc 158 | } 159 | } 160 | ``` 161 | 162 | **success** - uploading status. 1 for successful, 0 for failed 163 | 164 | **file** - uploaded file data. **Must** contain an `url` field with full public path to the uploaded image. 165 | Also, can contain any additional fields you want to store. For example, width, height, id etc. 166 | All additional fields will be saved at the `file` object of output data. 167 | 168 | ### Uploading by pasted URL 169 | 170 | Scenario: 171 | 172 | 1. User pastes an URL of the image file to the Editor 173 | 2. Editor pass pasted string to the Image Tool 174 | 3. Tool sends it to **your** backend (on `config.endpoints.byUrl` route) via 'url' in request body 175 | 4. Your backend should accept URL, **download and save the original file by passed URL** and return file data with JSON at specified format. 176 | 5. Image tool shows saved image and stores server answer 177 | 178 | The tool executes the request as `application/json` with the following request body: 179 | 180 | ```json5 181 | { 182 | "url": "" 183 | "additionalRequestData": "" 184 | } 185 | ``` 186 | 187 | Response of your uploader should be at the same format as described at «[Uploading files from device](#from-device)» section 188 | 189 | 190 | ### Uploading by drag-n-drop or from Clipboard 191 | 192 | Your backend will accept file as FormData object in field name, specified by `config.field` (by default, «`image`»). 193 | You should save it and return the same response format as described above. 194 | 195 | ## Providing custom uploading methods 196 | 197 | As mentioned at the Config Params section, you have an ability to provide own custom uploading methods. 198 | It is a quite simple: implement `uploadByFile` and `uploadByUrl` methods and pass them via `uploader` config param. 199 | Both methods must return a Promise that resolves with response in a format that described at the [backend response format](#server-format) section. 200 | 201 | 202 | | Method | Arguments | Return value | Description | 203 | | -------------- | --------- | -------------| ------------| 204 | | uploadByFile | `File` | `{Promise.<{success, file: {url}}>}` | Upload file to the server and return an uploaded image data | 205 | | uploadByUrl | `string` | `{Promise.<{success, file: {url}}>}` | Send URL-string to the server, that should load image by this URL and return an uploaded image data | 206 | 207 | Example: 208 | 209 | ```js 210 | import ImageTool from '@editorjs/image'; 211 | 212 | var editor = EditorJS({ 213 | ... 214 | 215 | tools: { 216 | ... 217 | image: { 218 | class: ImageTool, 219 | config: { 220 | /** 221 | * Custom uploader 222 | */ 223 | uploader: { 224 | /** 225 | * Upload file to the server and return an uploaded image data 226 | * @param {File} file - file selected from the device or pasted by drag-n-drop 227 | * @return {Promise.<{success, file: {url}}>} 228 | */ 229 | uploadByFile(file){ 230 | // your own uploading logic here 231 | return MyAjax.upload(file).then(() => { 232 | return { 233 | success: 1, 234 | file: { 235 | url: 'https://codex.so/upload/redactor_images/o_80beea670e49f04931ce9e3b2122ac70.jpg', 236 | // any other image data you want to store, such as width, height, color, extension, etc 237 | } 238 | }; 239 | }); 240 | }, 241 | 242 | /** 243 | * Send URL-string to the server. Backend should load image by this URL and return an uploaded image data 244 | * @param {string} url - pasted image URL 245 | * @return {Promise.<{success, file: {url}}>} 246 | */ 247 | uploadByUrl(url){ 248 | // your ajax request for uploading 249 | return MyAjax.upload(file).then(() => { 250 | return { 251 | success: 1, 252 | file: { 253 | url: 'https://codex.so/upload/redactor_images/o_e48549d1855c7fc1807308dd14990126.jpg',, 254 | // any other image data you want to store, such as width, height, color, extension, etc 255 | } 256 | } 257 | }) 258 | } 259 | } 260 | } 261 | } 262 | } 263 | 264 | ... 265 | }); 266 | ``` 267 | -------------------------------------------------------------------------------- /dev/example-dev.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | Editor.js 🤩🧦🤨 example2 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 |
23 | Plugins 24 | Usage 25 | Configuration 26 | API 27 |
28 |
29 |
30 |
31 |
32 | No submodules found. Run yarn pull_tools 33 |
34 |
35 | editor.save() 36 |
37 |
38 |
39 |

 40 | 
 41 |       
 44 |     
45 |
46 | 47 | 48 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Image Tool for the Editor.js 3 | * 4 | * @author CodeX 5 | * @license MIT 6 | * @see {@link https://github.com/editor-js/image} 7 | * 8 | * To developers. 9 | * To simplify Tool structure, we split it to 4 parts: 10 | * 1) index.js — main Tool's interface, public API and methods for working with data 11 | * 2) uploader.js — module that has methods for sending files via AJAX: from device, by URL or File pasting 12 | * 3) ui.js — module for UI manipulations: render, showing preloader, etc 13 | * 4) tunes.js — working with Block Tunes: render buttons, handle clicks 14 | * 15 | * For debug purposes there is a testing server 16 | * that can save uploaded files and return a Response {@link UploadResponseFormat} 17 | * 18 | * $ node dev/server.js 19 | * 20 | * It will expose 8008 port, so you can pass http://localhost:8008 with the Tools config: 21 | * 22 | * image: { 23 | * class: ImageTool, 24 | * config: { 25 | * endpoints: { 26 | * byFile: 'http://localhost:8008/uploadFile', 27 | * byUrl: 'http://localhost:8008/fetchUrl', 28 | * } 29 | * }, 30 | * }, 31 | */ 32 | 33 | /** 34 | * @typedef {object} ImageToolData 35 | * @description Image Tool's input and output data format 36 | * @property {string} caption — image caption 37 | * @property {boolean} withBorder - should image be rendered with border 38 | * @property {boolean} withBackground - should image be rendered with background 39 | * @property {boolean} stretched - should image be stretched to full width of container 40 | * @property {object} file — Image file data returned from backend 41 | * @property {string} file.url — image URL 42 | */ 43 | 44 | import './index.css'; 45 | 46 | import Ui from './ui'; 47 | import Uploader from './uploader'; 48 | 49 | import {IconPicture} from '@codexteam/icons'; 50 | 51 | /** 52 | * @typedef {object} ImageConfig 53 | * @description Config supported by Tool 54 | * @property {object} endpoints - upload endpoints 55 | * @property {string} endpoints.byFile - upload by file 56 | * @property {string} endpoints.byUrl - upload by URL 57 | * @property {string} field - field name for uploaded image 58 | * @property {string} types - available mime-types 59 | * @property {string} captionPlaceholder - placeholder for Caption field 60 | * @property {string} linkPlaceholder - placeholder for link field 61 | * @property {object} additionalRequestData - any data to send with requests 62 | * @property {object} additionalRequestHeaders - allows to pass custom headers with Request 63 | * @property {string} buttonContent - overrides for Select File button 64 | * @property {object} [uploader] - optional custom uploader 65 | * @property {function(File): Promise.} [uploader.uploadByFile] - method that upload image by File 66 | * @property {function(string): Promise.} [uploader.uploadByUrl] - method that upload image by URL 67 | */ 68 | 69 | /** 70 | * @typedef {object} UploadResponseFormat 71 | * @description This format expected from backend on file uploading 72 | * @property {number} success - 1 for successful uploading, 0 for failure 73 | * @property {object} file - Object with file data. 74 | * 'url' is required, 75 | * also can contain any additional data that will be saved and passed back 76 | * @property {string} file.url - [Required] image source URL 77 | */ 78 | export default class ImageTool { 79 | /** 80 | * Notify core that read-only mode is supported 81 | * 82 | * @returns {boolean} 83 | */ 84 | static get isReadOnlySupported() { 85 | return true; 86 | } 87 | 88 | /** 89 | * Get Tool toolbox settings 90 | * icon - Tool icon's SVG 91 | * title - title to show in toolbox 92 | * 93 | * @returns {{icon: string, title: string}} 94 | */ 95 | static get toolbox() { 96 | return { 97 | icon: IconPicture, 98 | title: 'Image', 99 | }; 100 | } 101 | 102 | /** 103 | * Available image tools 104 | * 105 | * @returns {Array} 106 | */ 107 | static get tunes() { 108 | return []; 109 | } 110 | 111 | 112 | 113 | /** 114 | * @param {object} tool - tool properties got from editor.js 115 | * @param {ImageToolData} tool.data - previously saved data 116 | * @param {ImageConfig} tool.config - user config for Tool 117 | * @param {object} tool.api - Editor.js API 118 | * @param {boolean} tool.readOnly - read-only mode flag 119 | * @param {BlockAPI|{}} tool.block - current Block API 120 | */ 121 | constructor({data, config, api, readOnly, block}) { 122 | this.api = api; 123 | this.readOnly = readOnly; 124 | this.block = block; 125 | 126 | /** 127 | * Tool's initial config 128 | */ 129 | this.config = { 130 | endpoints: config.endpoints || '', 131 | additionalRequestData: config.additionalRequestData || {}, 132 | additionalRequestHeaders: config.additionalRequestHeaders || {}, 133 | field: config.field || 'image', 134 | types: config.types || 'image/*', 135 | captionPlaceholder: this.api.i18n.t(config.captionPlaceholder || 'Caption'), 136 | linkPlaceholder: this.api.i18n.t(config.linkPlaceholder || 'Link'), 137 | buttonContent: config.buttonContent || '', 138 | uploader: config.uploader || undefined, 139 | actions: config.actions || [], 140 | }; 141 | 142 | /** 143 | * Module for file uploading 144 | */ 145 | this.uploader = new Uploader({ 146 | config: this.config, 147 | onUpload: (response) => this.onUpload(response), 148 | onError: (error) => this.uploadingFailed(error), 149 | }); 150 | 151 | /** 152 | * Module for working with UI 153 | */ 154 | this.ui = new Ui({ 155 | api, 156 | config: this.config, 157 | onSelectFile: () => { 158 | this.uploader.uploadSelectedFile({ 159 | onPreview: (src) => { 160 | this.ui.showPreloader(src); 161 | }, 162 | }); 163 | }, 164 | readOnly, 165 | }); 166 | 167 | /** 168 | * Set saved state 169 | */ 170 | this._data = {}; 171 | this.data = data; 172 | } 173 | 174 | /** 175 | * Renders Block content 176 | * 177 | * @public 178 | * 179 | * @returns {HTMLDivElement} 180 | */ 181 | render() { 182 | return this.ui.render(this.data); 183 | } 184 | 185 | /** 186 | * Validate data: check if Image exists 187 | * 188 | * @param {ImageToolData} savedData — data received after saving 189 | * @returns {boolean} false if saved data is not correct, otherwise true 190 | * @public 191 | */ 192 | validate(savedData) { 193 | return savedData.file && savedData.file.url; 194 | } 195 | 196 | /** 197 | * 198 | * @returns {object} - styles for image 199 | */ 200 | static get sanitize() { 201 | return { 202 | caption: {}, 203 | link: false, 204 | }; 205 | } 206 | 207 | /** 208 | * Return Block data 209 | * 210 | * @public 211 | * 212 | * @returns {ImageToolData} 213 | */ 214 | save() { 215 | const caption = this.ui.nodes.caption; 216 | 217 | this._data.caption = caption.innerHTML; 218 | 219 | const link = this.ui.nodes.link; 220 | 221 | this._data.link = link.innerHTML; 222 | 223 | return this.data; 224 | } 225 | 226 | /** 227 | * Returns configuration for block tunes: add background, add border, stretch image 228 | * 229 | * @public 230 | * 231 | * @returns {Array} 232 | */ 233 | renderSettings() { 234 | // Merge default tunes with the ones that might be added by user 235 | // @see https://github.com/editor-js/image/pull/49 236 | const tunes = ImageTool.tunes.concat(this.config.actions); 237 | 238 | return tunes.map(tune => ({ 239 | icon: tune.icon, 240 | label: this.api.i18n.t(tune.title), 241 | name: tune.name, 242 | toggle: tune.toggle, 243 | isActive: this.data[tune.name], 244 | onActivate: () => { 245 | /* If it'a user defined tune, execute it's callback stored in action property */ 246 | if (typeof tune.action === 'function') { 247 | tune.action(tune.name); 248 | 249 | return; 250 | } 251 | this.tuneToggled(tune.name); 252 | }, 253 | })); 254 | } 255 | 256 | /** 257 | * Fires after clicks on the Toolbox Image Icon 258 | * Initiates click on the Select File button 259 | * 260 | * @public 261 | */ 262 | appendCallback() { 263 | this.ui.nodes.fileButton.click(); 264 | } 265 | 266 | /** 267 | * Specify paste substitutes 268 | * 269 | * @see {@link https://github.com/codex-team/editor.js/blob/master/docs/tools.md#paste-handling} 270 | * @returns {{tags: string[], patterns: object, files: {extensions: string[], mimeTypes: string[]}}} 271 | */ 272 | static get pasteConfig() { 273 | return { 274 | /** 275 | * Paste HTML into Editor 276 | */ 277 | tags: [ 278 | { 279 | img: {src: true}, 280 | }, 281 | ], 282 | /** 283 | * Paste URL of image into the Editor 284 | */ 285 | patterns: { 286 | image: /https?:\/\/\S+\.(gif|jpe?g|tiff|png|svg|webp)(\?[a-z0-9=]*)?$/i, 287 | }, 288 | 289 | /** 290 | * Drag n drop file from into the Editor 291 | */ 292 | files: { 293 | mimeTypes: ['image/*'], 294 | }, 295 | }; 296 | } 297 | 298 | /** 299 | * Specify paste handlers 300 | * 301 | * @public 302 | * @see {@link https://github.com/codex-team/editor.js/blob/master/docs/tools.md#paste-handling} 303 | * @param {CustomEvent} event - editor.js custom paste event 304 | * {@link https://github.com/codex-team/editor.js/blob/master/types/tools/paste-events.d.ts} 305 | * @returns {void} 306 | */ 307 | async onPaste(event) { 308 | switch (event.type) { 309 | case 'tag': { 310 | const image = event.detail.data; 311 | 312 | /** Images from PDF */ 313 | if (/^blob:/.test(image.src)) { 314 | const response = await fetch(image.src); 315 | const file = await response.blob(); 316 | 317 | this.uploadFile(file); 318 | break; 319 | } 320 | 321 | this.uploadUrl(image.src); 322 | break; 323 | } 324 | case 'pattern': { 325 | const url = event.detail.data; 326 | 327 | this.uploadUrl(url); 328 | break; 329 | } 330 | case 'file': { 331 | const file = event.detail.file; 332 | 333 | this.uploadFile(file); 334 | break; 335 | } 336 | } 337 | } 338 | 339 | /** 340 | * Private methods 341 | * ̿̿ ̿̿ ̿̿ ̿'̿'\̵͇̿̿\з= ( ▀ ͜͞ʖ▀) =ε/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿ 342 | */ 343 | 344 | /** 345 | * Stores all Tool's data 346 | * 347 | * @private 348 | * 349 | * @param {ImageToolData} data - data in Image Tool format 350 | */ 351 | set data(data) { 352 | this.image = data.file; 353 | 354 | this._data.caption = data.caption || ''; 355 | this._data.link = data.link || ''; 356 | this.ui.fillCaption(this._data.caption); 357 | this.ui.fillLink(this._data.link); 358 | 359 | ImageTool.tunes.forEach(({name: tune}) => { 360 | const value = typeof data[tune] !== 'undefined' ? data[tune] === true || data[tune] === 'true' : false; 361 | 362 | this.setTune(tune, value); 363 | }); 364 | } 365 | 366 | /** 367 | * Return Tool data 368 | * 369 | * @private 370 | * 371 | * @returns {ImageToolData} 372 | */ 373 | get data() { 374 | return this._data; 375 | } 376 | 377 | /** 378 | * Set new image file 379 | * 380 | * @private 381 | * 382 | * @param {object} file - uploaded file data 383 | */ 384 | set image(file) { 385 | this._data.file = file || {}; 386 | 387 | if (file && file.url) { 388 | this.ui.fillImage(file.url); 389 | } 390 | } 391 | 392 | /** 393 | * File uploading callback 394 | * 395 | * @private 396 | * 397 | * @param {UploadResponseFormat} response - uploading server response 398 | * @returns {void} 399 | */ 400 | onUpload(response) { 401 | if (response.success && response.file) { 402 | this.image = response.file; 403 | } else { 404 | this.uploadingFailed('incorrect response: ' + JSON.stringify(response)); 405 | } 406 | } 407 | 408 | /** 409 | * Handle uploader errors 410 | * 411 | * @private 412 | * @param {string} errorText - uploading error text 413 | * @returns {void} 414 | */ 415 | uploadingFailed(errorText) { 416 | console.log('Image Tool: uploading failed because of', errorText); 417 | 418 | this.api.notifier.show({ 419 | message: this.api.i18n.t('Couldn’t upload image. Please try another.'), 420 | style: 'error', 421 | }); 422 | this.ui.hidePreloader(); 423 | } 424 | 425 | /** 426 | * Callback fired when Block Tune is activated 427 | * 428 | * @private 429 | * 430 | * @param {string} tuneName - tune that has been clicked 431 | * @returns {void} 432 | */ 433 | tuneToggled(tuneName) { 434 | // inverse tune state 435 | this.setTune(tuneName, !this._data[tuneName]); 436 | } 437 | 438 | /** 439 | * Set one tune 440 | * 441 | * @param {string} tuneName - {@link Tunes.tunes} 442 | * @param {boolean} value - tune state 443 | * @returns {void} 444 | */ 445 | setTune(tuneName, value) { 446 | this._data[tuneName] = value; 447 | 448 | this.ui.applyTune(tuneName, value); 449 | 450 | if (tuneName === 'stretched') { 451 | /** 452 | * Wait until the API is ready 453 | */ 454 | Promise.resolve().then(() => { 455 | this.block.stretched = value; 456 | }) 457 | .catch(err => { 458 | console.error(err); 459 | }); 460 | } 461 | } 462 | 463 | /** 464 | * Show preloader and upload image file 465 | * 466 | * @param {File} file - file that is currently uploading (from paste) 467 | * @returns {void} 468 | */ 469 | uploadFile(file) { 470 | this.uploader.uploadByFile(file, { 471 | onPreview: (src) => { 472 | this.ui.showPreloader(src); 473 | }, 474 | }); 475 | } 476 | 477 | /** 478 | * Show preloader and upload image by target url 479 | * 480 | * @param {string} url - url pasted 481 | * @returns {void} 482 | */ 483 | uploadUrl(url) { 484 | this.ui.showPreloader(url); 485 | this.uploader.uploadByUrl(url); 486 | } 487 | } 488 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.8.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" 8 | dependencies: 9 | "@babel/highlight" "^7.8.3" 10 | 11 | "@babel/helper-validator-identifier@^7.9.0": 12 | version "7.9.5" 13 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" 14 | 15 | "@babel/highlight@^7.8.3": 16 | version "7.9.0" 17 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" 18 | dependencies: 19 | "@babel/helper-validator-identifier" "^7.9.0" 20 | chalk "^2.0.0" 21 | js-tokens "^4.0.0" 22 | 23 | "@codexteam/ajax@^4.2.0": 24 | version "4.2.0" 25 | resolved "https://registry.yarnpkg.com/@codexteam/ajax/-/ajax-4.2.0.tgz#f89faecbaf8cd496bfd77ef20a7fe99ee20ca9a3" 26 | 27 | "@codexteam/icons@^0.0.6": 28 | version "0.0.6" 29 | resolved "https://registry.yarnpkg.com/@codexteam/icons/-/icons-0.0.6.tgz#5553ada48dddf5940851ccc142cfe17835c36ad3" 30 | 31 | "@esbuild/android-arm64@0.18.20": 32 | version "0.18.20" 33 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" 34 | integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== 35 | 36 | "@esbuild/android-arm@0.18.20": 37 | version "0.18.20" 38 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" 39 | integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== 40 | 41 | "@esbuild/android-x64@0.18.20": 42 | version "0.18.20" 43 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" 44 | integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== 45 | 46 | "@esbuild/darwin-arm64@0.18.20": 47 | version "0.18.20" 48 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" 49 | integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== 50 | 51 | "@esbuild/darwin-x64@0.18.20": 52 | version "0.18.20" 53 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" 54 | integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== 55 | 56 | "@esbuild/freebsd-arm64@0.18.20": 57 | version "0.18.20" 58 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" 59 | integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== 60 | 61 | "@esbuild/freebsd-x64@0.18.20": 62 | version "0.18.20" 63 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" 64 | integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== 65 | 66 | "@esbuild/linux-arm64@0.18.20": 67 | version "0.18.20" 68 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" 69 | integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== 70 | 71 | "@esbuild/linux-arm@0.18.20": 72 | version "0.18.20" 73 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" 74 | integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== 75 | 76 | "@esbuild/linux-ia32@0.18.20": 77 | version "0.18.20" 78 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" 79 | integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== 80 | 81 | "@esbuild/linux-loong64@0.18.20": 82 | version "0.18.20" 83 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" 84 | integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== 85 | 86 | "@esbuild/linux-mips64el@0.18.20": 87 | version "0.18.20" 88 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" 89 | integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== 90 | 91 | "@esbuild/linux-ppc64@0.18.20": 92 | version "0.18.20" 93 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" 94 | integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== 95 | 96 | "@esbuild/linux-riscv64@0.18.20": 97 | version "0.18.20" 98 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" 99 | integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== 100 | 101 | "@esbuild/linux-s390x@0.18.20": 102 | version "0.18.20" 103 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" 104 | integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== 105 | 106 | "@esbuild/linux-x64@0.18.20": 107 | version "0.18.20" 108 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" 109 | integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== 110 | 111 | "@esbuild/netbsd-x64@0.18.20": 112 | version "0.18.20" 113 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" 114 | integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== 115 | 116 | "@esbuild/openbsd-x64@0.18.20": 117 | version "0.18.20" 118 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" 119 | integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== 120 | 121 | "@esbuild/sunos-x64@0.18.20": 122 | version "0.18.20" 123 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" 124 | integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== 125 | 126 | "@esbuild/win32-arm64@0.18.20": 127 | version "0.18.20" 128 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" 129 | integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== 130 | 131 | "@esbuild/win32-ia32@0.18.20": 132 | version "0.18.20" 133 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" 134 | integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== 135 | 136 | "@esbuild/win32-x64@0.18.20": 137 | version "0.18.20" 138 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" 139 | integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== 140 | 141 | "@types/color-name@^1.1.1": 142 | version "1.1.1" 143 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 144 | 145 | "@types/eslint-visitor-keys@^1.0.0": 146 | version "1.0.0" 147 | resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" 148 | 149 | "@types/json-schema@^7.0.3": 150 | version "7.0.4" 151 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" 152 | 153 | "@typescript-eslint/eslint-plugin@^2.12.0": 154 | version "2.29.0" 155 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.29.0.tgz#c9efab7624e3dd6d144a0e4577a541d1bd42c2ac" 156 | dependencies: 157 | "@typescript-eslint/experimental-utils" "2.29.0" 158 | functional-red-black-tree "^1.0.1" 159 | regexpp "^3.0.0" 160 | tsutils "^3.17.1" 161 | 162 | "@typescript-eslint/experimental-utils@2.29.0": 163 | version "2.29.0" 164 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz#3cb8060de9265ba131625a96bbfec31ba6d4a0fe" 165 | dependencies: 166 | "@types/json-schema" "^7.0.3" 167 | "@typescript-eslint/typescript-estree" "2.29.0" 168 | eslint-scope "^5.0.0" 169 | eslint-utils "^2.0.0" 170 | 171 | "@typescript-eslint/parser@^2.12.0": 172 | version "2.29.0" 173 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.29.0.tgz#6e3c4e21ed6393dc05b9d8b47f0b7e731ef21c9c" 174 | dependencies: 175 | "@types/eslint-visitor-keys" "^1.0.0" 176 | "@typescript-eslint/experimental-utils" "2.29.0" 177 | "@typescript-eslint/typescript-estree" "2.29.0" 178 | eslint-visitor-keys "^1.1.0" 179 | 180 | "@typescript-eslint/typescript-estree@2.29.0": 181 | version "2.29.0" 182 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz#1be6612bb02fc37ac9f466521c1459a4744e8d3a" 183 | dependencies: 184 | debug "^4.1.1" 185 | eslint-visitor-keys "^1.1.0" 186 | glob "^7.1.6" 187 | is-glob "^4.0.1" 188 | lodash "^4.17.15" 189 | semver "^6.3.0" 190 | tsutils "^3.17.1" 191 | 192 | acorn-jsx@^5.2.0: 193 | version "5.2.0" 194 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 195 | 196 | acorn@^7.1.1: 197 | version "7.1.1" 198 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" 199 | 200 | ajv-keywords@^3.4.1: 201 | version "3.4.1" 202 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" 203 | 204 | ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: 205 | version "6.12.2" 206 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" 207 | dependencies: 208 | fast-deep-equal "^3.1.1" 209 | fast-json-stable-stringify "^2.0.0" 210 | json-schema-traverse "^0.4.1" 211 | uri-js "^4.2.2" 212 | 213 | ansi-escapes@^4.2.1: 214 | version "4.3.1" 215 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 216 | dependencies: 217 | type-fest "^0.11.0" 218 | 219 | ansi-regex@^4.1.0: 220 | version "4.1.0" 221 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 222 | 223 | ansi-regex@^5.0.0: 224 | version "5.0.0" 225 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 226 | 227 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 228 | version "3.2.1" 229 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 230 | dependencies: 231 | color-convert "^1.9.0" 232 | 233 | ansi-styles@^4.1.0: 234 | version "4.2.1" 235 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 236 | dependencies: 237 | "@types/color-name" "^1.1.1" 238 | color-convert "^2.0.1" 239 | 240 | argparse@^1.0.7: 241 | version "1.0.10" 242 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 243 | dependencies: 244 | sprintf-js "~1.0.2" 245 | 246 | array-includes@^3.0.3: 247 | version "3.1.1" 248 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" 249 | dependencies: 250 | define-properties "^1.1.3" 251 | es-abstract "^1.17.0" 252 | is-string "^1.0.5" 253 | 254 | array.prototype.flat@^1.2.1: 255 | version "1.2.3" 256 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" 257 | dependencies: 258 | define-properties "^1.1.3" 259 | es-abstract "^1.17.0-next.1" 260 | 261 | asn1@~0.2.3: 262 | version "0.2.4" 263 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 264 | dependencies: 265 | safer-buffer "~2.1.0" 266 | 267 | assert-plus@1.0.0, assert-plus@^1.0.0: 268 | version "1.0.0" 269 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 270 | 271 | astral-regex@^1.0.0: 272 | version "1.0.0" 273 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 274 | 275 | asynckit@^0.4.0: 276 | version "0.4.0" 277 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 278 | 279 | at-least-node@^1.0.0: 280 | version "1.0.0" 281 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 282 | 283 | aws-sign2@~0.7.0: 284 | version "0.7.0" 285 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 286 | 287 | aws4@^1.8.0: 288 | version "1.9.1" 289 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" 290 | 291 | balanced-match@^1.0.0: 292 | version "1.0.0" 293 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 294 | 295 | bcrypt-pbkdf@^1.0.0: 296 | version "1.0.2" 297 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 298 | dependencies: 299 | tweetnacl "^0.14.3" 300 | 301 | big.js@^5.2.2: 302 | version "5.2.2" 303 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 304 | 305 | brace-expansion@^1.1.7: 306 | version "1.1.11" 307 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 308 | dependencies: 309 | balanced-match "^1.0.0" 310 | concat-map "0.0.1" 311 | 312 | callsites@^3.0.0: 313 | version "3.1.0" 314 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 315 | 316 | caseless@~0.12.0: 317 | version "0.12.0" 318 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 319 | 320 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: 321 | version "2.4.2" 322 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 323 | dependencies: 324 | ansi-styles "^3.2.1" 325 | escape-string-regexp "^1.0.5" 326 | supports-color "^5.3.0" 327 | 328 | chalk@^3.0.0: 329 | version "3.0.0" 330 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 331 | dependencies: 332 | ansi-styles "^4.1.0" 333 | supports-color "^7.1.0" 334 | 335 | chardet@^0.7.0: 336 | version "0.7.0" 337 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 338 | 339 | cli-cursor@^3.1.0: 340 | version "3.1.0" 341 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 342 | dependencies: 343 | restore-cursor "^3.1.0" 344 | 345 | cli-width@^2.0.0: 346 | version "2.2.1" 347 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 348 | 349 | color-convert@^1.9.0: 350 | version "1.9.3" 351 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 352 | dependencies: 353 | color-name "1.1.3" 354 | 355 | color-convert@^2.0.1: 356 | version "2.0.1" 357 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 358 | dependencies: 359 | color-name "~1.1.4" 360 | 361 | color-name@1.1.3: 362 | version "1.1.3" 363 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 364 | 365 | color-name@~1.1.4: 366 | version "1.1.4" 367 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 368 | 369 | combined-stream@^1.0.6, combined-stream@~1.0.6: 370 | version "1.0.8" 371 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 372 | dependencies: 373 | delayed-stream "~1.0.0" 374 | 375 | comment-parser@^0.7.2: 376 | version "0.7.2" 377 | resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.2.tgz#baf6d99b42038678b81096f15b630d18142f4b8a" 378 | 379 | commondir@^1.0.1: 380 | version "1.0.1" 381 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 382 | 383 | concat-map@0.0.1: 384 | version "0.0.1" 385 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 386 | 387 | contains-path@^0.1.0: 388 | version "0.1.0" 389 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 390 | 391 | core-util-is@1.0.2: 392 | version "1.0.2" 393 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 394 | 395 | cross-spawn@^6.0.5: 396 | version "6.0.5" 397 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 398 | dependencies: 399 | nice-try "^1.0.4" 400 | path-key "^2.0.1" 401 | semver "^5.5.0" 402 | shebang-command "^1.2.0" 403 | which "^1.2.9" 404 | 405 | cssesc@^3.0.0: 406 | version "3.0.0" 407 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" 408 | 409 | dashdash@^1.12.0: 410 | version "1.14.1" 411 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 412 | dependencies: 413 | assert-plus "^1.0.0" 414 | 415 | debug@^2.6.9: 416 | version "2.6.9" 417 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 418 | dependencies: 419 | ms "2.0.0" 420 | 421 | debug@^4.0.1, debug@^4.1.1: 422 | version "4.1.1" 423 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 424 | dependencies: 425 | ms "^2.1.1" 426 | 427 | deep-is@~0.1.3: 428 | version "0.1.3" 429 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 430 | 431 | define-properties@^1.1.2, define-properties@^1.1.3: 432 | version "1.1.3" 433 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 434 | dependencies: 435 | object-keys "^1.0.12" 436 | 437 | delayed-stream@~1.0.0: 438 | version "1.0.0" 439 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 440 | 441 | doctrine@1.5.0: 442 | version "1.5.0" 443 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 444 | dependencies: 445 | esutils "^2.0.2" 446 | isarray "^1.0.0" 447 | 448 | doctrine@^3.0.0: 449 | version "3.0.0" 450 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 451 | dependencies: 452 | esutils "^2.0.2" 453 | 454 | ecc-jsbn@~0.1.1: 455 | version "0.1.2" 456 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 457 | dependencies: 458 | jsbn "~0.1.0" 459 | safer-buffer "^2.1.0" 460 | 461 | emoji-regex@^7.0.1: 462 | version "7.0.3" 463 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 464 | 465 | emoji-regex@^8.0.0: 466 | version "8.0.0" 467 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 468 | 469 | emojis-list@^3.0.0: 470 | version "3.0.0" 471 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" 472 | 473 | error-ex@^1.2.0: 474 | version "1.3.2" 475 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 476 | dependencies: 477 | is-arrayish "^0.2.1" 478 | 479 | es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 480 | version "1.17.5" 481 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 482 | dependencies: 483 | es-to-primitive "^1.2.1" 484 | function-bind "^1.1.1" 485 | has "^1.0.3" 486 | has-symbols "^1.0.1" 487 | is-callable "^1.1.5" 488 | is-regex "^1.0.5" 489 | object-inspect "^1.7.0" 490 | object-keys "^1.1.1" 491 | object.assign "^4.1.0" 492 | string.prototype.trimleft "^2.1.1" 493 | string.prototype.trimright "^2.1.1" 494 | 495 | es-to-primitive@^1.2.1: 496 | version "1.2.1" 497 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 498 | dependencies: 499 | is-callable "^1.1.4" 500 | is-date-object "^1.0.1" 501 | is-symbol "^1.0.2" 502 | 503 | esbuild@^0.18.10: 504 | version "0.18.20" 505 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" 506 | integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== 507 | optionalDependencies: 508 | "@esbuild/android-arm" "0.18.20" 509 | "@esbuild/android-arm64" "0.18.20" 510 | "@esbuild/android-x64" "0.18.20" 511 | "@esbuild/darwin-arm64" "0.18.20" 512 | "@esbuild/darwin-x64" "0.18.20" 513 | "@esbuild/freebsd-arm64" "0.18.20" 514 | "@esbuild/freebsd-x64" "0.18.20" 515 | "@esbuild/linux-arm" "0.18.20" 516 | "@esbuild/linux-arm64" "0.18.20" 517 | "@esbuild/linux-ia32" "0.18.20" 518 | "@esbuild/linux-loong64" "0.18.20" 519 | "@esbuild/linux-mips64el" "0.18.20" 520 | "@esbuild/linux-ppc64" "0.18.20" 521 | "@esbuild/linux-riscv64" "0.18.20" 522 | "@esbuild/linux-s390x" "0.18.20" 523 | "@esbuild/linux-x64" "0.18.20" 524 | "@esbuild/netbsd-x64" "0.18.20" 525 | "@esbuild/openbsd-x64" "0.18.20" 526 | "@esbuild/sunos-x64" "0.18.20" 527 | "@esbuild/win32-arm64" "0.18.20" 528 | "@esbuild/win32-ia32" "0.18.20" 529 | "@esbuild/win32-x64" "0.18.20" 530 | 531 | escape-string-regexp@^1.0.5: 532 | version "1.0.5" 533 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 534 | 535 | eslint-config-codex@^1.3.3: 536 | version "1.3.3" 537 | resolved "https://registry.yarnpkg.com/eslint-config-codex/-/eslint-config-codex-1.3.3.tgz#639ec0f6500c3f5bd10465f06f8fc0645a1ae064" 538 | dependencies: 539 | "@typescript-eslint/eslint-plugin" "^2.12.0" 540 | "@typescript-eslint/parser" "^2.12.0" 541 | eslint-config-standard "14.1.0" 542 | eslint-plugin-import "2.19.1" 543 | eslint-plugin-jsdoc "^22.1.0" 544 | eslint-plugin-node "10.0.0" 545 | eslint-plugin-promise "4.2.1" 546 | eslint-plugin-standard "4.0.1" 547 | typescript "^3.7.3" 548 | 549 | eslint-config-standard@14.1.0: 550 | version "14.1.0" 551 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4" 552 | 553 | eslint-import-resolver-node@^0.3.2: 554 | version "0.3.3" 555 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" 556 | dependencies: 557 | debug "^2.6.9" 558 | resolve "^1.13.1" 559 | 560 | eslint-loader@^4.0.0: 561 | version "4.0.0" 562 | resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-4.0.0.tgz#ab096ce9168fa167e4159afff66692c173fc7b79" 563 | dependencies: 564 | fs-extra "^9.0.0" 565 | loader-fs-cache "^1.0.3" 566 | loader-utils "^2.0.0" 567 | object-hash "^2.0.3" 568 | schema-utils "^2.6.5" 569 | 570 | eslint-module-utils@^2.4.1: 571 | version "2.6.0" 572 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" 573 | dependencies: 574 | debug "^2.6.9" 575 | pkg-dir "^2.0.0" 576 | 577 | eslint-plugin-es@^2.0.0: 578 | version "2.0.0" 579 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" 580 | dependencies: 581 | eslint-utils "^1.4.2" 582 | regexpp "^3.0.0" 583 | 584 | eslint-plugin-import@2.19.1: 585 | version "2.19.1" 586 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" 587 | dependencies: 588 | array-includes "^3.0.3" 589 | array.prototype.flat "^1.2.1" 590 | contains-path "^0.1.0" 591 | debug "^2.6.9" 592 | doctrine "1.5.0" 593 | eslint-import-resolver-node "^0.3.2" 594 | eslint-module-utils "^2.4.1" 595 | has "^1.0.3" 596 | minimatch "^3.0.4" 597 | object.values "^1.1.0" 598 | read-pkg-up "^2.0.0" 599 | resolve "^1.12.0" 600 | 601 | eslint-plugin-jsdoc@^22.1.0: 602 | version "22.2.0" 603 | resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-22.2.0.tgz#b89159e01ed8eeee4f6512101e96cac6a2999461" 604 | dependencies: 605 | comment-parser "^0.7.2" 606 | debug "^4.1.1" 607 | jsdoctypeparser "^6.1.0" 608 | lodash "^4.17.15" 609 | regextras "^0.7.0" 610 | semver "^6.3.0" 611 | spdx-expression-parse "^3.0.0" 612 | 613 | eslint-plugin-node@10.0.0: 614 | version "10.0.0" 615 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" 616 | dependencies: 617 | eslint-plugin-es "^2.0.0" 618 | eslint-utils "^1.4.2" 619 | ignore "^5.1.1" 620 | minimatch "^3.0.4" 621 | resolve "^1.10.1" 622 | semver "^6.1.0" 623 | 624 | eslint-plugin-promise@4.2.1: 625 | version "4.2.1" 626 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" 627 | 628 | eslint-plugin-standard@4.0.1: 629 | version "4.0.1" 630 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" 631 | 632 | eslint-scope@^5.0.0: 633 | version "5.0.0" 634 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 635 | dependencies: 636 | esrecurse "^4.1.0" 637 | estraverse "^4.1.1" 638 | 639 | eslint-utils@^1.4.2, eslint-utils@^1.4.3: 640 | version "1.4.3" 641 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 642 | dependencies: 643 | eslint-visitor-keys "^1.1.0" 644 | 645 | eslint-utils@^2.0.0: 646 | version "2.0.0" 647 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" 648 | dependencies: 649 | eslint-visitor-keys "^1.1.0" 650 | 651 | eslint-visitor-keys@^1.1.0: 652 | version "1.1.0" 653 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 654 | 655 | eslint@^6.8.0: 656 | version "6.8.0" 657 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" 658 | dependencies: 659 | "@babel/code-frame" "^7.0.0" 660 | ajv "^6.10.0" 661 | chalk "^2.1.0" 662 | cross-spawn "^6.0.5" 663 | debug "^4.0.1" 664 | doctrine "^3.0.0" 665 | eslint-scope "^5.0.0" 666 | eslint-utils "^1.4.3" 667 | eslint-visitor-keys "^1.1.0" 668 | espree "^6.1.2" 669 | esquery "^1.0.1" 670 | esutils "^2.0.2" 671 | file-entry-cache "^5.0.1" 672 | functional-red-black-tree "^1.0.1" 673 | glob-parent "^5.0.0" 674 | globals "^12.1.0" 675 | ignore "^4.0.6" 676 | import-fresh "^3.0.0" 677 | imurmurhash "^0.1.4" 678 | inquirer "^7.0.0" 679 | is-glob "^4.0.0" 680 | js-yaml "^3.13.1" 681 | json-stable-stringify-without-jsonify "^1.0.1" 682 | levn "^0.3.0" 683 | lodash "^4.17.14" 684 | minimatch "^3.0.4" 685 | mkdirp "^0.5.1" 686 | natural-compare "^1.4.0" 687 | optionator "^0.8.3" 688 | progress "^2.0.0" 689 | regexpp "^2.0.1" 690 | semver "^6.1.2" 691 | strip-ansi "^5.2.0" 692 | strip-json-comments "^3.0.1" 693 | table "^5.2.3" 694 | text-table "^0.2.0" 695 | v8-compile-cache "^2.0.3" 696 | 697 | espree@^6.1.2: 698 | version "6.2.1" 699 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" 700 | dependencies: 701 | acorn "^7.1.1" 702 | acorn-jsx "^5.2.0" 703 | eslint-visitor-keys "^1.1.0" 704 | 705 | esprima@^4.0.0: 706 | version "4.0.1" 707 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 708 | 709 | esquery@^1.0.1: 710 | version "1.3.1" 711 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 712 | dependencies: 713 | estraverse "^5.1.0" 714 | 715 | esrecurse@^4.1.0: 716 | version "4.2.1" 717 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 718 | dependencies: 719 | estraverse "^4.1.0" 720 | 721 | estraverse@^4.1.0, estraverse@^4.1.1: 722 | version "4.3.0" 723 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 724 | 725 | estraverse@^5.1.0: 726 | version "5.1.0" 727 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" 728 | 729 | esutils@^2.0.2: 730 | version "2.0.3" 731 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 732 | 733 | extend@~3.0.2: 734 | version "3.0.2" 735 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 736 | 737 | external-editor@^3.0.3: 738 | version "3.1.0" 739 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 740 | dependencies: 741 | chardet "^0.7.0" 742 | iconv-lite "^0.4.24" 743 | tmp "^0.0.33" 744 | 745 | extsprintf@1.3.0: 746 | version "1.3.0" 747 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 748 | 749 | extsprintf@^1.2.0: 750 | version "1.4.0" 751 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 752 | 753 | fast-deep-equal@^3.1.1: 754 | version "3.1.1" 755 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 756 | 757 | fast-json-stable-stringify@^2.0.0: 758 | version "2.1.0" 759 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 760 | 761 | fast-levenshtein@~2.0.6: 762 | version "2.0.6" 763 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 764 | 765 | figures@^3.0.0: 766 | version "3.2.0" 767 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 768 | dependencies: 769 | escape-string-regexp "^1.0.5" 770 | 771 | file-entry-cache@^5.0.1: 772 | version "5.0.1" 773 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 774 | dependencies: 775 | flat-cache "^2.0.1" 776 | 777 | find-cache-dir@^0.1.1: 778 | version "0.1.1" 779 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" 780 | dependencies: 781 | commondir "^1.0.1" 782 | mkdirp "^0.5.1" 783 | pkg-dir "^1.0.0" 784 | 785 | find-up@^1.0.0: 786 | version "1.1.2" 787 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 788 | dependencies: 789 | path-exists "^2.0.0" 790 | pinkie-promise "^2.0.0" 791 | 792 | find-up@^2.0.0, find-up@^2.1.0: 793 | version "2.1.0" 794 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 795 | dependencies: 796 | locate-path "^2.0.0" 797 | 798 | flat-cache@^2.0.1: 799 | version "2.0.1" 800 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 801 | dependencies: 802 | flatted "^2.0.0" 803 | rimraf "2.6.3" 804 | write "1.0.3" 805 | 806 | flatted@^2.0.0: 807 | version "2.0.2" 808 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 809 | 810 | forever-agent@~0.6.1: 811 | version "0.6.1" 812 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 813 | 814 | form-data@~2.3.2: 815 | version "2.3.3" 816 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 817 | dependencies: 818 | asynckit "^0.4.0" 819 | combined-stream "^1.0.6" 820 | mime-types "^2.1.12" 821 | 822 | formidable@^1.2.1: 823 | version "1.2.2" 824 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" 825 | 826 | fs-extra@^9.0.0: 827 | version "9.0.0" 828 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" 829 | dependencies: 830 | at-least-node "^1.0.0" 831 | graceful-fs "^4.2.0" 832 | jsonfile "^6.0.1" 833 | universalify "^1.0.0" 834 | 835 | fs.realpath@^1.0.0: 836 | version "1.0.0" 837 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 838 | 839 | fsevents@~2.3.2: 840 | version "2.3.3" 841 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 842 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 843 | 844 | function-bind@^1.1.1: 845 | version "1.1.1" 846 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 847 | 848 | functional-red-black-tree@^1.0.1: 849 | version "1.0.1" 850 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 851 | 852 | getpass@^0.1.1: 853 | version "0.1.7" 854 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 855 | dependencies: 856 | assert-plus "^1.0.0" 857 | 858 | glob-parent@^5.0.0: 859 | version "5.1.1" 860 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 861 | dependencies: 862 | is-glob "^4.0.1" 863 | 864 | glob@^7.1.3, glob@^7.1.6: 865 | version "7.1.6" 866 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 867 | dependencies: 868 | fs.realpath "^1.0.0" 869 | inflight "^1.0.4" 870 | inherits "2" 871 | minimatch "^3.0.4" 872 | once "^1.3.0" 873 | path-is-absolute "^1.0.0" 874 | 875 | globals@^12.1.0: 876 | version "12.4.0" 877 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 878 | dependencies: 879 | type-fest "^0.8.1" 880 | 881 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 882 | version "4.2.3" 883 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 884 | 885 | har-schema@^2.0.0: 886 | version "2.0.0" 887 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 888 | 889 | har-validator@~5.1.3: 890 | version "5.1.3" 891 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 892 | dependencies: 893 | ajv "^6.5.5" 894 | har-schema "^2.0.0" 895 | 896 | has-flag@^3.0.0: 897 | version "3.0.0" 898 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 899 | 900 | has-flag@^4.0.0: 901 | version "4.0.0" 902 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 903 | 904 | has-symbols@^1.0.0, has-symbols@^1.0.1: 905 | version "1.0.1" 906 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 907 | 908 | has@^1.0.3: 909 | version "1.0.3" 910 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 911 | dependencies: 912 | function-bind "^1.1.1" 913 | 914 | hosted-git-info@^2.1.4: 915 | version "2.8.9" 916 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 917 | 918 | http-signature@~1.2.0: 919 | version "1.2.0" 920 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 921 | dependencies: 922 | assert-plus "^1.0.0" 923 | jsprim "^1.2.2" 924 | sshpk "^1.7.0" 925 | 926 | iconv-lite@^0.4.24: 927 | version "0.4.24" 928 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 929 | dependencies: 930 | safer-buffer ">= 2.1.2 < 3" 931 | 932 | ignore@^4.0.6: 933 | version "4.0.6" 934 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 935 | 936 | ignore@^5.1.1: 937 | version "5.1.4" 938 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" 939 | 940 | import-fresh@^3.0.0: 941 | version "3.2.1" 942 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 943 | dependencies: 944 | parent-module "^1.0.0" 945 | resolve-from "^4.0.0" 946 | 947 | imurmurhash@^0.1.4: 948 | version "0.1.4" 949 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 950 | 951 | indexes-of@^1.0.1: 952 | version "1.0.1" 953 | resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 954 | 955 | inflight@^1.0.4: 956 | version "1.0.6" 957 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 958 | dependencies: 959 | once "^1.3.0" 960 | wrappy "1" 961 | 962 | inherits@2: 963 | version "2.0.4" 964 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 965 | 966 | inquirer@^7.0.0: 967 | version "7.1.0" 968 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" 969 | dependencies: 970 | ansi-escapes "^4.2.1" 971 | chalk "^3.0.0" 972 | cli-cursor "^3.1.0" 973 | cli-width "^2.0.0" 974 | external-editor "^3.0.3" 975 | figures "^3.0.0" 976 | lodash "^4.17.15" 977 | mute-stream "0.0.8" 978 | run-async "^2.4.0" 979 | rxjs "^6.5.3" 980 | string-width "^4.1.0" 981 | strip-ansi "^6.0.0" 982 | through "^2.3.6" 983 | 984 | is-arrayish@^0.2.1: 985 | version "0.2.1" 986 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 987 | 988 | is-callable@^1.1.4, is-callable@^1.1.5: 989 | version "1.1.5" 990 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 991 | 992 | is-date-object@^1.0.1: 993 | version "1.0.2" 994 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 995 | 996 | is-extglob@^2.1.1: 997 | version "2.1.1" 998 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 999 | 1000 | is-fullwidth-code-point@^2.0.0: 1001 | version "2.0.0" 1002 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1003 | 1004 | is-fullwidth-code-point@^3.0.0: 1005 | version "3.0.0" 1006 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1007 | 1008 | is-glob@^4.0.0, is-glob@^4.0.1: 1009 | version "4.0.1" 1010 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1011 | dependencies: 1012 | is-extglob "^2.1.1" 1013 | 1014 | is-promise@^2.1.0: 1015 | version "2.1.0" 1016 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1017 | 1018 | is-regex@^1.0.5: 1019 | version "1.0.5" 1020 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 1021 | dependencies: 1022 | has "^1.0.3" 1023 | 1024 | is-string@^1.0.5: 1025 | version "1.0.5" 1026 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 1027 | 1028 | is-symbol@^1.0.2: 1029 | version "1.0.3" 1030 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1031 | dependencies: 1032 | has-symbols "^1.0.1" 1033 | 1034 | is-typedarray@~1.0.0: 1035 | version "1.0.0" 1036 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1037 | 1038 | isarray@^1.0.0: 1039 | version "1.0.0" 1040 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1041 | 1042 | isexe@^2.0.0: 1043 | version "2.0.0" 1044 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1045 | 1046 | isstream@~0.1.2: 1047 | version "0.1.2" 1048 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1049 | 1050 | js-tokens@^4.0.0: 1051 | version "4.0.0" 1052 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1053 | 1054 | js-yaml@^3.13.1: 1055 | version "3.13.1" 1056 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1057 | dependencies: 1058 | argparse "^1.0.7" 1059 | esprima "^4.0.0" 1060 | 1061 | jsbn@~0.1.0: 1062 | version "0.1.1" 1063 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1064 | 1065 | jsdoctypeparser@^6.1.0: 1066 | version "6.1.0" 1067 | resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz#acfb936c26300d98f1405cb03e20b06748e512a8" 1068 | 1069 | json-schema-traverse@^0.4.1: 1070 | version "0.4.1" 1071 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1072 | 1073 | json-schema@0.2.3: 1074 | version "0.2.3" 1075 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1076 | 1077 | json-stable-stringify-without-jsonify@^1.0.1: 1078 | version "1.0.1" 1079 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1080 | 1081 | json-stringify-safe@~5.0.1: 1082 | version "5.0.1" 1083 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1084 | 1085 | json5@^2.1.2: 1086 | version "2.1.3" 1087 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" 1088 | dependencies: 1089 | minimist "^1.2.5" 1090 | 1091 | jsonfile@^6.0.1: 1092 | version "6.0.1" 1093 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" 1094 | dependencies: 1095 | universalify "^1.0.0" 1096 | optionalDependencies: 1097 | graceful-fs "^4.1.6" 1098 | 1099 | jsprim@^1.2.2: 1100 | version "1.4.1" 1101 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1102 | dependencies: 1103 | assert-plus "1.0.0" 1104 | extsprintf "1.3.0" 1105 | json-schema "0.2.3" 1106 | verror "1.10.0" 1107 | 1108 | levn@^0.3.0, levn@~0.3.0: 1109 | version "0.3.0" 1110 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1111 | dependencies: 1112 | prelude-ls "~1.1.2" 1113 | type-check "~0.3.2" 1114 | 1115 | load-json-file@^2.0.0: 1116 | version "2.0.0" 1117 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1118 | dependencies: 1119 | graceful-fs "^4.1.2" 1120 | parse-json "^2.2.0" 1121 | pify "^2.0.0" 1122 | strip-bom "^3.0.0" 1123 | 1124 | loader-fs-cache@^1.0.3: 1125 | version "1.0.3" 1126 | resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" 1127 | dependencies: 1128 | find-cache-dir "^0.1.1" 1129 | mkdirp "^0.5.1" 1130 | 1131 | loader-utils@^2.0.0: 1132 | version "2.0.0" 1133 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" 1134 | dependencies: 1135 | big.js "^5.2.2" 1136 | emojis-list "^3.0.0" 1137 | json5 "^2.1.2" 1138 | 1139 | locate-path@^2.0.0: 1140 | version "2.0.0" 1141 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1142 | dependencies: 1143 | p-locate "^2.0.0" 1144 | path-exists "^3.0.0" 1145 | 1146 | lodash@^4.17.14, lodash@^4.17.15: 1147 | version "4.17.21" 1148 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1149 | 1150 | mime-db@1.43.0: 1151 | version "1.43.0" 1152 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 1153 | 1154 | mime-types@^2.1.12, mime-types@~2.1.19: 1155 | version "2.1.26" 1156 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 1157 | dependencies: 1158 | mime-db "1.43.0" 1159 | 1160 | mimic-fn@^2.1.0: 1161 | version "2.1.0" 1162 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1163 | 1164 | minimatch@^3.0.4: 1165 | version "3.0.4" 1166 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1167 | dependencies: 1168 | brace-expansion "^1.1.7" 1169 | 1170 | minimist@^1.2.5: 1171 | version "1.2.5" 1172 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1173 | 1174 | mkdirp@^0.5.1: 1175 | version "0.5.5" 1176 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1177 | dependencies: 1178 | minimist "^1.2.5" 1179 | 1180 | ms@2.0.0: 1181 | version "2.0.0" 1182 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1183 | 1184 | ms@^2.1.1: 1185 | version "2.1.2" 1186 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1187 | 1188 | mute-stream@0.0.8: 1189 | version "0.0.8" 1190 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1191 | 1192 | nanoid@^3.3.6: 1193 | version "3.3.7" 1194 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 1195 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1196 | 1197 | natural-compare@^1.4.0: 1198 | version "1.4.0" 1199 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1200 | 1201 | nice-try@^1.0.4: 1202 | version "1.0.5" 1203 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1204 | 1205 | normalize-package-data@^2.3.2: 1206 | version "2.5.0" 1207 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1208 | dependencies: 1209 | hosted-git-info "^2.1.4" 1210 | resolve "^1.10.0" 1211 | semver "2 || 3 || 4 || 5" 1212 | validate-npm-package-license "^3.0.1" 1213 | 1214 | oauth-sign@~0.9.0: 1215 | version "0.9.0" 1216 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1217 | 1218 | object-hash@^2.0.3: 1219 | version "2.0.3" 1220 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" 1221 | 1222 | object-inspect@^1.7.0: 1223 | version "1.7.0" 1224 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1225 | 1226 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1227 | version "1.1.1" 1228 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1229 | 1230 | object.assign@^4.1.0: 1231 | version "4.1.0" 1232 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1233 | dependencies: 1234 | define-properties "^1.1.2" 1235 | function-bind "^1.1.1" 1236 | has-symbols "^1.0.0" 1237 | object-keys "^1.0.11" 1238 | 1239 | object.values@^1.1.0: 1240 | version "1.1.1" 1241 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" 1242 | dependencies: 1243 | define-properties "^1.1.3" 1244 | es-abstract "^1.17.0-next.1" 1245 | function-bind "^1.1.1" 1246 | has "^1.0.3" 1247 | 1248 | once@^1.3.0: 1249 | version "1.4.0" 1250 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1251 | dependencies: 1252 | wrappy "1" 1253 | 1254 | onetime@^5.1.0: 1255 | version "5.1.0" 1256 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1257 | dependencies: 1258 | mimic-fn "^2.1.0" 1259 | 1260 | optionator@^0.8.3: 1261 | version "0.8.3" 1262 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1263 | dependencies: 1264 | deep-is "~0.1.3" 1265 | fast-levenshtein "~2.0.6" 1266 | levn "~0.3.0" 1267 | prelude-ls "~1.1.2" 1268 | type-check "~0.3.2" 1269 | word-wrap "~1.2.3" 1270 | 1271 | os-tmpdir@~1.0.2: 1272 | version "1.0.2" 1273 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1274 | 1275 | p-limit@^1.1.0: 1276 | version "1.3.0" 1277 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1278 | dependencies: 1279 | p-try "^1.0.0" 1280 | 1281 | p-locate@^2.0.0: 1282 | version "2.0.0" 1283 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1284 | dependencies: 1285 | p-limit "^1.1.0" 1286 | 1287 | p-try@^1.0.0: 1288 | version "1.0.0" 1289 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1290 | 1291 | parent-module@^1.0.0: 1292 | version "1.0.1" 1293 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1294 | dependencies: 1295 | callsites "^3.0.0" 1296 | 1297 | parse-json@^2.2.0: 1298 | version "2.2.0" 1299 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1300 | dependencies: 1301 | error-ex "^1.2.0" 1302 | 1303 | path-exists@^2.0.0: 1304 | version "2.1.0" 1305 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1306 | dependencies: 1307 | pinkie-promise "^2.0.0" 1308 | 1309 | path-exists@^3.0.0: 1310 | version "3.0.0" 1311 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1312 | 1313 | path-is-absolute@^1.0.0: 1314 | version "1.0.1" 1315 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1316 | 1317 | path-key@^2.0.1: 1318 | version "2.0.1" 1319 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1320 | 1321 | path-parse@^1.0.6: 1322 | version "1.0.7" 1323 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1324 | 1325 | path-type@^2.0.0: 1326 | version "2.0.0" 1327 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1328 | dependencies: 1329 | pify "^2.0.0" 1330 | 1331 | performance-now@^2.1.0: 1332 | version "2.1.0" 1333 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1334 | 1335 | picocolors@^1.0.0: 1336 | version "1.0.0" 1337 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1338 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1339 | 1340 | pify@^2.0.0: 1341 | version "2.3.0" 1342 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1343 | 1344 | pinkie-promise@^2.0.0: 1345 | version "2.0.1" 1346 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1347 | dependencies: 1348 | pinkie "^2.0.0" 1349 | 1350 | pinkie@^2.0.0: 1351 | version "2.0.4" 1352 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1353 | 1354 | pkg-dir@^1.0.0: 1355 | version "1.0.0" 1356 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1357 | dependencies: 1358 | find-up "^1.0.0" 1359 | 1360 | pkg-dir@^2.0.0: 1361 | version "2.0.0" 1362 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1363 | dependencies: 1364 | find-up "^2.1.0" 1365 | 1366 | postcss-nested-ancestors@^2.0.0: 1367 | version "2.0.0" 1368 | resolved "https://registry.yarnpkg.com/postcss-nested-ancestors/-/postcss-nested-ancestors-2.0.0.tgz#957ef27fb9e37cb082786d95b5e310d4b47470fe" 1369 | dependencies: 1370 | escape-string-regexp "^1.0.5" 1371 | postcss "^6.0.0" 1372 | postcss-resolve-nested-selector "^0.1.1" 1373 | 1374 | postcss-nested@^4.1.0: 1375 | version "4.2.1" 1376 | resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.1.tgz#4bc2e5b35e3b1e481ff81e23b700da7f82a8b248" 1377 | dependencies: 1378 | postcss "^7.0.21" 1379 | postcss-selector-parser "^6.0.2" 1380 | 1381 | postcss-resolve-nested-selector@^0.1.1: 1382 | version "0.1.1" 1383 | resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" 1384 | 1385 | postcss-selector-parser@^6.0.2: 1386 | version "6.0.2" 1387 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" 1388 | dependencies: 1389 | cssesc "^3.0.0" 1390 | indexes-of "^1.0.1" 1391 | uniq "^1.0.1" 1392 | 1393 | postcss@^6.0.0: 1394 | version "6.0.23" 1395 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" 1396 | dependencies: 1397 | chalk "^2.4.1" 1398 | source-map "^0.6.1" 1399 | supports-color "^5.4.0" 1400 | 1401 | postcss@^7.0.21: 1402 | version "7.0.27" 1403 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" 1404 | dependencies: 1405 | chalk "^2.4.2" 1406 | source-map "^0.6.1" 1407 | supports-color "^6.1.0" 1408 | 1409 | postcss@^8.4.27: 1410 | version "8.4.31" 1411 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" 1412 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== 1413 | dependencies: 1414 | nanoid "^3.3.6" 1415 | picocolors "^1.0.0" 1416 | source-map-js "^1.0.2" 1417 | 1418 | prelude-ls@~1.1.2: 1419 | version "1.1.2" 1420 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1421 | 1422 | progress@^2.0.0: 1423 | version "2.0.3" 1424 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1425 | 1426 | psl@^1.1.28: 1427 | version "1.8.0" 1428 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 1429 | 1430 | punycode@^2.1.0, punycode@^2.1.1: 1431 | version "2.1.1" 1432 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1433 | 1434 | qs@~6.5.2: 1435 | version "6.5.2" 1436 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1437 | 1438 | read-pkg-up@^2.0.0: 1439 | version "2.0.0" 1440 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1441 | dependencies: 1442 | find-up "^2.0.0" 1443 | read-pkg "^2.0.0" 1444 | 1445 | read-pkg@^2.0.0: 1446 | version "2.0.0" 1447 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1448 | dependencies: 1449 | load-json-file "^2.0.0" 1450 | normalize-package-data "^2.3.2" 1451 | path-type "^2.0.0" 1452 | 1453 | regexpp@^2.0.1: 1454 | version "2.0.1" 1455 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1456 | 1457 | regexpp@^3.0.0: 1458 | version "3.1.0" 1459 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 1460 | 1461 | regextras@^0.7.0: 1462 | version "0.7.0" 1463 | resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.0.tgz#2298bef8cfb92b1b7e3b9b12aa8f69547b7d71e4" 1464 | 1465 | request@^2.88.0: 1466 | version "2.88.2" 1467 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 1468 | dependencies: 1469 | aws-sign2 "~0.7.0" 1470 | aws4 "^1.8.0" 1471 | caseless "~0.12.0" 1472 | combined-stream "~1.0.6" 1473 | extend "~3.0.2" 1474 | forever-agent "~0.6.1" 1475 | form-data "~2.3.2" 1476 | har-validator "~5.1.3" 1477 | http-signature "~1.2.0" 1478 | is-typedarray "~1.0.0" 1479 | isstream "~0.1.2" 1480 | json-stringify-safe "~5.0.1" 1481 | mime-types "~2.1.19" 1482 | oauth-sign "~0.9.0" 1483 | performance-now "^2.1.0" 1484 | qs "~6.5.2" 1485 | safe-buffer "^5.1.2" 1486 | tough-cookie "~2.5.0" 1487 | tunnel-agent "^0.6.0" 1488 | uuid "^3.3.2" 1489 | 1490 | resolve-from@^4.0.0: 1491 | version "4.0.0" 1492 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1493 | 1494 | resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1: 1495 | version "1.16.1" 1496 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.16.1.tgz#49fac5d8bacf1fd53f200fa51247ae736175832c" 1497 | dependencies: 1498 | path-parse "^1.0.6" 1499 | 1500 | restore-cursor@^3.1.0: 1501 | version "3.1.0" 1502 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1503 | dependencies: 1504 | onetime "^5.1.0" 1505 | signal-exit "^3.0.2" 1506 | 1507 | rimraf@2.6.3: 1508 | version "2.6.3" 1509 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1510 | dependencies: 1511 | glob "^7.1.3" 1512 | 1513 | rollup@^3.27.1: 1514 | version "3.29.4" 1515 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" 1516 | integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== 1517 | optionalDependencies: 1518 | fsevents "~2.3.2" 1519 | 1520 | run-async@^2.4.0: 1521 | version "2.4.0" 1522 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" 1523 | dependencies: 1524 | is-promise "^2.1.0" 1525 | 1526 | rxjs@^6.5.3: 1527 | version "6.5.5" 1528 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" 1529 | dependencies: 1530 | tslib "^1.9.0" 1531 | 1532 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 1533 | version "5.2.0" 1534 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1535 | 1536 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1537 | version "2.1.2" 1538 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1539 | 1540 | schema-utils@^2.6.5: 1541 | version "2.6.6" 1542 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" 1543 | dependencies: 1544 | ajv "^6.12.0" 1545 | ajv-keywords "^3.4.1" 1546 | 1547 | "semver@2 || 3 || 4 || 5", semver@^5.5.0: 1548 | version "5.7.1" 1549 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1550 | 1551 | semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: 1552 | version "6.3.0" 1553 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1554 | 1555 | shebang-command@^1.2.0: 1556 | version "1.2.0" 1557 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1558 | dependencies: 1559 | shebang-regex "^1.0.0" 1560 | 1561 | shebang-regex@^1.0.0: 1562 | version "1.0.0" 1563 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1564 | 1565 | signal-exit@^3.0.2: 1566 | version "3.0.3" 1567 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1568 | 1569 | slice-ansi@^2.1.0: 1570 | version "2.1.0" 1571 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1572 | dependencies: 1573 | ansi-styles "^3.2.0" 1574 | astral-regex "^1.0.0" 1575 | is-fullwidth-code-point "^2.0.0" 1576 | 1577 | source-map-js@^1.0.2: 1578 | version "1.0.2" 1579 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1580 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1581 | 1582 | source-map@^0.6.1: 1583 | version "0.6.1" 1584 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1585 | 1586 | spdx-correct@^3.0.0: 1587 | version "3.1.0" 1588 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 1589 | dependencies: 1590 | spdx-expression-parse "^3.0.0" 1591 | spdx-license-ids "^3.0.0" 1592 | 1593 | spdx-exceptions@^2.1.0: 1594 | version "2.3.0" 1595 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1596 | 1597 | spdx-expression-parse@^3.0.0: 1598 | version "3.0.0" 1599 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1600 | dependencies: 1601 | spdx-exceptions "^2.1.0" 1602 | spdx-license-ids "^3.0.0" 1603 | 1604 | spdx-license-ids@^3.0.0: 1605 | version "3.0.5" 1606 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1607 | 1608 | sprintf-js@~1.0.2: 1609 | version "1.0.3" 1610 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1611 | 1612 | sshpk@^1.7.0: 1613 | version "1.16.1" 1614 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 1615 | dependencies: 1616 | asn1 "~0.2.3" 1617 | assert-plus "^1.0.0" 1618 | bcrypt-pbkdf "^1.0.0" 1619 | dashdash "^1.12.0" 1620 | ecc-jsbn "~0.1.1" 1621 | getpass "^0.1.1" 1622 | jsbn "~0.1.0" 1623 | safer-buffer "^2.0.2" 1624 | tweetnacl "~0.14.0" 1625 | 1626 | string-width@^3.0.0: 1627 | version "3.1.0" 1628 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1629 | dependencies: 1630 | emoji-regex "^7.0.1" 1631 | is-fullwidth-code-point "^2.0.0" 1632 | strip-ansi "^5.1.0" 1633 | 1634 | string-width@^4.1.0: 1635 | version "4.2.0" 1636 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1637 | dependencies: 1638 | emoji-regex "^8.0.0" 1639 | is-fullwidth-code-point "^3.0.0" 1640 | strip-ansi "^6.0.0" 1641 | 1642 | string.prototype.trimend@^1.0.0: 1643 | version "1.0.1" 1644 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1645 | dependencies: 1646 | define-properties "^1.1.3" 1647 | es-abstract "^1.17.5" 1648 | 1649 | string.prototype.trimleft@^2.1.1: 1650 | version "2.1.2" 1651 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1652 | dependencies: 1653 | define-properties "^1.1.3" 1654 | es-abstract "^1.17.5" 1655 | string.prototype.trimstart "^1.0.0" 1656 | 1657 | string.prototype.trimright@^2.1.1: 1658 | version "2.1.2" 1659 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1660 | dependencies: 1661 | define-properties "^1.1.3" 1662 | es-abstract "^1.17.5" 1663 | string.prototype.trimend "^1.0.0" 1664 | 1665 | string.prototype.trimstart@^1.0.0: 1666 | version "1.0.1" 1667 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1668 | dependencies: 1669 | define-properties "^1.1.3" 1670 | es-abstract "^1.17.5" 1671 | 1672 | strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1673 | version "5.2.0" 1674 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1675 | dependencies: 1676 | ansi-regex "^4.1.0" 1677 | 1678 | strip-ansi@^6.0.0: 1679 | version "6.0.0" 1680 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1681 | dependencies: 1682 | ansi-regex "^5.0.0" 1683 | 1684 | strip-bom@^3.0.0: 1685 | version "3.0.0" 1686 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1687 | 1688 | strip-json-comments@^3.0.1: 1689 | version "3.1.0" 1690 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" 1691 | 1692 | supports-color@^5.3.0, supports-color@^5.4.0: 1693 | version "5.5.0" 1694 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1695 | dependencies: 1696 | has-flag "^3.0.0" 1697 | 1698 | supports-color@^6.1.0: 1699 | version "6.1.0" 1700 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 1701 | dependencies: 1702 | has-flag "^3.0.0" 1703 | 1704 | supports-color@^7.1.0: 1705 | version "7.1.0" 1706 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1707 | dependencies: 1708 | has-flag "^4.0.0" 1709 | 1710 | table@^5.2.3: 1711 | version "5.4.6" 1712 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1713 | dependencies: 1714 | ajv "^6.10.2" 1715 | lodash "^4.17.14" 1716 | slice-ansi "^2.1.0" 1717 | string-width "^3.0.0" 1718 | 1719 | text-table@^0.2.0: 1720 | version "0.2.0" 1721 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1722 | 1723 | through@^2.3.6: 1724 | version "2.3.8" 1725 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1726 | 1727 | tmp@^0.0.33: 1728 | version "0.0.33" 1729 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1730 | dependencies: 1731 | os-tmpdir "~1.0.2" 1732 | 1733 | tough-cookie@~2.5.0: 1734 | version "2.5.0" 1735 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 1736 | dependencies: 1737 | psl "^1.1.28" 1738 | punycode "^2.1.1" 1739 | 1740 | tslib@^1.8.1, tslib@^1.9.0: 1741 | version "1.11.1" 1742 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" 1743 | 1744 | tsutils@^3.17.1: 1745 | version "3.17.1" 1746 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 1747 | dependencies: 1748 | tslib "^1.8.1" 1749 | 1750 | tunnel-agent@^0.6.0: 1751 | version "0.6.0" 1752 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1753 | dependencies: 1754 | safe-buffer "^5.0.1" 1755 | 1756 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1757 | version "0.14.5" 1758 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1759 | 1760 | type-check@~0.3.2: 1761 | version "0.3.2" 1762 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1763 | dependencies: 1764 | prelude-ls "~1.1.2" 1765 | 1766 | type-fest@^0.11.0: 1767 | version "0.11.0" 1768 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 1769 | 1770 | type-fest@^0.8.1: 1771 | version "0.8.1" 1772 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1773 | 1774 | typescript@^3.7.3: 1775 | version "3.8.3" 1776 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" 1777 | 1778 | uniq@^1.0.1: 1779 | version "1.0.1" 1780 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 1781 | 1782 | universalify@^1.0.0: 1783 | version "1.0.0" 1784 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" 1785 | 1786 | uri-js@^4.2.2: 1787 | version "4.2.2" 1788 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1789 | dependencies: 1790 | punycode "^2.1.0" 1791 | 1792 | uuid@^3.3.2: 1793 | version "3.4.0" 1794 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1795 | 1796 | v8-compile-cache@^2.0.3: 1797 | version "2.1.0" 1798 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 1799 | 1800 | validate-npm-package-license@^3.0.1: 1801 | version "3.0.4" 1802 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1803 | dependencies: 1804 | spdx-correct "^3.0.0" 1805 | spdx-expression-parse "^3.0.0" 1806 | 1807 | verror@1.10.0: 1808 | version "1.10.0" 1809 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1810 | dependencies: 1811 | assert-plus "^1.0.0" 1812 | core-util-is "1.0.2" 1813 | extsprintf "^1.2.0" 1814 | 1815 | vite-plugin-css-injected-by-js@^3.3.0: 1816 | version "3.3.0" 1817 | resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.3.0.tgz#c19480a9e42a95c5bced976a9dde1446f9bd91ff" 1818 | integrity sha512-xG+jyHNCmUqi/TXp6q88wTJGeAOrNLSyUUTp4qEQ9QZLGcHWQQsCsSSKa59rPMQr8sOzfzmWDd8enGqfH/dBew== 1819 | 1820 | vite@^4.5.0: 1821 | version "4.5.0" 1822 | resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" 1823 | integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== 1824 | dependencies: 1825 | esbuild "^0.18.10" 1826 | postcss "^8.4.27" 1827 | rollup "^3.27.1" 1828 | optionalDependencies: 1829 | fsevents "~2.3.2" 1830 | 1831 | which@^1.2.9: 1832 | version "1.3.1" 1833 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1834 | dependencies: 1835 | isexe "^2.0.0" 1836 | 1837 | word-wrap@~1.2.3: 1838 | version "1.2.3" 1839 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1840 | 1841 | wrappy@1: 1842 | version "1.0.2" 1843 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1844 | 1845 | write@1.0.3: 1846 | version "1.0.3" 1847 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1848 | dependencies: 1849 | mkdirp "^0.5.1" 1850 | --------------------------------------------------------------------------------