├── .npmignore ├── .gitignore ├── src ├── types │ └── icons.d.ts ├── utils │ └── makeFragment.ts ├── index.css └── index.ts ├── .editorconfig ├── dist ├── utils │ └── makeFragment.d.ts ├── paragraph.umd.js ├── index.d.ts └── paragraph.mjs ├── .github └── workflows │ └── npm-publish.yml ├── tsconfig.json ├── vite.config.js ├── LICENSE ├── package.json ├── README.md └── yarn.lock /.npmignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | src/ 3 | vite.config.js 4 | yarn.lock 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | npm-debug.log 3 | .idea/ 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /src/types/icons.d.ts: -------------------------------------------------------------------------------- 1 | // temporary fix for the missing types 2 | declare module "@codexteam/icons" { 3 | export const IconText: string; 4 | } 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = false 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | quote_type = single 11 | -------------------------------------------------------------------------------- /dist/utils/makeFragment.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Create a DocumentFragment and fill it with HTML from a string 3 | * 4 | * @param {string} htmlString - A string of valid HTML 5 | * @returns {DocumentFragment} 6 | */ 7 | export default function makeFragment(htmlString: string): DocumentFragment; 8 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2016", 4 | "module": "commonjs", 5 | "lib": ["dom", "es2015"], 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "skipLibCheck": true, 10 | "outDir": "./dist", 11 | "declaration": true, 12 | "declarationDir": "./dist/types", 13 | "isolatedModules": true 14 | }, 15 | "include": ["src"], 16 | "exclude": ["node_modules", "**/*.spec.ts"] 17 | } 18 | -------------------------------------------------------------------------------- /src/utils/makeFragment.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Create a DocumentFragment and fill it with HTML from a string 3 | * 4 | * @param {string} htmlString - A string of valid HTML 5 | * @returns {DocumentFragment} 6 | */ 7 | export default function makeFragment(htmlString: string): DocumentFragment { 8 | const tempDiv = document.createElement('div'); 9 | 10 | tempDiv.innerHTML = htmlString.trim(); 11 | 12 | const fragment = document.createDocumentFragment(); 13 | 14 | fragment.append(...Array.from(tempDiv.childNodes)); 15 | 16 | return fragment; 17 | } 18 | -------------------------------------------------------------------------------- /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 | import dts from "vite-plugin-dts"; 5 | 6 | const NODE_ENV = process.argv.mode || "development"; 7 | const VERSION = pkg.version; 8 | 9 | export default { 10 | build: { 11 | copyPublicDir: false, 12 | lib: { 13 | entry: path.resolve(__dirname, "src", "index.ts"), 14 | name: "Paragraph", 15 | fileName: "paragraph", 16 | }, 17 | }, 18 | define: { 19 | NODE_ENV: JSON.stringify(NODE_ENV), 20 | VERSION: JSON.stringify(VERSION), 21 | }, 22 | 23 | plugins: [cssInjectedByJsPlugin(), dts()], 24 | }; 25 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | .ce-paragraph { 2 | line-height: 1.6em; 3 | outline: none; 4 | } 5 | 6 | /** 7 | * Normally paragraph placeholder is shown only for the focused block (thanks to "data-placeholder-active"). 8 | * 9 | * But there is a special case when the paragraph is the only block in the empty editor. 10 | * When editor autofocus=false, there will be no focus. We need to show the placeholder anyway. 11 | */ 12 | .ce-block:only-of-type .ce-paragraph[data-placeholder-active]:empty::before, 13 | .ce-block:only-of-type .ce-paragraph[data-placeholder-active][data-empty="true"]::before { 14 | content: attr(data-placeholder-active); 15 | } 16 | 17 | .ce-paragraph p:first-of-type{ 18 | margin-top: 0; 19 | } 20 | 21 | .ce-paragraph p:last-of-type{ 22 | margin-bottom: 0; 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@editorjs/paragraph", 3 | "version": "2.11.7", 4 | "keywords": [ 5 | "codex editor", 6 | "paragraph", 7 | "editor.js", 8 | "editorjs" 9 | ], 10 | "description": "Paragraph Tool for Editor.js", 11 | "license": "MIT", 12 | "repository": "https://github.com/editor-js/paragraph", 13 | "files": [ 14 | "dist" 15 | ], 16 | "main": "./dist/paragraph.umd.js", 17 | "module": "./dist/paragraph.mjs", 18 | "exports": { 19 | ".": { 20 | "import": { 21 | "types": "./dist/index.d.ts", 22 | "default": "./dist/paragraph.mjs" 23 | }, 24 | "require": { 25 | "types": "./dist/index.d.ts", 26 | "default": "./dist/paragraph.umd.js" 27 | } 28 | } 29 | }, 30 | "types": "./dist/index.d.ts", 31 | "scripts": { 32 | "dev": "vite", 33 | "build": "vite build", 34 | "preview": "vite preview" 35 | }, 36 | "author": { 37 | "name": "CodeX", 38 | "email": "team@codex.so" 39 | }, 40 | "devDependencies": { 41 | "@editorjs/editorjs": "^2.29.1", 42 | "typescript": "^5.4.5", 43 | "vite": "^4.4.11", 44 | "vite-plugin-css-injected-by-js": "^3.3.0", 45 | "vite-plugin-dts": "^3.9.1" 46 | }, 47 | "dependencies": { 48 | "@codexteam/icons": "^0.0.4" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://badgen.net/badge/Editor.js/v2.0/blue) 2 | 3 | # Paragraph Tool for Editor.js 4 | 5 | Basic text Tool for the [Editor.js](https://ifmo.su/editor). 6 | 7 | ## Installation 8 | 9 | Get the package 10 | 11 | ```shell 12 | yarn add @editorjs/paragraph 13 | ``` 14 | 15 | Include module at your application 16 | 17 | ```javascript 18 | import Paragraph from '@editorjs/paragraph'; 19 | ``` 20 | 21 | ## Usage 22 | 23 | The Paragraph tool is included at editor.js by default. So you don't need to connect it manually. 24 | If you want to connect your customized version of this tool, do not forget to use the [`defaultBlock`](https://editorjs.io/configuration#change-the-default-block) 25 | option of the editor config. 26 | 27 | Add a new Tool to the `tools` property of the Editor.js initial config. 28 | 29 | ```javascript 30 | var editor = new EditorJS({ 31 | ... 32 | 33 | tools: { 34 | ... 35 | paragraph: { 36 | class: Paragraph, 37 | inlineToolbar: true, 38 | }, 39 | } 40 | 41 | ... 42 | }); 43 | ``` 44 | 45 | ## Config Params 46 | 47 | The Paragraph Tool supports these configuration parameters: 48 | 49 | | Field | Type | Description | 50 | | ----- | -------- | ------------------ | 51 | | placeholder | `string` | The placeholder. Will be shown only in the first paragraph when the whole editor is empty. | 52 | | preserveBlank | `boolean` | (default: `false`) Whether or not to keep blank paragraphs when saving editor data | 53 | 54 | ## Output data 55 | 56 | | Field | Type | Description | 57 | | ------ | -------- | ---------------- | 58 | | text | `string` | paragraph's text | 59 | 60 | 61 | ```json 62 | { 63 | "type" : "paragraph", 64 | "data" : { 65 | "text" : "Check out our projects on a GitHub page.", 66 | } 67 | } 68 | ``` 69 | 70 | -------------------------------------------------------------------------------- /dist/paragraph.umd.js: -------------------------------------------------------------------------------- 1 | (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(".ce-paragraph{line-height:1.6em;outline:none}.ce-block:only-of-type .ce-paragraph[data-placeholder-active]:empty:before,.ce-block:only-of-type .ce-paragraph[data-placeholder-active][data-empty=true]:before{content:attr(data-placeholder-active)}.ce-paragraph p:first-of-type{margin-top:0}.ce-paragraph p:last-of-type{margin-bottom:0}")),document.head.appendChild(e)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})(); 2 | (function(i,n){typeof exports=="object"&&typeof module<"u"?module.exports=n():typeof define=="function"&&define.amd?define(n):(i=typeof globalThis<"u"?globalThis:i||self,i.Paragraph=n())})(this,function(){"use strict";const i="",n='';function s(a){const e=document.createElement("div");e.innerHTML=a.trim();const t=document.createDocumentFragment();return t.append(...Array.from(e.childNodes)),t}/** 3 | * Base Paragraph Block for the Editor.js. 4 | * Represents a regular text block 5 | * 6 | * @author CodeX (team@codex.so) 7 | * @copyright CodeX 2018 8 | * @license The MIT License (MIT) 9 | */class r{static get DEFAULT_PLACEHOLDER(){return""}constructor({data:e,config:t,api:o,readOnly:l}){this.api=o,this.readOnly=l,this._CSS={block:this.api.styles.block,wrapper:"ce-paragraph"},this.readOnly||(this.onKeyUp=this.onKeyUp.bind(this)),this._placeholder=t.placeholder?t.placeholder:r.DEFAULT_PLACEHOLDER,this._data=e??{},this._element=null,this._preserveBlank=t.preserveBlank??!1}onKeyUp(e){if(e.code!=="Backspace"&&e.code!=="Delete"||!this._element)return;const{textContent:t}=this._element;t===""&&(this._element.innerHTML="")}drawView(){const e=document.createElement("DIV");return e.classList.add(this._CSS.wrapper,this._CSS.block),e.contentEditable="false",e.dataset.placeholderActive=this.api.i18n.t(this._placeholder),this._data.text&&(e.innerHTML=this._data.text),this.readOnly||(e.contentEditable="true",e.addEventListener("keyup",this.onKeyUp)),e}render(){return this._element=this.drawView(),this._element}merge(e){if(!this._element)return;this._data.text+=e.text;const t=s(e.text);this._element.appendChild(t),this._element.normalize()}validate(e){return!(e.text.trim()===""&&!this._preserveBlank)}save(e){return{text:e.innerHTML}}onPaste(e){const t={text:e.detail.data.innerHTML};this._data=t,window.requestAnimationFrame(()=>{this._element&&(this._element.innerHTML=this._data.text||"")})}static get conversionConfig(){return{export:"text",import:"text"}}static get sanitize(){return{text:{br:!0}}}static get isReadOnlySupported(){return!0}static get pasteConfig(){return{tags:["P"]}}static get toolbox(){return{icon:n,title:"Text"}}}return r}); 10 | -------------------------------------------------------------------------------- /dist/index.d.ts: -------------------------------------------------------------------------------- 1 | import { API, ConversionConfig, HTMLPasteEvent, PasteConfig, SanitizerConfig, ToolConfig, ToolboxConfig } from '@editorjs/editorjs'; 2 | 3 | /** 4 | * Base Paragraph Block for the Editor.js. 5 | * Represents a regular text block 6 | * 7 | * @author CodeX (team@codex.so) 8 | * @copyright CodeX 2018 9 | * @license The MIT License (MIT) 10 | */ 11 | /** 12 | * @typedef {object} ParagraphConfig 13 | * @property {string} placeholder - placeholder for the empty paragraph 14 | * @property {boolean} preserveBlank - Whether or not to keep blank paragraphs when saving editor data 15 | */ 16 | export interface ParagraphConfig extends ToolConfig { 17 | /** 18 | * Placeholder for the empty paragraph 19 | */ 20 | placeholder?: string; 21 | /** 22 | * Whether or not to keep blank paragraphs when saving editor data 23 | */ 24 | preserveBlank?: boolean; 25 | } 26 | /** 27 | * @typedef {object} ParagraphData 28 | * @description Tool's input and output data format 29 | * @property {string} text — Paragraph's content. Can include HTML tags: 30 | */ 31 | export interface ParagraphData { 32 | /** 33 | * Paragraph's content 34 | */ 35 | text: string; 36 | } 37 | /** 38 | * @typedef {object} ParagraphParams 39 | * @description Constructor params for the Paragraph tool, use to pass initial data and settings 40 | * @property {ParagraphData} data - Preload data for the paragraph. 41 | * @property {ParagraphConfig} config - The configuration for the paragraph. 42 | * @property {API} api - The Editor.js API. 43 | * @property {boolean} readOnly - Is paragraph is read-only. 44 | */ 45 | interface ParagraphParams { 46 | /** 47 | * Initial data for the paragraph 48 | */ 49 | data: ParagraphData; 50 | /** 51 | * Paragraph tool configuration 52 | */ 53 | config: ParagraphConfig; 54 | /** 55 | * Editor.js API 56 | */ 57 | api: API; 58 | /** 59 | * Is paragraph read-only. 60 | */ 61 | readOnly: boolean; 62 | } 63 | export default class Paragraph { 64 | /** 65 | * Default placeholder for Paragraph Tool 66 | * 67 | * @returns {string} 68 | * @class 69 | */ 70 | static get DEFAULT_PLACEHOLDER(): string; 71 | /** 72 | * The Editor.js API 73 | */ 74 | api: API; 75 | /** 76 | * Is Paragraph Tool read-only 77 | */ 78 | readOnly: boolean; 79 | /** 80 | * Paragraph Tool's CSS classes 81 | */ 82 | private _CSS; 83 | /** 84 | * Placeholder for Paragraph Tool 85 | */ 86 | private _placeholder; 87 | /** 88 | * Paragraph's data 89 | */ 90 | private _data; 91 | /** 92 | * Paragraph's main Element 93 | */ 94 | private _element; 95 | /** 96 | * Whether or not to keep blank paragraphs when saving editor data 97 | */ 98 | private _preserveBlank; 99 | /** 100 | * Render plugin`s main Element and fill it with saved data 101 | * 102 | * @param {object} params - constructor params 103 | * @param {ParagraphData} params.data - previously saved data 104 | * @param {ParagraphConfig} params.config - user config for Tool 105 | * @param {object} params.api - editor.js api 106 | * @param {boolean} readOnly - read only mode flag 107 | */ 108 | constructor({ data, config, api, readOnly }: ParagraphParams); 109 | /** 110 | * Check if text content is empty and set empty string to inner html. 111 | * We need this because some browsers (e.g. Safari) insert
into empty contenteditanle elements 112 | * 113 | * @param {KeyboardEvent} e - key up event 114 | */ 115 | onKeyUp(e: KeyboardEvent): void; 116 | /** 117 | * Create Tool's view 118 | * 119 | * @returns {HTMLDivElement} 120 | * @private 121 | */ 122 | drawView(): HTMLDivElement; 123 | /** 124 | * Return Tool's view 125 | * 126 | * @returns {HTMLDivElement} 127 | */ 128 | render(): HTMLDivElement; 129 | /** 130 | * Method that specified how to merge two Text blocks. 131 | * Called by Editor.js by backspace at the beginning of the Block 132 | * 133 | * @param {ParagraphData} data 134 | * @public 135 | */ 136 | merge(data: ParagraphData): void; 137 | /** 138 | * Validate Paragraph block data: 139 | * - check for emptiness 140 | * 141 | * @param {ParagraphData} savedData — data received after saving 142 | * @returns {boolean} false if saved data is not correct, otherwise true 143 | * @public 144 | */ 145 | validate(savedData: ParagraphData): boolean; 146 | /** 147 | * Extract Tool's data from the view 148 | * 149 | * @param {HTMLDivElement} toolsContent - Paragraph tools rendered view 150 | * @returns {ParagraphData} - saved data 151 | * @public 152 | */ 153 | save(toolsContent: HTMLDivElement): ParagraphData; 154 | /** 155 | * On paste callback fired from Editor. 156 | * 157 | * @param {HTMLPasteEvent} event - event with pasted data 158 | */ 159 | onPaste(event: HTMLPasteEvent): void; 160 | /** 161 | * Enable Conversion Toolbar. Paragraph can be converted to/from other tools 162 | * @returns {ConversionConfig} 163 | */ 164 | static get conversionConfig(): ConversionConfig; 165 | /** 166 | * Sanitizer rules 167 | * @returns {SanitizerConfig} - Edtior.js sanitizer config 168 | */ 169 | static get sanitize(): SanitizerConfig; 170 | /** 171 | * Returns true to notify the core that read-only mode is supported 172 | * 173 | * @returns {boolean} 174 | */ 175 | static get isReadOnlySupported(): boolean; 176 | /** 177 | * Used by Editor paste handling API. 178 | * Provides configuration to handle P tags. 179 | * 180 | * @returns {PasteConfig} - Paragraph Paste Setting 181 | */ 182 | static get pasteConfig(): PasteConfig; 183 | /** 184 | * Icon and title for displaying at the Toolbox 185 | * 186 | * @returns {ToolboxConfig} - Paragraph Toolbox Setting 187 | */ 188 | static get toolbox(): ToolboxConfig; 189 | } 190 | export {}; 191 | -------------------------------------------------------------------------------- /dist/paragraph.mjs: -------------------------------------------------------------------------------- 1 | (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(".ce-paragraph{line-height:1.6em;outline:none}.ce-block:only-of-type .ce-paragraph[data-placeholder-active]:empty:before,.ce-block:only-of-type .ce-paragraph[data-placeholder-active][data-empty=true]:before{content:attr(data-placeholder-active)}.ce-paragraph p:first-of-type{margin-top:0}.ce-paragraph p:last-of-type{margin-bottom:0}")),document.head.appendChild(e)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})(); 2 | const a = ''; 3 | function l(r) { 4 | const t = document.createElement("div"); 5 | t.innerHTML = r.trim(); 6 | const e = document.createDocumentFragment(); 7 | return e.append(...Array.from(t.childNodes)), e; 8 | } 9 | /** 10 | * Base Paragraph Block for the Editor.js. 11 | * Represents a regular text block 12 | * 13 | * @author CodeX (team@codex.so) 14 | * @copyright CodeX 2018 15 | * @license The MIT License (MIT) 16 | */ 17 | class n { 18 | /** 19 | * Default placeholder for Paragraph Tool 20 | * 21 | * @returns {string} 22 | * @class 23 | */ 24 | static get DEFAULT_PLACEHOLDER() { 25 | return ""; 26 | } 27 | /** 28 | * Render plugin`s main Element and fill it with saved data 29 | * 30 | * @param {object} params - constructor params 31 | * @param {ParagraphData} params.data - previously saved data 32 | * @param {ParagraphConfig} params.config - user config for Tool 33 | * @param {object} params.api - editor.js api 34 | * @param {boolean} readOnly - read only mode flag 35 | */ 36 | constructor({ data: t, config: e, api: i, readOnly: s }) { 37 | this.api = i, this.readOnly = s, this._CSS = { 38 | block: this.api.styles.block, 39 | wrapper: "ce-paragraph" 40 | }, this.readOnly || (this.onKeyUp = this.onKeyUp.bind(this)), this._placeholder = e.placeholder ? e.placeholder : n.DEFAULT_PLACEHOLDER, this._data = t ?? {}, this._element = null, this._preserveBlank = e.preserveBlank ?? !1; 41 | } 42 | /** 43 | * Check if text content is empty and set empty string to inner html. 44 | * We need this because some browsers (e.g. Safari) insert
into empty contenteditanle elements 45 | * 46 | * @param {KeyboardEvent} e - key up event 47 | */ 48 | onKeyUp(t) { 49 | if (t.code !== "Backspace" && t.code !== "Delete" || !this._element) 50 | return; 51 | const { textContent: e } = this._element; 52 | e === "" && (this._element.innerHTML = ""); 53 | } 54 | /** 55 | * Create Tool's view 56 | * 57 | * @returns {HTMLDivElement} 58 | * @private 59 | */ 60 | drawView() { 61 | const t = document.createElement("DIV"); 62 | return t.classList.add(this._CSS.wrapper, this._CSS.block), t.contentEditable = "false", t.dataset.placeholderActive = this.api.i18n.t(this._placeholder), this._data.text && (t.innerHTML = this._data.text), this.readOnly || (t.contentEditable = "true", t.addEventListener("keyup", this.onKeyUp)), t; 63 | } 64 | /** 65 | * Return Tool's view 66 | * 67 | * @returns {HTMLDivElement} 68 | */ 69 | render() { 70 | return this._element = this.drawView(), this._element; 71 | } 72 | /** 73 | * Method that specified how to merge two Text blocks. 74 | * Called by Editor.js by backspace at the beginning of the Block 75 | * 76 | * @param {ParagraphData} data 77 | * @public 78 | */ 79 | merge(t) { 80 | if (!this._element) 81 | return; 82 | this._data.text += t.text; 83 | const e = l(t.text); 84 | this._element.appendChild(e), this._element.normalize(); 85 | } 86 | /** 87 | * Validate Paragraph block data: 88 | * - check for emptiness 89 | * 90 | * @param {ParagraphData} savedData — data received after saving 91 | * @returns {boolean} false if saved data is not correct, otherwise true 92 | * @public 93 | */ 94 | validate(t) { 95 | return !(t.text.trim() === "" && !this._preserveBlank); 96 | } 97 | /** 98 | * Extract Tool's data from the view 99 | * 100 | * @param {HTMLDivElement} toolsContent - Paragraph tools rendered view 101 | * @returns {ParagraphData} - saved data 102 | * @public 103 | */ 104 | save(t) { 105 | return { 106 | text: t.innerHTML 107 | }; 108 | } 109 | /** 110 | * On paste callback fired from Editor. 111 | * 112 | * @param {HTMLPasteEvent} event - event with pasted data 113 | */ 114 | onPaste(t) { 115 | const e = { 116 | text: t.detail.data.innerHTML 117 | }; 118 | this._data = e, window.requestAnimationFrame(() => { 119 | this._element && (this._element.innerHTML = this._data.text || ""); 120 | }); 121 | } 122 | /** 123 | * Enable Conversion Toolbar. Paragraph can be converted to/from other tools 124 | * @returns {ConversionConfig} 125 | */ 126 | static get conversionConfig() { 127 | return { 128 | export: "text", 129 | // to convert Paragraph to other block, use 'text' property of saved data 130 | import: "text" 131 | // to covert other block's exported string to Paragraph, fill 'text' property of tool data 132 | }; 133 | } 134 | /** 135 | * Sanitizer rules 136 | * @returns {SanitizerConfig} - Edtior.js sanitizer config 137 | */ 138 | static get sanitize() { 139 | return { 140 | text: { 141 | br: !0 142 | } 143 | }; 144 | } 145 | /** 146 | * Returns true to notify the core that read-only mode is supported 147 | * 148 | * @returns {boolean} 149 | */ 150 | static get isReadOnlySupported() { 151 | return !0; 152 | } 153 | /** 154 | * Used by Editor paste handling API. 155 | * Provides configuration to handle P tags. 156 | * 157 | * @returns {PasteConfig} - Paragraph Paste Setting 158 | */ 159 | static get pasteConfig() { 160 | return { 161 | tags: ["P"] 162 | }; 163 | } 164 | /** 165 | * Icon and title for displaying at the Toolbox 166 | * 167 | * @returns {ToolboxConfig} - Paragraph Toolbox Setting 168 | */ 169 | static get toolbox() { 170 | return { 171 | icon: a, 172 | title: "Text" 173 | }; 174 | } 175 | } 176 | export { 177 | n as default 178 | }; 179 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Build styles 3 | */ 4 | import './index.css'; 5 | 6 | import { IconText } from '@codexteam/icons'; 7 | import makeFragment from './utils/makeFragment'; 8 | 9 | import type { 10 | API, 11 | ConversionConfig, 12 | HTMLPasteEvent, 13 | PasteConfig, 14 | SanitizerConfig, 15 | ToolConfig, 16 | ToolboxConfig, 17 | } from '@editorjs/editorjs'; 18 | 19 | /** 20 | * Base Paragraph Block for the Editor.js. 21 | * Represents a regular text block 22 | * 23 | * @author CodeX (team@codex.so) 24 | * @copyright CodeX 2018 25 | * @license The MIT License (MIT) 26 | */ 27 | 28 | /** 29 | * @typedef {object} ParagraphConfig 30 | * @property {string} placeholder - placeholder for the empty paragraph 31 | * @property {boolean} preserveBlank - Whether or not to keep blank paragraphs when saving editor data 32 | */ 33 | export interface ParagraphConfig extends ToolConfig { 34 | /** 35 | * Placeholder for the empty paragraph 36 | */ 37 | placeholder?: string; 38 | 39 | /** 40 | * Whether or not to keep blank paragraphs when saving editor data 41 | */ 42 | preserveBlank?: boolean; 43 | } 44 | 45 | /** 46 | * @typedef {object} ParagraphData 47 | * @description Tool's input and output data format 48 | * @property {string} text — Paragraph's content. Can include HTML tags:
49 | */ 50 | export interface ParagraphData { 51 | /** 52 | * Paragraph's content 53 | */ 54 | text: string; 55 | } 56 | 57 | /** 58 | * @typedef {object} ParagraphParams 59 | * @description Constructor params for the Paragraph tool, use to pass initial data and settings 60 | * @property {ParagraphData} data - Preload data for the paragraph. 61 | * @property {ParagraphConfig} config - The configuration for the paragraph. 62 | * @property {API} api - The Editor.js API. 63 | * @property {boolean} readOnly - Is paragraph is read-only. 64 | */ 65 | interface ParagraphParams { 66 | /** 67 | * Initial data for the paragraph 68 | */ 69 | data: ParagraphData; 70 | /** 71 | * Paragraph tool configuration 72 | */ 73 | config: ParagraphConfig; 74 | /** 75 | * Editor.js API 76 | */ 77 | api: API; 78 | /** 79 | * Is paragraph read-only. 80 | */ 81 | readOnly: boolean; 82 | } 83 | 84 | /** 85 | * @typedef {object} ParagraphCSS 86 | * @description CSS classes names 87 | * @property {string} block - Editor.js CSS Class for block 88 | * @property {string} wrapper - Paragraph CSS Class 89 | */ 90 | interface ParagraphCSS { 91 | /** 92 | * Editor.js CSS Class for block 93 | */ 94 | block: string; 95 | /** 96 | * Paragraph CSS Class 97 | */ 98 | wrapper: string; 99 | } 100 | 101 | export default class Paragraph { 102 | /** 103 | * Default placeholder for Paragraph Tool 104 | * 105 | * @returns {string} 106 | * @class 107 | */ 108 | static get DEFAULT_PLACEHOLDER() { 109 | return ''; 110 | } 111 | 112 | /** 113 | * The Editor.js API 114 | */ 115 | api: API; 116 | 117 | /** 118 | * Is Paragraph Tool read-only 119 | */ 120 | readOnly: boolean; 121 | 122 | /** 123 | * Paragraph Tool's CSS classes 124 | */ 125 | private _CSS: ParagraphCSS; 126 | 127 | /** 128 | * Placeholder for Paragraph Tool 129 | */ 130 | private _placeholder: string; 131 | 132 | /** 133 | * Paragraph's data 134 | */ 135 | private _data: ParagraphData; 136 | 137 | /** 138 | * Paragraph's main Element 139 | */ 140 | private _element: HTMLDivElement | null; 141 | 142 | /** 143 | * Whether or not to keep blank paragraphs when saving editor data 144 | */ 145 | private _preserveBlank: boolean; 146 | 147 | /** 148 | * Render plugin`s main Element and fill it with saved data 149 | * 150 | * @param {object} params - constructor params 151 | * @param {ParagraphData} params.data - previously saved data 152 | * @param {ParagraphConfig} params.config - user config for Tool 153 | * @param {object} params.api - editor.js api 154 | * @param {boolean} readOnly - read only mode flag 155 | */ 156 | constructor({ data, config, api, readOnly }: ParagraphParams) { 157 | this.api = api; 158 | this.readOnly = readOnly; 159 | 160 | this._CSS = { 161 | block: this.api.styles.block, 162 | wrapper: 'ce-paragraph', 163 | }; 164 | 165 | if (!this.readOnly) { 166 | this.onKeyUp = this.onKeyUp.bind(this); 167 | } 168 | 169 | /** 170 | * Placeholder for paragraph if it is first Block 171 | * 172 | * @type {string} 173 | */ 174 | this._placeholder = config.placeholder 175 | ? config.placeholder 176 | : Paragraph.DEFAULT_PLACEHOLDER; 177 | this._data = data ?? {}; 178 | this._element = null; 179 | this._preserveBlank = config.preserveBlank ?? false; 180 | } 181 | 182 | /** 183 | * Check if text content is empty and set empty string to inner html. 184 | * We need this because some browsers (e.g. Safari) insert
into empty contenteditanle elements 185 | * 186 | * @param {KeyboardEvent} e - key up event 187 | */ 188 | onKeyUp(e: KeyboardEvent): void { 189 | if (e.code !== 'Backspace' && e.code !== 'Delete') { 190 | return; 191 | } 192 | 193 | if (!this._element) { 194 | return; 195 | } 196 | 197 | const { textContent } = this._element; 198 | 199 | if (textContent === '') { 200 | this._element.innerHTML = ''; 201 | } 202 | } 203 | 204 | /** 205 | * Create Tool's view 206 | * 207 | * @returns {HTMLDivElement} 208 | * @private 209 | */ 210 | drawView(): HTMLDivElement { 211 | const div = document.createElement('DIV'); 212 | 213 | div.classList.add(this._CSS.wrapper, this._CSS.block); 214 | div.contentEditable = 'false'; 215 | div.dataset.placeholderActive = this.api.i18n.t(this._placeholder); 216 | 217 | if (this._data.text) { 218 | div.innerHTML = this._data.text; 219 | } 220 | 221 | if (!this.readOnly) { 222 | div.contentEditable = 'true'; 223 | div.addEventListener('keyup', this.onKeyUp); 224 | } 225 | 226 | /** 227 | * bypass property 'align' required in html div element 228 | */ 229 | return div as HTMLDivElement; 230 | } 231 | 232 | /** 233 | * Return Tool's view 234 | * 235 | * @returns {HTMLDivElement} 236 | */ 237 | render(): HTMLDivElement { 238 | this._element = this.drawView(); 239 | 240 | return this._element; 241 | } 242 | 243 | /** 244 | * Method that specified how to merge two Text blocks. 245 | * Called by Editor.js by backspace at the beginning of the Block 246 | * 247 | * @param {ParagraphData} data 248 | * @public 249 | */ 250 | merge(data: ParagraphData): void { 251 | if (!this._element) { 252 | return; 253 | } 254 | 255 | this._data.text += data.text; 256 | 257 | /** 258 | * We use appendChild instead of innerHTML to keep the links of the existing nodes 259 | * (for example, shadow caret) 260 | */ 261 | const fragment = makeFragment(data.text); 262 | 263 | this._element.appendChild(fragment); 264 | 265 | this._element.normalize(); 266 | } 267 | 268 | /** 269 | * Validate Paragraph block data: 270 | * - check for emptiness 271 | * 272 | * @param {ParagraphData} savedData — data received after saving 273 | * @returns {boolean} false if saved data is not correct, otherwise true 274 | * @public 275 | */ 276 | validate(savedData: ParagraphData): boolean { 277 | if (savedData.text.trim() === '' && !this._preserveBlank) { 278 | return false; 279 | } 280 | 281 | return true; 282 | } 283 | 284 | /** 285 | * Extract Tool's data from the view 286 | * 287 | * @param {HTMLDivElement} toolsContent - Paragraph tools rendered view 288 | * @returns {ParagraphData} - saved data 289 | * @public 290 | */ 291 | save(toolsContent: HTMLDivElement): ParagraphData { 292 | return { 293 | text: toolsContent.innerHTML, 294 | }; 295 | } 296 | 297 | /** 298 | * On paste callback fired from Editor. 299 | * 300 | * @param {HTMLPasteEvent} event - event with pasted data 301 | */ 302 | onPaste(event: HTMLPasteEvent): void { 303 | const data = { 304 | text: event.detail.data.innerHTML, 305 | }; 306 | 307 | this._data = data; 308 | 309 | /** 310 | * We use requestAnimationFrame for performance purposes 311 | */ 312 | window.requestAnimationFrame(() => { 313 | if (!this._element) { 314 | return; 315 | } 316 | this._element.innerHTML = this._data.text || ''; 317 | }); 318 | } 319 | 320 | /** 321 | * Enable Conversion Toolbar. Paragraph can be converted to/from other tools 322 | * @returns {ConversionConfig} 323 | */ 324 | static get conversionConfig(): ConversionConfig { 325 | return { 326 | export: 'text', // to convert Paragraph to other block, use 'text' property of saved data 327 | import: 'text', // to covert other block's exported string to Paragraph, fill 'text' property of tool data 328 | }; 329 | } 330 | 331 | /** 332 | * Sanitizer rules 333 | * @returns {SanitizerConfig} - Edtior.js sanitizer config 334 | */ 335 | static get sanitize(): SanitizerConfig { 336 | return { 337 | text: { 338 | br: true, 339 | }, 340 | }; 341 | } 342 | 343 | /** 344 | * Returns true to notify the core that read-only mode is supported 345 | * 346 | * @returns {boolean} 347 | */ 348 | static get isReadOnlySupported(): boolean { 349 | return true; 350 | } 351 | 352 | /** 353 | * Used by Editor paste handling API. 354 | * Provides configuration to handle P tags. 355 | * 356 | * @returns {PasteConfig} - Paragraph Paste Setting 357 | */ 358 | static get pasteConfig(): PasteConfig { 359 | return { 360 | tags: ['P'], 361 | }; 362 | } 363 | 364 | /** 365 | * Icon and title for displaying at the Toolbox 366 | * 367 | * @returns {ToolboxConfig} - Paragraph Toolbox Setting 368 | */ 369 | static get toolbox(): ToolboxConfig { 370 | return { 371 | icon: IconText, 372 | title: 'Text', 373 | }; 374 | } 375 | } 376 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/parser@^7.24.4": 6 | version "7.24.6" 7 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz" 8 | integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== 9 | 10 | "@codexteam/icons@^0.0.4": 11 | version "0.0.4" 12 | resolved "https://registry.npmjs.org/@codexteam/icons/-/icons-0.0.4.tgz" 13 | integrity sha512-V8N/TY2TGyas4wLrPIFq7bcow68b3gu8DfDt1+rrHPtXxcexadKauRJL6eQgfG7Z0LCrN4boLRawR4S9gjIh/Q== 14 | 15 | "@editorjs/editorjs@^2.29.1": 16 | version "2.29.1" 17 | resolved "https://registry.npmjs.org/@editorjs/editorjs/-/editorjs-2.29.1.tgz" 18 | integrity sha512-WRT2pCfikMsvySQJqpCU21LfTZaPuxUWsDO8aFGrPx4MKzOR9D+Ur4mNb3jq0FXx2EMqvIWfTyFixJxtjGHTyQ== 19 | 20 | "@esbuild/android-arm64@0.18.20": 21 | version "0.18.20" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" 23 | integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== 24 | 25 | "@esbuild/android-arm@0.18.20": 26 | version "0.18.20" 27 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" 28 | integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== 29 | 30 | "@esbuild/android-x64@0.18.20": 31 | version "0.18.20" 32 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" 33 | integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== 34 | 35 | "@esbuild/darwin-arm64@0.18.20": 36 | version "0.18.20" 37 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" 38 | integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== 39 | 40 | "@esbuild/darwin-x64@0.18.20": 41 | version "0.18.20" 42 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" 43 | integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== 44 | 45 | "@esbuild/freebsd-arm64@0.18.20": 46 | version "0.18.20" 47 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" 48 | integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== 49 | 50 | "@esbuild/freebsd-x64@0.18.20": 51 | version "0.18.20" 52 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" 53 | integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== 54 | 55 | "@esbuild/linux-arm64@0.18.20": 56 | version "0.18.20" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" 58 | integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== 59 | 60 | "@esbuild/linux-arm@0.18.20": 61 | version "0.18.20" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" 63 | integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== 64 | 65 | "@esbuild/linux-ia32@0.18.20": 66 | version "0.18.20" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" 68 | integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== 69 | 70 | "@esbuild/linux-loong64@0.18.20": 71 | version "0.18.20" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" 73 | integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== 74 | 75 | "@esbuild/linux-mips64el@0.18.20": 76 | version "0.18.20" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" 78 | integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== 79 | 80 | "@esbuild/linux-ppc64@0.18.20": 81 | version "0.18.20" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" 83 | integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== 84 | 85 | "@esbuild/linux-riscv64@0.18.20": 86 | version "0.18.20" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" 88 | integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== 89 | 90 | "@esbuild/linux-s390x@0.18.20": 91 | version "0.18.20" 92 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" 93 | integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== 94 | 95 | "@esbuild/linux-x64@0.18.20": 96 | version "0.18.20" 97 | resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz" 98 | integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== 99 | 100 | "@esbuild/netbsd-x64@0.18.20": 101 | version "0.18.20" 102 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" 103 | integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== 104 | 105 | "@esbuild/openbsd-x64@0.18.20": 106 | version "0.18.20" 107 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" 108 | integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== 109 | 110 | "@esbuild/sunos-x64@0.18.20": 111 | version "0.18.20" 112 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" 113 | integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== 114 | 115 | "@esbuild/win32-arm64@0.18.20": 116 | version "0.18.20" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" 118 | integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== 119 | 120 | "@esbuild/win32-ia32@0.18.20": 121 | version "0.18.20" 122 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" 123 | integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== 124 | 125 | "@esbuild/win32-x64@0.18.20": 126 | version "0.18.20" 127 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" 128 | integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== 129 | 130 | "@jridgewell/sourcemap-codec@^1.4.15": 131 | version "1.4.15" 132 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" 133 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 134 | 135 | "@microsoft/api-extractor-model@7.28.13": 136 | version "7.28.13" 137 | resolved "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.13.tgz" 138 | integrity sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw== 139 | dependencies: 140 | "@microsoft/tsdoc" "0.14.2" 141 | "@microsoft/tsdoc-config" "~0.16.1" 142 | "@rushstack/node-core-library" "4.0.2" 143 | 144 | "@microsoft/api-extractor@7.43.0": 145 | version "7.43.0" 146 | resolved "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz" 147 | integrity sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w== 148 | dependencies: 149 | "@microsoft/api-extractor-model" "7.28.13" 150 | "@microsoft/tsdoc" "0.14.2" 151 | "@microsoft/tsdoc-config" "~0.16.1" 152 | "@rushstack/node-core-library" "4.0.2" 153 | "@rushstack/rig-package" "0.5.2" 154 | "@rushstack/terminal" "0.10.0" 155 | "@rushstack/ts-command-line" "4.19.1" 156 | lodash "~4.17.15" 157 | minimatch "~3.0.3" 158 | resolve "~1.22.1" 159 | semver "~7.5.4" 160 | source-map "~0.6.1" 161 | typescript "5.4.2" 162 | 163 | "@microsoft/tsdoc-config@~0.16.1": 164 | version "0.16.2" 165 | resolved "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz" 166 | integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== 167 | dependencies: 168 | "@microsoft/tsdoc" "0.14.2" 169 | ajv "~6.12.6" 170 | jju "~1.4.0" 171 | resolve "~1.19.0" 172 | 173 | "@microsoft/tsdoc@0.14.2": 174 | version "0.14.2" 175 | resolved "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz" 176 | integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== 177 | 178 | "@rollup/pluginutils@^5.1.0": 179 | version "5.1.0" 180 | resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz" 181 | integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== 182 | dependencies: 183 | "@types/estree" "^1.0.0" 184 | estree-walker "^2.0.2" 185 | picomatch "^2.3.1" 186 | 187 | "@rushstack/node-core-library@4.0.2": 188 | version "4.0.2" 189 | resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-4.0.2.tgz" 190 | integrity sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg== 191 | dependencies: 192 | fs-extra "~7.0.1" 193 | import-lazy "~4.0.0" 194 | jju "~1.4.0" 195 | resolve "~1.22.1" 196 | semver "~7.5.4" 197 | z-schema "~5.0.2" 198 | 199 | "@rushstack/rig-package@0.5.2": 200 | version "0.5.2" 201 | resolved "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.2.tgz" 202 | integrity sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA== 203 | dependencies: 204 | resolve "~1.22.1" 205 | strip-json-comments "~3.1.1" 206 | 207 | "@rushstack/terminal@0.10.0": 208 | version "0.10.0" 209 | resolved "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.10.0.tgz" 210 | integrity sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw== 211 | dependencies: 212 | "@rushstack/node-core-library" "4.0.2" 213 | supports-color "~8.1.1" 214 | 215 | "@rushstack/ts-command-line@4.19.1": 216 | version "4.19.1" 217 | resolved "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.19.1.tgz" 218 | integrity sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg== 219 | dependencies: 220 | "@rushstack/terminal" "0.10.0" 221 | "@types/argparse" "1.0.38" 222 | argparse "~1.0.9" 223 | string-argv "~0.3.1" 224 | 225 | "@types/argparse@1.0.38": 226 | version "1.0.38" 227 | resolved "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz" 228 | integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== 229 | 230 | "@types/estree@^1.0.0": 231 | version "1.0.5" 232 | resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" 233 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 234 | 235 | "@volar/language-core@1.11.1", "@volar/language-core@~1.11.1": 236 | version "1.11.1" 237 | resolved "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz" 238 | integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw== 239 | dependencies: 240 | "@volar/source-map" "1.11.1" 241 | 242 | "@volar/source-map@1.11.1", "@volar/source-map@~1.11.1": 243 | version "1.11.1" 244 | resolved "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz" 245 | integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg== 246 | dependencies: 247 | muggle-string "^0.3.1" 248 | 249 | "@volar/typescript@~1.11.1": 250 | version "1.11.1" 251 | resolved "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz" 252 | integrity sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ== 253 | dependencies: 254 | "@volar/language-core" "1.11.1" 255 | path-browserify "^1.0.1" 256 | 257 | "@vue/compiler-core@3.4.27": 258 | version "3.4.27" 259 | resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz" 260 | integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg== 261 | dependencies: 262 | "@babel/parser" "^7.24.4" 263 | "@vue/shared" "3.4.27" 264 | entities "^4.5.0" 265 | estree-walker "^2.0.2" 266 | source-map-js "^1.2.0" 267 | 268 | "@vue/compiler-dom@^3.3.0": 269 | version "3.4.27" 270 | resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz" 271 | integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== 272 | dependencies: 273 | "@vue/compiler-core" "3.4.27" 274 | "@vue/shared" "3.4.27" 275 | 276 | "@vue/language-core@1.8.27", "@vue/language-core@^1.8.27": 277 | version "1.8.27" 278 | resolved "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz" 279 | integrity sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA== 280 | dependencies: 281 | "@volar/language-core" "~1.11.1" 282 | "@volar/source-map" "~1.11.1" 283 | "@vue/compiler-dom" "^3.3.0" 284 | "@vue/shared" "^3.3.0" 285 | computeds "^0.0.1" 286 | minimatch "^9.0.3" 287 | muggle-string "^0.3.1" 288 | path-browserify "^1.0.1" 289 | vue-template-compiler "^2.7.14" 290 | 291 | "@vue/shared@3.4.27", "@vue/shared@^3.3.0": 292 | version "3.4.27" 293 | resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz" 294 | integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== 295 | 296 | ajv@~6.12.6: 297 | version "6.12.6" 298 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 299 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 300 | dependencies: 301 | fast-deep-equal "^3.1.1" 302 | fast-json-stable-stringify "^2.0.0" 303 | json-schema-traverse "^0.4.1" 304 | uri-js "^4.2.2" 305 | 306 | argparse@~1.0.9: 307 | version "1.0.10" 308 | resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 309 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 310 | dependencies: 311 | sprintf-js "~1.0.2" 312 | 313 | balanced-match@^1.0.0: 314 | version "1.0.2" 315 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 316 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 317 | 318 | brace-expansion@^1.1.7: 319 | version "1.1.11" 320 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 321 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 322 | dependencies: 323 | balanced-match "^1.0.0" 324 | concat-map "0.0.1" 325 | 326 | brace-expansion@^2.0.1: 327 | version "2.0.1" 328 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 329 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 330 | dependencies: 331 | balanced-match "^1.0.0" 332 | 333 | commander@^9.4.1: 334 | version "9.5.0" 335 | resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" 336 | integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== 337 | 338 | computeds@^0.0.1: 339 | version "0.0.1" 340 | resolved "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz" 341 | integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== 342 | 343 | concat-map@0.0.1: 344 | version "0.0.1" 345 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 346 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 347 | 348 | de-indent@^1.0.2: 349 | version "1.0.2" 350 | resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" 351 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== 352 | 353 | debug@^4.3.4: 354 | version "4.3.5" 355 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" 356 | integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== 357 | dependencies: 358 | ms "2.1.2" 359 | 360 | entities@^4.5.0: 361 | version "4.5.0" 362 | resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" 363 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 364 | 365 | esbuild@^0.18.10: 366 | version "0.18.20" 367 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" 368 | integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== 369 | optionalDependencies: 370 | "@esbuild/android-arm" "0.18.20" 371 | "@esbuild/android-arm64" "0.18.20" 372 | "@esbuild/android-x64" "0.18.20" 373 | "@esbuild/darwin-arm64" "0.18.20" 374 | "@esbuild/darwin-x64" "0.18.20" 375 | "@esbuild/freebsd-arm64" "0.18.20" 376 | "@esbuild/freebsd-x64" "0.18.20" 377 | "@esbuild/linux-arm" "0.18.20" 378 | "@esbuild/linux-arm64" "0.18.20" 379 | "@esbuild/linux-ia32" "0.18.20" 380 | "@esbuild/linux-loong64" "0.18.20" 381 | "@esbuild/linux-mips64el" "0.18.20" 382 | "@esbuild/linux-ppc64" "0.18.20" 383 | "@esbuild/linux-riscv64" "0.18.20" 384 | "@esbuild/linux-s390x" "0.18.20" 385 | "@esbuild/linux-x64" "0.18.20" 386 | "@esbuild/netbsd-x64" "0.18.20" 387 | "@esbuild/openbsd-x64" "0.18.20" 388 | "@esbuild/sunos-x64" "0.18.20" 389 | "@esbuild/win32-arm64" "0.18.20" 390 | "@esbuild/win32-ia32" "0.18.20" 391 | "@esbuild/win32-x64" "0.18.20" 392 | 393 | estree-walker@^2.0.2: 394 | version "2.0.2" 395 | resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" 396 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 397 | 398 | fast-deep-equal@^3.1.1: 399 | version "3.1.3" 400 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 401 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 402 | 403 | fast-json-stable-stringify@^2.0.0: 404 | version "2.1.0" 405 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 406 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 407 | 408 | fs-extra@~7.0.1: 409 | version "7.0.1" 410 | resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" 411 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 412 | dependencies: 413 | graceful-fs "^4.1.2" 414 | jsonfile "^4.0.0" 415 | universalify "^0.1.0" 416 | 417 | fsevents@~2.3.2: 418 | version "2.3.3" 419 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 420 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 421 | 422 | function-bind@^1.1.2: 423 | version "1.1.2" 424 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" 425 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 426 | 427 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 428 | version "4.2.11" 429 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" 430 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 431 | 432 | has-flag@^4.0.0: 433 | version "4.0.0" 434 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 435 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 436 | 437 | hasown@^2.0.0: 438 | version "2.0.2" 439 | resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" 440 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 441 | dependencies: 442 | function-bind "^1.1.2" 443 | 444 | he@^1.2.0: 445 | version "1.2.0" 446 | resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 447 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 448 | 449 | import-lazy@~4.0.0: 450 | version "4.0.0" 451 | resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" 452 | integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== 453 | 454 | is-core-module@^2.1.0, is-core-module@^2.13.0: 455 | version "2.13.1" 456 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" 457 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== 458 | dependencies: 459 | hasown "^2.0.0" 460 | 461 | jju@~1.4.0: 462 | version "1.4.0" 463 | resolved "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" 464 | integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== 465 | 466 | json-schema-traverse@^0.4.1: 467 | version "0.4.1" 468 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 469 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 470 | 471 | jsonfile@^4.0.0: 472 | version "4.0.0" 473 | resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" 474 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 475 | optionalDependencies: 476 | graceful-fs "^4.1.6" 477 | 478 | kolorist@^1.8.0: 479 | version "1.8.0" 480 | resolved "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz" 481 | integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== 482 | 483 | lodash.get@^4.4.2: 484 | version "4.4.2" 485 | resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" 486 | integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== 487 | 488 | lodash.isequal@^4.5.0: 489 | version "4.5.0" 490 | resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" 491 | integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== 492 | 493 | lodash@~4.17.15: 494 | version "4.17.21" 495 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 496 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 497 | 498 | lru-cache@^6.0.0: 499 | version "6.0.0" 500 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" 501 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 502 | dependencies: 503 | yallist "^4.0.0" 504 | 505 | magic-string@^0.30.8: 506 | version "0.30.10" 507 | resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz" 508 | integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== 509 | dependencies: 510 | "@jridgewell/sourcemap-codec" "^1.4.15" 511 | 512 | minimatch@^9.0.3: 513 | version "9.0.4" 514 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" 515 | integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== 516 | dependencies: 517 | brace-expansion "^2.0.1" 518 | 519 | minimatch@~3.0.3: 520 | version "3.0.8" 521 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz" 522 | integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== 523 | dependencies: 524 | brace-expansion "^1.1.7" 525 | 526 | ms@2.1.2: 527 | version "2.1.2" 528 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 529 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 530 | 531 | muggle-string@^0.3.1: 532 | version "0.3.1" 533 | resolved "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz" 534 | integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== 535 | 536 | nanoid@^3.3.6: 537 | version "3.3.6" 538 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" 539 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== 540 | 541 | path-browserify@^1.0.1: 542 | version "1.0.1" 543 | resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" 544 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== 545 | 546 | path-parse@^1.0.6, path-parse@^1.0.7: 547 | version "1.0.7" 548 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 549 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 550 | 551 | picocolors@^1.0.0: 552 | version "1.0.0" 553 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 554 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 555 | 556 | picomatch@^2.3.1: 557 | version "2.3.1" 558 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 559 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 560 | 561 | postcss@^8.4.27: 562 | version "8.4.31" 563 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" 564 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== 565 | dependencies: 566 | nanoid "^3.3.6" 567 | picocolors "^1.0.0" 568 | source-map-js "^1.0.2" 569 | 570 | punycode@^2.1.0: 571 | version "2.3.1" 572 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" 573 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 574 | 575 | resolve@~1.19.0: 576 | version "1.19.0" 577 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz" 578 | integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== 579 | dependencies: 580 | is-core-module "^2.1.0" 581 | path-parse "^1.0.6" 582 | 583 | resolve@~1.22.1: 584 | version "1.22.8" 585 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" 586 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 587 | dependencies: 588 | is-core-module "^2.13.0" 589 | path-parse "^1.0.7" 590 | supports-preserve-symlinks-flag "^1.0.0" 591 | 592 | rollup@^3.27.1: 593 | version "3.29.4" 594 | resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" 595 | integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== 596 | optionalDependencies: 597 | fsevents "~2.3.2" 598 | 599 | semver@^7.5.4, semver@~7.5.4: 600 | version "7.5.4" 601 | resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" 602 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 603 | dependencies: 604 | lru-cache "^6.0.0" 605 | 606 | source-map-js@^1.0.2, source-map-js@^1.2.0: 607 | version "1.2.0" 608 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" 609 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 610 | 611 | source-map@~0.6.1: 612 | version "0.6.1" 613 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 614 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 615 | 616 | sprintf-js@~1.0.2: 617 | version "1.0.3" 618 | resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 619 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 620 | 621 | string-argv@~0.3.1: 622 | version "0.3.2" 623 | resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" 624 | integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== 625 | 626 | strip-json-comments@~3.1.1: 627 | version "3.1.1" 628 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 629 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 630 | 631 | supports-color@~8.1.1: 632 | version "8.1.1" 633 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" 634 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 635 | dependencies: 636 | has-flag "^4.0.0" 637 | 638 | supports-preserve-symlinks-flag@^1.0.0: 639 | version "1.0.0" 640 | resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 641 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 642 | 643 | typescript@5.4.2: 644 | version "5.4.2" 645 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz" 646 | integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== 647 | 648 | typescript@^5.4.5: 649 | version "5.4.5" 650 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" 651 | integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== 652 | 653 | universalify@^0.1.0: 654 | version "0.1.2" 655 | resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" 656 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 657 | 658 | uri-js@^4.2.2: 659 | version "4.4.1" 660 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 661 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 662 | dependencies: 663 | punycode "^2.1.0" 664 | 665 | validator@^13.7.0: 666 | version "13.12.0" 667 | resolved "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz" 668 | integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== 669 | 670 | vite-plugin-css-injected-by-js@^3.3.0: 671 | version "3.3.0" 672 | resolved "https://registry.npmjs.org/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.3.0.tgz" 673 | integrity sha512-xG+jyHNCmUqi/TXp6q88wTJGeAOrNLSyUUTp4qEQ9QZLGcHWQQsCsSSKa59rPMQr8sOzfzmWDd8enGqfH/dBew== 674 | 675 | vite-plugin-dts@^3.9.1: 676 | version "3.9.1" 677 | resolved "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.9.1.tgz" 678 | integrity sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg== 679 | dependencies: 680 | "@microsoft/api-extractor" "7.43.0" 681 | "@rollup/pluginutils" "^5.1.0" 682 | "@vue/language-core" "^1.8.27" 683 | debug "^4.3.4" 684 | kolorist "^1.8.0" 685 | magic-string "^0.30.8" 686 | vue-tsc "^1.8.27" 687 | 688 | vite@^4.4.11: 689 | version "4.4.11" 690 | resolved "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz" 691 | integrity sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A== 692 | dependencies: 693 | esbuild "^0.18.10" 694 | postcss "^8.4.27" 695 | rollup "^3.27.1" 696 | optionalDependencies: 697 | fsevents "~2.3.2" 698 | 699 | vue-template-compiler@^2.7.14: 700 | version "2.7.16" 701 | resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz" 702 | integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== 703 | dependencies: 704 | de-indent "^1.0.2" 705 | he "^1.2.0" 706 | 707 | vue-tsc@^1.8.27: 708 | version "1.8.27" 709 | resolved "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz" 710 | integrity sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg== 711 | dependencies: 712 | "@volar/typescript" "~1.11.1" 713 | "@vue/language-core" "1.8.27" 714 | semver "^7.5.4" 715 | 716 | yallist@^4.0.0: 717 | version "4.0.0" 718 | resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 719 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 720 | 721 | z-schema@~5.0.2: 722 | version "5.0.5" 723 | resolved "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz" 724 | integrity sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q== 725 | dependencies: 726 | lodash.get "^4.4.2" 727 | lodash.isequal "^4.5.0" 728 | validator "^13.7.0" 729 | optionalDependencies: 730 | commander "^9.4.1" 731 | --------------------------------------------------------------------------------