diff --git a/README.md b/README.md index caf31c9..3549754 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ This repository comprises plugins which allow extending the functionality of [ONLYOFFICE DocSpace](https://www.onlyoffice.com/docspace.aspx). +* [ZIP Archives](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/archives) * [Codemirror](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/codemirror) -* [ConvertToMarkdown](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/convert-to-markdown) * [draw.io](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/draw.io) * [Markdown](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/markdown) * [ImageEditor](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/image-editor) * [PDFConverter](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/pdf-converter) * [SpeechToText](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/speech-to-text) -* [ZIP Archives](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/archives) +* [ConvertToMarkdown](https://github.com/ONLYOFFICE/docspace-plugins/tree/master/convert-to-markdown) ## User feedback and support diff --git a/convert-to-markdown/README.md b/convert-to-markdown/README.md index 53d0cb7..7eadbb1 100644 --- a/convert-to-markdown/README.md +++ b/convert-to-markdown/README.md @@ -1,13 +1,13 @@ # Markdown Converter - ONLYOFFICE DocSpace Plugin -Convert DOCX and TXT files to Markdown format directly in DocSpace with a single click. +Convert DOCX, HTML and TXT files to Markdown format directly in DocSpace with a single click. ## Features -- **Easy Conversion**: Right-click any DOCX or TXT file and select "Convert to Markdown" +- **Easy Conversion**: Right-click any DOCX, HTML or TXT file and select "Convert to Markdown" - **Client-Side Processing**: All conversions happen in your browser - no external services required - **Supported Formats**: - - `.docx` - Microsoft Word documents + - `.docx` - Word documents - `.txt` - Plain text files - `.html` - HTML files - **Fast & Reliable**: Uses industry-standard libraries (mammoth.js for DOCX parsing, Turndown for HTML-to-Markdown conversion) @@ -16,7 +16,7 @@ Convert DOCX and TXT files to Markdown format directly in DocSpace with a single ## How to Use 1. Navigate to a folder in DocSpace -2. Right-click on a DOCX, TXT, or HTML file +2. Right-click on a DOCX, HTML or TXT file 3. Select **"Convert to Markdown"** from the context menu 4. The converted `.md` file will be created in the same folder @@ -27,7 +27,7 @@ Convert DOCX and TXT files to Markdown format directly in DocSpace with a single - **DOCX Files**: Parsed using [mammoth.js](https://github.com/mwilliamson/mammoth.js) to extract content as HTML, then converted to Markdown - **TXT Files**: Converted directly to Markdown format -- **HTML Files**: Converted directly to Markdown format +- **HTML Files**: Converted directly to Markdown format using [Turndown](https://github.com/mixmark-io/turndown) ### Technologies Used @@ -43,7 +43,7 @@ Convert DOCX and TXT files to Markdown format directly in DocSpace with a single ## Troubleshooting ### Conversion Failed -- Check that the file is a valid DOCX, TXT or HTML file +- Check that the file is a valid DOCX, HTML or TXT file - Ensure you have permission to create files in the folder - Try refreshing the page and attempting again diff --git a/convert-to-markdown/package-lock.json b/convert-to-markdown/package-lock.json index f785b1b..1b4c0dc 100644 --- a/convert-to-markdown/package-lock.json +++ b/convert-to-markdown/package-lock.json @@ -1,24 +1,26 @@ { - "name": "convert-to-markdown", - "version": "1.0.0", + "name": "convert_to_markdown", + "version": "1.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "convert-to-markdown", - "version": "1.0.0", + "name": "convert_to_markdown", + "version": "1.0.6", "license": "Apache-2.0", "dependencies": { "@onlyoffice/docspace-plugin-sdk": "^2.0.0", + "@truto/turndown-plugin-gfm": "^1.0.2", "mammoth": "^1.11.0", - "turndown": "^7.2.2" + "turndown": "^7.2.2", + "turndown-plugin-gfm": "^1.0.2" }, "devDependencies": { "@types/turndown": "^5.0.6", "prettier": "2.8.6", "ts-loader": "^9.3.1", "typescript": "^4.7.4", - "webpack": "^5.105.0", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0" } }, @@ -132,6 +134,34 @@ "create-docspace-plugin": "npx/index.js" } }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", + "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@truto/turndown-plugin-gfm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@truto/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", + "integrity": "sha512-EayTVTfRg4cTIPTIwC7bwY4jvCy4lz2V4NBDf1OHPr0fH044K5xs1LRy5tcjspOrL1do7FerVw2iqBglO2gxlg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.45.1" + }, + "peerDependencies": { + "turndown": "^7.0.0" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -905,14 +935,14 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" @@ -2193,6 +2223,12 @@ "@mixmark-io/domino": "^2.2.0" } }, + "node_modules/turndown-plugin-gfm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", + "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", + "license": "MIT" + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -2293,9 +2329,9 @@ } }, "node_modules/webpack": { - "version": "5.105.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", - "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", "dependencies": { @@ -2309,7 +2345,7 @@ "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", + "enhanced-resolve": "^5.17.4", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -2322,7 +2358,7 @@ "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { diff --git a/convert-to-markdown/package.json b/convert-to-markdown/package.json index ca33dd6..b4cfd37 100644 --- a/convert-to-markdown/package.json +++ b/convert-to-markdown/package.json @@ -3,7 +3,6 @@ "version": "1.0.0", "description": "Convert DOCX, TXT and HTML files to Markdown format directly in DocSpace", "license": "Apache-2.0", - "homepage": "https://github.com/ONLYOFFICE/docspace-plugins/tree/master/convert-to-markdown", "author": "ONLYOFFICE", "maintainers": [ "Ascensio System SIA (https://www.onlyoffice.com)" @@ -13,6 +12,7 @@ }, "pluginName": "MarkdownConverter", "logo": "icon-md.svg", + "homepage": "", "main": "index.ts", "private": true, "scopes": [ @@ -28,12 +28,14 @@ "prettier": "2.8.6", "ts-loader": "^9.3.1", "typescript": "^4.7.4", - "webpack": "^5.105.0", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0" }, "dependencies": { "@onlyoffice/docspace-plugin-sdk": "^2.0.0", + "@truto/turndown-plugin-gfm": "^1.0.2", "mammoth": "^1.11.0", - "turndown": "^7.2.2" - } + "turndown": "^7.2.2", + "turndown-plugin-gfm": "^1.0.2" + }, } diff --git a/convert-to-markdown/src/ConvertFile.ts b/convert-to-markdown/src/ConvertFile.ts index 59a9090..19c4155 100644 --- a/convert-to-markdown/src/ConvertFile.ts +++ b/convert-to-markdown/src/ConvertFile.ts @@ -20,10 +20,38 @@ import { ToastType, } from "@onlyoffice/docspace-plugin-sdk"; import TurndownService from "turndown"; +import { tables } from "turndown-plugin-gfm"; import mammoth from "mammoth"; import plugin from "."; +// Patch mammoths internal Element.prototype.text which throws "Not implemented" +// when an element has multiple or non text children +// Both convertToHtml and extractRawText hit the same reader path, so patching +// at the source is the only reliable fix for the issue +const patchMammothNodes = (): void => { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const nodes = require("mammoth/lib/xml/nodes"); + const collectText = (children: any[]): string => + children + .map((child: any) => { + if (child.type === "text") return child.value; + if (Array.isArray(child.children)) return collectText(child.children); + return ""; + }) + .join(""); + + nodes.Element.prototype.text = function (): string { + if (this.children.length === 0) return ""; + return collectText(this.children); + }; + } catch (_) { + // If patching fails mammoth will still work for docs that dont hit the bug + } +}; +patchMammothNodes(); + // Supported file extensions const SUPPORTED_EXTENSIONS = { docx: ".docx", @@ -37,12 +65,52 @@ class ConvertFile { private apiURL = ""; private createLock = false; - private turndownService = new TurndownService({ - headingStyle: "atx", - codeBlockStyle: "fenced", - emDelimiter: "*", - bulletListMarker: "-", - }); + private turndownService = (() => { + const service = new TurndownService({ + headingStyle: "atx", + codeBlockStyle: "fenced", + emDelimiter: "*", + bulletListMarker: "-", + }); + service.use(tables); + + // Handle tables that have no (all rows in ) + // The GFM tables plugin only produces pipe-tables when it finds / + // so we need a separate rule that treats the first as the header + service.addRule("tableWithoutHeader", { + filter: (node: HTMLElement): boolean => { + return node.nodeName === "TABLE" && !node.querySelector("thead"); + }, + replacement: (_content: string, node: Node): string => { + const el = node as HTMLElement; + const rows = Array.from(el.querySelectorAll("tr")); + if (rows.length === 0) return _content; + + const getCells = (row: Element): string[] => + Array.from(row.querySelectorAll("td, th")).map((cell) => + (cell.textContent || "") + .trim() + .replace(/\s+/g, " ") + .replace(/\|/g, "\\|") + ); + + const allRows = rows.map(getCells); + const header = allRows[0]; + const separator = header.map(() => "---"); + const body = allRows.slice(1); + + const fmt = (cells: string[]): string => `| ${cells.join(" | ")} |`; + + return ( + "\n\n" + + [fmt(header), fmt(separator), ...body.map(fmt)].join("\n") + + "\n\n" + ); + }, + }); + + return service; + })(); private createAPIUrl = (): void => { const api = plugin.getAPI(); @@ -123,6 +191,13 @@ class ConvertFile { if (!response.ok) { throw new Error(`Failed to download file: ${response.statusText}`); } + + const contentType = response.headers.get("Content-Type") || ""; + if (contentType.includes("application/pdf")) { + throw new Error( + "This file is watermark-protected. Disable the \"Add watermarks to documents\" room setting and try again." + ); + } const buffer = await response.arrayBuffer(); if (!buffer || buffer.byteLength === 0) { diff --git a/convert-to-markdown/src/turndown-plugin-gfm.d.ts b/convert-to-markdown/src/turndown-plugin-gfm.d.ts new file mode 100644 index 0000000..e71e4e8 --- /dev/null +++ b/convert-to-markdown/src/turndown-plugin-gfm.d.ts @@ -0,0 +1,8 @@ +declare module "turndown-plugin-gfm" { + import TurndownService from "turndown"; + + export function gfm(service: TurndownService): void; + export function tables(service: TurndownService): void; + export function strikethrough(service: TurndownService): void; + export function taskListItems(service: TurndownService): void; +} diff --git a/convert-to-markdown/yarn.lock b/convert-to-markdown/yarn.lock index 40cef6e..5226424 100644 --- a/convert-to-markdown/yarn.lock +++ b/convert-to-markdown/yarn.lock @@ -67,6 +67,18 @@ inquirer "^9.1.0" jszip "^3.10.1" +"@rollup/rollup-linux-x64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz" + integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw== + +"@truto/turndown-plugin-gfm@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@truto/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz" + integrity sha512-EayTVTfRg4cTIPTIwC7bwY4jvCy4lz2V4NBDf1OHPr0fH044K5xs1LRy5tcjspOrL1do7FerVw2iqBglO2gxlg== + optionalDependencies: + "@rollup/rollup-linux-x64-gnu" "4.45.1" + "@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" @@ -93,7 +105,7 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*": +"@types/node@*", "@types/node@>=18": version "25.0.10" resolved "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz" integrity sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg== @@ -105,7 +117,7 @@ resolved "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.6.tgz" integrity sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg== -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": +"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -206,7 +218,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": +"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -263,7 +275,7 @@ acorn-import-phases@^1.0.3: resolved "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz" integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== -acorn@^8.15.0: +acorn@^8.14.0, acorn@^8.15.0: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -282,7 +294,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -349,7 +361,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.28.1: +browserslist@^4.28.1, "browserslist@>= 4.21.0": version "4.28.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== @@ -497,13 +509,13 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -enhanced-resolve@^5.0.0, enhanced-resolve@^5.19.0: - version "5.19.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz" - integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.4: + version "5.18.4" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz" + integrity sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q== dependencies: graceful-fs "^4.2.4" - tapable "^2.3.0" + tapable "^2.2.0" envinfo@^7.7.3: version "7.21.0" @@ -1025,7 +1037,7 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" -safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -1035,6 +1047,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -1114,15 +1131,6 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -string-width@^4.1.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" @@ -1137,6 +1145,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +string-width@^4.1.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -1163,7 +1180,7 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tapable@^2.3.0: +tapable@^2.2.0, tapable@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== @@ -1212,7 +1229,12 @@ tslib@^2.1.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -turndown@^7.2.2: +turndown-plugin-gfm@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz" + integrity sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg== + +turndown@^7.0.0, turndown@^7.2.2: version "7.2.2" resolved "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz" integrity sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ== @@ -1224,7 +1246,7 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^4.7.4: +typescript@*, typescript@^4.7.4: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -1252,7 +1274,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -watchpack@^2.5.1: +watchpack@^2.4.4: version "2.5.1" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz" integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== @@ -1267,7 +1289,7 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-cli@^4.10.0: +webpack-cli@^4.10.0, webpack-cli@4.x.x: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -1299,10 +1321,10 @@ webpack-sources@^3.3.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== -webpack@^5.105.0: - version "5.105.2" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz" - integrity sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw== +webpack@^5.0.0, webpack@^5.1.0, webpack@^5.74.0, "webpack@4.x.x || 5.x.x": + version "5.104.1" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz" + integrity sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -1314,7 +1336,7 @@ webpack@^5.105.0: acorn-import-phases "^1.0.3" browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.19.0" + enhanced-resolve "^5.17.4" es-module-lexer "^2.0.0" eslint-scope "5.1.1" events "^3.2.0" @@ -1327,7 +1349,7 @@ webpack@^5.105.0: schema-utils "^4.3.3" tapable "^2.3.0" terser-webpack-plugin "^5.3.16" - watchpack "^2.5.1" + watchpack "^2.4.4" webpack-sources "^3.3.3" which@^2.0.1: