├── .gitignore ├── LICENSE ├── README.md ├── build ├── Parser.browser.js ├── Parser.esm.js └── Parser.node.js ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── Parser.js ├── config.js ├── parsers.js └── utitlities.js └── test ├── test.js └── testData.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | # Ignore IDE configuration files 4 | .idea/ 5 | .vscode/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Michael Jones 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Editorjs-parser 2 | 3 | editorjs-parser is a NPM package for parsing the output object of [EditorJs](https://github.com/codex-team/editor.js) to HTML. 4 | 5 | # Installation 6 | 7 | ### CDN 8 | 9 | - https://cdn.jsdelivr.net/npm/editorjs-parser@1/build/Parser.node.min.js (Node only) 10 | - https://cdn.jsdelivr.net/npm/editorjs-parser@1/build/Parser.browser.min.js (Browser only) 11 | 12 | ### NPM 13 | 14 | Use the package manager [npm](https://www.npmjs.com/) to install editorjs-parser. 15 | 16 | ```bash 17 | npm install --save editorjs-parser 18 | ``` 19 | 20 | # Usage 21 | 22 | To use the package in browser, import Browser verison through CDN to your HTML file and just call `edjsParser` class: 23 | 24 | ```javascript 25 | const parser = new edjsParser(config, customParsers, embedMarkup); 26 | ``` 27 | 28 | To import the package in Node and Front-end code: 29 | 30 | ```javascript 31 | const edjsParser = require("editorjs-parser"); 32 | const parser = new edjsParser(config, customParsers, embedMarkup); 33 | ``` 34 | 35 | **NOTE:** **Parameters are optional**. If you want to only pass the second parameter, set the first parameter to `undefined`. 36 | 37 | To parse all blocks, pass the exact EditorJs' output object: 38 | 39 | ```javascript 40 | const markup = parser.parse(output); 41 | ``` 42 | 43 | To parse one block, pass a complete block: 44 | 45 | ```javascript 46 | const markup = parser.parseBlock(block); 47 | ``` 48 | 49 | **NOTE:** HTML markup in code blocks are already sanitized and ready to be send to browser. You don't have to do anything. 50 | 51 | **NOTE:** Code blocks are compatible with [highlight.js](https://github.com/highlightjs/highlight.js/) 52 | 53 | ## Supported blocks 54 | 55 | - Paragraph 56 | - Header 57 | - Table 58 | - Raw 59 | - Delimiter 60 | - Code 61 | - Quote 62 | - List 63 | - Embed 64 | - Image 65 | - Simple-image 66 | 67 | **NOTE:** It is pointless to use both `image` and `simple-image` block types in the same editor insatnce, but this parser supports both of them and you can use any of them that fulfills your needs. 68 | 69 | ## Custom or overriding parser methods 70 | 71 | If you have a custom block like so: 72 | 73 | ```javascript 74 | { 75 | type: "customBlock", 76 | data: { 77 | // Your data 78 | } 79 | } 80 | ``` 81 | 82 | You can pass an object of custom parsers or override existing parsers of supported blocks as the second argument, like so: 83 | 84 | ```javascript 85 | const customParsers = { 86 | customBlock: function(data, config) { 87 | // parsing functionality 88 | // the config arg is user provided config merged with default config 89 | }, 90 | image: function(data, config): { 91 | return `${data.caption}`; 92 | } 93 | } 94 | 95 | const parser = new edjsParser(undefined, customParsers); 96 | ``` 97 | 98 | **NOTE:** The config arg is user provided config merged with default configuration. 99 | 100 | ## Configuration 101 | 102 | This is the default configuration. You can override any of these properties by passing a config object. 103 | 104 | ```javascript 105 | { 106 | image: { 107 | use: "figure", 108 | // use figure or img tag for images (figcaption will be used for caption of figure) 109 | // if you use figure, caption will be visible 110 | imgClass: "img", // used class for img tags 111 | figureClass: "fig-img", // used class for figure tags 112 | figCapClass: "fig-cap", // used class for figcaption tags 113 | path: "absolute", 114 | // if absolute is passed, the url property which is the absolute path to the image will be used 115 | // otherwise pass a relative path with the filename property in <> like so: '/img/' 116 | }, 117 | paragraph: { 118 | pClass: "paragraph", // used class for paragraph tags 119 | }, 120 | code: { 121 | codeBlockClass: "code-block", // used class for code blocks 122 | }, 123 | embed: { 124 | useProvidedLength: false, 125 | // set to true if you want the returned width and height of editorjs to be applied 126 | // NOTE: sometimes source site overrides the lengths so it does not work 100% 127 | }, 128 | quote: { 129 | applyAlignment: false, 130 | // if set to true blockquote element will have text-align css property set 131 | }, 132 | }; 133 | ``` 134 | 135 | ### Relative path (images) 136 | 137 | To use the relative path, you should return the filename of the uploaded image from your backend, alongside the url (for more info [docs](https://github.com/editor-js/image#backend-response-format-)). 138 | 139 | Then include the property name of filename in config like so: (for example the property name of the returned filename is `imageFileName`) 140 | 141 | ```javascript 142 | const config = { 143 | image: { 144 | path: "/img/"; 145 | } 146 | }; 147 | 148 | const parser = new edjsParser(config); 149 | ``` 150 | 151 | **NOTE:** Images will have class `img`. 152 | 153 | **NOTE:** If the image is streched, the parsed `img` tag will have `img-fullwidth` as class. 154 | 155 | **NOTE:** If image is set to have a border, the parsed `img` tag will have `img-border` as class. 156 | 157 | **NOTE:** If `withBackground` is set to true, the parsed `img` tag will have `img-bg` as class. 158 | 159 | You can style, according to these classes. 160 | 161 | ### Apply provided lengths (embeds) 162 | 163 | If you want the returned width and height of embeded element to be applied, set `useProvidedLength` option to true in config: 164 | 165 | ```javascript 166 | const config = { 167 | embed: { 168 | useProvidedLength: true, 169 | }, 170 | }; 171 | 172 | const parser = new edjsParser(config); 173 | ``` 174 | 175 | ### Custom embed markup (embeds) 176 | 177 | If you want to render a custom markup for your embed service, pass it in an object in third argument. For example if you want your own markup to be rendered for Youtube video embed, you got to do this: 178 | 179 | ```javascript 180 | const parser = new edjsParser(undifined, undifined, { 181 | youtube: `Your markup in string`, 182 | }); 183 | ``` 184 | 185 | You also have access to `data` object. To use that you should put variable names in placeholders, like so: 186 | 187 | ```javascript 188 | const customEmbeds = { 189 | youtube: ``, 190 | }; 191 | 192 | const parser = new edjsParser(undifined, undifined, customEmbeds); 193 | ``` 194 | 195 | **NOTE:** If you want to have [useProvidedLength](#apply-provided-lengths-embeds) functionality, use `<%data.length%>` instead of `<%data.width%>` and `<%data.height%>` in embed markups. 196 | 197 | `<%data.length%>` returns string like this: `width="300" height="500"` 198 | 199 | ### Qoute Alignment (quotes) 200 | 201 | If you need the returned alignment of blockquotes to be set, set `applyAlignment` to true in config: 202 | 203 | ```javascript 204 | const config = { 205 | quote: { 206 | applyAlignment: true; 207 | } 208 | }; 209 | 210 | const parser = new edjsParser(config); 211 | ``` 212 | 213 | # Contributing 214 | 215 | Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate. 216 | 217 | For any issue or feature request, please open an issue. 218 | 219 | # License 220 | 221 | [MIT](https://choosealicense.com/licenses/mit/) 222 | -------------------------------------------------------------------------------- /build/Parser.browser.js: -------------------------------------------------------------------------------- 1 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2 | 3 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 4 | 5 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 6 | 7 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 8 | 9 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 10 | 11 | var edjsParser = function () { 12 | 'use strict'; 13 | 14 | var isObject = function isObject(item) { 15 | return item && _typeof(item) === "object" && !Array.isArray(item); 16 | }; 17 | 18 | var mergeDeep = function mergeDeep(target, source) { 19 | var output = Object.assign({}, target); 20 | 21 | if (isObject(target) && isObject(source)) { 22 | Object.keys(source).forEach(function (key) { 23 | if (isObject(source[key])) { 24 | if (!(key in target)) Object.assign(output, _defineProperty({}, key, source[key]));else output[key] = mergeDeep(target[key], source[key]); 25 | } else { 26 | Object.assign(output, _defineProperty({}, key, source[key])); 27 | } 28 | }); 29 | } 30 | 31 | return output; 32 | }; 33 | 34 | var sanitizeHtml = function sanitizeHtml(markup) { 35 | markup = markup.replace(/&/g, "&"); 36 | markup = markup.replace(//g, ">"); 38 | return markup; 39 | }; 40 | 41 | var embedMarkups = { 42 | youtube: "
", 43 | twitter: "
>\">
", 44 | instagram: "
>/captioned\">
", 45 | codepen: "
", 46 | defaultMarkup: "
" 47 | }; 48 | var defaultParsers = { 49 | paragraph: function paragraph(data, config) { 50 | return "

").concat(data.text, "

"); 51 | }, 52 | header: function header(data) { 53 | return "").concat(data.text, ""); 54 | }, 55 | list: function list(data) { 56 | var type = data.style === "ordered" ? "ol" : "ul"; 57 | var items = data.items.reduce(function (acc, item) { 58 | return acc + "
  • ".concat(item, "
  • "); 59 | }, ""); 60 | return "<".concat(type, ">").concat(items, ""); 61 | }, 62 | quote: function quote(data, config) { 63 | var alignment = ""; 64 | 65 | if (config.quote.applyAlignment) { 66 | alignment = "style=\"text-align: ".concat(data.alignment, ";\""); 67 | } 68 | 69 | return "

    ").concat(data.text, "

    ").concat(data.caption, "
    "); 70 | }, 71 | table: function table(data) { 72 | var rows = data.content.map(function (row) { 73 | return "".concat(row.reduce(function (acc, cell) { 74 | return acc + "".concat(cell, ""); 75 | }, ""), ""); 76 | }); 77 | return "".concat(rows.join(""), "
    "); 78 | }, 79 | image: function image(data, config) { 80 | var imageConditions = "".concat(data.stretched ? "img-fullwidth" : "", " ").concat(data.withBorder ? "img-border" : "", " ").concat(data.withBackground ? "img-bg" : ""); 81 | var imgClass = config.image.imgClass || ""; 82 | var imageSrc; 83 | 84 | if (data.url) { 85 | // simple-image was used and the image probably is not uploaded to this server 86 | // therefore, we use the absolute path provided in data.url 87 | // so, config.image.path property is useless in this case! 88 | imageSrc = data.url; 89 | } else if (config.image.path === "absolute") { 90 | imageSrc = data.file.url; 91 | } else { 92 | imageSrc = config.image.path.replace(/<(.+)>/, function (match, p1) { 93 | return data.file[p1]; 94 | }); 95 | } 96 | 97 | if (config.image.use === "img") { 98 | return "\"").concat(data.caption,"); 99 | } else if (config.image.use === "figure") { 100 | var figureClass = config.image.figureClass || ""; 101 | var figCapClass = config.image.figCapClass || ""; 102 | return "
    \"").concat(data.caption,
    ").concat(data.caption, "
    "); 103 | } 104 | }, 105 | code: function code(data, config) { 106 | var markup = sanitizeHtml(data.code); 107 | return "
    ").concat(markup, "
    "); 108 | }, 109 | raw: function raw(data) { 110 | return data.html; 111 | }, 112 | delimiter: function delimiter(data) { 113 | return "
    "; 114 | }, 115 | embed: function embed(data, config) { 116 | if (config.embed.useProvidedLength) { 117 | data.length = "width=\"".concat(data.width, "\" height=\"").concat(data.height, "\""); 118 | } else { 119 | data.length = ""; 120 | } 121 | 122 | var regex = new RegExp(/<%data\.(.+?)%>/, "gm"); 123 | 124 | if (config.embedMarkups[data.service]) { 125 | return config.embedMarkups[data.service].replace(regex, function (match, p1) { 126 | return data[p1]; 127 | }); 128 | } else { 129 | return config.embedMarkups["defaultMarkup"].replace(regex, function (match, p1) { 130 | return data[p1]; 131 | }); 132 | } 133 | } 134 | }; 135 | var defaultConfig = { 136 | image: { 137 | use: "figure", 138 | // figure or img (figcaption will be used for caption of figure) 139 | imgClass: "img", 140 | figureClass: "fig-img", 141 | figCapClass: "fig-cap", 142 | path: "absolute" 143 | }, 144 | paragraph: { 145 | pClass: "paragraph" 146 | }, 147 | code: { 148 | codeBlockClass: "code-block" 149 | }, 150 | embed: { 151 | useProvidedLength: false // set to true if you want the returned width and height of editorjs to be applied 152 | // NOTE: sometimes source site overrides the lengths so it does not work 100% 153 | 154 | }, 155 | quote: { 156 | applyAlignment: false // if set to true blockquote element will have text-align css property set 157 | 158 | } 159 | }; 160 | 161 | var edjsParser = /*#__PURE__*/function () { 162 | function edjsParser() { 163 | var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 164 | var customs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 165 | var embeds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 166 | 167 | _classCallCheck(this, edjsParser); 168 | 169 | this.config = mergeDeep(defaultConfig, config); 170 | this.config.embedMarkups = Object.assign(embedMarkups, embeds); 171 | this.parsers = Object.assign(defaultParsers, customs); 172 | } 173 | 174 | _createClass(edjsParser, [{ 175 | key: "parse", 176 | value: function parse(EditorJsObject) { 177 | var _this = this; 178 | 179 | var html = EditorJsObject.blocks.map(function (block) { 180 | var markup = _this.parseBlock(block); 181 | 182 | if (markup instanceof Error) { 183 | return ""; // parser for this kind of block doesn't exist 184 | } 185 | 186 | return markup; 187 | }); 188 | return html.join(""); 189 | } 190 | }, { 191 | key: "parseBlock", 192 | value: function parseBlock(block) { 193 | if (!this.parsers[block.type]) { 194 | return new Error("".concat(block.type, " is not supported! Define your own custom function.")); 195 | } 196 | 197 | try { 198 | return this.parsers[block.type](block.data, this.config); 199 | } catch (err) { 200 | return err; 201 | } 202 | } 203 | }]); 204 | 205 | return edjsParser; 206 | }(); 207 | 208 | return edjsParser; 209 | }(); 210 | -------------------------------------------------------------------------------- /build/Parser.esm.js: -------------------------------------------------------------------------------- 1 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2 | 3 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 4 | 5 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 6 | 7 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 8 | 9 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 10 | 11 | var isObject = function isObject(item) { 12 | return item && _typeof(item) === "object" && !Array.isArray(item); 13 | }; 14 | 15 | var mergeDeep = function mergeDeep(target, source) { 16 | var output = Object.assign({}, target); 17 | 18 | if (isObject(target) && isObject(source)) { 19 | Object.keys(source).forEach(function (key) { 20 | if (isObject(source[key])) { 21 | if (!(key in target)) Object.assign(output, _defineProperty({}, key, source[key]));else output[key] = mergeDeep(target[key], source[key]); 22 | } else { 23 | Object.assign(output, _defineProperty({}, key, source[key])); 24 | } 25 | }); 26 | } 27 | 28 | return output; 29 | }; 30 | 31 | var sanitizeHtml = function sanitizeHtml(markup) { 32 | markup = markup.replace(/&/g, "&"); 33 | markup = markup.replace(//g, ">"); 35 | return markup; 36 | }; 37 | 38 | var embedMarkups = { 39 | youtube: "
    ", 40 | twitter: "
    >\">
    ", 41 | instagram: "
    >/captioned\">
    ", 42 | codepen: "
    ", 43 | defaultMarkup: "
    " 44 | }; 45 | var defaultParsers = { 46 | paragraph: function paragraph(data, config) { 47 | return "

    ").concat(data.text, "

    "); 48 | }, 49 | header: function header(data) { 50 | return "").concat(data.text, ""); 51 | }, 52 | list: function list(data) { 53 | var type = data.style === "ordered" ? "ol" : "ul"; 54 | var items = data.items.reduce(function (acc, item) { 55 | return acc + "
  • ".concat(item, "
  • "); 56 | }, ""); 57 | return "<".concat(type, ">").concat(items, ""); 58 | }, 59 | quote: function quote(data, config) { 60 | var alignment = ""; 61 | 62 | if (config.quote.applyAlignment) { 63 | alignment = "style=\"text-align: ".concat(data.alignment, ";\""); 64 | } 65 | 66 | return "

    ").concat(data.text, "

    ").concat(data.caption, "
    "); 67 | }, 68 | table: function table(data) { 69 | var rows = data.content.map(function (row) { 70 | return "".concat(row.reduce(function (acc, cell) { 71 | return acc + "".concat(cell, ""); 72 | }, ""), ""); 73 | }); 74 | return "".concat(rows.join(""), "
    "); 75 | }, 76 | image: function image(data, config) { 77 | var imageConditions = "".concat(data.stretched ? "img-fullwidth" : "", " ").concat(data.withBorder ? "img-border" : "", " ").concat(data.withBackground ? "img-bg" : ""); 78 | var imgClass = config.image.imgClass || ""; 79 | var imageSrc; 80 | 81 | if (data.url) { 82 | // simple-image was used and the image probably is not uploaded to this server 83 | // therefore, we use the absolute path provided in data.url 84 | // so, config.image.path property is useless in this case! 85 | imageSrc = data.url; 86 | } else if (config.image.path === "absolute") { 87 | imageSrc = data.file.url; 88 | } else { 89 | imageSrc = config.image.path.replace(/<(.+)>/, function (match, p1) { 90 | return data.file[p1]; 91 | }); 92 | } 93 | 94 | if (config.image.use === "img") { 95 | return "\"").concat(data.caption,"); 96 | } else if (config.image.use === "figure") { 97 | var figureClass = config.image.figureClass || ""; 98 | var figCapClass = config.image.figCapClass || ""; 99 | return "
    \"").concat(data.caption,
    ").concat(data.caption, "
    "); 100 | } 101 | }, 102 | code: function code(data, config) { 103 | var markup = sanitizeHtml(data.code); 104 | return "
    ").concat(markup, "
    "); 105 | }, 106 | raw: function raw(data) { 107 | return data.html; 108 | }, 109 | delimiter: function delimiter(data) { 110 | return "
    "; 111 | }, 112 | embed: function embed(data, config) { 113 | if (config.embed.useProvidedLength) { 114 | data.length = "width=\"".concat(data.width, "\" height=\"").concat(data.height, "\""); 115 | } else { 116 | data.length = ""; 117 | } 118 | 119 | var regex = new RegExp(/<%data\.(.+?)%>/, "gm"); 120 | 121 | if (config.embedMarkups[data.service]) { 122 | return config.embedMarkups[data.service].replace(regex, function (match, p1) { 123 | return data[p1]; 124 | }); 125 | } else { 126 | return config.embedMarkups["defaultMarkup"].replace(regex, function (match, p1) { 127 | return data[p1]; 128 | }); 129 | } 130 | } 131 | }; 132 | var defaultConfig = { 133 | image: { 134 | use: "figure", 135 | // figure or img (figcaption will be used for caption of figure) 136 | imgClass: "img", 137 | figureClass: "fig-img", 138 | figCapClass: "fig-cap", 139 | path: "absolute" 140 | }, 141 | paragraph: { 142 | pClass: "paragraph" 143 | }, 144 | code: { 145 | codeBlockClass: "code-block" 146 | }, 147 | embed: { 148 | useProvidedLength: false // set to true if you want the returned width and height of editorjs to be applied 149 | // NOTE: sometimes source site overrides the lengths so it does not work 100% 150 | 151 | }, 152 | quote: { 153 | applyAlignment: false // if set to true blockquote element will have text-align css property set 154 | 155 | } 156 | }; 157 | 158 | var edjsParser = /*#__PURE__*/function () { 159 | function edjsParser() { 160 | var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 161 | var customs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 162 | var embeds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 163 | 164 | _classCallCheck(this, edjsParser); 165 | 166 | this.config = mergeDeep(defaultConfig, config); 167 | this.config.embedMarkups = Object.assign(embedMarkups, embeds); 168 | this.parsers = Object.assign(defaultParsers, customs); 169 | } 170 | 171 | _createClass(edjsParser, [{ 172 | key: "parse", 173 | value: function parse(EditorJsObject) { 174 | var _this = this; 175 | 176 | var html = EditorJsObject.blocks.map(function (block) { 177 | var markup = _this.parseBlock(block); 178 | 179 | if (markup instanceof Error) { 180 | return ""; // parser for this kind of block doesn't exist 181 | } 182 | 183 | return markup; 184 | }); 185 | return html.join(""); 186 | } 187 | }, { 188 | key: "parseBlock", 189 | value: function parseBlock(block) { 190 | if (!this.parsers[block.type]) { 191 | return new Error("".concat(block.type, " is not supported! Define your own custom function.")); 192 | } 193 | 194 | try { 195 | return this.parsers[block.type](block.data, this.config); 196 | } catch (err) { 197 | return err; 198 | } 199 | } 200 | }]); 201 | 202 | return edjsParser; 203 | }(); 204 | 205 | export default edjsParser; 206 | -------------------------------------------------------------------------------- /build/Parser.node.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const isObject = function(item) { 4 | return item && typeof item === "object" && !Array.isArray(item); 5 | }; 6 | 7 | const mergeDeep = function(target, source) { 8 | let output = Object.assign({}, target); 9 | if (isObject(target) && isObject(source)) { 10 | Object.keys(source).forEach((key) => { 11 | if (isObject(source[key])) { 12 | if (!(key in target)) 13 | Object.assign(output, { 14 | [key]: source[key], 15 | }); 16 | else output[key] = mergeDeep(target[key], source[key]); 17 | } else { 18 | Object.assign(output, { 19 | [key]: source[key], 20 | }); 21 | } 22 | }); 23 | } 24 | return output; 25 | }; 26 | 27 | const sanitizeHtml = function(markup) { 28 | markup = markup.replace(/&/g, "&"); 29 | markup = markup.replace(//g, ">"); 31 | return markup; 32 | }; 33 | 34 | const embedMarkups = { 35 | youtube: `
    `, 36 | 37 | twitter: ` `, 38 | 39 | instagram: `
    >
    `, 40 | 41 | codepen: `
    `, 42 | 43 | defaultMarkup: `
    `, 44 | }; 45 | 46 | var defaultParsers = { 47 | paragraph: function(data, config) { 48 | return `

    ${data.text}

    `; 49 | }, 50 | 51 | header: function(data) { 52 | return `${data.text}`; 53 | }, 54 | 55 | list: function(data) { 56 | const type = data.style === "ordered" ? "ol" : "ul"; 57 | const items = data.items.reduce( 58 | (acc, item) => acc + `
  • ${item}
  • `, 59 | "" 60 | ); 61 | return `<${type}>${items}`; 62 | }, 63 | 64 | quote: function(data, config) { 65 | let alignment = ""; 66 | if (config.quote.applyAlignment) { 67 | alignment = `style="text-align: ${data.alignment};"`; 68 | } 69 | return `

    ${data.text}

    ${data.caption}
    `; 70 | }, 71 | 72 | table: function(data) { 73 | const rows = data.content.map((row) => { 74 | return `${row.reduce( 75 | (acc, cell) => acc + `${cell}`, 76 | "" 77 | )}`; 78 | }); 79 | return `${rows.join("")}
    `; 80 | }, 81 | image: function (data, config) { 82 | const imageConditions = `${data.stretched ? "img-fullwidth" : ""} ${ 83 | data.withBorder ? "img-border" : "" 84 | } ${data.withBackground ? "img-bg" : ""}`; 85 | const imgClass = config.image.imgClass || ""; 86 | let imageSrc; 87 | 88 | if (data.url) { 89 | // simple-image was used and the image probably is not uploaded to this server 90 | // therefore, we use the absolute path provided in data.url 91 | // so, config.image.path property is useless in this case! 92 | imageSrc = data.url; 93 | } else if (config.image.path === "absolute") { 94 | imageSrc = data.file.url; 95 | } else { 96 | imageSrc = config.image.path.replace( 97 | /<(.+)>/, 98 | (match, p1) => data.file[p1] 99 | ); 100 | } 101 | 102 | if (config.image.use === "img") { 103 | return `${data.caption}`; 104 | } else if (config.image.use === "figure") { 105 | const figureClass = config.image.figureClass || ""; 106 | const figCapClass = config.image.figCapClass || ""; 107 | 108 | return `
    ${data.caption}
    ${data.caption}
    `; 109 | } 110 | }, 111 | code: function (data, config) { 112 | const markup = sanitizeHtml(data.code); 113 | return `
    ${markup}
    `; 114 | }, 115 | raw: function (data) { 116 | return data.html; 117 | }, 118 | delimiter: function (data) { 119 | return "
    "; 120 | }, 121 | 122 | embed: function (data, config) { 123 | if (config.embed.useProvidedLength) { 124 | data.length = `width="${data.width}" height="${data.height}"`; 125 | } else { 126 | data.length = ""; 127 | } 128 | const regex = new RegExp(/<%data\.(.+?)%>/, "gm"); 129 | if (config.embedMarkups[data.service]) { 130 | return config.embedMarkups[data.service].replace( 131 | regex, 132 | (match, p1) => data[p1] 133 | ); 134 | } else { 135 | return config.embedMarkups["defaultMarkup"].replace( 136 | regex, 137 | (match, p1) => data[p1] 138 | ); 139 | } 140 | }, 141 | }; 142 | 143 | var defaultConfig = { 144 | image: { 145 | use: "figure", // figure or img (figcaption will be used for caption of figure) 146 | imgClass: "img", 147 | figureClass: "fig-img", 148 | figCapClass: "fig-cap", 149 | path: "absolute", 150 | }, 151 | paragraph: { 152 | pClass: "paragraph", 153 | }, 154 | code: { 155 | codeBlockClass: "code-block", 156 | }, 157 | embed: { 158 | useProvidedLength: false, 159 | // set to true if you want the returned width and height of editorjs to be applied 160 | // NOTE: sometimes source site overrides the lengths so it does not work 100% 161 | }, 162 | quote: { 163 | applyAlignment: false, 164 | // if set to true blockquote element will have text-align css property set 165 | }, 166 | }; 167 | 168 | class edjsParser { 169 | constructor(config = {}, customs = {}, embeds = {}) { 170 | this.config = mergeDeep(defaultConfig, config); 171 | this.config.embedMarkups = Object.assign(embedMarkups, embeds); 172 | this.parsers = Object.assign(defaultParsers, customs); 173 | } 174 | 175 | parse(EditorJsObject) { 176 | const html = EditorJsObject.blocks.map((block) => { 177 | const markup = this.parseBlock(block); 178 | if (markup instanceof Error) { 179 | return ""; // parser for this kind of block doesn't exist 180 | } 181 | return markup; 182 | }); 183 | return html.join(""); 184 | } 185 | 186 | parseBlock(block) { 187 | if (!this.parsers[block.type]) { 188 | return new Error( 189 | `${block.type} is not supported! Define your own custom function.` 190 | ); 191 | } 192 | try { 193 | return this.parsers[block.type](block.data, this.config); 194 | } catch (err) { 195 | return err; 196 | } 197 | } 198 | } 199 | 200 | module.exports = edjsParser; 201 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "editorjs-parser", 3 | "version": "1.5.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.12.0", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.0.tgz", 19 | "integrity": "sha512-jAbCtMANC9ptXxbSVXIqV/3H0bkh7iyyv6JS5lu10av45bcc2QmDNJXkASZCFwbBt75Q0AEq/BB+bNa3x1QgYQ==", 20 | "dev": true 21 | }, 22 | "@babel/core": { 23 | "version": "7.12.0", 24 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.0.tgz", 25 | "integrity": "sha512-iV7Gwg0DePKvdDZZWRTkj4MW+6/AbVWd4ZCg+zk8H1RVt5xBpUZS6vLQWwb3pyLg4BFTaGiQCPoJ4Ibmbne4fA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/code-frame": "^7.10.4", 29 | "@babel/generator": "^7.12.0", 30 | "@babel/helper-module-transforms": "^7.12.0", 31 | "@babel/helpers": "^7.10.4", 32 | "@babel/parser": "^7.12.0", 33 | "@babel/template": "^7.10.4", 34 | "@babel/traverse": "^7.12.0", 35 | "@babel/types": "^7.12.0", 36 | "convert-source-map": "^1.7.0", 37 | "debug": "^4.1.0", 38 | "gensync": "^1.0.0-beta.1", 39 | "json5": "^2.1.2", 40 | "lodash": "^4.17.19", 41 | "resolve": "^1.3.2", 42 | "semver": "^5.4.1", 43 | "source-map": "^0.5.0" 44 | } 45 | }, 46 | "@babel/generator": { 47 | "version": "7.12.0", 48 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.0.tgz", 49 | "integrity": "sha512-8lnf4QcyiQMf5XQp47BltuMTocsOh6P0z/vueEh8GzhmWWlDbdvOoI5Ziddg0XYhmnx35HyByUW51/9NprF8cA==", 50 | "dev": true, 51 | "requires": { 52 | "@babel/types": "^7.12.0", 53 | "jsesc": "^2.5.1", 54 | "source-map": "^0.5.0" 55 | } 56 | }, 57 | "@babel/helper-annotate-as-pure": { 58 | "version": "7.10.4", 59 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", 60 | "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", 61 | "dev": true, 62 | "requires": { 63 | "@babel/types": "^7.10.4" 64 | } 65 | }, 66 | "@babel/helper-builder-binary-assignment-operator-visitor": { 67 | "version": "7.10.4", 68 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", 69 | "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", 70 | "dev": true, 71 | "requires": { 72 | "@babel/helper-explode-assignable-expression": "^7.10.4", 73 | "@babel/types": "^7.10.4" 74 | } 75 | }, 76 | "@babel/helper-compilation-targets": { 77 | "version": "7.12.0", 78 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.0.tgz", 79 | "integrity": "sha512-NbDFJNjDgxE7IkrHp5gq2+Tr8bEdCLKYN90YDQEjMiTMUAFAcShNkaH8kydcmU0mEQTiQY0Ydy/+1xfS2OCEnw==", 80 | "dev": true, 81 | "requires": { 82 | "@babel/compat-data": "^7.12.0", 83 | "@babel/helper-validator-option": "^7.12.0", 84 | "browserslist": "^4.12.0", 85 | "semver": "^5.5.0" 86 | } 87 | }, 88 | "@babel/helper-create-class-features-plugin": { 89 | "version": "7.12.0", 90 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.0.tgz", 91 | "integrity": "sha512-9tD1r9RK928vxvxcoNK8/7uwT7Q2DJZP1dnJmyMAJPwOF0yr8PPwqdpyw33lUpCfrJ765bOs5XNa4KSfUDWFSw==", 92 | "dev": true, 93 | "requires": { 94 | "@babel/helper-function-name": "^7.10.4", 95 | "@babel/helper-member-expression-to-functions": "^7.12.0", 96 | "@babel/helper-optimise-call-expression": "^7.10.4", 97 | "@babel/helper-plugin-utils": "^7.10.4", 98 | "@babel/helper-replace-supers": "^7.12.0", 99 | "@babel/helper-split-export-declaration": "^7.10.4" 100 | } 101 | }, 102 | "@babel/helper-create-regexp-features-plugin": { 103 | "version": "7.12.0", 104 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.0.tgz", 105 | "integrity": "sha512-YBqH+3wLcom+tko8/JLgRcG8DMqORgmjqNRNI751gTioJSZHWFybO1mRoLtJtWIlYSHY+zT9LqqnbbK1c3KIVQ==", 106 | "dev": true, 107 | "requires": { 108 | "@babel/helper-annotate-as-pure": "^7.10.4", 109 | "@babel/helper-regex": "^7.10.4", 110 | "regexpu-core": "^4.7.1" 111 | } 112 | }, 113 | "@babel/helper-define-map": { 114 | "version": "7.10.5", 115 | "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", 116 | "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", 117 | "dev": true, 118 | "requires": { 119 | "@babel/helper-function-name": "^7.10.4", 120 | "@babel/types": "^7.10.5", 121 | "lodash": "^4.17.19" 122 | } 123 | }, 124 | "@babel/helper-explode-assignable-expression": { 125 | "version": "7.11.4", 126 | "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", 127 | "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", 128 | "dev": true, 129 | "requires": { 130 | "@babel/types": "^7.10.4" 131 | } 132 | }, 133 | "@babel/helper-function-name": { 134 | "version": "7.10.4", 135 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", 136 | "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", 137 | "dev": true, 138 | "requires": { 139 | "@babel/helper-get-function-arity": "^7.10.4", 140 | "@babel/template": "^7.10.4", 141 | "@babel/types": "^7.10.4" 142 | } 143 | }, 144 | "@babel/helper-get-function-arity": { 145 | "version": "7.10.4", 146 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", 147 | "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", 148 | "dev": true, 149 | "requires": { 150 | "@babel/types": "^7.10.4" 151 | } 152 | }, 153 | "@babel/helper-hoist-variables": { 154 | "version": "7.10.4", 155 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", 156 | "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", 157 | "dev": true, 158 | "requires": { 159 | "@babel/types": "^7.10.4" 160 | } 161 | }, 162 | "@babel/helper-member-expression-to-functions": { 163 | "version": "7.12.0", 164 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.0.tgz", 165 | "integrity": "sha512-I0d/bgzgzgLsJMk7UZ0TN2KV3OGjC/t/9Saz8PKb9jrcEAXhgjGysOgp4PDKydIKjUv/gj2St4ae+ov8l+T9Xg==", 166 | "dev": true, 167 | "requires": { 168 | "@babel/types": "^7.12.0" 169 | } 170 | }, 171 | "@babel/helper-module-imports": { 172 | "version": "7.10.4", 173 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", 174 | "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", 175 | "dev": true, 176 | "requires": { 177 | "@babel/types": "^7.10.4" 178 | } 179 | }, 180 | "@babel/helper-module-transforms": { 181 | "version": "7.12.0", 182 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.0.tgz", 183 | "integrity": "sha512-1ZTMoCiLSzTJLbq7mSaTHki4oIrBIf/dUbzdhwTrvtMU3ZNVKwQmGae3gSiqppo7G8HAgnXmc43rfEaD8yYLLQ==", 184 | "dev": true, 185 | "requires": { 186 | "@babel/helper-module-imports": "^7.10.4", 187 | "@babel/helper-replace-supers": "^7.12.0", 188 | "@babel/helper-simple-access": "^7.10.4", 189 | "@babel/helper-split-export-declaration": "^7.11.0", 190 | "@babel/helper-validator-identifier": "^7.10.4", 191 | "@babel/template": "^7.10.4", 192 | "@babel/traverse": "^7.12.0", 193 | "@babel/types": "^7.12.0", 194 | "lodash": "^4.17.19" 195 | } 196 | }, 197 | "@babel/helper-optimise-call-expression": { 198 | "version": "7.10.4", 199 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", 200 | "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", 201 | "dev": true, 202 | "requires": { 203 | "@babel/types": "^7.10.4" 204 | } 205 | }, 206 | "@babel/helper-plugin-utils": { 207 | "version": "7.10.4", 208 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", 209 | "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", 210 | "dev": true 211 | }, 212 | "@babel/helper-regex": { 213 | "version": "7.10.5", 214 | "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", 215 | "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", 216 | "dev": true, 217 | "requires": { 218 | "lodash": "^4.17.19" 219 | } 220 | }, 221 | "@babel/helper-remap-async-to-generator": { 222 | "version": "7.11.4", 223 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", 224 | "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", 225 | "dev": true, 226 | "requires": { 227 | "@babel/helper-annotate-as-pure": "^7.10.4", 228 | "@babel/helper-wrap-function": "^7.10.4", 229 | "@babel/template": "^7.10.4", 230 | "@babel/types": "^7.10.4" 231 | } 232 | }, 233 | "@babel/helper-replace-supers": { 234 | "version": "7.12.0", 235 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.0.tgz", 236 | "integrity": "sha512-9kycFdq2c9e7PXZOr2z/ZqTFF9OzFu287iFwYS+CiDVPuoTCfY8hoTsIqNQNetQjlqoRsRyJFrMG1uhGAR4EEw==", 237 | "dev": true, 238 | "requires": { 239 | "@babel/helper-member-expression-to-functions": "^7.12.0", 240 | "@babel/helper-optimise-call-expression": "^7.10.4", 241 | "@babel/traverse": "^7.12.0", 242 | "@babel/types": "^7.12.0" 243 | } 244 | }, 245 | "@babel/helper-simple-access": { 246 | "version": "7.10.4", 247 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", 248 | "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", 249 | "dev": true, 250 | "requires": { 251 | "@babel/template": "^7.10.4", 252 | "@babel/types": "^7.10.4" 253 | } 254 | }, 255 | "@babel/helper-skip-transparent-expression-wrappers": { 256 | "version": "7.11.0", 257 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", 258 | "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", 259 | "dev": true, 260 | "requires": { 261 | "@babel/types": "^7.11.0" 262 | } 263 | }, 264 | "@babel/helper-split-export-declaration": { 265 | "version": "7.11.0", 266 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", 267 | "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", 268 | "dev": true, 269 | "requires": { 270 | "@babel/types": "^7.11.0" 271 | } 272 | }, 273 | "@babel/helper-validator-identifier": { 274 | "version": "7.10.4", 275 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 276 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 277 | "dev": true 278 | }, 279 | "@babel/helper-validator-option": { 280 | "version": "7.12.0", 281 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.0.tgz", 282 | "integrity": "sha512-NRfKaAQw/JCMsTFUdJI6cp4MoJGGVBRQTRSiW1nwlGldNqzjB9jqWI0SZqQksC724dJoKqwG+QqfS9ib7SoVsw==", 283 | "dev": true 284 | }, 285 | "@babel/helper-wrap-function": { 286 | "version": "7.10.4", 287 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", 288 | "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", 289 | "dev": true, 290 | "requires": { 291 | "@babel/helper-function-name": "^7.10.4", 292 | "@babel/template": "^7.10.4", 293 | "@babel/traverse": "^7.10.4", 294 | "@babel/types": "^7.10.4" 295 | } 296 | }, 297 | "@babel/helpers": { 298 | "version": "7.10.4", 299 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", 300 | "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", 301 | "dev": true, 302 | "requires": { 303 | "@babel/template": "^7.10.4", 304 | "@babel/traverse": "^7.10.4", 305 | "@babel/types": "^7.10.4" 306 | } 307 | }, 308 | "@babel/highlight": { 309 | "version": "7.10.4", 310 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 311 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 312 | "dev": true, 313 | "requires": { 314 | "@babel/helper-validator-identifier": "^7.10.4", 315 | "chalk": "^2.0.0", 316 | "js-tokens": "^4.0.0" 317 | } 318 | }, 319 | "@babel/parser": { 320 | "version": "7.12.0", 321 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.0.tgz", 322 | "integrity": "sha512-dYmySMYnlus2jwl7JnnajAj11obRStZoW9cG04wh4ZuhozDn11tDUrhHcUZ9iuNHqALAhh60XqNaYXpvuuE/Gg==", 323 | "dev": true 324 | }, 325 | "@babel/plugin-proposal-async-generator-functions": { 326 | "version": "7.10.5", 327 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", 328 | "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", 329 | "dev": true, 330 | "requires": { 331 | "@babel/helper-plugin-utils": "^7.10.4", 332 | "@babel/helper-remap-async-to-generator": "^7.10.4", 333 | "@babel/plugin-syntax-async-generators": "^7.8.0" 334 | } 335 | }, 336 | "@babel/plugin-proposal-class-properties": { 337 | "version": "7.10.4", 338 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", 339 | "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", 340 | "dev": true, 341 | "requires": { 342 | "@babel/helper-create-class-features-plugin": "^7.10.4", 343 | "@babel/helper-plugin-utils": "^7.10.4" 344 | } 345 | }, 346 | "@babel/plugin-proposal-dynamic-import": { 347 | "version": "7.10.4", 348 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", 349 | "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", 350 | "dev": true, 351 | "requires": { 352 | "@babel/helper-plugin-utils": "^7.10.4", 353 | "@babel/plugin-syntax-dynamic-import": "^7.8.0" 354 | } 355 | }, 356 | "@babel/plugin-proposal-export-namespace-from": { 357 | "version": "7.12.0", 358 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.0.tgz", 359 | "integrity": "sha512-ao43U2ptSe+mIZAQo2nBV5Wx2Ie3i2XbLt8jCXZpv+bvLY1Twv0lak4YZ1Ps5OwbeLMAl3iOVScgGMOImBae1g==", 360 | "dev": true, 361 | "requires": { 362 | "@babel/helper-plugin-utils": "^7.10.4", 363 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 364 | } 365 | }, 366 | "@babel/plugin-proposal-json-strings": { 367 | "version": "7.10.4", 368 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", 369 | "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", 370 | "dev": true, 371 | "requires": { 372 | "@babel/helper-plugin-utils": "^7.10.4", 373 | "@babel/plugin-syntax-json-strings": "^7.8.0" 374 | } 375 | }, 376 | "@babel/plugin-proposal-logical-assignment-operators": { 377 | "version": "7.12.0", 378 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.0.tgz", 379 | "integrity": "sha512-dssjXHzdMQal4q6GCSwDTVPEbyBLdd9+7aSlzAkQbrGEKq5xG8pvhQ7u2ktUrCLRmzQphZnSzILBL5ta4xSRlA==", 380 | "dev": true, 381 | "requires": { 382 | "@babel/helper-plugin-utils": "^7.10.4", 383 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 384 | } 385 | }, 386 | "@babel/plugin-proposal-nullish-coalescing-operator": { 387 | "version": "7.12.0", 388 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.0.tgz", 389 | "integrity": "sha512-JpNWix2VP2ue31r72fKytTE13nPX1fxl1mudfTaTwcDhl3iExz5NZjQBq012b/BQ6URWoc/onI73pZdYlAfihg==", 390 | "dev": true, 391 | "requires": { 392 | "@babel/helper-plugin-utils": "^7.10.4", 393 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" 394 | } 395 | }, 396 | "@babel/plugin-proposal-numeric-separator": { 397 | "version": "7.12.0", 398 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.0.tgz", 399 | "integrity": "sha512-iON65YmIy/IpEgteYJ4HfO2q30SLdIxiyjNNlsSjSl0tUxLhSH9PljE5r6sczwdW64ZZzznYNcezdcROB+rDDw==", 400 | "dev": true, 401 | "requires": { 402 | "@babel/helper-plugin-utils": "^7.10.4", 403 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 404 | } 405 | }, 406 | "@babel/plugin-proposal-object-rest-spread": { 407 | "version": "7.11.0", 408 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", 409 | "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", 410 | "dev": true, 411 | "requires": { 412 | "@babel/helper-plugin-utils": "^7.10.4", 413 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 414 | "@babel/plugin-transform-parameters": "^7.10.4" 415 | } 416 | }, 417 | "@babel/plugin-proposal-optional-catch-binding": { 418 | "version": "7.10.4", 419 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", 420 | "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", 421 | "dev": true, 422 | "requires": { 423 | "@babel/helper-plugin-utils": "^7.10.4", 424 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" 425 | } 426 | }, 427 | "@babel/plugin-proposal-optional-chaining": { 428 | "version": "7.12.0", 429 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.0.tgz", 430 | "integrity": "sha512-CXu9aw32FH/MksqdKvhpiH8pSvxnXJ33E7I7BGNE9VzNRpWgpNzvPpds/tW9E0pjmX9+D1zAHRyHbtyeTboo2g==", 431 | "dev": true, 432 | "requires": { 433 | "@babel/helper-plugin-utils": "^7.10.4", 434 | "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", 435 | "@babel/plugin-syntax-optional-chaining": "^7.8.0" 436 | } 437 | }, 438 | "@babel/plugin-proposal-private-methods": { 439 | "version": "7.10.4", 440 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", 441 | "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", 442 | "dev": true, 443 | "requires": { 444 | "@babel/helper-create-class-features-plugin": "^7.10.4", 445 | "@babel/helper-plugin-utils": "^7.10.4" 446 | } 447 | }, 448 | "@babel/plugin-proposal-unicode-property-regex": { 449 | "version": "7.10.4", 450 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", 451 | "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", 452 | "dev": true, 453 | "requires": { 454 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 455 | "@babel/helper-plugin-utils": "^7.10.4" 456 | } 457 | }, 458 | "@babel/plugin-syntax-async-generators": { 459 | "version": "7.8.4", 460 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 461 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 462 | "dev": true, 463 | "requires": { 464 | "@babel/helper-plugin-utils": "^7.8.0" 465 | } 466 | }, 467 | "@babel/plugin-syntax-class-properties": { 468 | "version": "7.10.4", 469 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", 470 | "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", 471 | "dev": true, 472 | "requires": { 473 | "@babel/helper-plugin-utils": "^7.10.4" 474 | } 475 | }, 476 | "@babel/plugin-syntax-dynamic-import": { 477 | "version": "7.8.3", 478 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 479 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 480 | "dev": true, 481 | "requires": { 482 | "@babel/helper-plugin-utils": "^7.8.0" 483 | } 484 | }, 485 | "@babel/plugin-syntax-export-namespace-from": { 486 | "version": "7.8.3", 487 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 488 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 489 | "dev": true, 490 | "requires": { 491 | "@babel/helper-plugin-utils": "^7.8.3" 492 | } 493 | }, 494 | "@babel/plugin-syntax-json-strings": { 495 | "version": "7.8.3", 496 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 497 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 498 | "dev": true, 499 | "requires": { 500 | "@babel/helper-plugin-utils": "^7.8.0" 501 | } 502 | }, 503 | "@babel/plugin-syntax-logical-assignment-operators": { 504 | "version": "7.10.4", 505 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 506 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 507 | "dev": true, 508 | "requires": { 509 | "@babel/helper-plugin-utils": "^7.10.4" 510 | } 511 | }, 512 | "@babel/plugin-syntax-nullish-coalescing-operator": { 513 | "version": "7.8.3", 514 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 515 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 516 | "dev": true, 517 | "requires": { 518 | "@babel/helper-plugin-utils": "^7.8.0" 519 | } 520 | }, 521 | "@babel/plugin-syntax-numeric-separator": { 522 | "version": "7.10.4", 523 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 524 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 525 | "dev": true, 526 | "requires": { 527 | "@babel/helper-plugin-utils": "^7.10.4" 528 | } 529 | }, 530 | "@babel/plugin-syntax-object-rest-spread": { 531 | "version": "7.8.3", 532 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 533 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 534 | "dev": true, 535 | "requires": { 536 | "@babel/helper-plugin-utils": "^7.8.0" 537 | } 538 | }, 539 | "@babel/plugin-syntax-optional-catch-binding": { 540 | "version": "7.8.3", 541 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 542 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 543 | "dev": true, 544 | "requires": { 545 | "@babel/helper-plugin-utils": "^7.8.0" 546 | } 547 | }, 548 | "@babel/plugin-syntax-optional-chaining": { 549 | "version": "7.8.3", 550 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 551 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 552 | "dev": true, 553 | "requires": { 554 | "@babel/helper-plugin-utils": "^7.8.0" 555 | } 556 | }, 557 | "@babel/plugin-syntax-top-level-await": { 558 | "version": "7.10.4", 559 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", 560 | "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", 561 | "dev": true, 562 | "requires": { 563 | "@babel/helper-plugin-utils": "^7.10.4" 564 | } 565 | }, 566 | "@babel/plugin-transform-arrow-functions": { 567 | "version": "7.10.4", 568 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", 569 | "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", 570 | "dev": true, 571 | "requires": { 572 | "@babel/helper-plugin-utils": "^7.10.4" 573 | } 574 | }, 575 | "@babel/plugin-transform-async-to-generator": { 576 | "version": "7.10.4", 577 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", 578 | "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", 579 | "dev": true, 580 | "requires": { 581 | "@babel/helper-module-imports": "^7.10.4", 582 | "@babel/helper-plugin-utils": "^7.10.4", 583 | "@babel/helper-remap-async-to-generator": "^7.10.4" 584 | } 585 | }, 586 | "@babel/plugin-transform-block-scoped-functions": { 587 | "version": "7.10.4", 588 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", 589 | "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", 590 | "dev": true, 591 | "requires": { 592 | "@babel/helper-plugin-utils": "^7.10.4" 593 | } 594 | }, 595 | "@babel/plugin-transform-block-scoping": { 596 | "version": "7.11.1", 597 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", 598 | "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", 599 | "dev": true, 600 | "requires": { 601 | "@babel/helper-plugin-utils": "^7.10.4" 602 | } 603 | }, 604 | "@babel/plugin-transform-classes": { 605 | "version": "7.10.4", 606 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", 607 | "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", 608 | "dev": true, 609 | "requires": { 610 | "@babel/helper-annotate-as-pure": "^7.10.4", 611 | "@babel/helper-define-map": "^7.10.4", 612 | "@babel/helper-function-name": "^7.10.4", 613 | "@babel/helper-optimise-call-expression": "^7.10.4", 614 | "@babel/helper-plugin-utils": "^7.10.4", 615 | "@babel/helper-replace-supers": "^7.10.4", 616 | "@babel/helper-split-export-declaration": "^7.10.4", 617 | "globals": "^11.1.0" 618 | } 619 | }, 620 | "@babel/plugin-transform-computed-properties": { 621 | "version": "7.10.4", 622 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", 623 | "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", 624 | "dev": true, 625 | "requires": { 626 | "@babel/helper-plugin-utils": "^7.10.4" 627 | } 628 | }, 629 | "@babel/plugin-transform-destructuring": { 630 | "version": "7.10.4", 631 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", 632 | "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", 633 | "dev": true, 634 | "requires": { 635 | "@babel/helper-plugin-utils": "^7.10.4" 636 | } 637 | }, 638 | "@babel/plugin-transform-dotall-regex": { 639 | "version": "7.10.4", 640 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", 641 | "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", 642 | "dev": true, 643 | "requires": { 644 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 645 | "@babel/helper-plugin-utils": "^7.10.4" 646 | } 647 | }, 648 | "@babel/plugin-transform-duplicate-keys": { 649 | "version": "7.10.4", 650 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", 651 | "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", 652 | "dev": true, 653 | "requires": { 654 | "@babel/helper-plugin-utils": "^7.10.4" 655 | } 656 | }, 657 | "@babel/plugin-transform-exponentiation-operator": { 658 | "version": "7.10.4", 659 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", 660 | "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", 661 | "dev": true, 662 | "requires": { 663 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", 664 | "@babel/helper-plugin-utils": "^7.10.4" 665 | } 666 | }, 667 | "@babel/plugin-transform-for-of": { 668 | "version": "7.10.4", 669 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", 670 | "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", 671 | "dev": true, 672 | "requires": { 673 | "@babel/helper-plugin-utils": "^7.10.4" 674 | } 675 | }, 676 | "@babel/plugin-transform-function-name": { 677 | "version": "7.10.4", 678 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", 679 | "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", 680 | "dev": true, 681 | "requires": { 682 | "@babel/helper-function-name": "^7.10.4", 683 | "@babel/helper-plugin-utils": "^7.10.4" 684 | } 685 | }, 686 | "@babel/plugin-transform-literals": { 687 | "version": "7.10.4", 688 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", 689 | "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", 690 | "dev": true, 691 | "requires": { 692 | "@babel/helper-plugin-utils": "^7.10.4" 693 | } 694 | }, 695 | "@babel/plugin-transform-member-expression-literals": { 696 | "version": "7.10.4", 697 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", 698 | "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", 699 | "dev": true, 700 | "requires": { 701 | "@babel/helper-plugin-utils": "^7.10.4" 702 | } 703 | }, 704 | "@babel/plugin-transform-modules-amd": { 705 | "version": "7.10.5", 706 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", 707 | "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", 708 | "dev": true, 709 | "requires": { 710 | "@babel/helper-module-transforms": "^7.10.5", 711 | "@babel/helper-plugin-utils": "^7.10.4", 712 | "babel-plugin-dynamic-import-node": "^2.3.3" 713 | } 714 | }, 715 | "@babel/plugin-transform-modules-commonjs": { 716 | "version": "7.10.4", 717 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", 718 | "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", 719 | "dev": true, 720 | "requires": { 721 | "@babel/helper-module-transforms": "^7.10.4", 722 | "@babel/helper-plugin-utils": "^7.10.4", 723 | "@babel/helper-simple-access": "^7.10.4", 724 | "babel-plugin-dynamic-import-node": "^2.3.3" 725 | } 726 | }, 727 | "@babel/plugin-transform-modules-systemjs": { 728 | "version": "7.12.0", 729 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.0.tgz", 730 | "integrity": "sha512-h2fDMnwRwBiNMmTGAWqUo404Z3oLbrPE6hyATecyIbsEsrbM5gjLbfKQLb6hjiouMlGHH+yliYBbc4NPgWKE/g==", 731 | "dev": true, 732 | "requires": { 733 | "@babel/helper-hoist-variables": "^7.10.4", 734 | "@babel/helper-module-transforms": "^7.12.0", 735 | "@babel/helper-plugin-utils": "^7.10.4", 736 | "@babel/helper-validator-identifier": "^7.10.4", 737 | "babel-plugin-dynamic-import-node": "^2.3.3" 738 | } 739 | }, 740 | "@babel/plugin-transform-modules-umd": { 741 | "version": "7.10.4", 742 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", 743 | "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", 744 | "dev": true, 745 | "requires": { 746 | "@babel/helper-module-transforms": "^7.10.4", 747 | "@babel/helper-plugin-utils": "^7.10.4" 748 | } 749 | }, 750 | "@babel/plugin-transform-named-capturing-groups-regex": { 751 | "version": "7.10.4", 752 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", 753 | "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", 754 | "dev": true, 755 | "requires": { 756 | "@babel/helper-create-regexp-features-plugin": "^7.10.4" 757 | } 758 | }, 759 | "@babel/plugin-transform-new-target": { 760 | "version": "7.10.4", 761 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", 762 | "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", 763 | "dev": true, 764 | "requires": { 765 | "@babel/helper-plugin-utils": "^7.10.4" 766 | } 767 | }, 768 | "@babel/plugin-transform-object-super": { 769 | "version": "7.10.4", 770 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", 771 | "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", 772 | "dev": true, 773 | "requires": { 774 | "@babel/helper-plugin-utils": "^7.10.4", 775 | "@babel/helper-replace-supers": "^7.10.4" 776 | } 777 | }, 778 | "@babel/plugin-transform-parameters": { 779 | "version": "7.10.5", 780 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", 781 | "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", 782 | "dev": true, 783 | "requires": { 784 | "@babel/helper-get-function-arity": "^7.10.4", 785 | "@babel/helper-plugin-utils": "^7.10.4" 786 | } 787 | }, 788 | "@babel/plugin-transform-property-literals": { 789 | "version": "7.10.4", 790 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", 791 | "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", 792 | "dev": true, 793 | "requires": { 794 | "@babel/helper-plugin-utils": "^7.10.4" 795 | } 796 | }, 797 | "@babel/plugin-transform-regenerator": { 798 | "version": "7.10.4", 799 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", 800 | "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", 801 | "dev": true, 802 | "requires": { 803 | "regenerator-transform": "^0.14.2" 804 | } 805 | }, 806 | "@babel/plugin-transform-reserved-words": { 807 | "version": "7.10.4", 808 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", 809 | "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", 810 | "dev": true, 811 | "requires": { 812 | "@babel/helper-plugin-utils": "^7.10.4" 813 | } 814 | }, 815 | "@babel/plugin-transform-shorthand-properties": { 816 | "version": "7.10.4", 817 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", 818 | "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", 819 | "dev": true, 820 | "requires": { 821 | "@babel/helper-plugin-utils": "^7.10.4" 822 | } 823 | }, 824 | "@babel/plugin-transform-spread": { 825 | "version": "7.11.0", 826 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", 827 | "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", 828 | "dev": true, 829 | "requires": { 830 | "@babel/helper-plugin-utils": "^7.10.4", 831 | "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" 832 | } 833 | }, 834 | "@babel/plugin-transform-sticky-regex": { 835 | "version": "7.10.4", 836 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", 837 | "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", 838 | "dev": true, 839 | "requires": { 840 | "@babel/helper-plugin-utils": "^7.10.4", 841 | "@babel/helper-regex": "^7.10.4" 842 | } 843 | }, 844 | "@babel/plugin-transform-template-literals": { 845 | "version": "7.10.5", 846 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", 847 | "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", 848 | "dev": true, 849 | "requires": { 850 | "@babel/helper-annotate-as-pure": "^7.10.4", 851 | "@babel/helper-plugin-utils": "^7.10.4" 852 | } 853 | }, 854 | "@babel/plugin-transform-typeof-symbol": { 855 | "version": "7.10.4", 856 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", 857 | "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", 858 | "dev": true, 859 | "requires": { 860 | "@babel/helper-plugin-utils": "^7.10.4" 861 | } 862 | }, 863 | "@babel/plugin-transform-unicode-escapes": { 864 | "version": "7.10.4", 865 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", 866 | "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", 867 | "dev": true, 868 | "requires": { 869 | "@babel/helper-plugin-utils": "^7.10.4" 870 | } 871 | }, 872 | "@babel/plugin-transform-unicode-regex": { 873 | "version": "7.10.4", 874 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", 875 | "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", 876 | "dev": true, 877 | "requires": { 878 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 879 | "@babel/helper-plugin-utils": "^7.10.4" 880 | } 881 | }, 882 | "@babel/preset-env": { 883 | "version": "7.12.0", 884 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.0.tgz", 885 | "integrity": "sha512-jSIHvHSuF+hBUIrvA2/61yIzhH+ceLOXGLTH1nwPvQlso/lNxXsoE/nvrCzY5M77KRzhKegB1CvdhWPZmYDZ5A==", 886 | "dev": true, 887 | "requires": { 888 | "@babel/compat-data": "^7.12.0", 889 | "@babel/helper-compilation-targets": "^7.12.0", 890 | "@babel/helper-module-imports": "^7.10.4", 891 | "@babel/helper-plugin-utils": "^7.10.4", 892 | "@babel/helper-validator-option": "^7.12.0", 893 | "@babel/plugin-proposal-async-generator-functions": "^7.10.4", 894 | "@babel/plugin-proposal-class-properties": "^7.10.4", 895 | "@babel/plugin-proposal-dynamic-import": "^7.10.4", 896 | "@babel/plugin-proposal-export-namespace-from": "^7.12.0", 897 | "@babel/plugin-proposal-json-strings": "^7.10.4", 898 | "@babel/plugin-proposal-logical-assignment-operators": "^7.12.0", 899 | "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.0", 900 | "@babel/plugin-proposal-numeric-separator": "^7.12.0", 901 | "@babel/plugin-proposal-object-rest-spread": "^7.11.0", 902 | "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", 903 | "@babel/plugin-proposal-optional-chaining": "^7.12.0", 904 | "@babel/plugin-proposal-private-methods": "^7.10.4", 905 | "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", 906 | "@babel/plugin-syntax-async-generators": "^7.8.0", 907 | "@babel/plugin-syntax-class-properties": "^7.10.4", 908 | "@babel/plugin-syntax-dynamic-import": "^7.8.0", 909 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3", 910 | "@babel/plugin-syntax-json-strings": "^7.8.0", 911 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 912 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", 913 | "@babel/plugin-syntax-numeric-separator": "^7.10.4", 914 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 915 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", 916 | "@babel/plugin-syntax-optional-chaining": "^7.8.0", 917 | "@babel/plugin-syntax-top-level-await": "^7.10.4", 918 | "@babel/plugin-transform-arrow-functions": "^7.10.4", 919 | "@babel/plugin-transform-async-to-generator": "^7.10.4", 920 | "@babel/plugin-transform-block-scoped-functions": "^7.10.4", 921 | "@babel/plugin-transform-block-scoping": "^7.10.4", 922 | "@babel/plugin-transform-classes": "^7.10.4", 923 | "@babel/plugin-transform-computed-properties": "^7.10.4", 924 | "@babel/plugin-transform-destructuring": "^7.10.4", 925 | "@babel/plugin-transform-dotall-regex": "^7.10.4", 926 | "@babel/plugin-transform-duplicate-keys": "^7.10.4", 927 | "@babel/plugin-transform-exponentiation-operator": "^7.10.4", 928 | "@babel/plugin-transform-for-of": "^7.10.4", 929 | "@babel/plugin-transform-function-name": "^7.10.4", 930 | "@babel/plugin-transform-literals": "^7.10.4", 931 | "@babel/plugin-transform-member-expression-literals": "^7.10.4", 932 | "@babel/plugin-transform-modules-amd": "^7.10.4", 933 | "@babel/plugin-transform-modules-commonjs": "^7.10.4", 934 | "@babel/plugin-transform-modules-systemjs": "^7.12.0", 935 | "@babel/plugin-transform-modules-umd": "^7.10.4", 936 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", 937 | "@babel/plugin-transform-new-target": "^7.10.4", 938 | "@babel/plugin-transform-object-super": "^7.10.4", 939 | "@babel/plugin-transform-parameters": "^7.10.4", 940 | "@babel/plugin-transform-property-literals": "^7.10.4", 941 | "@babel/plugin-transform-regenerator": "^7.10.4", 942 | "@babel/plugin-transform-reserved-words": "^7.10.4", 943 | "@babel/plugin-transform-shorthand-properties": "^7.10.4", 944 | "@babel/plugin-transform-spread": "^7.11.0", 945 | "@babel/plugin-transform-sticky-regex": "^7.10.4", 946 | "@babel/plugin-transform-template-literals": "^7.10.4", 947 | "@babel/plugin-transform-typeof-symbol": "^7.10.4", 948 | "@babel/plugin-transform-unicode-escapes": "^7.10.4", 949 | "@babel/plugin-transform-unicode-regex": "^7.10.4", 950 | "@babel/preset-modules": "^0.1.3", 951 | "@babel/types": "^7.12.0", 952 | "browserslist": "^4.12.0", 953 | "core-js-compat": "^3.6.2", 954 | "semver": "^5.5.0" 955 | } 956 | }, 957 | "@babel/preset-modules": { 958 | "version": "0.1.4", 959 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", 960 | "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", 961 | "dev": true, 962 | "requires": { 963 | "@babel/helper-plugin-utils": "^7.0.0", 964 | "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", 965 | "@babel/plugin-transform-dotall-regex": "^7.4.4", 966 | "@babel/types": "^7.4.4", 967 | "esutils": "^2.0.2" 968 | } 969 | }, 970 | "@babel/runtime": { 971 | "version": "7.12.0", 972 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.0.tgz", 973 | "integrity": "sha512-lS4QLXQ2Vbw2ubfQjeQcn+BZgZ5+ROHW9f+DWjEp5Y+NHYmkRGKqHSJ1tuhbUauKu2nhZNTBIvsIQ8dXfY5Gjw==", 974 | "dev": true, 975 | "requires": { 976 | "regenerator-runtime": "^0.13.4" 977 | } 978 | }, 979 | "@babel/template": { 980 | "version": "7.10.4", 981 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", 982 | "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", 983 | "dev": true, 984 | "requires": { 985 | "@babel/code-frame": "^7.10.4", 986 | "@babel/parser": "^7.10.4", 987 | "@babel/types": "^7.10.4" 988 | } 989 | }, 990 | "@babel/traverse": { 991 | "version": "7.12.0", 992 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.0.tgz", 993 | "integrity": "sha512-ZU9e79xpOukCNPkQ1UzR4gJKCruGckr6edd8v8lmKpSk8iakgUIvb+5ZtaKKV9f7O+x5r+xbMDDIbzVpUoiIuw==", 994 | "dev": true, 995 | "requires": { 996 | "@babel/code-frame": "^7.10.4", 997 | "@babel/generator": "^7.12.0", 998 | "@babel/helper-function-name": "^7.10.4", 999 | "@babel/helper-split-export-declaration": "^7.11.0", 1000 | "@babel/parser": "^7.12.0", 1001 | "@babel/types": "^7.12.0", 1002 | "debug": "^4.1.0", 1003 | "globals": "^11.1.0", 1004 | "lodash": "^4.17.19" 1005 | } 1006 | }, 1007 | "@babel/types": { 1008 | "version": "7.12.0", 1009 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.0.tgz", 1010 | "integrity": "sha512-ggIyFmT2zMaYRheOfPDQ4gz7QqV3B+t2rjqjbttDJxMcb7/LukvWCmlIl1sWcOxrvwpTDd+z0OytzqsbGeb3/g==", 1011 | "dev": true, 1012 | "requires": { 1013 | "@babel/helper-validator-identifier": "^7.10.4", 1014 | "lodash": "^4.17.19", 1015 | "to-fast-properties": "^2.0.0" 1016 | } 1017 | }, 1018 | "@rollup/plugin-babel": { 1019 | "version": "5.2.1", 1020 | "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz", 1021 | "integrity": "sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==", 1022 | "dev": true, 1023 | "requires": { 1024 | "@babel/helper-module-imports": "^7.10.4", 1025 | "@rollup/pluginutils": "^3.1.0" 1026 | } 1027 | }, 1028 | "@rollup/pluginutils": { 1029 | "version": "3.1.0", 1030 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", 1031 | "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", 1032 | "dev": true, 1033 | "requires": { 1034 | "@types/estree": "0.0.39", 1035 | "estree-walker": "^1.0.1", 1036 | "picomatch": "^2.2.2" 1037 | } 1038 | }, 1039 | "@types/estree": { 1040 | "version": "0.0.39", 1041 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 1042 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 1043 | "dev": true 1044 | }, 1045 | "ansi-styles": { 1046 | "version": "3.2.1", 1047 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1048 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1049 | "dev": true, 1050 | "requires": { 1051 | "color-convert": "^1.9.0" 1052 | } 1053 | }, 1054 | "babel-plugin-dynamic-import-node": { 1055 | "version": "2.3.3", 1056 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", 1057 | "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", 1058 | "dev": true, 1059 | "requires": { 1060 | "object.assign": "^4.1.0" 1061 | } 1062 | }, 1063 | "browserslist": { 1064 | "version": "4.14.5", 1065 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", 1066 | "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", 1067 | "dev": true, 1068 | "requires": { 1069 | "caniuse-lite": "^1.0.30001135", 1070 | "electron-to-chromium": "^1.3.571", 1071 | "escalade": "^3.1.0", 1072 | "node-releases": "^1.1.61" 1073 | } 1074 | }, 1075 | "caniuse-lite": { 1076 | "version": "1.0.30001148", 1077 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz", 1078 | "integrity": "sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==", 1079 | "dev": true 1080 | }, 1081 | "chalk": { 1082 | "version": "2.4.2", 1083 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1084 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1085 | "dev": true, 1086 | "requires": { 1087 | "ansi-styles": "^3.2.1", 1088 | "escape-string-regexp": "^1.0.5", 1089 | "supports-color": "^5.3.0" 1090 | } 1091 | }, 1092 | "color-convert": { 1093 | "version": "1.9.3", 1094 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1095 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1096 | "dev": true, 1097 | "requires": { 1098 | "color-name": "1.1.3" 1099 | } 1100 | }, 1101 | "color-name": { 1102 | "version": "1.1.3", 1103 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1104 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1105 | "dev": true 1106 | }, 1107 | "convert-source-map": { 1108 | "version": "1.7.0", 1109 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 1110 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 1111 | "dev": true, 1112 | "requires": { 1113 | "safe-buffer": "~5.1.1" 1114 | } 1115 | }, 1116 | "core-js-compat": { 1117 | "version": "3.6.5", 1118 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", 1119 | "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", 1120 | "dev": true, 1121 | "requires": { 1122 | "browserslist": "^4.8.5", 1123 | "semver": "7.0.0" 1124 | }, 1125 | "dependencies": { 1126 | "semver": { 1127 | "version": "7.0.0", 1128 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1129 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1130 | "dev": true 1131 | } 1132 | } 1133 | }, 1134 | "debug": { 1135 | "version": "4.2.0", 1136 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", 1137 | "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", 1138 | "dev": true, 1139 | "requires": { 1140 | "ms": "2.1.2" 1141 | } 1142 | }, 1143 | "define-properties": { 1144 | "version": "1.1.3", 1145 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1146 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1147 | "dev": true, 1148 | "requires": { 1149 | "object-keys": "^1.0.12" 1150 | } 1151 | }, 1152 | "electron-to-chromium": { 1153 | "version": "1.3.580", 1154 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.580.tgz", 1155 | "integrity": "sha512-5flHTbRpptO6h3lQUG4zdSAxryAS3PrZOkLpLS0DL5/y2LBf+l9HJ8X6UBorNs1QRBrMR7u/QvkdK+GlekW1kQ==", 1156 | "dev": true 1157 | }, 1158 | "es-abstract": { 1159 | "version": "1.18.0-next.1", 1160 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", 1161 | "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", 1162 | "dev": true, 1163 | "requires": { 1164 | "es-to-primitive": "^1.2.1", 1165 | "function-bind": "^1.1.1", 1166 | "has": "^1.0.3", 1167 | "has-symbols": "^1.0.1", 1168 | "is-callable": "^1.2.2", 1169 | "is-negative-zero": "^2.0.0", 1170 | "is-regex": "^1.1.1", 1171 | "object-inspect": "^1.8.0", 1172 | "object-keys": "^1.1.1", 1173 | "object.assign": "^4.1.1", 1174 | "string.prototype.trimend": "^1.0.1", 1175 | "string.prototype.trimstart": "^1.0.1" 1176 | } 1177 | }, 1178 | "es-to-primitive": { 1179 | "version": "1.2.1", 1180 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1181 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1182 | "dev": true, 1183 | "requires": { 1184 | "is-callable": "^1.1.4", 1185 | "is-date-object": "^1.0.1", 1186 | "is-symbol": "^1.0.2" 1187 | } 1188 | }, 1189 | "escalade": { 1190 | "version": "3.1.1", 1191 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1192 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1193 | "dev": true 1194 | }, 1195 | "escape-string-regexp": { 1196 | "version": "1.0.5", 1197 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1198 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1199 | "dev": true 1200 | }, 1201 | "estree-walker": { 1202 | "version": "1.0.1", 1203 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 1204 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 1205 | "dev": true 1206 | }, 1207 | "esutils": { 1208 | "version": "2.0.3", 1209 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1210 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1211 | "dev": true 1212 | }, 1213 | "fsevents": { 1214 | "version": "2.1.3", 1215 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 1216 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 1217 | "dev": true, 1218 | "optional": true 1219 | }, 1220 | "function-bind": { 1221 | "version": "1.1.1", 1222 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1223 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1224 | "dev": true 1225 | }, 1226 | "gensync": { 1227 | "version": "1.0.0-beta.1", 1228 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", 1229 | "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", 1230 | "dev": true 1231 | }, 1232 | "globals": { 1233 | "version": "11.12.0", 1234 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1235 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1236 | "dev": true 1237 | }, 1238 | "has": { 1239 | "version": "1.0.3", 1240 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1241 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1242 | "dev": true, 1243 | "requires": { 1244 | "function-bind": "^1.1.1" 1245 | } 1246 | }, 1247 | "has-flag": { 1248 | "version": "3.0.0", 1249 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1250 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1251 | "dev": true 1252 | }, 1253 | "has-symbols": { 1254 | "version": "1.0.1", 1255 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1256 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1257 | "dev": true 1258 | }, 1259 | "is-callable": { 1260 | "version": "1.2.2", 1261 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", 1262 | "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", 1263 | "dev": true 1264 | }, 1265 | "is-date-object": { 1266 | "version": "1.0.2", 1267 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1268 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1269 | "dev": true 1270 | }, 1271 | "is-negative-zero": { 1272 | "version": "2.0.0", 1273 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", 1274 | "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", 1275 | "dev": true 1276 | }, 1277 | "is-regex": { 1278 | "version": "1.1.1", 1279 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 1280 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 1281 | "dev": true, 1282 | "requires": { 1283 | "has-symbols": "^1.0.1" 1284 | } 1285 | }, 1286 | "is-symbol": { 1287 | "version": "1.0.3", 1288 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1289 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1290 | "dev": true, 1291 | "requires": { 1292 | "has-symbols": "^1.0.1" 1293 | } 1294 | }, 1295 | "js-tokens": { 1296 | "version": "4.0.0", 1297 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1298 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1299 | "dev": true 1300 | }, 1301 | "jsesc": { 1302 | "version": "2.5.2", 1303 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1304 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1305 | "dev": true 1306 | }, 1307 | "json5": { 1308 | "version": "2.1.3", 1309 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 1310 | "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", 1311 | "dev": true, 1312 | "requires": { 1313 | "minimist": "^1.2.5" 1314 | } 1315 | }, 1316 | "lodash": { 1317 | "version": "4.17.20", 1318 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1319 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 1320 | "dev": true 1321 | }, 1322 | "minimist": { 1323 | "version": "1.2.5", 1324 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1325 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1326 | "dev": true 1327 | }, 1328 | "ms": { 1329 | "version": "2.1.2", 1330 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1331 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1332 | "dev": true 1333 | }, 1334 | "node-releases": { 1335 | "version": "1.1.63", 1336 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.63.tgz", 1337 | "integrity": "sha512-ukW3iCfQaoxJkSPN+iK7KznTeqDGVJatAEuXsJERYHa9tn/KaT5lBdIyxQjLEVTzSkyjJEuQ17/vaEjrOauDkg==", 1338 | "dev": true 1339 | }, 1340 | "object-inspect": { 1341 | "version": "1.8.0", 1342 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 1343 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 1344 | "dev": true 1345 | }, 1346 | "object-keys": { 1347 | "version": "1.1.1", 1348 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1349 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1350 | "dev": true 1351 | }, 1352 | "object.assign": { 1353 | "version": "4.1.1", 1354 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", 1355 | "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", 1356 | "dev": true, 1357 | "requires": { 1358 | "define-properties": "^1.1.3", 1359 | "es-abstract": "^1.18.0-next.0", 1360 | "has-symbols": "^1.0.1", 1361 | "object-keys": "^1.1.1" 1362 | } 1363 | }, 1364 | "path-parse": { 1365 | "version": "1.0.6", 1366 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1367 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1368 | "dev": true 1369 | }, 1370 | "picomatch": { 1371 | "version": "2.2.2", 1372 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1373 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1374 | "dev": true 1375 | }, 1376 | "regenerate": { 1377 | "version": "1.4.1", 1378 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", 1379 | "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", 1380 | "dev": true 1381 | }, 1382 | "regenerate-unicode-properties": { 1383 | "version": "8.2.0", 1384 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", 1385 | "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", 1386 | "dev": true, 1387 | "requires": { 1388 | "regenerate": "^1.4.0" 1389 | } 1390 | }, 1391 | "regenerator-runtime": { 1392 | "version": "0.13.7", 1393 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1394 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", 1395 | "dev": true 1396 | }, 1397 | "regenerator-transform": { 1398 | "version": "0.14.5", 1399 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", 1400 | "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", 1401 | "dev": true, 1402 | "requires": { 1403 | "@babel/runtime": "^7.8.4" 1404 | } 1405 | }, 1406 | "regexpu-core": { 1407 | "version": "4.7.1", 1408 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", 1409 | "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", 1410 | "dev": true, 1411 | "requires": { 1412 | "regenerate": "^1.4.0", 1413 | "regenerate-unicode-properties": "^8.2.0", 1414 | "regjsgen": "^0.5.1", 1415 | "regjsparser": "^0.6.4", 1416 | "unicode-match-property-ecmascript": "^1.0.4", 1417 | "unicode-match-property-value-ecmascript": "^1.2.0" 1418 | } 1419 | }, 1420 | "regjsgen": { 1421 | "version": "0.5.2", 1422 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", 1423 | "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", 1424 | "dev": true 1425 | }, 1426 | "regjsparser": { 1427 | "version": "0.6.4", 1428 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", 1429 | "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", 1430 | "dev": true, 1431 | "requires": { 1432 | "jsesc": "~0.5.0" 1433 | }, 1434 | "dependencies": { 1435 | "jsesc": { 1436 | "version": "0.5.0", 1437 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1438 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1439 | "dev": true 1440 | } 1441 | } 1442 | }, 1443 | "resolve": { 1444 | "version": "1.17.0", 1445 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1446 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1447 | "dev": true, 1448 | "requires": { 1449 | "path-parse": "^1.0.6" 1450 | } 1451 | }, 1452 | "rollup": { 1453 | "version": "2.29.0", 1454 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.29.0.tgz", 1455 | "integrity": "sha512-gtU0sjxMpsVlpuAf4QXienPmUAhd6Kc7owQ4f5lypoxBW18fw2UNYZ4NssLGsri6WhUZkE/Ts3EMRebN+gNLiQ==", 1456 | "dev": true, 1457 | "requires": { 1458 | "fsevents": "~2.1.2" 1459 | } 1460 | }, 1461 | "safe-buffer": { 1462 | "version": "5.1.2", 1463 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1464 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1465 | "dev": true 1466 | }, 1467 | "semver": { 1468 | "version": "5.7.1", 1469 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1470 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1471 | "dev": true 1472 | }, 1473 | "source-map": { 1474 | "version": "0.5.7", 1475 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1476 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1477 | "dev": true 1478 | }, 1479 | "string.prototype.trimend": { 1480 | "version": "1.0.1", 1481 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1482 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1483 | "dev": true, 1484 | "requires": { 1485 | "define-properties": "^1.1.3", 1486 | "es-abstract": "^1.17.5" 1487 | }, 1488 | "dependencies": { 1489 | "es-abstract": { 1490 | "version": "1.17.7", 1491 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", 1492 | "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", 1493 | "dev": true, 1494 | "requires": { 1495 | "es-to-primitive": "^1.2.1", 1496 | "function-bind": "^1.1.1", 1497 | "has": "^1.0.3", 1498 | "has-symbols": "^1.0.1", 1499 | "is-callable": "^1.2.2", 1500 | "is-regex": "^1.1.1", 1501 | "object-inspect": "^1.8.0", 1502 | "object-keys": "^1.1.1", 1503 | "object.assign": "^4.1.1", 1504 | "string.prototype.trimend": "^1.0.1", 1505 | "string.prototype.trimstart": "^1.0.1" 1506 | } 1507 | } 1508 | } 1509 | }, 1510 | "string.prototype.trimstart": { 1511 | "version": "1.0.1", 1512 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1513 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1514 | "dev": true, 1515 | "requires": { 1516 | "define-properties": "^1.1.3", 1517 | "es-abstract": "^1.17.5" 1518 | }, 1519 | "dependencies": { 1520 | "es-abstract": { 1521 | "version": "1.17.7", 1522 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", 1523 | "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", 1524 | "dev": true, 1525 | "requires": { 1526 | "es-to-primitive": "^1.2.1", 1527 | "function-bind": "^1.1.1", 1528 | "has": "^1.0.3", 1529 | "has-symbols": "^1.0.1", 1530 | "is-callable": "^1.2.2", 1531 | "is-regex": "^1.1.1", 1532 | "object-inspect": "^1.8.0", 1533 | "object-keys": "^1.1.1", 1534 | "object.assign": "^4.1.1", 1535 | "string.prototype.trimend": "^1.0.1", 1536 | "string.prototype.trimstart": "^1.0.1" 1537 | } 1538 | } 1539 | } 1540 | }, 1541 | "supports-color": { 1542 | "version": "5.5.0", 1543 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1544 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1545 | "dev": true, 1546 | "requires": { 1547 | "has-flag": "^3.0.0" 1548 | } 1549 | }, 1550 | "to-fast-properties": { 1551 | "version": "2.0.0", 1552 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1553 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1554 | "dev": true 1555 | }, 1556 | "unicode-canonical-property-names-ecmascript": { 1557 | "version": "1.0.4", 1558 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1559 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", 1560 | "dev": true 1561 | }, 1562 | "unicode-match-property-ecmascript": { 1563 | "version": "1.0.4", 1564 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 1565 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 1566 | "dev": true, 1567 | "requires": { 1568 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 1569 | "unicode-property-aliases-ecmascript": "^1.0.4" 1570 | } 1571 | }, 1572 | "unicode-match-property-value-ecmascript": { 1573 | "version": "1.2.0", 1574 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", 1575 | "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", 1576 | "dev": true 1577 | }, 1578 | "unicode-property-aliases-ecmascript": { 1579 | "version": "1.1.0", 1580 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", 1581 | "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", 1582 | "dev": true 1583 | } 1584 | } 1585 | } 1586 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "editorjs-parser", 3 | "version": "1.5.3", 4 | "description": "This package parses output blocks of editorjs to html", 5 | "main": "./build/Parser.node.js", 6 | "module": "./build/Parser.esm.js", 7 | "directories": { 8 | "test": "test" 9 | }, 10 | "keywords": [ 11 | "editorjs", 12 | "parser", 13 | "html", 14 | "clean-data", 15 | "json", 16 | "parsing" 17 | ], 18 | "scripts": { 19 | "test": "node test/test.js", 20 | "build": "rollup --config" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "https://github.com/miadabdi/editorjs-parser" 25 | }, 26 | "author": "Miad Abdi <50056491+miadabdi@users.noreply.github.com>", 27 | "license": "MIT", 28 | "devDependencies": { 29 | "@babel/core": "^7.12.0", 30 | "@babel/preset-env": "^7.12.0", 31 | "@rollup/plugin-babel": "^5.2.1", 32 | "rollup": "^2.29.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import { getBabelOutputPlugin } from '@rollup/plugin-babel'; 2 | 3 | export default { 4 | input: "./src/Parser.js", 5 | output: [{ 6 | file: "./build/Parser.node.js", 7 | format: "cjs", 8 | name: "edjsParser", 9 | }, 10 | { 11 | file: "./build/Parser.esm.js", 12 | format: "esm", 13 | name: "edjsParser", 14 | plugins: [getBabelOutputPlugin({ 15 | exclude: /node_modules/, 16 | presets: [ 17 | "@babel/preset-env", 18 | ], 19 | babelrc: false, 20 | //allowAllFormats: true 21 | })] 22 | }, 23 | { 24 | file: "./build/Parser.browser.js", 25 | format: "iife", 26 | name: "edjsParser", 27 | plugins: [getBabelOutputPlugin({ 28 | exclude: /node_modules/, 29 | presets: [ 30 | "@babel/preset-env", 31 | ], 32 | babelrc: false, 33 | allowAllFormats: true 34 | })] 35 | }, 36 | ] 37 | }; -------------------------------------------------------------------------------- /src/Parser.js: -------------------------------------------------------------------------------- 1 | import defaultParsers from "./parsers"; 2 | import defaultConfig from "./config"; 3 | import { mergeDeep, embedMarkups } from "./utitlities"; 4 | 5 | export default class edjsParser { 6 | constructor(config = {}, customs = {}, embeds = {}) { 7 | this.config = mergeDeep(defaultConfig, config); 8 | this.config.embedMarkups = Object.assign(embedMarkups, embeds); 9 | this.parsers = Object.assign(defaultParsers, customs); 10 | } 11 | 12 | parse(EditorJsObject) { 13 | const html = EditorJsObject.blocks.map((block) => { 14 | const markup = this.parseBlock(block); 15 | if (markup instanceof Error) { 16 | return ""; // parser for this kind of block doesn't exist 17 | } 18 | return markup; 19 | }); 20 | return html.join(""); 21 | } 22 | 23 | parseBlock(block) { 24 | if (!this.parsers[block.type]) { 25 | return new Error( 26 | `${block.type} is not supported! Define your own custom function.` 27 | ); 28 | } 29 | try { 30 | return this.parsers[block.type](block.data, this.config); 31 | } catch (err) { 32 | return err; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | image: { 3 | use: "figure", // figure or img (figcaption will be used for caption of figure) 4 | imgClass: "img", 5 | figureClass: "fig-img", 6 | figCapClass: "fig-cap", 7 | path: "absolute", 8 | }, 9 | paragraph: { 10 | pClass: "paragraph", 11 | }, 12 | code: { 13 | codeBlockClass: "code-block", 14 | }, 15 | embed: { 16 | useProvidedLength: false, 17 | // set to true if you want the returned width and height of editorjs to be applied 18 | // NOTE: sometimes source site overrides the lengths so it does not work 100% 19 | }, 20 | quote: { 21 | applyAlignment: false, 22 | // if set to true blockquote element will have text-align css property set 23 | }, 24 | }; -------------------------------------------------------------------------------- /src/parsers.js: -------------------------------------------------------------------------------- 1 | import { sanitizeHtml } from "./utitlities"; 2 | 3 | export default { 4 | paragraph: function(data, config) { 5 | return `

    ${data.text}

    `; 6 | }, 7 | 8 | header: function(data) { 9 | return `${data.text}`; 10 | }, 11 | 12 | list: function(data) { 13 | const type = data.style === "ordered" ? "ol" : "ul"; 14 | const items = data.items.reduce( 15 | (acc, item) => acc + `
  • ${item}
  • `, 16 | "" 17 | ); 18 | return `<${type}>${items}`; 19 | }, 20 | 21 | quote: function(data, config) { 22 | let alignment = ""; 23 | if (config.quote.applyAlignment) { 24 | alignment = `style="text-align: ${data.alignment};"`; 25 | } 26 | return `

    ${data.text}

    ${data.caption}
    `; 27 | }, 28 | 29 | table: function(data) { 30 | const rows = data.content.map((row) => { 31 | return `${row.reduce( 32 | (acc, cell) => acc + `${cell}`, 33 | "" 34 | )}`; 35 | }); 36 | return `${rows.join("")}
    `; 37 | }, 38 | image: function (data, config) { 39 | const imageConditions = `${data.stretched ? "img-fullwidth" : ""} ${ 40 | data.withBorder ? "img-border" : "" 41 | } ${data.withBackground ? "img-bg" : ""}`; 42 | const imgClass = config.image.imgClass || ""; 43 | let imageSrc; 44 | 45 | if (data.url) { 46 | // simple-image was used and the image probably is not uploaded to this server 47 | // therefore, we use the absolute path provided in data.url 48 | // so, config.image.path property is useless in this case! 49 | imageSrc = data.url; 50 | } else if (config.image.path === "absolute") { 51 | imageSrc = data.file.url; 52 | } else { 53 | imageSrc = config.image.path.replace( 54 | /<(.+)>/, 55 | (match, p1) => data.file[p1] 56 | ); 57 | } 58 | 59 | if (config.image.use === "img") { 60 | return `${data.caption}`; 61 | } else if (config.image.use === "figure") { 62 | const figureClass = config.image.figureClass || ""; 63 | const figCapClass = config.image.figCapClass || ""; 64 | 65 | return `
    ${data.caption}
    ${data.caption}
    `; 66 | } 67 | }, 68 | code: function (data, config) { 69 | const markup = sanitizeHtml(data.code); 70 | return `
    ${markup}
    `; 71 | }, 72 | raw: function (data) { 73 | return data.html; 74 | }, 75 | delimiter: function (data) { 76 | return "
    "; 77 | }, 78 | 79 | embed: function (data, config) { 80 | if (config.embed.useProvidedLength) { 81 | data.length = `width="${data.width}" height="${data.height}"`; 82 | } else { 83 | data.length = ""; 84 | } 85 | const regex = new RegExp(/<%data\.(.+?)%>/, "gm"); 86 | if (config.embedMarkups[data.service]) { 87 | return config.embedMarkups[data.service].replace( 88 | regex, 89 | (match, p1) => data[p1] 90 | ); 91 | } else { 92 | return config.embedMarkups["defaultMarkup"].replace( 93 | regex, 94 | (match, p1) => data[p1] 95 | ); 96 | } 97 | }, 98 | }; -------------------------------------------------------------------------------- /src/utitlities.js: -------------------------------------------------------------------------------- 1 | export const isObject = function(item) { 2 | return item && typeof item === "object" && !Array.isArray(item); 3 | }; 4 | 5 | export const mergeDeep = function(target, source) { 6 | let output = Object.assign({}, target); 7 | if (isObject(target) && isObject(source)) { 8 | Object.keys(source).forEach((key) => { 9 | if (isObject(source[key])) { 10 | if (!(key in target)) 11 | Object.assign(output, { 12 | [key]: source[key], 13 | }); 14 | else output[key] = mergeDeep(target[key], source[key]); 15 | } else { 16 | Object.assign(output, { 17 | [key]: source[key], 18 | }); 19 | } 20 | }); 21 | } 22 | return output; 23 | }; 24 | 25 | export const sanitizeHtml = function(markup) { 26 | markup = markup.replace(/&/g, "&"); 27 | markup = markup.replace(//g, ">"); 29 | return markup; 30 | }; 31 | 32 | export const embedMarkups = { 33 | youtube: `
    `, 34 | 35 | twitter: ` `, 36 | 37 | instagram: `
    >
    `, 38 | 39 | codepen: `
    `, 40 | 41 | defaultMarkup: `
    `, 42 | }; -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const testObject = require("./testData.json"); 2 | const edjsParser = require("../build/Parser.node"); 3 | 4 | const parser = new edjsParser({ 5 | embed: { useProvidedLength: false }, 6 | quote: { applyAlignment: true }, 7 | }, {}, { 8 | youtube: '<%data.embed%><%data.length%>' 9 | }); 10 | const html = parser.parse(testObject); 11 | console.log("HTML:\n" + html); -------------------------------------------------------------------------------- /test/testData.json: -------------------------------------------------------------------------------- 1 | { 2 | "time": 1601898039654, 3 | "blocks": [{ 4 | "type": "image", 5 | "data": { 6 | "url": "https://www.tesla.com/tesla_theme/assets/img/_vehicle_redesign/roadster_and_semi/roadster/hero.jpg", 7 | "caption": "Roadster // tesla.com", 8 | "withBorder": false, 9 | "withBackground": false, 10 | "stretched": true 11 | } 12 | }, 13 | { 14 | "type": "paragraph", 15 | "data": { 16 | "text": "Hello There, it is a test post related to Google which is the biggest search engine!" 17 | } 18 | }, 19 | { 20 | "type": "header", 21 | "data": { 22 | "text": "Google's attributes", 23 | "level": 2 24 | } 25 | }, 26 | { 27 | "type": "list", 28 | "data": { 29 | "style": "ordered", 30 | "items": [ 31 | "Search Engine", 32 | "Google fonts", 33 | "Google images", 34 | "Google maps" 35 | ] 36 | } 37 | }, 38 | { 39 | "type": "quote", 40 | "data": { 41 | "text": "If your access to health care involves your leaving work and driving somewhere and parking and waiting for a long time, that's not going to promote healthiness.", 42 | "caption": "Larry Page", 43 | "alignment": "left" 44 | } 45 | }, 46 | { 47 | "type": "table", 48 | "data": { 49 | "content": [ 50 | ["", "Me", "Me"], 51 | ["You", "Ugly", "Big"] 52 | ] 53 | } 54 | }, 55 | { 56 | "type": "code", 57 | "data": { 58 | "code": "const path = require(\"path\");\nconst cookieParser = require(\"cookie-parser\");\nconst rateLimiter = require(\"express-rate-limit\");\nconst helmet = require(\"helmet\");\nconst mongoSanitize = require(\"express-mongo-sanitize\");\nconst xss = require(\"xss-clean\");\nconst hpp = require(\"hpp\");\nconst express = require(\"express\");" 59 | } 60 | }, 61 | { 62 | "type": "embed", 63 | "data": { 64 | "service": "youtube", 65 | "source": "https://www.youtube.com/watch?v=1z6sLQJHbP0", 66 | "embed": "https://www.youtube.com/embed/1z6sLQJHbP0", 67 | "width": 580, 68 | "height": 320, 69 | "caption": "This is a Youtube video!
    " 70 | } 71 | }, 72 | { 73 | "type": "embed", 74 | "data": { 75 | "service": "twitter", 76 | "source": "https://twitter.com/elonmusk/status/1310001082278371328", 77 | "embed": "https://twitframe.com/show?url=https://twitter.com/elonmusk/status/1310001082278371328", 78 | "width": 600, 79 | "height": 300, 80 | "caption": "This is a twitter embed!
    " 81 | } 82 | }, 83 | { 84 | "type": "warning", 85 | "data": { 86 | "title": "Watch Out!!!
    ", 87 | "message": "This is a test WARNING!
    " 88 | } 89 | }, 90 | { 91 | "type": "delimiter" 92 | }, 93 | 94 | { 95 | "type": "checklist", 96 | "data": { 97 | "items": [{ 98 | "text": "I'm a Developer", 99 | "checked": true 100 | }, 101 | { 102 | "text": "I'm an introvert", 103 | "checked": true 104 | }, 105 | { 106 | "text": "I love science!", 107 | "checked": false 108 | } 109 | ] 110 | } 111 | }, 112 | { 113 | "type": "embed", 114 | "data": { 115 | "service": "codepen", 116 | "source": "https://codepen.io/traversbray/pen/NWNZwPq", 117 | "embed": "https://codepen.io/traversbray/embed/NWNZwPq?height=300&theme-id=0&default-tab=css,result&embed-version=2", 118 | "width": 600, 119 | "height": 300, 120 | "caption": "" 121 | } 122 | }, 123 | { 124 | "type": "code", 125 | "data": { 126 | "code": "
    x

    Hi!

    I'm the element coming from the right of the browser.

    Click the close icon or anywhere on the overlay to close me.

    " 127 | } 128 | }, 129 | { 130 | "type": "embed", 131 | "data": { 132 | "service": "twitter", 133 | "source": "https://twitter.com/SpaceX/status/1310962850601545728", 134 | "embed": "https://twitframe.com/show?url=https://twitter.com/SpaceX/status/1310962850601545728", 135 | "width": 600, 136 | "height": 300, 137 | "caption": "" 138 | } 139 | }, 140 | { 141 | "type": "embed", 142 | "data": { 143 | "service": "instagram", 144 | "source": "https://www.instagram.com/p/CFuMV9MhwlL", 145 | "embed": "https://www.instagram.com/p/CFuMV9MhwlL/embed", 146 | "width": 400, 147 | "height": 505, 148 | "caption": "" 149 | } 150 | }, 151 | { 152 | "type": "image", 153 | "data": { 154 | "file": { 155 | "url": "http://127.0.0.1:5000/img/Wallpaper-Mix-2017.04---24-5f5f73c9754360259669284a-1601846783120.jpg", 156 | "fileName": "Wallpaper-Mix-2017.04---24-5f5f73c9754360259669284a-1601846783120.jpg" 157 | }, 158 | "caption": "dfvsdfvdsvdfvs", 159 | "withBorder": false, 160 | "stretched": true, 161 | "withBackground": false 162 | } 163 | }, 164 | { 165 | "type": "raw", 166 | "data": { 167 | "html": "
    Dark arts and crafts!
    " 168 | } 169 | } 170 | ], 171 | "version": "2.18.0" 172 | } --------------------------------------------------------------------------------