├── .gitignore ├── src ├── Globals.d.ts ├── index.module.css ├── types │ └── index.ts └── index.ts ├── assets └── demo.png ├── .npmignore ├── .github ├── dependabot.yml └── workflows │ ├── npm-publish.yml │ └── bump-version.yml ├── package.json ├── vite.config.js ├── LICENSE ├── README.md ├── index.html ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ -------------------------------------------------------------------------------- /src/Globals.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.module.css"; -------------------------------------------------------------------------------- /src/index.module.css: -------------------------------------------------------------------------------- 1 | .opensea-tool { 2 | margin: 1em auto; 3 | } -------------------------------------------------------------------------------- /assets/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/editor-js/opensea/master/assets/demo.png -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .github/ 2 | assets/ 3 | src/ 4 | index.html 5 | LICENSE 6 | tsconfig.json 7 | vite.config.js 8 | yarn.lock 9 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/template" 5 | schedule: 6 | interval: "daily" -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@editorjs/opensea", 3 | "description": "OpenSea Tool for Editor.js", 4 | "version": "1.0.2", 5 | "main": "dist/OpenseaTool.umd.js", 6 | "module": "dist/OpenseaTool.mjs", 7 | "license": "MIT", 8 | "repository": "https://github.com/editor-js/opensea", 9 | "scripts": { 10 | "dev": "vite", 11 | "build": "vite build" 12 | }, 13 | "devDependencies": { 14 | "@editorjs/editorjs": "^2.26.0", 15 | "@types/node": "^16.3.3", 16 | "vite": "^3.1.0", 17 | "vite-plugin-css-injected-by-js": "^2.1.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | import { BlockToolData, ToolConfig } from '@editorjs/editorjs'; 2 | 3 | /** 4 | * OpenseaTool Tool's input and output data format 5 | */ 6 | export interface OpenseaToolData extends BlockToolData { 7 | /** 8 | * Coin 9 | */ 10 | coin: string; 11 | 12 | /** 13 | * The token's contract address 14 | */ 15 | contractAddress: string; 16 | 17 | /** 18 | * The token Id of the asset. 19 | */ 20 | tokenId: string; 21 | } 22 | 23 | /** 24 | * OpenseaTool Tool's configuration object that passed through the initial Editor config 25 | */ 26 | export interface OpenseaToolConfig extends ToolConfig {} -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'; 2 | import path from 'path'; 3 | 4 | /** 5 | * Trick to use Vite server.open option on macOS 6 | * @see https://github.com/facebook/create-react-app/pull/1690#issuecomment-283518768 7 | */ 8 | process.env.BROWSER = 'open'; 9 | 10 | export default { 11 | build: { 12 | lib: { 13 | entry: path.resolve(__dirname, 'src', 'index.ts'), 14 | name: 'OpenseaTool', 15 | formats: ['umd', 'es'], 16 | fileName: 'OpenseaTool' 17 | }, 18 | }, 19 | 20 | server: { 21 | port: 3300, 22 | open: true, 23 | }, 24 | 25 | plugins: [ 26 | cssInjectedByJsPlugin(), 27 | ] 28 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 CodeX 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 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish package to NPM 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | - master 8 | 9 | jobs: 10 | publish: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: actions/setup-node@v1 15 | with: 16 | node-version: 18 17 | registry-url: https://registry.npmjs.org/ 18 | 19 | - run: yarn 20 | - run: yarn build 21 | - run: yarn publish --access=public --tag=next 22 | env: 23 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 24 | 25 | - name: Get package info 26 | id: package 27 | uses: codex-team/action-nodejs-package-info@v1.1 28 | 29 | - name: Add LATEST tag for the published package if this is not a -rc version 30 | if: steps.package.outputs.is-release-candidate == 'false' 31 | run: npm dist-tag add ${{ steps.package.outputs.name }}@${{ steps.package.outputs.version }} latest 32 | env: 33 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 34 | 35 | notify: 36 | needs: publish 37 | runs-on: ubuntu-latest 38 | steps: 39 | - uses: actions/checkout@v2 40 | - name: Get package info 41 | id: package 42 | uses: codex-team/action-nodejs-package-info@v1 43 | - name: Send a message 44 | uses: codex-team/action-codexbot-notify@v1 45 | with: 46 | webhook: ${{ secrets.CODEX_BOT_NOTIFY_EDITORJS_PUBLIC_CHAT }} 47 | message: '📦 [${{ steps.package.outputs.name }}](${{ steps.package.outputs.npmjs-link }}) ${{ steps.package.outputs.version }} was published' 48 | parse_mode: 'markdown' 49 | disable_web_page_preview: true 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenSea Tool for Editor.js 2 | 3 | Parses the pasted link to OpenSea item and inserts the embed block. 4 | 5 | ![Opensea Tool example card](assets/demo.png) 6 | 7 | ## Installation 8 | 9 | Use your package manager to install the `@editorjs/opensea` package. 10 | 11 | ``` 12 | npm install -D @editorjs/opensea 13 | 14 | yarn add -D @editorjs/opensea 15 | ``` 16 | 17 | ## Usage 18 | 19 | Import and add the Tool to Editor.js tools config. 20 | 21 | ```javascript 22 | import OpenseaTool from '@editorjs/opensea'; 23 | 24 | const editor = new EditorJS({ 25 | tools: { 26 | opensea: { 27 | class: OpenseaTool 28 | }, 29 | }, 30 | 31 | // ... 32 | }); 33 | ``` 34 | 35 | Check out the [example page](./index.html). 36 | 37 | ## Output Data 38 | 39 | Check the `OpenseaToolData` interface in [src/types/index.ts](./src/types/index.ts) file with types. 40 | 41 | ## Render Template 42 | 43 | Use the following HTML to render the block. 44 | 45 | ```html 46 | 47 | 48 | 49 | ``` 50 | 51 | ## Development 52 | 53 | This tool uses [Vite](https://vitejs.dev/) as builder. 54 | 55 | `npm run dev` — run development environment with hot reload 56 | 57 | `npm run build` — build the tool for production to the `dist` folder 58 | 59 | ## Links 60 | 61 | [Editor.js](https://editorjs.io) • [Create Tool](https://github.com/editor-js/create-tool) 62 | 63 | ## About CodeX 64 | 65 | 66 | 67 | CodeX is a team of digital specialists around the world interested in building high-quality open source products on a global market. We are [open](https://codex.so/join) for young people who want to constantly improve their skills and grow professionally with experiments in cutting-edge technologies. 68 | 69 | | 🌐 | Join 👋 | Twitter | Instagram | 70 | | -- | -- | -- | -- | 71 | | [codex.so](https://codex.so) | [codex.so/join](https://codex.so/join) |[@codex_team](http://twitter.com/codex_team) | [@codex_team](http://instagram.com/codex_team/) | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Editor.js example page 4 | 5 | 10 | 11 | 12 |
13 | 14 | 15 |

16 | 
17 |   
70 | 
71 | 
72 | 
73 | 


--------------------------------------------------------------------------------
/.github/workflows/bump-version.yml:
--------------------------------------------------------------------------------
 1 | name: Auto bump version
 2 | 
 3 | on:
 4 |   pull_request:
 5 |     branches:
 6 |       - main
 7 |       - master
 8 | 
 9 | jobs:
10 |   # If pull request was merged then we should check for a package version update
11 |   check-for-no-version-changing:
12 |     runs-on: ubuntu-latest
13 |     steps:
14 |       # Checkout to target branch
15 |       - uses: actions/checkout@v2
16 |         with:
17 |           fetch-depth: 0
18 | 
19 |       # Get package new version name
20 |       - name: Get package info
21 |         id: packageNew
22 |         uses: codex-team/action-nodejs-package-info@v1
23 | 
24 |       # Checkout to the base commit before merge
25 |       - name: Checkout to the base commit before merge
26 |         run: git checkout ${{ github.event.pull_request.base.sha }}
27 | 
28 |       # Get package old version name
29 |       - name: Get package info
30 |         id: packageOld
31 |         uses: codex-team/action-nodejs-package-info@v1
32 | 
33 |       # Stop workflow and do not bump version if it was changed already
34 |       - name: Stop workflow and do not bump version if it was changed already
35 |         uses: actions/github-script@v3
36 |         if: steps.packageOld.outputs.version != steps.packageNew.outputs.version
37 |         with:
38 |           script: |
39 |             core.setFailed('Version was changed! ${{ steps.packageOld.outputs.version }} -> ${{ steps.packageNew.outputs.version }}')
40 | 
41 |   bump-version:
42 |     needs: check-for-no-version-changing
43 |     runs-on: ubuntu-latest
44 |     steps:
45 |       # Checkout to target branch
46 |       - uses: actions/checkout@v2
47 | 
48 |       # Setup node environment
49 |       - uses: actions/setup-node@v1
50 |         with:
51 |           node-version: 18
52 | 
53 |       # Bump version to the next prerelease (patch) with rc suffix
54 |       - name: Suggest the new version
55 |         run: yarn version --prerelease --preid rc --no-git-tag-version
56 | 
57 |       # Get package new version name
58 |       - name: Get package info
59 |         id: package
60 |         uses: codex-team/action-nodejs-package-info@v1
61 | 
62 |       # Commit and push changes
63 |       - uses: EndBug/add-and-commit@v7
64 |         with:
65 |           author_name: github-actions
66 |           author_email: 41898282+github-actions[bot]@users.noreply.github.com
67 |           message: "Bump version up to ${{ steps.package.outputs.version }}"


--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
  1 | /**
  2 |  * Import styles library
  3 |  */
  4 | import styles from './index.module.css';
  5 | 
  6 | /**
  7 |  * Import types
  8 |  */
  9 | import { OpenseaToolData, OpenseaToolConfig } from './types';
 10 | import { API, BlockTool, PasteConfig, PatternPasteEvent } from '@editorjs/editorjs';
 11 | 
 12 | /**
 13 |  * opensea Tool for Editor.js
 14 |  */
 15 | export default class OpenseaTool implements BlockTool {
 16 |   /**
 17 |    * Code API — public methods to work with Editor
 18 |    * 
 19 |    * @link https://editorjs.io/api
 20 |    */
 21 |   private readonly api: API;
 22 | 
 23 |   /**
 24 |    * Read-only mode flag
 25 |    */
 26 |   private readonly readOnly: boolean;
 27 | 
 28 |   /**
 29 |    * Tool data for input and output
 30 |    */
 31 |   private data: OpenseaToolData;
 32 | 
 33 |   /**
 34 |    * Configuration object that passed through the initial Editor configuration.
 35 |    */
 36 |   private config: OpenseaToolConfig;
 37 | 
 38 |   /**
 39 |    * Tool's HTML nodes
 40 |    */
 41 |   private nodes: {[key: string]: HTMLElement|null};
 42 | 
 43 |   /**
 44 |    * Class constructor
 45 |    */
 46 |   constructor({ data, config, api, readOnly }: { data: OpenseaToolData, config: OpenseaToolConfig, api: API, readOnly: boolean }) {
 47 |     this.data = data;
 48 |     this.config = config;
 49 |     this.api = api;
 50 |     this.readOnly = readOnly;
 51 | 
 52 |     /**
 53 |      * Declare Tool's nodes
 54 |      */
 55 |     this.nodes = {
 56 |       wrapper: null,
 57 |       nftCard: null,
 58 |     };
 59 |   }
 60 | 
 61 |   /**
 62 |    * Before usage of the Tool, it should be prepared
 63 |    */
 64 |   static prepare(): void {
 65 |     /**
 66 |      * Script URL for an embeddable NFT card
 67 |      * Required only in this method
 68 |      */
 69 |     const scriptUrl = 'https://unpkg.com/embeddable-nfts/dist/nft-card.min.js';
 70 | 
 71 |     /**
 72 |      * Add script file only once
 73 |      */
 74 |     const scriptElement = document.querySelector(`script[src="${scriptUrl}"]`);
 75 | 
 76 |     if (!scriptElement) {
 77 |       const script = document.createElement('script');
 78 | 
 79 |       script.src = scriptUrl;
 80 | 
 81 |       document.head.appendChild(script);
 82 |     }
 83 |   }
 84 | 
 85 |   /**
 86 |    * Creates UI of a Block
 87 |    */
 88 |   render(): HTMLElement {
 89 |     this.nodes.wrapper = document.createElement('div');
 90 |     this.nodes.wrapper.classList.add(styles['opensea-tool']);
 91 | 
 92 |     /**
 93 |      * If data is passed, render NFT card
 94 |      */ 
 95 |     if (this.data.contractAddress && this.data.tokenId) {
 96 |       this.renderNftCard();
 97 |     }
 98 | 
 99 |     return this.nodes.wrapper;
100 |   }
101 | 
102 |   /**
103 |    * Extracts Block data from the UI
104 |    */
105 |   save(): OpenseaToolData {
106 |     return this.data;
107 |   }
108 | 
109 |   /**
110 |    * Handle content pasted by ways that described by pasteConfig static getter
111 |    */  
112 |   onPaste(event: PatternPasteEvent) {
113 |     const { data } = event.detail;
114 |     const groups = data.match(OpenseaTool.regexp);
115 | 
116 |     /**
117 |      * If data is not a valid link, show message and do nothing
118 |      */
119 |     if (!groups || groups.length < 4) {
120 |       this.api.notifier.show({
121 |         message: 'Bad opensea item URL',
122 |         style: 'error',
123 |       });
124 |       return;
125 |     }
126 | 
127 |     /**
128 |      * Save data to the Tool's data
129 |      */
130 |     this.data = {
131 |       coin: groups[1],
132 |       contractAddress: groups[2],
133 |       tokenId: groups[3],
134 |     };
135 | 
136 |     this.renderNftCard();
137 |   }
138 | 
139 |   /**
140 |    * Process pasted content before appending to the Editor
141 |    */ 
142 |   static get pasteConfig(): PasteConfig {
143 |     return {
144 |       patterns: {
145 |         opensea: OpenseaTool.regexp,
146 |       }
147 |     };
148 |   }
149 | 
150 |   /**
151 |    * Notify core that read-only mode is suppoorted
152 |    */
153 |   static get isReadOnlySupported(): boolean {
154 |     return true;
155 |   }
156 | 
157 |   /**
158 |    * Regexp for a opensea link
159 |    */
160 |   private static get regexp(): RegExp {
161 |     return /^https:\/\/opensea\.io\/assets\/([a-zA-Z]+)\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)$/i;
162 |   }
163 | 
164 |   /**
165 |    * Render NFT card into the wrapper
166 |    */
167 |   private renderNftCard(): void {
168 |     /**
169 |      * Create NFT card element
170 |      */
171 |     this.nodes.nftCard = document.createElement('nft-card');
172 |     this.nodes.nftCard.setAttribute('contractAddress', this.data.contractAddress);
173 |     this.nodes.nftCard.setAttribute('tokenId', this.data.tokenId);
174 | 
175 |     /**
176 |      * Append NFT card to the wrapper
177 |      */
178 |     if (this.nodes.wrapper) {
179 |       this.nodes.wrapper.innerHTML = '';
180 |       this.nodes.wrapper.appendChild(this.nodes.nftCard);
181 |     } else {
182 |       this.api.notifier.show({
183 |         message: 'Wrapper is not initialized',
184 |         style: 'error',
185 |       });
186 |     }
187 |   }
188 | };


--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     /* Visit https://aka.ms/tsconfig.json to read more about this file */
 4 | 
 5 |     /* Basic Options */
 6 |     // "incremental": true,                         /* Enable incremental compilation */
 7 |     "target": "es5",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
 8 |     "module": "commonjs",                           /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
 9 |     "lib": ["ES2020", "dom"],                       /* Specify library files to be included in the compilation. */
10 |     // "allowJs": true,                             /* Allow javascript files to be compiled. */
11 |     // "checkJs": true,                             /* Report errors in .js files. */
12 |     // "jsx": "preserve",                           /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
13 |     // "declaration": true,                         /* Generates corresponding '.d.ts' file. */
14 |     // "declarationMap": true,                      /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 |     // "sourceMap": true,                           /* Generates corresponding '.map' file. */
16 |     // "outFile": "./",                             /* Concatenate and emit output to single file. */
17 |     // "outDir": "./",                              /* Redirect output structure to the directory. */
18 |     // "rootDir": "./",                             /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 |     // "composite": true,                           /* Enable project compilation */
20 |     // "tsBuildInfoFile": "./",                     /* Specify file to store incremental compilation information */
21 |     // "removeComments": true,                      /* Do not emit comments to output. */
22 |     // "noEmit": true,                              /* Do not emit outputs. */
23 |     // "importHelpers": true,                       /* Import emit helpers from 'tslib'. */
24 |     // "downlevelIteration": true,                  /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 |     // "isolatedModules": true,                     /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 | 
27 |     /* Strict Type-Checking Options */
28 |     "strict": true,                                 /* Enable all strict type-checking options. */
29 |     // "noImplicitAny": true,                       /* Raise error on expressions and declarations with an implied 'any' type. */
30 |     // "strictNullChecks": true,                    /* Enable strict null checks. */
31 |     // "strictFunctionTypes": true,                 /* Enable strict checking of function types. */
32 |     // "strictBindCallApply": true,                 /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 |     // "strictPropertyInitialization": true,        /* Enable strict checking of property initialization in classes. */
34 |     // "noImplicitThis": true,                      /* Raise error on 'this' expressions with an implied 'any' type. */
35 |     // "alwaysStrict": true,                        /* Parse in strict mode and emit "use strict" for each source file. */
36 | 
37 |     /* Additional Checks */
38 |     // "noUnusedLocals": true,                      /* Report errors on unused locals. */
39 |     // "noUnusedParameters": true,                  /* Report errors on unused parameters. */
40 |     // "noImplicitReturns": true,                   /* Report error when not all code paths in function return a value. */
41 |     // "noFallthroughCasesInSwitch": true,          /* Report errors for fallthrough cases in switch statement. */
42 |     // "noUncheckedIndexedAccess": true,            /* Include 'undefined' in index signature results */
43 |     // "noPropertyAccessFromIndexSignature": true,  /* Require undeclared properties from index signatures to use element accesses. */
44 | 
45 |     /* Module Resolution Options */
46 |     // "moduleResolution": "node",                  /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
47 |     // "baseUrl": "./",                             /* Base directory to resolve non-absolute module names. */
48 |     // "paths": {},                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
49 |     // "rootDirs": [],                              /* List of root folders whose combined content represents the structure of the project at runtime. */
50 |     // "typeRoots": [],                             /* List of folders to include type definitions from. */
51 |     // "types": [],                                 /* Type declaration files to be included in compilation. */
52 |     // "allowSyntheticDefaultImports": true,        /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
53 |     "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
54 |     // "preserveSymlinks": true,                    /* Do not resolve the real path of symlinks. */
55 |     // "allowUmdGlobalAccess": true,                /* Allow accessing UMD globals from modules. */
56 | 
57 |     /* Source Map Options */
58 |     // "sourceRoot": "",                            /* Specify the location where debugger should locate TypeScript files instead of source locations. */
59 |     // "mapRoot": "",                               /* Specify the location where debugger should locate map files instead of generated locations. */
60 |     // "inlineSourceMap": true,                     /* Emit a single file with source maps instead of having a separate file. */
61 |     // "inlineSources": true,                       /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
62 | 
63 |     /* Experimental Options */
64 |     // "experimentalDecorators": true,              /* Enables experimental support for ES7 decorators. */
65 |     // "emitDecoratorMetadata": true,               /* Enables experimental support for emitting type metadata for decorators. */
66 | 
67 |     /* Advanced Options */
68 |     "skipLibCheck": true,                           /* Skip type checking of declaration files. */
69 |     "forceConsistentCasingInFileNames": true,       /* Disallow inconsistently-cased references to the same file. */
70 |     
71 |     "plugins": [{
72 |       "name": "typescript-plugin-css-modules"
73 |     }]
74 |   }
75 | }


--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
  1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
  2 | # yarn lockfile v1
  3 | 
  4 | 
  5 | "@codexteam/icons@0.1.0":
  6 |   version "0.1.0"
  7 |   resolved "https://registry.yarnpkg.com/@codexteam/icons/-/icons-0.1.0.tgz#a02885fe8699f69902d05b077b5f1cd48a2ca6b9"
  8 |   integrity sha512-jW1fWnwtWzcP4FBGsaodbJY3s1ZaRU+IJy1pvJ7ygNQxkQinybJcwXoyt0a5mWwu/4w30A42EWhCrZn8lp4fdw==
  9 | 
 10 | "@editorjs/editorjs@^2.26.0":
 11 |   version "2.26.4"
 12 |   resolved "https://registry.yarnpkg.com/@editorjs/editorjs/-/editorjs-2.26.4.tgz#097e29341501d81cd1721604a74da1530f5ff74f"
 13 |   integrity sha512-yuJ2NM1Y5+8DDNWr4C00tHMVHKy0uCqK1HS4pwFPVcXUawgJnU2Li2vKGvPLuf0Jj2ir7MVgADO6oC1TbYBOYQ==
 14 |   dependencies:
 15 |     "@codexteam/icons" "0.1.0"
 16 |     codex-notifier "^1.1.2"
 17 |     codex-tooltip "^1.0.5"
 18 |     html-janitor "^2.0.4"
 19 |     nanoid "^3.1.22"
 20 | 
 21 | "@esbuild/android-arm@0.15.18":
 22 |   version "0.15.18"
 23 |   resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80"
 24 |   integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==
 25 | 
 26 | "@esbuild/linux-loong64@0.15.18":
 27 |   version "0.15.18"
 28 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239"
 29 |   integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==
 30 | 
 31 | "@types/node@^16.3.3":
 32 |   version "16.18.9"
 33 |   resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.9.tgz#47c491cfbc10460571d766c16526748fa9ad96a1"
 34 |   integrity sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==
 35 | 
 36 | codex-notifier@^1.1.2:
 37 |   version "1.1.2"
 38 |   resolved "https://registry.yarnpkg.com/codex-notifier/-/codex-notifier-1.1.2.tgz#a733079185f4c927fa296f1d71eb8753fe080895"
 39 |   integrity sha512-DCp6xe/LGueJ1N5sXEwcBc3r3PyVkEEDNWCVigfvywAkeXcZMk9K41a31tkEFBW0Ptlwji6/JlAb49E3Yrxbtg==
 40 | 
 41 | codex-tooltip@^1.0.5:
 42 |   version "1.0.5"
 43 |   resolved "https://registry.yarnpkg.com/codex-tooltip/-/codex-tooltip-1.0.5.tgz#ba25fd5b3a58ba2f73fd667c2b46987ffd1edef2"
 44 |   integrity sha512-IuA8LeyLU5p1B+HyhOsqR6oxyFQ11k3i9e9aXw40CrHFTRO2Y1npNBVU3W1SvhKAbUU7R/YikUBdcYFP0RcJag==
 45 | 
 46 | esbuild-android-64@0.15.18:
 47 |   version "0.15.18"
 48 |   resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5"
 49 |   integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==
 50 | 
 51 | esbuild-android-arm64@0.15.18:
 52 |   version "0.15.18"
 53 |   resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04"
 54 |   integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==
 55 | 
 56 | esbuild-darwin-64@0.15.18:
 57 |   version "0.15.18"
 58 |   resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410"
 59 |   integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==
 60 | 
 61 | esbuild-darwin-arm64@0.15.18:
 62 |   version "0.15.18"
 63 |   resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz#b6dfc7799115a2917f35970bfbc93ae50256b337"
 64 |   integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==
 65 | 
 66 | esbuild-freebsd-64@0.15.18:
 67 |   version "0.15.18"
 68 |   resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2"
 69 |   integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==
 70 | 
 71 | esbuild-freebsd-arm64@0.15.18:
 72 |   version "0.15.18"
 73 |   resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635"
 74 |   integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==
 75 | 
 76 | esbuild-linux-32@0.15.18:
 77 |   version "0.15.18"
 78 |   resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce"
 79 |   integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==
 80 | 
 81 | esbuild-linux-64@0.15.18:
 82 |   version "0.15.18"
 83 |   resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c"
 84 |   integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==
 85 | 
 86 | esbuild-linux-arm64@0.15.18:
 87 |   version "0.15.18"
 88 |   resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d"
 89 |   integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==
 90 | 
 91 | esbuild-linux-arm@0.15.18:
 92 |   version "0.15.18"
 93 |   resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc"
 94 |   integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==
 95 | 
 96 | esbuild-linux-mips64le@0.15.18:
 97 |   version "0.15.18"
 98 |   resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb"
 99 |   integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==
100 | 
101 | esbuild-linux-ppc64le@0.15.18:
102 |   version "0.15.18"
103 |   resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507"
104 |   integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==
105 | 
106 | esbuild-linux-riscv64@0.15.18:
107 |   version "0.15.18"
108 |   resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6"
109 |   integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==
110 | 
111 | esbuild-linux-s390x@0.15.18:
112 |   version "0.15.18"
113 |   resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb"
114 |   integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==
115 | 
116 | esbuild-netbsd-64@0.15.18:
117 |   version "0.15.18"
118 |   resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998"
119 |   integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==
120 | 
121 | esbuild-openbsd-64@0.15.18:
122 |   version "0.15.18"
123 |   resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8"
124 |   integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==
125 | 
126 | esbuild-sunos-64@0.15.18:
127 |   version "0.15.18"
128 |   resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971"
129 |   integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==
130 | 
131 | esbuild-windows-32@0.15.18:
132 |   version "0.15.18"
133 |   resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3"
134 |   integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==
135 | 
136 | esbuild-windows-64@0.15.18:
137 |   version "0.15.18"
138 |   resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz#0fc761d785414284fc408e7914226d33f82420d0"
139 |   integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==
140 | 
141 | esbuild-windows-arm64@0.15.18:
142 |   version "0.15.18"
143 |   resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7"
144 |   integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==
145 | 
146 | esbuild@^0.15.9:
147 |   version "0.15.18"
148 |   resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.18.tgz#ea894adaf3fbc036d32320a00d4d6e4978a2f36d"
149 |   integrity sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==
150 |   optionalDependencies:
151 |     "@esbuild/android-arm" "0.15.18"
152 |     "@esbuild/linux-loong64" "0.15.18"
153 |     esbuild-android-64 "0.15.18"
154 |     esbuild-android-arm64 "0.15.18"
155 |     esbuild-darwin-64 "0.15.18"
156 |     esbuild-darwin-arm64 "0.15.18"
157 |     esbuild-freebsd-64 "0.15.18"
158 |     esbuild-freebsd-arm64 "0.15.18"
159 |     esbuild-linux-32 "0.15.18"
160 |     esbuild-linux-64 "0.15.18"
161 |     esbuild-linux-arm "0.15.18"
162 |     esbuild-linux-arm64 "0.15.18"
163 |     esbuild-linux-mips64le "0.15.18"
164 |     esbuild-linux-ppc64le "0.15.18"
165 |     esbuild-linux-riscv64 "0.15.18"
166 |     esbuild-linux-s390x "0.15.18"
167 |     esbuild-netbsd-64 "0.15.18"
168 |     esbuild-openbsd-64 "0.15.18"
169 |     esbuild-sunos-64 "0.15.18"
170 |     esbuild-windows-32 "0.15.18"
171 |     esbuild-windows-64 "0.15.18"
172 |     esbuild-windows-arm64 "0.15.18"
173 | 
174 | fsevents@~2.3.2:
175 |   version "2.3.2"
176 |   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
177 |   integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
178 | 
179 | function-bind@^1.1.1:
180 |   version "1.1.1"
181 |   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
182 |   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
183 | 
184 | has@^1.0.3:
185 |   version "1.0.3"
186 |   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
187 |   integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
188 |   dependencies:
189 |     function-bind "^1.1.1"
190 | 
191 | html-janitor@^2.0.4:
192 |   version "2.0.4"
193 |   resolved "https://registry.yarnpkg.com/html-janitor/-/html-janitor-2.0.4.tgz#ae5a115cdf3331cd5501edd7b5471b18ea44cdbb"
194 |   integrity sha512-92J5h9jNZRk30PMHapjHEJfkrBWKCOy0bq3oW2pBungky6lzYSoboBGPMvxl1XRKB2q+kniQmsLsPbdpY7RM2g==
195 | 
196 | is-core-module@^2.9.0:
197 |   version "2.11.0"
198 |   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
199 |   integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
200 |   dependencies:
201 |     has "^1.0.3"
202 | 
203 | nanoid@^3.1.22, nanoid@^3.3.4:
204 |   version "3.3.4"
205 |   resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
206 |   integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
207 | 
208 | path-parse@^1.0.7:
209 |   version "1.0.7"
210 |   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
211 |   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
212 | 
213 | picocolors@^1.0.0:
214 |   version "1.0.0"
215 |   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
216 |   integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
217 | 
218 | postcss@^8.4.18:
219 |   version "8.4.20"
220 |   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56"
221 |   integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==
222 |   dependencies:
223 |     nanoid "^3.3.4"
224 |     picocolors "^1.0.0"
225 |     source-map-js "^1.0.2"
226 | 
227 | resolve@^1.22.1:
228 |   version "1.22.1"
229 |   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
230 |   integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
231 |   dependencies:
232 |     is-core-module "^2.9.0"
233 |     path-parse "^1.0.7"
234 |     supports-preserve-symlinks-flag "^1.0.0"
235 | 
236 | rollup@^2.79.1:
237 |   version "2.79.1"
238 |   resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
239 |   integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
240 |   optionalDependencies:
241 |     fsevents "~2.3.2"
242 | 
243 | source-map-js@^1.0.2:
244 |   version "1.0.2"
245 |   resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
246 |   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
247 | 
248 | supports-preserve-symlinks-flag@^1.0.0:
249 |   version "1.0.0"
250 |   resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
251 |   integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
252 | 
253 | vite-plugin-css-injected-by-js@^2.1.1:
254 |   version "2.1.1"
255 |   resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-2.1.1.tgz#a79275241c61f1c8d55d228f5b2dded450a580e4"
256 |   integrity sha512-gjIG6iFWde32oRr/bK9CsfN+jdbura2y4GlDzeOiEm6py38ud8dXzFl9zwmHjOjZdr8XEgQ9TovzVGNzp47esw==
257 | 
258 | vite@^3.1.0:
259 |   version "3.2.5"
260 |   resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.5.tgz#dee5678172a8a0ab3e547ad4148c3d547f90e86a"
261 |   integrity sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==
262 |   dependencies:
263 |     esbuild "^0.15.9"
264 |     postcss "^8.4.18"
265 |     resolve "^1.22.1"
266 |     rollup "^2.79.1"
267 |   optionalDependencies:
268 |     fsevents "~2.3.2"
269 | 


--------------------------------------------------------------------------------