From 1ebe65d10dcdd697ed00e6b90df9cd919f40fb5c Mon Sep 17 00:00:00 2001 From: Mister-Hope Date: Tue, 22 Oct 2024 19:42:30 +0800 Subject: [PATCH] feat: add plugin-markdown-ext --- .vscode/settings.json | 3 +- .../markdown/plugin-markdown-ext/package.json | 60 ++++++++++++ .../plugin-markdown-ext/rollup.config.ts | 10 ++ .../plugin-markdown-ext/src/node/index.ts | 1 + .../src/node/markdown-it-plugins/component.ts | 67 +++++++++++++ .../src/node/markdown-it-plugins/index.ts | 2 + .../src/node/markdown-it-plugins/utils.ts | 3 + .../src/node/markdown-it-plugins/vPre.ts | 10 ++ .../src/node/markdownExtPlugin.ts | 38 ++++++++ .../plugin-markdown-ext/src/node/options.ts | 77 +++++++++++++++ .../plugin-markdown-ext/src/node/utils.ts | 5 + .../tests/node/component.spec.ts | 95 +++++++++++++++++++ .../tests/node/vPre.spec.ts | 14 +++ .../plugin-markdown-ext/tsconfig.build.json | 8 ++ pnpm-lock.yaml | 69 ++++++++++++++ 15 files changed, 461 insertions(+), 1 deletion(-) create mode 100644 plugins/markdown/plugin-markdown-ext/package.json create mode 100644 plugins/markdown/plugin-markdown-ext/rollup.config.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/index.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/component.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/index.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/utils.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/vPre.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/markdownExtPlugin.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/options.ts create mode 100644 plugins/markdown/plugin-markdown-ext/src/node/utils.ts create mode 100644 plugins/markdown/plugin-markdown-ext/tests/node/component.spec.ts create mode 100644 plugins/markdown/plugin-markdown-ext/tests/node/vPre.spec.ts create mode 100644 plugins/markdown/plugin-markdown-ext/tsconfig.build.json diff --git a/.vscode/settings.json b/.vscode/settings.json index b2b10e18e6..52489824ce 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,9 +33,10 @@ "globby", "gtag", "jsonld", + "katex", "lazyload", "lightmode", - "katex", + "linkify", "mathjax", "mdit", "nord", diff --git a/plugins/markdown/plugin-markdown-ext/package.json b/plugins/markdown/plugin-markdown-ext/package.json new file mode 100644 index 0000000000..ec8a6ee6fb --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/package.json @@ -0,0 +1,60 @@ +{ + "name": "@vuepress/plugin-markdown-ext", + "version": "2.0.0-rc.54", + "description": "VuePress plugin - markdown extension", + "keywords": [ + "vuepress-plugin", + "vuepress", + "plugin", + "markdown", + "extension" + ], + "homepage": "https://ecosystem.vuejs.press/plugins/markdown/markdown-ext.html", + "bugs": { + "url": "https://github.com/vuepress/ecosystem/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/vuepress/ecosystem.git", + "directory": "plugins/markdown/plugin-markdown-ext" + }, + "license": "MIT", + "author": { + "name": "Mr.Hope", + "email": "mister-hope@outlook.com", + "url": "https://mister-hope.com" + }, + "type": "module", + "exports": { + ".": "./lib/node/index.js", + "./package.json": "./package.json" + }, + "main": "./lib/node/index.js", + "types": "./lib/node/index.d.ts", + "files": [ + "lib" + ], + "scripts": { + "build": "tsc -b tsconfig.build.json", + "bundle": "rollup -c rollup.config.ts --configPlugin esbuild", + "clean": "rimraf --glob ./lib ./*.tsbuildinfo" + }, + "dependencies": { + "@mdit/plugin-container": "^0.13.1", + "@mdit/plugin-footnote": "^0.13.1", + "@mdit/plugin-tasklist": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "workspace:*", + "js-yaml": "^4.1.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + }, + "devDependencies": { + "@types/js-yaml": "4.0.9", + "markdown-it": "^14.1.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/plugins/markdown/plugin-markdown-ext/rollup.config.ts b/plugins/markdown/plugin-markdown-ext/rollup.config.ts new file mode 100644 index 0000000000..f0a0f96e21 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/rollup.config.ts @@ -0,0 +1,10 @@ +import { rollupBundle } from '../../../scripts/rollup.js' + +export default rollupBundle('node/index', { + external: [ + '@mdit/plugin-container', + '@mdit/plugin-footnote', + '@mdit/plugin-tasklist', + 'js-yaml', + ], +}) diff --git a/plugins/markdown/plugin-markdown-ext/src/node/index.ts b/plugins/markdown/plugin-markdown-ext/src/node/index.ts new file mode 100644 index 0000000000..e383ac49b9 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/index.ts @@ -0,0 +1 @@ +export * from './markdownExtPlugin.js' diff --git a/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/component.ts b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/component.ts new file mode 100644 index 0000000000..b476a313fd --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/component.ts @@ -0,0 +1,67 @@ +import { load } from 'js-yaml' +import type { Options, PluginSimple } from 'markdown-it' +import type { RenderRule } from 'markdown-it/lib/renderer.mjs' +import type Token from 'markdown-it/lib/token.mjs' +import type { MarkdownEnv } from 'vuepress/markdown' + +import { logger } from '../utils.js' +import { stringifyProp } from './utils.js' + +const getComponentRender = + (name: string): RenderRule => + ( + tokens: Token[], + index: number, + _options: Options, + { filePathRelative }: MarkdownEnv, + ): string => { + const token = tokens[index] + const { content } = token + + let config: unknown = null + + if (content.trim().startsWith('{')) + try { + config = JSON.parse(content) as unknown + } catch { + // Do nothing + } + else + try { + config = load(content) + } catch { + // Do nothing + } + + if (config) return `<${name} v-bind='${stringifyProp(config)}' />` + + logger.error( + `Invalid ${name} config${ + filePathRelative ? ` found in ${filePathRelative}` : '' + }: +${content} +`, + ) + + return '' + } + +export const component: PluginSimple = (md) => { + // Handle ```component blocks + const { fence } = md.renderer.rules + + md.renderer.rules.fence = (...args): string => { + const [tokens, index] = args + const { info } = tokens[index] + + const [fenceName, componentName] = info.split(' ', 2) + + if (fenceName === 'component') { + const render = getComponentRender(componentName) + + return render(...args) + } + + return fence!(...args) + } +} diff --git a/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/index.ts b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/index.ts new file mode 100644 index 0000000000..cf1d7d0c90 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/index.ts @@ -0,0 +1,2 @@ +export * from './component.js' +export * from './vPre.js' diff --git a/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/utils.ts b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/utils.ts new file mode 100644 index 0000000000..b78742555e --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/utils.ts @@ -0,0 +1,3 @@ +// Single quote will break @vue/compiler-sfc +export const stringifyProp = (data: unknown): string => + JSON.stringify(data).replace(/'/g, ''') diff --git a/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/vPre.ts b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/vPre.ts new file mode 100644 index 0000000000..0b46ac88dc --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/markdown-it-plugins/vPre.ts @@ -0,0 +1,10 @@ +import { container } from '@mdit/plugin-container' +import type { PluginSimple } from 'markdown-it' + +export const vPre: PluginSimple = (md) => { + container(md, { + name: 'v-pre', + openRender: () => `
\n`, + closeRender: () => '
\n', + }) +} diff --git a/plugins/markdown/plugin-markdown-ext/src/node/markdownExtPlugin.ts b/plugins/markdown/plugin-markdown-ext/src/node/markdownExtPlugin.ts new file mode 100644 index 0000000000..1b4ab8be0b --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/markdownExtPlugin.ts @@ -0,0 +1,38 @@ +import { footnote as footnotePlugin } from '@mdit/plugin-footnote' +import { tasklist as tasklistPlugin } from '@mdit/plugin-tasklist' +import type { Plugin } from 'vuepress/core' +import { isPlainObject } from 'vuepress/shared' + +import { + component as componentPlugin, + vPre as vPrePlugin, +} from './markdown-it-plugins/index.js' +import type { MarkdownExtPluginOptions } from './options.js' +import { PLUGIN_NAME } from './utils.js' + +export const markdownExtPlugin = ({ + gfm, + breaks, + linkify, + footnote, + tasklist, + + component, + vPre, +}: MarkdownExtPluginOptions): Plugin => { + return { + name: PLUGIN_NAME, + + extendsMarkdown: (md) => { + // Behavior + if (breaks ?? gfm) md.options.breaks = true + if (linkify ?? gfm) md.options.linkify = true + + if (footnote ?? gfm) md.use(footnotePlugin) + if (tasklist ?? gfm) + md.use(tasklistPlugin, [isPlainObject(tasklist) ? tasklist : {}]) + if (component) md.use(componentPlugin) + if (vPre) md.use(vPrePlugin) + }, + } +} diff --git a/plugins/markdown/plugin-markdown-ext/src/node/options.ts b/plugins/markdown/plugin-markdown-ext/src/node/options.ts new file mode 100644 index 0000000000..984369d657 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/options.ts @@ -0,0 +1,77 @@ +import type { MarkdownItTaskListOptions } from '@mdit/plugin-tasklist' + +/** + * Options of markdown-ext plugin + */ +export interface MarkdownExtPluginOptions { + /** + * Whether enable standard GFM support + * + * 是否启用标准的 GitHub Favor Markdown 支持 + * + * @default false + */ + gfm?: boolean + + /** + * Whether convert `\n` in paragraphs into `
`s + * + * 是否将段落中的 `\n` 转换为 `
` + * + * @description enabled in gfm mode + * + * @default false + */ + breaks?: boolean + + /** + * Whether convert URL-like text into links + * + * 是否将文字中的链接格式文字转换为链接 + * + * @description enabled in gfm mode + * + * @default false + */ + linkify?: boolean + + /** + * Whether to enable footnote format support + * + * 是否启用脚注格式支持。 + * + * @description enabled in gfm mode + * + * @default false + */ + footnote?: boolean + + /** + * Whether to enable tasklist format support + * + * 是否启用任务列表支持 + * + * @description enabled in gfm mode + * + * @default false + */ + tasklist?: MarkdownItTaskListOptions | boolean + + /** + * Whether to enable component support + * + * 是否启用组件支持 + * + * @default false + */ + component?: boolean + + /** + * Whether to enable v-pre wrapper. + * + * 是否启用 v-pre 容器。 + * + * @default false + */ + vPre?: boolean +} diff --git a/plugins/markdown/plugin-markdown-ext/src/node/utils.ts b/plugins/markdown/plugin-markdown-ext/src/node/utils.ts new file mode 100644 index 0000000000..9079776dd9 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/src/node/utils.ts @@ -0,0 +1,5 @@ +import { Logger } from '@vuepress/helper' + +export const PLUGIN_NAME = '@vuepress/plugin-markdown-ext' + +export const logger = new Logger(PLUGIN_NAME) diff --git a/plugins/markdown/plugin-markdown-ext/tests/node/component.spec.ts b/plugins/markdown/plugin-markdown-ext/tests/node/component.spec.ts new file mode 100644 index 0000000000..c4916cbbe2 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/tests/node/component.spec.ts @@ -0,0 +1,95 @@ +import MarkdownIt from 'markdown-it' +import { describe, expect, it } from 'vitest' + +import { component } from '../../src/node/markdown-it-plugins/component.js' + +describe('component', () => { + const markdownIt = MarkdownIt({ linkify: true }).use(component) + + it('Should resolve component fence', () => { + const result1 = markdownIt.render( + ` +\`\`\`component VPCard +title: A card +desc: A card desc +logo: https://example.com/logo.png +link: https://example.com +color: "#000" +\`\`\` +`, + {}, + ) + + const result2 = markdownIt.render( + ` +\`\`\`component VPCard +{ + "title": "A card", + "desc": "A card desc", + "logo": "https://example.com/logo.png", + "link": "https://example.com", + "color": "#000" +} +\`\`\` +`, + {}, + ) + + expect(result1).toContain('VPCard') + expect(result1).toMatchSnapshot() + expect(result2).toContain('VPCard') + expect(result2).toMatchSnapshot() + }) + + it('Should not throw with invalid syntax', () => { + const result1 = markdownIt.render( + ` +\`\`\`component VPCard +title: a +title: b +\`\`\` +`, + {}, + ) + + const result2 = markdownIt.render( + ` +\`\`\`component VPCard +title: a +title: b +\`\`\` +`, + {}, + ) + + expect(result1).toEqual('') + expect(result2).toEqual('') + }) + + it('Should drop when receiving a invalid syntax', () => { + const result = markdownIt.render( + ` +\`\`\`component VPCard +{a:1} +\`\`\` +`, + {}, + ) + + expect(result).toMatch('') + }) + + it('Should not break markdown fence', () => { + const result = markdownIt.render( + ` +\`\`\`js +const a = 1; +\`\`\` +`, + {}, + ) + + expect(result).toMatch(/[\s\S]*<\/pre>/) + expect(result).toMatchSnapshot() + }) +}) diff --git a/plugins/markdown/plugin-markdown-ext/tests/node/vPre.spec.ts b/plugins/markdown/plugin-markdown-ext/tests/node/vPre.spec.ts new file mode 100644 index 0000000000..0c8c845f20 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/tests/node/vPre.spec.ts @@ -0,0 +1,14 @@ +import MarkdownIt from 'markdown-it' +import { describe, expect, it } from 'vitest' + +import { vPre } from '../../src/node/markdown-it-plugins/vPre.js' + +describe('v-pre', () => { + it('should add v-pre wrapper', () => { + const markdownIt = MarkdownIt({ linkify: true }).use(vPre) + + expect(markdownIt.render('::: v-pre\n{{a}}\n:::\n')).toBe( + '
\n

{{a}}

\n
\n', + ) + }) +}) diff --git a/plugins/markdown/plugin-markdown-ext/tsconfig.build.json b/plugins/markdown/plugin-markdown-ext/tsconfig.build.json new file mode 100644 index 0000000000..1e7fd0d655 --- /dev/null +++ b/plugins/markdown/plugin-markdown-ext/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.build.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["./src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aabb288722..20d4225e9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -634,6 +634,37 @@ importers: specifier: ^14.1.0 version: 14.1.0 + plugins/markdown/plugin-markdown-ext: + dependencies: + '@mdit/plugin-container': + specifier: ^0.13.1 + version: 0.13.1(markdown-it@14.1.0) + '@mdit/plugin-footnote': + specifier: ^0.13.1 + version: 0.13.1(markdown-it@14.1.0) + '@mdit/plugin-tasklist': + specifier: ^0.13.1 + version: 0.13.1(markdown-it@14.1.0) + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@vuepress/helper': + specifier: workspace:* + version: link:../../../tools/helper + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + vuepress: + specifier: 2.0.0-rc.18 + version: 2.0.0-rc.18(@vuepress/bundler-vite@2.0.0-rc.18(@types/node@22.7.7)(jiti@1.21.6)(lightningcss@1.27.0)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)(tsx@4.19.1)(typescript@5.6.3)(yaml@2.4.5))(@vuepress/bundler-webpack@2.0.0-rc.18(esbuild@0.23.1)(typescript@5.6.3))(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + devDependencies: + '@types/js-yaml': + specifier: 4.0.9 + version: 4.0.9 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + plugins/markdown/plugin-markdown-hint: dependencies: '@mdit/plugin-alert': @@ -2442,6 +2473,15 @@ packages: markdown-it: optional: true + '@mdit/plugin-tasklist@0.13.1': + resolution: {integrity: sha512-flEWnDJFEB7QZIHRwtkVjAEZe9ONiRQLRg7oazRDBM/3Z0rf28blxOx7qj2QZ/FVzQnRRZTgjFQkpiz61IckKQ==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + '@mdit/plugin-tex@0.13.1': resolution: {integrity: sha512-lkRf6XrfVfS11FzT3hiooWdOUPJfAd/cnAv4NN/4WU7qOEz0e0HBVQO8PQb5CPwrE94Ld4+E6rQwJfVH1grkwQ==} engines: {node: '>= 18'} @@ -2634,30 +2674,35 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} @@ -2772,46 +2817,55 @@ packages: resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -2959,6 +3013,9 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -5503,24 +5560,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.27.0: resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.27.0: resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.27.0: resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.27.0: resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} @@ -9763,6 +9824,12 @@ snapshots: optionalDependencies: markdown-it: 14.1.0 + '@mdit/plugin-tasklist@0.13.1(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + '@mdit/plugin-tex@0.13.1(markdown-it@14.1.0)': dependencies: '@types/markdown-it': 14.1.2 @@ -10355,6 +10422,8 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/js-yaml@4.0.9': {} + '@types/json-schema@7.0.15': {} '@types/jsonfile@6.1.4':