503
package-lock.json
generated
503
package-lock.json
generated
@@ -2043,6 +2043,18 @@
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc/node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/eslintrc/node_modules/type-fest": {
|
||||
"version": "0.20.2",
|
||||
"dev": true,
|
||||
@@ -7166,8 +7178,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/decode-named-character-reference": {
|
||||
"version": "1.0.1",
|
||||
"license": "MIT",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
|
||||
"integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
|
||||
"dependencies": {
|
||||
"character-entities": "^2.0.0"
|
||||
},
|
||||
@@ -8463,6 +8476,18 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/type-fest": {
|
||||
"version": "0.20.2",
|
||||
"dev": true,
|
||||
@@ -11362,6 +11387,18 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/jest-config/node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/jest-diff": {
|
||||
"version": "29.5.0",
|
||||
"dev": true,
|
||||
@@ -13642,64 +13679,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
|
||||
"integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w=="
|
||||
},
|
||||
"node_modules/mdast-util-from-markdown/node_modules/micromark-util-character": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
|
||||
"integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^2.0.0",
|
||||
"micromark-util-types": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz",
|
||||
"integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-string": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz",
|
||||
"integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^2.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^2.0.0",
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-from-markdown/node_modules/micromark-util-normalize-identifier": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz",
|
||||
@@ -13847,6 +13826,45 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
|
||||
"integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-string": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
|
||||
"integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^1.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^1.0.0",
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-footnote/node_modules/unist-util-visit": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
|
||||
@@ -13930,6 +13948,45 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
|
||||
"integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-string": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
|
||||
"integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^1.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^1.0.0",
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-visit": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
|
||||
@@ -13967,7 +14024,7 @@
|
||||
"devlop": "^1.0.0",
|
||||
"markdown-table": "^3.0.0",
|
||||
"mdast-util-from-markdown": "^2.0.0",
|
||||
"mdast-util-to-markdown": "2.0.0"
|
||||
"mdast-util-to-markdown": "^2.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
@@ -13983,12 +14040,6 @@
|
||||
"@types/unist": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-table/node_modules/@types/unist": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
|
||||
"integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/mdast-util-gfm-task-list-item": {
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
@@ -14045,6 +14096,45 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
|
||||
"integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-string": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
|
||||
"integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^1.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^1.0.0",
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-visit": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
|
||||
@@ -14188,6 +14278,45 @@
|
||||
"uvu": "^0.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
|
||||
"integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm/node_modules/micromark-util-decode-string": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
|
||||
"integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^1.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^1.0.0",
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-gfm/node_modules/unist-util-visit": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
|
||||
@@ -14331,94 +14460,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
|
||||
"integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w=="
|
||||
},
|
||||
"node_modules/mdast-util-to-markdown/node_modules/micromark-util-character": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
|
||||
"integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^2.0.0",
|
||||
"micromark-util-types": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz",
|
||||
"integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz",
|
||||
"integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^2.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^2.0.0",
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdast-util-to-markdown/node_modules/micromark-util-symbol": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
|
||||
"integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/mdast-util-to-markdown/node_modules/micromark-util-types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz",
|
||||
"integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/mdast-util-to-string": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
|
||||
@@ -14909,7 +14950,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "1.0.0",
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz",
|
||||
"integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
@@ -14920,13 +14963,29 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
|
||||
"integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/micromark-util-decode-string": {
|
||||
"version": "1.0.1",
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz",
|
||||
"integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
@@ -14937,14 +14996,62 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"micromark-util-character": "^1.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^1.0.0",
|
||||
"micromark-util-symbol": "^1.0.0",
|
||||
"parse-entities": "^3.0.0"
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^2.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^2.0.0",
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/micromark-util-decode-string/node_modules/micromark-util-character": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
|
||||
"integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^2.0.0",
|
||||
"micromark-util-types": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
|
||||
"integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/micromark-util-decode-string/node_modules/micromark-util-types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz",
|
||||
"integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/micromark-util-encode": {
|
||||
"version": "1.0.0",
|
||||
"funding": [
|
||||
@@ -15286,24 +15393,6 @@
|
||||
"micromark-util-types": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/micromark/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz",
|
||||
"integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/micromark/node_modules/micromark-util-encode": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz",
|
||||
@@ -17585,6 +17674,45 @@
|
||||
"uvu": "^0.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-parse/node_modules/micromark-util-decode-numeric-character-reference": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
|
||||
"integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-parse/node_modules/micromark-util-decode-string": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
|
||||
"integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "GitHub Sponsors",
|
||||
"url": "https://github.com/sponsors/unifiedjs"
|
||||
},
|
||||
{
|
||||
"type": "OpenCollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"decode-named-character-reference": "^1.0.0",
|
||||
"micromark-util-character": "^1.0.0",
|
||||
"micromark-util-decode-numeric-character-reference": "^1.0.0",
|
||||
"micromark-util-symbol": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-rehype": {
|
||||
"version": "10.1.0",
|
||||
"license": "MIT",
|
||||
@@ -18613,17 +18741,6 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/strnum": {
|
||||
"version": "1.0.5",
|
||||
"license": "MIT"
|
||||
|
||||
@@ -4,37 +4,38 @@
|
||||
|
||||
We are using the [markdownlint](https://github.com/DavidAnson/markdownlint) framework to implement custom and existing markdown linter rules to check the markdown content in our `content` and `data` directory files. Here is the list of our current rules implemented in our [markdownlint.js script](./scripts/markdownlint.js):
|
||||
|
||||
| **Rule ID** | **Description** | **Severity** |
|
||||
Each rule listed below is configured in a src/content-linter/style file, which is where the rule's severity is defined. The goal is to get to a point where all rules have a severity of `error` and we can set them to `warning` until the occurrences are handled in the content.
|
||||
|
||||
| **Rule ID** | **Description** |
|
||||
|---|---|---|
|
||||
| [MD001](https://github.com/DavidAnson/markdownlint/blob/main/doc/md001.md) | Header levels can only increments by one level at a time. | error |
|
||||
| [MD002](https://github.com/DavidAnson/markdownlint/blob/main/doc/md002.md) | Ensure that headings start with an H2 heading. | error |
|
||||
| [MD004](https://github.com/DavidAnson/markdownlint/blob/main/doc/md004.md) | Unordered list style must be a dash. | error |
|
||||
| [MD009](https://github.com/DavidAnson/markdownlint/blob/main/doc/md009.md) | No unnecessary whitespace from the end of the line. | warning |
|
||||
| [MD012](https://github.com/DavidAnson/markdownlint/blob/main/doc/md012.md) | No unnecessary blank lines. | warning |
|
||||
| [MD014](https://github.com/DavidAnson/markdownlint/blob/main/doc/md014.md) | Dollar signs should not be used before commands without showing output. | error |
|
||||
| [MD018](https://github.com/DavidAnson/markdownlint/blob/main/doc/md018.md) | Must have one space after a hash style heading. | error |
|
||||
| [MD019](https://github.com/DavidAnson/markdownlint/blob/main/doc/md019.md) | Must not have spaces after a hash style heading. | error |
|
||||
| [MD022](https://github.com/DavidAnson/markdownlint/blob/main/doc/md022.md) | Headings must be surrounded by a blank line. | warning |
|
||||
| [MD023](https://github.com/DavidAnson/markdownlint/blob/main/doc/md023.md) | Headings must start at the beginning of the line. | error |
|
||||
| [MD024](https://github.com/DavidAnson/markdownlint/blob/main/doc/md024.md) | Disallow headings with the same content. | error |
|
||||
| [MD027](https://github.com/DavidAnson/markdownlint/blob/main/doc/md027.md) | Catches multiple spaces after blockquote symbol. | warning |
|
||||
| [MD029](https://github.com/DavidAnson/markdownlint/blob/main/doc/md029.md) | All ordered lists should be prefixed with `1.`. | error |
|
||||
| [MD030](https://github.com/DavidAnson/markdownlint/blob/main/doc/md030.md) | Only allow one space after list markers. | error |
|
||||
| [MD031](https://github.com/DavidAnson/markdownlint/blob/main/doc/md031.md) | Fenced code blocks must be surrounded by blank lines. | warning |
|
||||
| [MD037](https://github.com/DavidAnson/markdownlint/blob/main/doc/md037.md) | Remove extra spacing inside emphasis markers. | warning |
|
||||
| [MD039](https://github.com/DavidAnson/markdownlint/blob/main/doc/md039.md) | Remove spacing around image text. | warning |
|
||||
| [MD040](https://github.com/DavidAnson/markdownlint/blob/main/doc/md040.md) | Code fences must have a language specified. | warning |
|
||||
| [MD042](https://github.com/DavidAnson/markdownlint/blob/main/doc/md042.md) | Do not allow empty links. | error |
|
||||
| [MD047](https://github.com/DavidAnson/markdownlint/blob/main/doc/md047.md) | All files should end with a new line character. | warning |
|
||||
| [MD049](https://github.com/DavidAnson/markdownlint/blob/main/doc/md049.md) | All emphasis styling should use underscores. | warning |
|
||||
| [MD050](https://github.com/DavidAnson/markdownlint/blob/main/doc/md050.md) | All strong styling should use asterisks. | warning |
|
||||
| [MD011](https://github.com/DavidAnson/markdownlint/blob/main/doc/md011.md) | Make sure that link syntax is not reversed. | error |
|
||||
| [MD111](./linting-rules/image-alt-text-length.js) | Images alternate text should be between 40-150 characters. | warning |
|
||||
| [MD112](./linting-rules/image-alt-text-end-punctuation.js) | Images alternate text should end with a punctuation. | error |
|
||||
| [MD113](./linting-rules/internal-links-slash.js) | Internal links must start with a `/`. | error |
|
||||
| [MD114](./linting-rules/internal-links-lang.js) | Internal links must not have a hardcoded language code. | error |
|
||||
| [MD115](./linting-rules/image-file-kebab.js) | Image file names should be lowercase kebab case. | error |
|
||||
| [MD117](./linting-rules/code-fence-line-length.js) | Code fence content should be 60 lines or less in length. | warning |
|
||||
| [MD001](https://github.com/DavidAnson/markdownlint/blob/main/doc/md001.md) | Header levels can only increments by one level at a time. |
|
||||
| [MD002](https://github.com/DavidAnson/markdownlint/blob/main/doc/md002.md) | Ensure that headings start with an H2 heading. |
|
||||
| [MD004](https://github.com/DavidAnson/markdownlint/blob/main/doc/md004.md) | Unordered list style must be a dash. |
|
||||
| [MD009](https://github.com/DavidAnson/markdownlint/blob/main/doc/md009.md) | No unnecessary whitespace from the end of the line. |
|
||||
| [MD012](https://github.com/DavidAnson/markdownlint/blob/main/doc/md012.md) | No unnecessary blank lines. |
|
||||
| [MD014](https://github.com/DavidAnson/markdownlint/blob/main/doc/md014.md) | Dollar signs should not be used before commands without showing output. |
|
||||
| [MD018](https://github.com/DavidAnson/markdownlint/blob/main/doc/md018.md) | Must have one space after a hash style heading. |
|
||||
| [MD019](https://github.com/DavidAnson/markdownlint/blob/main/doc/md019.md) | Must not have spaces after a hash style heading. |
|
||||
| [MD022](https://github.com/DavidAnson/markdownlint/blob/main/doc/md022.md) | Headings must be surrounded by a blank line. |
|
||||
| [MD023](https://github.com/DavidAnson/markdownlint/blob/main/doc/md023.md) | Headings must start at the beginning of the line. |
|
||||
| [MD027](https://github.com/DavidAnson/markdownlint/blob/main/doc/md027.md) | Catches multiple spaces after blockquote symbol. |
|
||||
| [MD029](https://github.com/DavidAnson/markdownlint/blob/main/doc/md029.md) | All ordered lists should be prefixed with `1.`. |
|
||||
| [MD030](https://github.com/DavidAnson/markdownlint/blob/main/doc/md030.md) | Only allow one space after list markers. |
|
||||
| [MD031](https://github.com/DavidAnson/markdownlint/blob/main/doc/md031.md) | Fenced code blocks must be surrounded by blank lines. |
|
||||
| [MD037](https://github.com/DavidAnson/markdownlint/blob/main/doc/md037.md) | Remove extra spacing inside emphasis markers. |
|
||||
| [MD039](https://github.com/DavidAnson/markdownlint/blob/main/doc/md039.md) | Remove spacing around image text. |
|
||||
| [MD040](https://github.com/DavidAnson/markdownlint/blob/main/doc/md040.md) | Code fences must have a language specified. |
|
||||
| [MD042](https://github.com/DavidAnson/markdownlint/blob/main/doc/md042.md) | Do not allow empty links. |
|
||||
| [MD047](https://github.com/DavidAnson/markdownlint/blob/main/doc/md047.md) | All files should end with a new line character. |
|
||||
| [MD049](https://github.com/DavidAnson/markdownlint/blob/main/doc/md049.md) | All emphasis styling should use underscores. |
|
||||
| [MD050](https://github.com/DavidAnson/markdownlint/blob/main/doc/md050.md) | All strong styling should use asterisks. |
|
||||
| [MD011](https://github.com/DavidAnson/markdownlint/blob/main/doc/md011.md) | Make sure that link syntax is not reversed. |
|
||||
| [GHD001](./linting-rules/code-fence-line-length.js) | Code fence content should be 60 lines or less in length. |
|
||||
| [GHD002](./linting-rules/image-alt-text-end-punctuation.js) | Images alternate text should end with a punctuation. |
|
||||
| [GHD003](./linting-rules/image-alt-text-length.js) | Images alternate text should be between 40-150 characters. |
|
||||
| [GHD004](./linting-rules/internal-links-slash.js) | Internal links must start with a `/`. |
|
||||
| [GHD005](./linting-rules/internal-links-lang.js) | Internal links must not have a hardcoded language code. |
|
||||
| [GHD006](./linting-rules/image-file-kebab.js) | Image file names should be lowercase kebab case. |
|
||||
|
||||
## Linting Tests
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@ import { addError } from 'markdownlint-rule-helpers'
|
||||
import { getCodeFenceTokens, getCodeFenceLines } from '../markdownlint-helpers.js'
|
||||
|
||||
export const codeFenceLineLength = {
|
||||
names: ['MD117', 'code-fence-line-length'],
|
||||
names: ['GHD001', 'code-fence-line-length'],
|
||||
description: 'Code fence lines should not exceed a maximum length',
|
||||
tags: ['code'],
|
||||
severity: 'warning',
|
||||
function: function MD117(params, onError) {
|
||||
function: function GHD001(params, onError) {
|
||||
const MAX_LINE_LENGTH = String(params.config.maxLength || 60)
|
||||
const codeFenceTokens = getCodeFenceTokens(params)
|
||||
codeFenceTokens.forEach((token) => {
|
||||
@@ -24,7 +24,6 @@ export const codeFenceLineLength = {
|
||||
`Code fence line exceeds ${MAX_LINE_LENGTH} characters.`,
|
||||
undefined, // N/A
|
||||
undefined, // N/A
|
||||
undefined, // N/A
|
||||
)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { addError, forEachInlineChild } from 'markdownlint-rule-helpers'
|
||||
|
||||
export const imageAltTextEndPunctuation = {
|
||||
names: ['MD112', 'image-alt-text-end-punctuation'],
|
||||
names: ['GHD002', 'image-alt-text-end-punctuation'],
|
||||
description: 'Images alternate text should end with a punctuation.',
|
||||
severity: 'error',
|
||||
tags: ['accessibility', 'images'],
|
||||
function: function MD112(params, onError) {
|
||||
function: function GHD003(params, onError) {
|
||||
forEachInlineChild(params, 'image', function forToken(token) {
|
||||
const quoteRegex = /[.?!]['"]$/
|
||||
const endRegex = /[.?!]$/
|
||||
|
||||
@@ -2,11 +2,11 @@ import { addError, forEachInlineChild } from 'markdownlint-rule-helpers'
|
||||
import { liquid } from '#src/content-render/index.js'
|
||||
|
||||
export const incorrectAltTextLength = {
|
||||
names: ['MD111', 'incorrect-alt-text-length'],
|
||||
names: ['GHD003', 'incorrect-alt-text-length'],
|
||||
severity: 'warning',
|
||||
description: 'Images alternate text should be between 40-150 characters',
|
||||
tags: ['accessibility', 'images'],
|
||||
function: function MD111(params, onError) {
|
||||
function: function GHD004(params, onError) {
|
||||
forEachInlineChild(params, 'image', async function forToken(token) {
|
||||
let renderedString = token.content
|
||||
if (token.content.includes('{%') || token.content.includes('{{')) {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { addError, forEachInlineChild } from 'markdownlint-rule-helpers'
|
||||
|
||||
export const imageFileKebab = {
|
||||
names: ['MD115', 'image-file-kebab'],
|
||||
names: ['GHD004', 'image-file-kebab'],
|
||||
description: 'Image file names should always be lowercase kebab case',
|
||||
severity: 'PLACEHOLDER',
|
||||
severity: 'warning',
|
||||
tags: ['accessibility', 'images'],
|
||||
function: function MD115(params, onError) {
|
||||
function: function GHD005(params, onError) {
|
||||
forEachInlineChild(params, 'image', async function forToken(token) {
|
||||
const imageFileName = token.attrs[0][1].split('/').pop().split('.')[0]
|
||||
const nonKebabRegex = /([A-Z]|_)/
|
||||
|
||||
17
src/content-linter/lib/linting-rules/index.js
Normal file
17
src/content-linter/lib/linting-rules/index.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import { codeFenceLineLength } from './code-fence-line-length.js'
|
||||
import { imageAltTextEndPunctuation } from './image-alt-text-end-punctuation.js'
|
||||
import { imageFileKebab } from './image-file-kebab.js'
|
||||
import { incorrectAltTextLength } from './image-alt-text-length.js'
|
||||
import { internalLinksLang } from './internal-links-lang.js'
|
||||
import { internalLinksSlash } from './internal-links-slash.js'
|
||||
|
||||
export const gitHubDocsMarkdownlint = {
|
||||
rules: [
|
||||
codeFenceLineLength,
|
||||
imageAltTextEndPunctuation,
|
||||
imageFileKebab,
|
||||
incorrectAltTextLength,
|
||||
internalLinksLang,
|
||||
internalLinksSlash,
|
||||
],
|
||||
}
|
||||
@@ -3,11 +3,11 @@ import { addError, filterTokens } from 'markdownlint-rule-helpers'
|
||||
import { languageKeys } from '../../../../lib/languages.js'
|
||||
|
||||
export const internalLinksLang = {
|
||||
names: ['MD114', 'internal-links-lang'],
|
||||
names: ['GHD005', 'internal-links-lang'],
|
||||
description: 'Internal links must not have a hardcoded language code',
|
||||
severity: 'error',
|
||||
tags: ['links', 'url'],
|
||||
function: function MD114(params, onError) {
|
||||
function: function GHD006(params, onError) {
|
||||
filterTokens(params, 'inline', (token) => {
|
||||
let linkHref = ''
|
||||
let internalLinkHasLang = false
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { addError, filterTokens } from 'markdownlint-rule-helpers'
|
||||
|
||||
export const internalLinksSlash = {
|
||||
names: ['MD113', 'internal-links-slash'],
|
||||
names: ['GHD006', 'internal-links-slash'],
|
||||
description: 'Internal links must start with a /',
|
||||
severity: 'error',
|
||||
tags: ['links', 'url'],
|
||||
function: function MD113(params, onError) {
|
||||
function: function GHD007(params, onError) {
|
||||
filterTokens(params, 'inline', (token) => {
|
||||
let linkHref = ''
|
||||
let internalLinkHasSlash = true
|
||||
|
||||
@@ -1,121 +1,140 @@
|
||||
#!/usr/bin/env node
|
||||
import { program } from 'commander'
|
||||
import { program, Option } from 'commander'
|
||||
import markdownlint from 'markdownlint'
|
||||
import { applyFixes } from 'markdownlint-rule-helpers'
|
||||
import { readFile, writeFile } from 'fs/promises'
|
||||
|
||||
import walkFiles from '../../../script/helpers/walk-files.js'
|
||||
|
||||
import { incorrectAltTextLength } from '../lib/linting-rules/image-alt-text-length.js'
|
||||
import { internalLinksLang } from '../lib/linting-rules/internal-links-lang.js'
|
||||
import { internalLinksSlash } from '../lib/linting-rules/internal-links-slash.js'
|
||||
import { imageAltTextEndPunctuation } from '../lib/linting-rules/image-alt-text-end-punctuation.js'
|
||||
import { imageFileKebab } from '../lib/linting-rules/image-file-kebab.js'
|
||||
import { gitHubDocsMarkdownlint } from '../lib/linting-rules/index.js'
|
||||
import { baseConfig } from '../style/base.js'
|
||||
import { githubDocsConfig } from '../style/github-docs.js'
|
||||
|
||||
program
|
||||
.description('Run markdownlint.')
|
||||
.option('-p, --path <path>', 'Specify filepaths to include.')
|
||||
.option('-f, --fix', 'Fix linting errors.')
|
||||
.description('Run GitHub Docs Markdownlint rules.')
|
||||
.addOption(
|
||||
new Option('-p, --paths [paths...]', 'Specify filepaths to include.').conflicts('files'),
|
||||
)
|
||||
.addOption(new Option('-f, --files [files...]', 'A list of files to lint.').conflicts('paths'))
|
||||
.addOption(
|
||||
new Option('-e, --error', 'Only report rules that have the severity of error.').conflicts(
|
||||
'rules',
|
||||
),
|
||||
)
|
||||
.addOption(
|
||||
new Option(
|
||||
'-r, --rules [rules...]',
|
||||
'Specify rules to run. For example code-fence-line-length.',
|
||||
).conflicts('error'),
|
||||
)
|
||||
.option('--fix', 'Fix linting errors.')
|
||||
.option('--summary-by-rule', 'Summarize the number of errors for each rule.')
|
||||
.parse(process.argv)
|
||||
|
||||
const { path, fix } = program.opts()
|
||||
const { files, fix, paths, error, rules, summaryByRule } = program.opts()
|
||||
const DEFAULT_LINT_DIRS = ['content', 'data']
|
||||
|
||||
main()
|
||||
|
||||
async function main() {
|
||||
const start = Date.now()
|
||||
const config = {
|
||||
default: false,
|
||||
MD001: true,
|
||||
MD002: { level: 2 },
|
||||
MD004: { style: 'dash' },
|
||||
MD009: true,
|
||||
MD011: true,
|
||||
MD012: true,
|
||||
MD018: true,
|
||||
MD019: true,
|
||||
MD014: true,
|
||||
MD022: true,
|
||||
MD023: true,
|
||||
MD027: true,
|
||||
MD029: { style: 'one' },
|
||||
MD030: true,
|
||||
MD031: true,
|
||||
MD037: true,
|
||||
MD039: true,
|
||||
MD040: {
|
||||
allowed_languages: [
|
||||
'bash',
|
||||
'csharp',
|
||||
'geojson',
|
||||
'go',
|
||||
'golang',
|
||||
'graphql',
|
||||
'groovy',
|
||||
'html',
|
||||
'http',
|
||||
'java',
|
||||
'javascript',
|
||||
'json',
|
||||
'markdown',
|
||||
'math',
|
||||
'md',
|
||||
'mermaid',
|
||||
'powershell',
|
||||
'python',
|
||||
'ruby',
|
||||
'scss',
|
||||
'shell',
|
||||
'sh',
|
||||
'stl',
|
||||
'tasklist',
|
||||
'text',
|
||||
'topojson',
|
||||
'xml',
|
||||
'yaml',
|
||||
'yml',
|
||||
],
|
||||
},
|
||||
MD047: true,
|
||||
MD049: { style: 'underscore' },
|
||||
MD050: { style: 'asterisk' },
|
||||
MD111: true,
|
||||
MD112: true,
|
||||
MD113: true,
|
||||
MD114: true,
|
||||
MD115: true,
|
||||
MD117: true,
|
||||
|
||||
const config = {}
|
||||
const allConfig = { ...baseConfig, ...githubDocsConfig }
|
||||
if (error) {
|
||||
const errorConfig = Object.keys(baseConfig).reduce(
|
||||
(acc, key) => {
|
||||
if (allConfig[key].severity === 'error') acc[key] = allConfig[key]
|
||||
return acc
|
||||
},
|
||||
{ default: false },
|
||||
)
|
||||
Object.assign(config, errorConfig)
|
||||
} else if (rules) {
|
||||
config.default = false
|
||||
for (const rule of rules) {
|
||||
config[rule] = allConfig[rule]
|
||||
}
|
||||
} else {
|
||||
Object.assign(config, allConfig)
|
||||
}
|
||||
|
||||
const files = walkFiles(path, ['.md'], { includeBasePath: true })
|
||||
// If paths or files have not been specified, lint all files
|
||||
const filesToLint = files || getFilesToLint(paths || DEFAULT_LINT_DIRS)
|
||||
|
||||
const options = {
|
||||
files,
|
||||
customRules: [
|
||||
incorrectAltTextLength,
|
||||
imageAltTextEndPunctuation,
|
||||
internalLinksLang,
|
||||
internalLinksSlash,
|
||||
imageFileKebab,
|
||||
],
|
||||
files: filesToLint,
|
||||
config,
|
||||
customRules: gitHubDocsMarkdownlint.rules,
|
||||
}
|
||||
|
||||
const result = await markdownlint.promises.markdownlint(options)
|
||||
|
||||
if (fix) {
|
||||
for (const file of files) {
|
||||
for (const file of filesToLint) {
|
||||
const content = await readFile(file, 'utf8')
|
||||
const applied = applyFixes(content, result[file])
|
||||
await writeFile(file, applied)
|
||||
}
|
||||
}
|
||||
|
||||
Object.keys(result).forEach((key) => {
|
||||
if (result[key].length > 0) {
|
||||
console.log(key, result[key])
|
||||
}
|
||||
})
|
||||
// Used for a temporary way to allow us to see how many errors currently
|
||||
// exist for each rule in the content directory.
|
||||
if (summaryByRule) {
|
||||
reportSummaryByRule(result, config)
|
||||
} else {
|
||||
reportResults(result)
|
||||
}
|
||||
|
||||
const end = Date.now()
|
||||
console.log(`markdownlint finished in ${(end - start) / 1000} s`)
|
||||
|
||||
const errorFileCount = getErrorCountByFile(result)
|
||||
if (errorFileCount > 0) {
|
||||
console.log(`Found ${errorFileCount} file(s) with error(s).`)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
function getFilesToLint(paths) {
|
||||
const fileList = []
|
||||
for (const path of paths) {
|
||||
fileList.push(...walkFiles(path, ['.md'], { includeBasePath: true }))
|
||||
}
|
||||
return fileList
|
||||
}
|
||||
|
||||
function reportSummaryByRule(result, config) {
|
||||
const ruleCount = {}
|
||||
|
||||
// populate the list of rules with 0 occurrences
|
||||
for (const rule of Object.keys(config)) {
|
||||
ruleCount[rule] = 0
|
||||
}
|
||||
// the default property is not acutally a rule
|
||||
delete ruleCount.default
|
||||
|
||||
Object.keys(result).forEach((key) => {
|
||||
if (result[key].length > 0) {
|
||||
for (const flaw of result[key]) {
|
||||
const ruleName = flaw.ruleNames[1]
|
||||
const count = ruleCount[ruleName]
|
||||
ruleCount[ruleName] = count + 1
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
console.log(JSON.stringify(ruleCount, null, 2))
|
||||
}
|
||||
|
||||
function reportResults(results) {
|
||||
Object.entries(results)
|
||||
// each result key always has an array value, but it may be empty
|
||||
.filter(([key, result]) => result.length)
|
||||
.forEach(([key, result]) => {
|
||||
console.log(key, result)
|
||||
})
|
||||
}
|
||||
|
||||
function getErrorCountByFile(result) {
|
||||
return Object.values(result).filter((value) => value.length).length
|
||||
}
|
||||
|
||||
126
src/content-linter/style/base.js
Normal file
126
src/content-linter/style/base.js
Normal file
@@ -0,0 +1,126 @@
|
||||
export const baseConfig = {
|
||||
// Don't run all rules by default. This must be done first to
|
||||
// enable a specific set of rules.
|
||||
default: false,
|
||||
'heading-increment': {
|
||||
// MD001
|
||||
severity: 'warning',
|
||||
},
|
||||
'first-heading-h1': {
|
||||
// MD002
|
||||
severity: 'warning',
|
||||
level: 2,
|
||||
noPartialFileChecks: true,
|
||||
},
|
||||
'ul-style': {
|
||||
// MD004
|
||||
severity: 'error',
|
||||
style: 'dash',
|
||||
},
|
||||
'no-trailing-spaces': {
|
||||
// MD009
|
||||
severity: 'warning',
|
||||
},
|
||||
'no-reversed-links': {
|
||||
// MD011
|
||||
severity: 'error',
|
||||
},
|
||||
'no-multiple-blanks': {
|
||||
// MD012
|
||||
severity: 'error',
|
||||
},
|
||||
'commands-show-output': {
|
||||
// MD014
|
||||
severity: 'error',
|
||||
},
|
||||
'no-missing-space-atx': {
|
||||
// MD018
|
||||
severity: 'error',
|
||||
},
|
||||
'no-multiple-space-atx': {
|
||||
// MD019
|
||||
severity: 'error',
|
||||
},
|
||||
'blanks-around-headings': {
|
||||
// MD022
|
||||
severity: 'error',
|
||||
},
|
||||
'heading-start-left': {
|
||||
// MD023
|
||||
severity: 'error',
|
||||
},
|
||||
'no-multiple-space-blockquote': {
|
||||
// MD027
|
||||
severity: 'error',
|
||||
},
|
||||
'ol-prefix': {
|
||||
// MD029
|
||||
severity: 'error',
|
||||
style: 'one',
|
||||
},
|
||||
'list-marker-space': {
|
||||
// MD030
|
||||
severity: 'error',
|
||||
},
|
||||
'blanks-around-fences': {
|
||||
// MD031
|
||||
severity: 'warning',
|
||||
},
|
||||
'no-space-in-emphasis': {
|
||||
// MD037
|
||||
severity: 'error',
|
||||
},
|
||||
'no-space-in-links': {
|
||||
// MD039
|
||||
severity: 'error',
|
||||
},
|
||||
'fenced-code-language': {
|
||||
// MD040
|
||||
severity: 'warning',
|
||||
allowed_languages: [
|
||||
'bash',
|
||||
'csharp',
|
||||
'geojson',
|
||||
'go',
|
||||
'golang',
|
||||
'graphql',
|
||||
'groovy',
|
||||
'html',
|
||||
'http',
|
||||
'java',
|
||||
'javascript',
|
||||
'json',
|
||||
'markdown',
|
||||
'math',
|
||||
'md',
|
||||
'mermaid',
|
||||
'powershell',
|
||||
'python',
|
||||
'ruby',
|
||||
'scss',
|
||||
'shell',
|
||||
'sh',
|
||||
'stl',
|
||||
'tasklist',
|
||||
'text',
|
||||
'topojson',
|
||||
'xml',
|
||||
'yaml',
|
||||
'yml',
|
||||
],
|
||||
},
|
||||
'single-trailing-newline': {
|
||||
// MD047
|
||||
severity: 'warning',
|
||||
},
|
||||
'emphasis-style': {
|
||||
// MD049
|
||||
severity: 'warning',
|
||||
style: 'underscore',
|
||||
},
|
||||
'strong-style': {
|
||||
// MD050
|
||||
severity: 'error',
|
||||
style: 'asterisk',
|
||||
},
|
||||
}
|
||||
26
src/content-linter/style/github-docs.js
Normal file
26
src/content-linter/style/github-docs.js
Normal file
@@ -0,0 +1,26 @@
|
||||
export const githubDocsConfig = {
|
||||
'code-fence-line-length': {
|
||||
// GHD001
|
||||
severity: 'warning',
|
||||
},
|
||||
'image-alt-text-end-punctuation': {
|
||||
// GHD002
|
||||
severity: 'error',
|
||||
},
|
||||
'incorrect-alt-text-length': {
|
||||
// GHD003
|
||||
severity: 'warning',
|
||||
},
|
||||
'image-file-kebab': {
|
||||
// GHD004
|
||||
severity: 'warning',
|
||||
},
|
||||
'internal-links-lang': {
|
||||
// GHD005
|
||||
severity: 'error',
|
||||
},
|
||||
'internal-links-slash': {
|
||||
// GHD006
|
||||
severity: 'error',
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user