code-pushup / cli

A CLI to run all kinds of code quality measurements to align your team with company goals
https://code-pushup.dev
MIT License
157 stars 9 forks source link

Generate config docs from Zod schemas #242

Closed kristihoskova closed 6 months ago

kristihoskova commented 7 months ago

Spike for the research is 2h.

matejchalk commented 6 months ago

Possible solutions for generating Markdown docs from Zod schemas (via JSON schema):

matejchalk commented 6 months ago

The Markdown files generated by @adobe/jsonschema2md looked really bad, but found some decent alternatives.


Markdown generated by json-schema-md-doc Type: `object` path: # $schema: [http://json-schema.org/draft-07/schema#](http://json-schema.org/draft-07/schema#) This schema does not accept additional properties. **_Properties_** - plugins `required` - _List of plugins to be used (official, community-provided, or custom)_ - Type: `array` - path: #/properties/plugins - **_Items_** - Type: `object` - path: #/properties/plugins/items - This schema does not accept additional properties. - **_Properties_** - packageName - _NPM package name_ - Type: `string` - path: #/properties/plugins/items/properties/packageName - version - _NPM version of the package_ - Type: `string` - path: #/properties/plugins/items/properties/version - title `required` - _Descriptive name_ - Type: `string` - path: #/properties/plugins/items/properties/title - Length: ≤ 256 - description - _Description (markdown)_ - Type: `string` - path: #/properties/plugins/items/properties/description - Length: ≤ 65536 - docsUrl - _Plugin documentation site_ - path: #/properties/plugins/items/properties/docsUrl - slug `required` - _References plugin. ID (unique within core config)_ - Type: `string` - path: #/properties/plugins/items/properties/slug - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - icon `required` - _Icon from VSCode Material Icons extension_ - Type: `string` - path: #/properties/plugins/items/properties/icon - The value is restricted to the following: 1. _"git"_ 2. _"yaml"_ 3. _"xml"_ 4. _"matlab"_ 5. _"settings"_ 6. _"shaderlab"_ 7. _"diff"_ 8. _"json"_ 9. _"blink"_ 10. _"java"_ 11. _"razor"_ 12. _"python"_ 13. _"mojo"_ 14. _"javascript"_ 15. _"typescript"_ 16. _"scala"_ 17. _"handlebars"_ 18. _"perl"_ 19. _"haxe"_ 20. _"puppet"_ 21. _"elixir"_ 22. _"livescript"_ 23. _"erlang"_ 24. _"twig"_ 25. _"julia"_ 26. _"elm"_ 27. _"purescript"_ 28. _"stylus"_ 29. _"nunjucks"_ 30. _"pug"_ 31. _"robot"_ 32. _"sass"_ 33. _"less"_ 34. _"css"_ 35. _"visualstudio"_ 36. _"angular"_ 37. _"graphql"_ 38. _"solidity"_ 39. _"autoit"_ 40. _"haml"_ 41. _"yang"_ 42. _"terraform"_ 43. _"applescript"_ 44. _"cake"_ 45. _"cucumber"_ 46. _"nim"_ 47. _"apiblueprint"_ 48. _"riot"_ 49. _"postcss"_ 50. _"coldfusion"_ 51. _"haskell"_ 52. _"dhall"_ 53. _"cabal"_ 54. _"nix"_ 55. _"ruby"_ 56. _"slim"_ 57. _"php"_ 58. _"php_elephant"_ 59. _"php_elephant_pink"_ 60. _"hack"_ 61. _"react"_ 62. _"mjml"_ 63. _"processing"_ 64. _"hcl"_ 65. _"go"_ 66. _"go_gopher"_ 67. _"nodejs_alt"_ 68. _"django"_ 69. _"html"_ 70. _"godot"_ 71. _"godot-assets"_ 72. _"vim"_ 73. _"silverstripe"_ 74. _"prolog"_ 75. _"pawn"_ 76. _"reason"_ 77. _"sml"_ 78. _"tex"_ 79. _"salesforce"_ 80. _"sas"_ 81. _"docker"_ 82. _"table"_ 83. _"csharp"_ 84. _"console"_ 85. _"c"_ 86. _"cpp"_ 87. _"objective-c"_ 88. _"objective-cpp"_ 89. _"coffee"_ 90. _"fsharp"_ 91. _"editorconfig"_ 92. _"clojure"_ 93. _"groovy"_ 94. _"markdown"_ 95. _"jinja"_ 96. _"proto"_ 97. _"python-misc"_ 98. _"vue"_ 99. _"lua"_ 100. _"lib"_ 101. _"log"_ 102. _"jupyter"_ 103. _"document"_ 104. _"pdf"_ 105. _"powershell"_ 106. _"r"_ 107. _"rust"_ 108. _"database"_ 109. _"kusto"_ 110. _"lock"_ 111. _"svg"_ 112. _"swift"_ 113. _"react_ts"_ 114. _"search"_ 115. _"minecraft"_ 116. _"rescript"_ 117. _"otne"_ 118. _"twine"_ 119. _"grain"_ 120. _"lolcode"_ 121. _"idris"_ 122. _"chess"_ 123. _"gemini"_ 124. _"vlang"_ 125. _"wolframlanguage"_ 126. _"shader"_ 127. _"tree"_ 128. _"svelte"_ 129. _"dart"_ 130. _"cadence"_ 131. _"stylable"_ 132. _"blink_light"_ 133. _"jinja_light"_ 134. _"playwright"_ 135. _"sublime"_ 136. _"image"_ 137. _"routing"_ 138. _"typescript-def"_ 139. _"markojs"_ 140. _"astro"_ 141. _"vscode"_ 142. _"qsharp"_ 143. _"zip"_ 144. _"vala"_ 145. _"zig"_ 146. _"exe"_ 147. _"hex"_ 148. _"jar"_ 149. _"javaclass"_ 150. _"h"_ 151. _"hpp"_ 152. _"rc"_ 153. _"go-mod"_ 154. _"url"_ 155. _"gradle"_ 156. _"word"_ 157. _"certificate"_ 158. _"key"_ 159. _"font"_ 160. _"gemfile"_ 161. _"rubocop"_ 162. _"rubocop_light"_ 163. _"arduino"_ 164. _"powerpoint"_ 165. _"video"_ 166. _"virtual"_ 167. _"email"_ 168. _"audio"_ 169. _"raml"_ 170. _"xaml"_ 171. _"kotlin"_ 172. _"dart_generated"_ 173. _"actionscript"_ 174. _"mxml"_ 175. _"autohotkey"_ 176. _"flash"_ 177. _"swc"_ 178. _"cmake"_ 179. _"assembly"_ 180. _"semgrep"_ 181. _"vue-config"_ 182. _"nuxt"_ 183. _"ocaml"_ 184. _"odin"_ 185. _"javascript-map"_ 186. _"css-map"_ 187. _"test-ts"_ 188. _"test-jsx"_ 189. _"test-js"_ 190. _"angular-component"_ 191. _"angular-guard"_ 192. _"angular-service"_ 193. _"angular-pipe"_ 194. _"angular-directive"_ 195. _"angular-resolver"_ 196. _"smarty"_ 197. _"bucklescript"_ 198. _"merlin"_ 199. _"verilog"_ 200. _"mathematica"_ 201. _"vercel"_ 202. _"vercel_light"_ 203. _"verdaccio"_ 204. _"next"_ 205. _"next_light"_ 206. _"remix"_ 207. _"remix_light"_ 208. _"laravel"_ 209. _"vfl"_ 210. _"kl"_ 211. _"posthtml"_ 212. _"todo"_ 213. _"http"_ 214. _"restql"_ 215. _"kivy"_ 216. _"graphcool"_ 217. _"sbt"_ 218. _"webpack"_ 219. _"ionic"_ 220. _"gulp"_ 221. _"nodejs"_ 222. _"npm"_ 223. _"yarn"_ 224. _"android"_ 225. _"tune"_ 226. _"turborepo"_ 227. _"turborepo_light"_ 228. _"babel"_ 229. _"blitz"_ 230. _"contributing"_ 231. _"readme"_ 232. _"changelog"_ 233. _"architecture"_ 234. _"credits"_ 235. _"authors"_ 236. _"flow"_ 237. _"favicon"_ 238. _"karma"_ 239. _"bithound"_ 240. _"svgo"_ 241. _"appveyor"_ 242. _"travis"_ 243. _"codecov"_ 244. _"sonarcloud"_ 245. _"protractor"_ 246. _"fusebox"_ 247. _"heroku"_ 248. _"gitlab"_ 249. _"bower"_ 250. _"eslint"_ 251. _"conduct"_ 252. _"watchman"_ 253. _"aurelia"_ 254. _"auto"_ 255. _"auto_light"_ 256. _"mocha"_ 257. _"jenkins"_ 258. _"firebase"_ 259. _"figma"_ 260. _"rollup"_ 261. _"hardhat"_ 262. _"stylelint"_ 263. _"stylelint_light"_ 264. _"code-climate"_ 265. _"code-climate_light"_ 266. _"prettier"_ 267. _"renovate"_ 268. _"apollo"_ 269. _"nodemon"_ 270. _"webhint"_ 271. _"browserlist"_ 272. _"browserlist_light"_ 273. _"crystal"_ 274. _"crystal_light"_ 275. _"snyk"_ 276. _"drone"_ 277. _"drone_light"_ 278. _"cuda"_ 279. _"dotjs"_ 280. _"ejs"_ 281. _"sequelize"_ 282. _"gatsby"_ 283. _"wakatime"_ 284. _"wakatime_light"_ 285. _"circleci"_ 286. _"circleci_light"_ 287. _"cloudfoundry"_ 288. _"grunt"_ 289. _"jest"_ 290. _"storybook"_ 291. _"wepy"_ 292. _"fastlane"_ 293. _"hcl_light"_ 294. _"helm"_ 295. _"san"_ 296. _"wallaby"_ 297. _"stencil"_ 298. _"red"_ 299. _"makefile"_ 300. _"foxpro"_ 301. _"i18n"_ 302. _"webassembly"_ 303. _"semantic-release"_ 304. _"semantic-release_light"_ 305. _"bitbucket"_ 306. _"d"_ 307. _"mdx"_ 308. _"mdsvex"_ 309. _"ballerina"_ 310. _"racket"_ 311. _"bazel"_ 312. _"mint"_ 313. _"velocity"_ 314. _"azure-pipelines"_ 315. _"azure"_ 316. _"vagrant"_ 317. _"prisma"_ 318. _"abc"_ 319. _"asciidoc"_ 320. _"istanbul"_ 321. _"edge"_ 322. _"scheme"_ 323. _"lisp"_ 324. _"tailwindcss"_ 325. _"3d"_ 326. _"buildkite"_ 327. _"netlify"_ 328. _"netlify_light"_ 329. _"nest"_ 330. _"moonscript"_ 331. _"percy"_ 332. _"gitpod"_ 333. _"advpl_prw"_ 334. _"advpl_ptm"_ 335. _"advpl_tlpp"_ 336. _"advpl_include"_ 337. _"codeowners"_ 338. _"gcp"_ 339. _"disc"_ 340. _"fortran"_ 341. _"tcl"_ 342. _"liquid"_ 343. _"husky"_ 344. _"coconut"_ 345. _"tilt"_ 346. _"capacitor"_ 347. _"sketch"_ 348. _"adonis"_ 349. _"forth"_ 350. _"uml"_ 351. _"uml_light"_ 352. _"meson"_ 353. _"commitlint"_ 354. _"buck"_ 355. _"nrwl"_ 356. _"opam"_ 357. _"dune"_ 358. _"imba"_ 359. _"drawio"_ 360. _"pascal"_ 361. _"roadmap"_ 362. _"nuget"_ 363. _"command"_ 364. _"stryker"_ 365. _"denizenscript"_ 366. _"modernizr"_ 367. _"slug"_ 368. _"stitches"_ 369. _"stitches_light"_ 370. _"nginx"_ 371. _"replit"_ 372. _"rescript-interface"_ 373. _"snowpack"_ 374. _"snowpack_light"_ 375. _"brainfuck"_ 376. _"bicep"_ 377. _"cobol"_ 378. _"quasar"_ 379. _"dependabot"_ 380. _"pipeline"_ 381. _"vite"_ 382. _"vitest"_ 383. _"opa"_ 384. _"lerna"_ 385. _"windicss"_ 386. _"textlint"_ 387. _"lilypond"_ 388. _"chess_light"_ 389. _"sentry"_ 390. _"phpunit"_ 391. _"php-cs-fixer"_ 392. _"robots"_ 393. _"tsconfig"_ 394. _"tauri"_ 395. _"jsconfig"_ 396. _"maven"_ 397. _"ada"_ 398. _"serverless"_ 399. _"supabase"_ 400. _"ember"_ 401. _"horusec"_ 402. _"poetry"_ 403. _"coala"_ 404. _"parcel"_ 405. _"dinophp"_ 406. _"teal"_ 407. _"template"_ 408. _"astyle"_ 409. _"lighthouse"_ 410. _"svgr"_ 411. _"rome"_ 412. _"cypress"_ 413. _"siyuan"_ 414. _"ndst"_ 415. _"plop"_ 416. _"tobi"_ 417. _"tobimake"_ 418. _"gleam"_ 419. _"pnpm"_ 420. _"pnpm_light"_ 421. _"gridsome"_ 422. _"steadybit"_ 423. _"caddy"_ 424. _"bun"_ 425. _"bun_light"_ 426. _"antlr"_ 427. _"pinejs"_ 428. _"nano-staged"_ 429. _"nano-staged_light"_ 430. _"craco"_ 431. _"gamemaker"_ 432. _"tldraw"_ 433. _"tldraw_light"_ 434. _"mercurial"_ 435. _"deno"_ 436. _"deno_light"_ 437. _"plastic"_ 438. _"typst"_ 439. _"unocss"_ 440. _"ifanr-cloud"_ 441. _"mermaid"_ 442. _"werf"_ 443. _"roblox"_ 444. _"panda"_ 445. _"file"_ 446. _"folder-robot"_ 447. _"folder-robot-open"_ 448. _"folder-src"_ 449. _"folder-src-open"_ 450. _"folder-dist"_ 451. _"folder-dist-open"_ 452. _"folder-css"_ 453. _"folder-css-open"_ 454. _"folder-sass"_ 455. _"folder-sass-open"_ 456. _"folder-images"_ 457. _"folder-images-open"_ 458. _"folder-scripts"_ 459. _"folder-scripts-open"_ 460. _"folder-node"_ 461. _"folder-node-open"_ 462. _"folder-javascript"_ 463. _"folder-javascript-open"_ 464. _"folder-json"_ 465. _"folder-json-open"_ 466. _"folder-font"_ 467. _"folder-font-open"_ 468. _"folder-bower"_ 469. _"folder-bower-open"_ 470. _"folder-test"_ 471. _"folder-test-open"_ 472. _"folder-jinja"_ 473. _"folder-jinja-open"_ 474. _"folder-jinja_light"_ 475. _"folder-jinja-open_light"_ 476. _"folder-markdown"_ 477. _"folder-markdown-open"_ 478. _"folder-php"_ 479. _"folder-php-open"_ 480. _"folder-phpmailer"_ 481. _"folder-phpmailer-open"_ 482. _"folder-sublime"_ 483. _"folder-sublime-open"_ 484. _"folder-docs"_ 485. _"folder-docs-open"_ 486. _"folder-git"_ 487. _"folder-git-open"_ 488. _"folder-github"_ 489. _"folder-github-open"_ 490. _"folder-gitlab"_ 491. _"folder-gitlab-open"_ 492. _"folder-vscode"_ 493. _"folder-vscode-open"_ 494. _"folder-views"_ 495. _"folder-views-open"_ 496. _"folder-vue"_ 497. _"folder-vue-open"_ 498. _"folder-vuepress"_ 499. _"folder-vuepress-open"_ 500. _"folder-expo"_ 501. _"folder-expo-open"_ 502. _"folder-config"_ 503. _"folder-config-open"_ 504. _"folder-i18n"_ 505. _"folder-i18n-open"_ 506. _"folder-components"_ 507. _"folder-components-open"_ 508. _"folder-verdaccio"_ 509. _"folder-verdaccio-open"_ 510. _"folder-aurelia"_ 511. _"folder-aurelia-open"_ 512. _"folder-resource"_ 513. _"folder-resource-open"_ 514. _"folder-lib"_ 515. _"folder-lib-open"_ 516. _"folder-theme"_ 517. _"folder-theme-open"_ 518. _"folder-webpack"_ 519. _"folder-webpack-open"_ 520. _"folder-global"_ 521. _"folder-global-open"_ 522. _"folder-public"_ 523. _"folder-public-open"_ 524. _"folder-include"_ 525. _"folder-include-open"_ 526. _"folder-docker"_ 527. _"folder-docker-open"_ 528. _"folder-database"_ 529. _"folder-database-open"_ 530. _"folder-log"_ 531. _"folder-log-open"_ 532. _"folder-target"_ 533. _"folder-target-open"_ 534. _"folder-temp"_ 535. _"folder-temp-open"_ 536. _"folder-aws"_ 537. _"folder-aws-open"_ 538. _"folder-audio"_ 539. _"folder-audio-open"_ 540. _"folder-video"_ 541. _"folder-video-open"_ 542. _"folder-kubernetes"_ 543. _"folder-kubernetes-open"_ 544. _"folder-import"_ 545. _"folder-import-open"_ 546. _"folder-export"_ 547. _"folder-export-open"_ 548. _"folder-wakatime"_ 549. _"folder-wakatime-open"_ 550. _"folder-circleci"_ 551. _"folder-circleci-open"_ 552. _"folder-wordpress"_ 553. _"folder-wordpress-open"_ 554. _"folder-gradle"_ 555. _"folder-gradle-open"_ 556. _"folder-coverage"_ 557. _"folder-coverage-open"_ 558. _"folder-class"_ 559. _"folder-class-open"_ 560. _"folder-other"_ 561. _"folder-other-open"_ 562. _"folder-lua"_ 563. _"folder-lua-open"_ 564. _"folder-typescript"_ 565. _"folder-typescript-open"_ 566. _"folder-graphql"_ 567. _"folder-graphql-open"_ 568. _"folder-routes"_ 569. _"folder-routes-open"_ 570. _"folder-ci"_ 571. _"folder-ci-open"_ 572. _"folder-benchmark"_ 573. _"folder-benchmark-open"_ 574. _"folder-messages"_ 575. _"folder-messages-open"_ 576. _"folder-less"_ 577. _"folder-less-open"_ 578. _"folder-gulp"_ 579. _"folder-gulp-open"_ 580. _"folder-python"_ 581. _"folder-python-open"_ 582. _"folder-mojo"_ 583. _"folder-mojo-open"_ 584. _"folder-debug"_ 585. _"folder-debug-open"_ 586. _"folder-fastlane"_ 587. _"folder-fastlane-open"_ 588. _"folder-plugin"_ 589. _"folder-plugin-open"_ 590. _"folder-middleware"_ 591. _"folder-middleware-open"_ 592. _"folder-controller"_ 593. _"folder-controller-open"_ 594. _"folder-ansible"_ 595. _"folder-ansible-open"_ 596. _"folder-server"_ 597. _"folder-server-open"_ 598. _"folder-client"_ 599. _"folder-client-open"_ 600. _"folder-tasks"_ 601. _"folder-tasks-open"_ 602. _"folder-android"_ 603. _"folder-android-open"_ 604. _"folder-ios"_ 605. _"folder-ios-open"_ 606. _"folder-upload"_ 607. _"folder-upload-open"_ 608. _"folder-download"_ 609. _"folder-download-open"_ 610. _"folder-tools"_ 611. _"folder-tools-open"_ 612. _"folder-helper"_ 613. _"folder-helper-open"_ 614. _"folder-serverless"_ 615. _"folder-serverless-open"_ 616. _"folder-api"_ 617. _"folder-api-open"_ 618. _"folder-app"_ 619. _"folder-app-open"_ 620. _"folder-apollo"_ 621. _"folder-apollo-open"_ 622. _"folder-archive"_ 623. _"folder-archive-open"_ 624. _"folder-batch"_ 625. _"folder-batch-open"_ 626. _"folder-buildkite"_ 627. _"folder-buildkite-open"_ 628. _"folder-cluster"_ 629. _"folder-cluster-open"_ 630. _"folder-command"_ 631. _"folder-command-open"_ 632. _"folder-constant"_ 633. _"folder-constant-open"_ 634. _"folder-container"_ 635. _"folder-container-open"_ 636. _"folder-content"_ 637. _"folder-content-open"_ 638. _"folder-context"_ 639. _"folder-context-open"_ 640. _"folder-core"_ 641. _"folder-core-open"_ 642. _"folder-delta"_ 643. _"folder-delta-open"_ 644. _"folder-dump"_ 645. _"folder-dump-open"_ 646. _"folder-examples"_ 647. _"folder-examples-open"_ 648. _"folder-environment"_ 649. _"folder-environment-open"_ 650. _"folder-functions"_ 651. _"folder-functions-open"_ 652. _"folder-generator"_ 653. _"folder-generator-open"_ 654. _"folder-hook"_ 655. _"folder-hook-open"_ 656. _"folder-job"_ 657. _"folder-job-open"_ 658. _"folder-keys"_ 659. _"folder-keys-open"_ 660. _"folder-layout"_ 661. _"folder-layout-open"_ 662. _"folder-mail"_ 663. _"folder-mail-open"_ 664. _"folder-mappings"_ 665. _"folder-mappings-open"_ 666. _"folder-meta"_ 667. _"folder-meta-open"_ 668. _"folder-changesets"_ 669. _"folder-changesets-open"_ 670. _"folder-packages"_ 671. _"folder-packages-open"_ 672. _"folder-shared"_ 673. _"folder-shared-open"_ 674. _"folder-shader"_ 675. _"folder-shader-open"_ 676. _"folder-stack"_ 677. _"folder-stack-open"_ 678. _"folder-template"_ 679. _"folder-template-open"_ 680. _"folder-utils"_ 681. _"folder-utils-open"_ 682. _"folder-supabase"_ 683. _"folder-supabase-open"_ 684. _"folder-private"_ 685. _"folder-private-open"_ 686. _"folder-error"_ 687. _"folder-error-open"_ 688. _"folder-event"_ 689. _"folder-event-open"_ 690. _"folder-secure"_ 691. _"folder-secure-open"_ 692. _"folder-custom"_ 693. _"folder-custom-open"_ 694. _"folder-mock"_ 695. _"folder-mock-open"_ 696. _"folder-syntax"_ 697. _"folder-syntax-open"_ 698. _"folder-vm"_ 699. _"folder-vm-open"_ 700. _"folder-stylus"_ 701. _"folder-stylus-open"_ 702. _"folder-flow"_ 703. _"folder-flow-open"_ 704. _"folder-rules"_ 705. _"folder-rules-open"_ 706. _"folder-review"_ 707. _"folder-review-open"_ 708. _"folder-animation"_ 709. _"folder-animation-open"_ 710. _"folder-guard"_ 711. _"folder-guard-open"_ 712. _"folder-prisma"_ 713. _"folder-prisma-open"_ 714. _"folder-pipe"_ 715. _"folder-pipe-open"_ 716. _"folder-svg"_ 717. _"folder-svg-open"_ 718. _"folder-terraform"_ 719. _"folder-terraform-open"_ 720. _"folder-mobile"_ 721. _"folder-mobile-open"_ 722. _"folder-stencil"_ 723. _"folder-stencil-open"_ 724. _"folder-firebase"_ 725. _"folder-firebase-open"_ 726. _"folder-svelte"_ 727. _"folder-svelte-open"_ 728. _"folder-update"_ 729. _"folder-update-open"_ 730. _"folder-intellij"_ 731. _"folder-intellij-open"_ 732. _"folder-intellij_light"_ 733. _"folder-intellij-open_light"_ 734. _"folder-azure-pipelines"_ 735. _"folder-azure-pipelines-open"_ 736. _"folder-mjml"_ 737. _"folder-mjml-open"_ 738. _"folder-admin"_ 739. _"folder-admin-open"_ 740. _"folder-scala"_ 741. _"folder-scala-open"_ 742. _"folder-connection"_ 743. _"folder-connection-open"_ 744. _"folder-quasar"_ 745. _"folder-quasar-open"_ 746. _"folder-next"_ 747. _"folder-next-open"_ 748. _"folder-cobol"_ 749. _"folder-cobol-open"_ 750. _"folder-yarn"_ 751. _"folder-yarn-open"_ 752. _"folder-husky"_ 753. _"folder-husky-open"_ 754. _"folder-storybook"_ 755. _"folder-storybook-open"_ 756. _"folder-base"_ 757. _"folder-base-open"_ 758. _"folder-cart"_ 759. _"folder-cart-open"_ 760. _"folder-home"_ 761. _"folder-home-open"_ 762. _"folder-project"_ 763. _"folder-project-open"_ 764. _"folder-interface"_ 765. _"folder-interface-open"_ 766. _"folder-netlify"_ 767. _"folder-netlify-open"_ 768. _"folder-enum"_ 769. _"folder-enum-open"_ 770. _"folder-contract"_ 771. _"folder-contract-open"_ 772. _"folder-queue"_ 773. _"folder-queue-open"_ 774. _"folder-vercel"_ 775. _"folder-vercel-open"_ 776. _"folder-cypress"_ 777. _"folder-cypress-open"_ 778. _"folder-decorators"_ 779. _"folder-decorators-open"_ 780. _"folder-java"_ 781. _"folder-java-open"_ 782. _"folder-resolver"_ 783. _"folder-resolver-open"_ 784. _"folder-angular"_ 785. _"folder-angular-open"_ 786. _"folder-unity"_ 787. _"folder-unity-open"_ 788. _"folder-pdf"_ 789. _"folder-pdf-open"_ 790. _"folder-proto"_ 791. _"folder-proto-open"_ 792. _"folder-plastic"_ 793. _"folder-plastic-open"_ 794. _"folder-gamemaker"_ 795. _"folder-gamemaker-open"_ 796. _"folder-mercurial"_ 797. _"folder-mercurial-open"_ 798. _"folder-godot"_ 799. _"folder-godot-open"_ 800. _"folder"_ 801. _"folder-open"_ 802. _"folder-root"_ 803. _"folder-root-open"_ - runner `required` - path: #/properties/plugins/items/properties/runner - audits `required` - _List of audits maintained in a plugin_ - Type: `array` - path: #/properties/plugins/items/properties/audits - **_Items_** - Type: `object` - path: #/properties/plugins/items/properties/audits/items - This schema does not accept additional properties. - **_Properties_** - slug `required` - _ID (unique within plugin)_ - Type: `string` - path: #/properties/plugins/items/properties/audits/items/properties/slug - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - title `required` - _Descriptive name_ - Type: `string` - path: #/properties/plugins/items/properties/audits/items/properties/title - Length: ≤ 256 - description - _Description (markdown)_ - Type: `string` - path: #/properties/plugins/items/properties/audits/items/properties/description - Length: ≤ 65536 - docsUrl - _Link to documentation (rationale)_ - path: #/properties/plugins/items/properties/audits/items/properties/docsUrl - groups - _List of groups_ - Type: `array` - path: #/properties/plugins/items/properties/groups - **_Items_** - Type: `object` - path: #/properties/plugins/items/properties/groups/items - This schema does not accept additional properties. - **_Properties_** - slug `required` - _Human-readable unique ID, e.g. "performance"_ - Type: `string` - path: #/properties/plugins/items/properties/groups/items/properties/slug - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - refs `required` - Type: `array` - path: #/properties/plugins/items/properties/groups/items/properties/refs - **_Items_** - _Weighted references to audits_ - Type: `object` - path: #/properties/plugins/items/properties/groups/items/properties/refs/items - This schema does not accept additional properties. - **_Properties_** - slug `required` - _Reference slug to an audit within this plugin (e.g. 'max-lines')_ - Type: `string` - path: #/properties/plugins/items/properties/groups/items/properties/refs/items/properties/slug - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - weight `required` - _Weight used to calculate score_ - Type: `integer` - path: #/properties/plugins/items/properties/groups/items/properties/refs/items/properties/weight - Range: ≥ 0 - title `required` - _Descriptive name for the group_ - Type: `string` - path: #/properties/plugins/items/properties/groups/items/properties/title - Length: ≤ 256 - description - _Description of the group (markdown)_ - Type: `string` - path: #/properties/plugins/items/properties/groups/items/properties/description - Length: ≤ 65536 - docsUrl - _Group documentation site_ - path: #/properties/plugins/items/properties/groups/items/properties/docsUrl - persist `required` - Type: `object` - path: #/properties/persist - This schema does not accept additional properties. - **_Properties_** - outputDir `required` - _Artifacts folder_ - Type: `string` - path: #/properties/persist/properties/outputDir - Length: ≥ 1 - filename - _Artifacts file name (without extension)_ - Type: `string` - path: #/properties/persist/properties/filename - Default: _"report"_ - The value must match this pattern: `^(?!.*[ \\/:*?"<>|]).+$` - Length: ≥ 1 - format - Type: `array` - path: #/properties/persist/properties/format - Default: `json` - **_Items_** - Type: `string` - path: #/properties/persist/properties/format/items - The value is restricted to the following: 1. _"json"_ 2. _"md"_ - upload - Type: `object` - path: #/properties/upload - This schema does not accept additional properties. - **_Properties_** - server `required` - _URL of deployed portal API_ - Type: `string` - path: #/properties/upload/properties/server - String format must be a "uri" - apiKey `required` - _API key with write access to portal (use `process.env` for security)_ - Type: `string` - path: #/properties/upload/properties/apiKey - organization `required` - _Organization in code versioning system_ - Type: `string` - path: #/properties/upload/properties/organization - project `required` - _Project in code versioning system_ - Type: `string` - path: #/properties/upload/properties/project - categories `required` - _Categorization of individual audits_ - Type: `array` - path: #/properties/categories - **_Items_** - Type: `object` - path: #/properties/categories/items - This schema does not accept additional properties. - **_Properties_** - slug `required` - _Human-readable unique ID, e.g. "performance"_ - Type: `string` - path: #/properties/categories/items/properties/slug - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - refs `required` - Type: `array` - path: #/properties/categories/items/properties/refs - **_Items_** - Type: `object` - path: #/properties/categories/items/properties/refs/items - This schema does not accept additional properties. - **_Properties_** - slug `required` - _Slug of an audit or group (depending on `type`)_ - Type: `string` - path: #/properties/categories/items/properties/refs/items/properties/slug - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - weight `required` - _Weight used to calculate score_ - Type: `integer` - path: #/properties/categories/items/properties/refs/items/properties/weight - Range: ≥ 0 - type `required` - _Discriminant for reference kind, affects where `slug` is looked up_ - Type: `string` - path: #/properties/categories/items/properties/refs/items/properties/type - The value is restricted to the following: 1. _"audit"_ 2. _"group"_ - plugin `required` - _Plugin slug (plugin should contain referenced audit or group)_ - Type: `string` - path: #/properties/categories/items/properties/refs/items/properties/plugin - The value must match this pattern: `^[a-z0-9]+(?:-[a-z0-9]+)*$` - Length: ≤ 128 - title `required` - _Category Title_ - Type: `string` - path: #/properties/categories/items/properties/title - Length: ≤ 256 - description - _Category description_ - Type: `string` - path: #/properties/categories/items/properties/description - Length: ≤ 65536 - docsUrl - _Category docs URL_ - path: #/properties/categories/items/properties/docsUrl - isBinary - _Is this a binary category (i.e. only a perfect score considered a "pass")?_ - Type: `boolean` - path: #/properties/categories/items/properties/isBinary _Generated with [json-schema-md-doc](https://brianwendt.github.io/json-schema-md-doc/)_

Markdown generated by jsonschema2md (Python) # JSON Schema ## Properties - **`plugins`** *(array)*: List of plugins to be used (official, community-provided, or custom). - **Items** *(object)*: Cannot contain additional properties. - **`packageName`** *(string)*: NPM package name. - **`version`** *(string)*: NPM version of the package. - **`title`** *(string, required)*: Descriptive name. - **`description`** *(string)*: Description (markdown). - **`docsUrl`**: Plugin documentation site. - **Any of** - : Plugin documentation site. - **Any of** - - *string, format: uri*: Plugin documentation site. - *string* - **`slug`** *(string, required)*: References plugin. ID (unique within core config). - **`icon`** *(string, required)*: Icon from VSCode Material Icons extension. Must be one of: `["git", "yaml", "xml", "matlab", "settings", "shaderlab", "diff", "json", "blink", "java", "razor", "python", "mojo", "javascript", "typescript", "scala", "handlebars", "perl", "haxe", "puppet", "elixir", "livescript", "erlang", "twig", "julia", "elm", "purescript", "stylus", "nunjucks", "pug", "robot", "sass", "less", "css", "visualstudio", "angular", "graphql", "solidity", "autoit", "haml", "yang", "terraform", "applescript", "cake", "cucumber", "nim", "apiblueprint", "riot", "postcss", "coldfusion", "haskell", "dhall", "cabal", "nix", "ruby", "slim", "php", "php_elephant", "php_elephant_pink", "hack", "react", "mjml", "processing", "hcl", "go", "go_gopher", "nodejs_alt", "django", "html", "godot", "godot-assets", "vim", "silverstripe", "prolog", "pawn", "reason", "sml", "tex", "salesforce", "sas", "docker", "table", "csharp", "console", "c", "cpp", "objective-c", "objective-cpp", "coffee", "fsharp", "editorconfig", "clojure", "groovy", "markdown", "jinja", "proto", "python-misc", "vue", "lua", "lib", "log", "jupyter", "document", "pdf", "powershell", "r", "rust", "database", "kusto", "lock", "svg", "swift", "react_ts", "search", "minecraft", "rescript", "otne", "twine", "grain", "lolcode", "idris", "chess", "gemini", "vlang", "wolframlanguage", "shader", "tree", "svelte", "dart", "cadence", "stylable", "blink_light", "jinja_light", "playwright", "sublime", "image", "routing", "typescript-def", "markojs", "astro", "vscode", "qsharp", "zip", "vala", "zig", "exe", "hex", "jar", "javaclass", "h", "hpp", "rc", "go-mod", "url", "gradle", "word", "certificate", "key", "font", "gemfile", "rubocop", "rubocop_light", "arduino", "powerpoint", "video", "virtual", "email", "audio", "raml", "xaml", "kotlin", "dart_generated", "actionscript", "mxml", "autohotkey", "flash", "swc", "cmake", "assembly", "semgrep", "vue-config", "nuxt", "ocaml", "odin", "javascript-map", "css-map", "test-ts", "test-jsx", "test-js", "angular-component", "angular-guard", "angular-service", "angular-pipe", "angular-directive", "angular-resolver", "smarty", "bucklescript", "merlin", "verilog", "mathematica", "vercel", "vercel_light", "verdaccio", "next", "next_light", "remix", "remix_light", "laravel", "vfl", "kl", "posthtml", "todo", "http", "restql", "kivy", "graphcool", "sbt", "webpack", "ionic", "gulp", "nodejs", "npm", "yarn", "android", "tune", "turborepo", "turborepo_light", "babel", "blitz", "contributing", "readme", "changelog", "architecture", "credits", "authors", "flow", "favicon", "karma", "bithound", "svgo", "appveyor", "travis", "codecov", "sonarcloud", "protractor", "fusebox", "heroku", "gitlab", "bower", "eslint", "conduct", "watchman", "aurelia", "auto", "auto_light", "mocha", "jenkins", "firebase", "figma", "rollup", "hardhat", "stylelint", "stylelint_light", "code-climate", "code-climate_light", "prettier", "renovate", "apollo", "nodemon", "webhint", "browserlist", "browserlist_light", "crystal", "crystal_light", "snyk", "drone", "drone_light", "cuda", "dotjs", "ejs", "sequelize", "gatsby", "wakatime", "wakatime_light", "circleci", "circleci_light", "cloudfoundry", "grunt", "jest", "storybook", "wepy", "fastlane", "hcl_light", "helm", "san", "wallaby", "stencil", "red", "makefile", "foxpro", "i18n", "webassembly", "semantic-release", "semantic-release_light", "bitbucket", "d", "mdx", "mdsvex", "ballerina", "racket", "bazel", "mint", "velocity", "azure-pipelines", "azure", "vagrant", "prisma", "abc", "asciidoc", "istanbul", "edge", "scheme", "lisp", "tailwindcss", "3d", "buildkite", "netlify", "netlify_light", "nest", "moonscript", "percy", "gitpod", "advpl_prw", "advpl_ptm", "advpl_tlpp", "advpl_include", "codeowners", "gcp", "disc", "fortran", "tcl", "liquid", "husky", "coconut", "tilt", "capacitor", "sketch", "adonis", "forth", "uml", "uml_light", "meson", "commitlint", "buck", "nrwl", "opam", "dune", "imba", "drawio", "pascal", "roadmap", "nuget", "command", "stryker", "denizenscript", "modernizr", "slug", "stitches", "stitches_light", "nginx", "replit", "rescript-interface", "snowpack", "snowpack_light", "brainfuck", "bicep", "cobol", "quasar", "dependabot", "pipeline", "vite", "vitest", "opa", "lerna", "windicss", "textlint", "lilypond", "chess_light", "sentry", "phpunit", "php-cs-fixer", "robots", "tsconfig", "tauri", "jsconfig", "maven", "ada", "serverless", "supabase", "ember", "horusec", "poetry", "coala", "parcel", "dinophp", "teal", "template", "astyle", "lighthouse", "svgr", "rome", "cypress", "siyuan", "ndst", "plop", "tobi", "tobimake", "gleam", "pnpm", "pnpm_light", "gridsome", "steadybit", "caddy", "bun", "bun_light", "antlr", "pinejs", "nano-staged", "nano-staged_light", "craco", "gamemaker", "tldraw", "tldraw_light", "mercurial", "deno", "deno_light", "plastic", "typst", "unocss", "ifanr-cloud", "mermaid", "werf", "roblox", "panda", "file", "folder-robot", "folder-robot-open", "folder-src", "folder-src-open", "folder-dist", "folder-dist-open", "folder-css", "folder-css-open", "folder-sass", "folder-sass-open", "folder-images", "folder-images-open", "folder-scripts", "folder-scripts-open", "folder-node", "folder-node-open", "folder-javascript", "folder-javascript-open", "folder-json", "folder-json-open", "folder-font", "folder-font-open", "folder-bower", "folder-bower-open", "folder-test", "folder-test-open", "folder-jinja", "folder-jinja-open", "folder-jinja_light", "folder-jinja-open_light", "folder-markdown", "folder-markdown-open", "folder-php", "folder-php-open", "folder-phpmailer", "folder-phpmailer-open", "folder-sublime", "folder-sublime-open", "folder-docs", "folder-docs-open", "folder-git", "folder-git-open", "folder-github", "folder-github-open", "folder-gitlab", "folder-gitlab-open", "folder-vscode", "folder-vscode-open", "folder-views", "folder-views-open", "folder-vue", "folder-vue-open", "folder-vuepress", "folder-vuepress-open", "folder-expo", "folder-expo-open", "folder-config", "folder-config-open", "folder-i18n", "folder-i18n-open", "folder-components", "folder-components-open", "folder-verdaccio", "folder-verdaccio-open", "folder-aurelia", "folder-aurelia-open", "folder-resource", "folder-resource-open", "folder-lib", "folder-lib-open", "folder-theme", "folder-theme-open", "folder-webpack", "folder-webpack-open", "folder-global", "folder-global-open", "folder-public", "folder-public-open", "folder-include", "folder-include-open", "folder-docker", "folder-docker-open", "folder-database", "folder-database-open", "folder-log", "folder-log-open", "folder-target", "folder-target-open", "folder-temp", "folder-temp-open", "folder-aws", "folder-aws-open", "folder-audio", "folder-audio-open", "folder-video", "folder-video-open", "folder-kubernetes", "folder-kubernetes-open", "folder-import", "folder-import-open", "folder-export", "folder-export-open", "folder-wakatime", "folder-wakatime-open", "folder-circleci", "folder-circleci-open", "folder-wordpress", "folder-wordpress-open", "folder-gradle", "folder-gradle-open", "folder-coverage", "folder-coverage-open", "folder-class", "folder-class-open", "folder-other", "folder-other-open", "folder-lua", "folder-lua-open", "folder-typescript", "folder-typescript-open", "folder-graphql", "folder-graphql-open", "folder-routes", "folder-routes-open", "folder-ci", "folder-ci-open", "folder-benchmark", "folder-benchmark-open", "folder-messages", "folder-messages-open", "folder-less", "folder-less-open", "folder-gulp", "folder-gulp-open", "folder-python", "folder-python-open", "folder-mojo", "folder-mojo-open", "folder-debug", "folder-debug-open", "folder-fastlane", "folder-fastlane-open", "folder-plugin", "folder-plugin-open", "folder-middleware", "folder-middleware-open", "folder-controller", "folder-controller-open", "folder-ansible", "folder-ansible-open", "folder-server", "folder-server-open", "folder-client", "folder-client-open", "folder-tasks", "folder-tasks-open", "folder-android", "folder-android-open", "folder-ios", "folder-ios-open", "folder-upload", "folder-upload-open", "folder-download", "folder-download-open", "folder-tools", "folder-tools-open", "folder-helper", "folder-helper-open", "folder-serverless", "folder-serverless-open", "folder-api", "folder-api-open", "folder-app", "folder-app-open", "folder-apollo", "folder-apollo-open", "folder-archive", "folder-archive-open", "folder-batch", "folder-batch-open", "folder-buildkite", "folder-buildkite-open", "folder-cluster", "folder-cluster-open", "folder-command", "folder-command-open", "folder-constant", "folder-constant-open", "folder-container", "folder-container-open", "folder-content", "folder-content-open", "folder-context", "folder-context-open", "folder-core", "folder-core-open", "folder-delta", "folder-delta-open", "folder-dump", "folder-dump-open", "folder-examples", "folder-examples-open", "folder-environment", "folder-environment-open", "folder-functions", "folder-functions-open", "folder-generator", "folder-generator-open", "folder-hook", "folder-hook-open", "folder-job", "folder-job-open", "folder-keys", "folder-keys-open", "folder-layout", "folder-layout-open", "folder-mail", "folder-mail-open", "folder-mappings", "folder-mappings-open", "folder-meta", "folder-meta-open", "folder-changesets", "folder-changesets-open", "folder-packages", "folder-packages-open", "folder-shared", "folder-shared-open", "folder-shader", "folder-shader-open", "folder-stack", "folder-stack-open", "folder-template", "folder-template-open", "folder-utils", "folder-utils-open", "folder-supabase", "folder-supabase-open", "folder-private", "folder-private-open", "folder-error", "folder-error-open", "folder-event", "folder-event-open", "folder-secure", "folder-secure-open", "folder-custom", "folder-custom-open", "folder-mock", "folder-mock-open", "folder-syntax", "folder-syntax-open", "folder-vm", "folder-vm-open", "folder-stylus", "folder-stylus-open", "folder-flow", "folder-flow-open", "folder-rules", "folder-rules-open", "folder-review", "folder-review-open", "folder-animation", "folder-animation-open", "folder-guard", "folder-guard-open", "folder-prisma", "folder-prisma-open", "folder-pipe", "folder-pipe-open", "folder-svg", "folder-svg-open", "folder-terraform", "folder-terraform-open", "folder-mobile", "folder-mobile-open", "folder-stencil", "folder-stencil-open", "folder-firebase", "folder-firebase-open", "folder-svelte", "folder-svelte-open", "folder-update", "folder-update-open", "folder-intellij", "folder-intellij-open", "folder-intellij_light", "folder-intellij-open_light", "folder-azure-pipelines", "folder-azure-pipelines-open", "folder-mjml", "folder-mjml-open", "folder-admin", "folder-admin-open", "folder-scala", "folder-scala-open", "folder-connection", "folder-connection-open", "folder-quasar", "folder-quasar-open", "folder-next", "folder-next-open", "folder-cobol", "folder-cobol-open", "folder-yarn", "folder-yarn-open", "folder-husky", "folder-husky-open", "folder-storybook", "folder-storybook-open", "folder-base", "folder-base-open", "folder-cart", "folder-cart-open", "folder-home", "folder-home-open", "folder-project", "folder-project-open", "folder-interface", "folder-interface-open", "folder-netlify", "folder-netlify-open", "folder-enum", "folder-enum-open", "folder-contract", "folder-contract-open", "folder-queue", "folder-queue-open", "folder-vercel", "folder-vercel-open", "folder-cypress", "folder-cypress-open", "folder-decorators", "folder-decorators-open", "folder-java", "folder-java-open", "folder-resolver", "folder-resolver-open", "folder-angular", "folder-angular-open", "folder-unity", "folder-unity-open", "folder-pdf", "folder-pdf-open", "folder-proto", "folder-proto-open", "folder-plastic", "folder-plastic-open", "folder-gamemaker", "folder-gamemaker-open", "folder-mercurial", "folder-mercurial-open", "folder-godot", "folder-godot-open", "folder", "folder-open", "folder-root", "folder-root-open"]`. - **`runner`** - **Any of** - *object*: How to execute runner. Cannot contain additional properties. - **`command`** *(string, required)*: Shell command to execute. - **`args`** *(array)* - **Items** *(string)*: Command arguments. - **`outputFile`** *(string, required)*: Output path. - **`audits`** *(array, required)*: List of audits maintained in a plugin. - **Items** *(object)*: Cannot contain additional properties. - **`slug`** *(string, required)*: ID (unique within plugin). - **`title`** *(string, required)*: Descriptive name. - **`description`** *(string)*: Description (markdown). - **`docsUrl`**: Link to documentation (rationale). - **Any of** - : Link to documentation (rationale). - **Any of** - - *string, format: uri*: Link to documentation (rationale). - *string* - **`groups`** *(array)*: List of groups. - **Items** *(object)*: Cannot contain additional properties. - **`slug`** *(string, required)*: Human-readable unique ID, e.g. "performance". - **`refs`** *(array, required)* - **Items** *(object)*: Weighted references to audits. Cannot contain additional properties. - **`slug`** *(string, required)*: Reference slug to an audit within this plugin (e.g. 'max-lines'). - **`weight`** *(integer, required)*: Weight used to calculate score. Minimum: `0`. - **`title`** *(string, required)*: Descriptive name for the group. - **`description`** *(string)*: Description of the group (markdown). - **`docsUrl`**: Group documentation site. - **Any of** - : Group documentation site. - **Any of** - - *string, format: uri*: Group documentation site. - *string* - **`persist`** *(object)*: Cannot contain additional properties. - **`outputDir`** *(string, required)*: Artifacts folder. - **`filename`** *(string)*: Artifacts file name (without extension). Default: `"report"`. - **`format`** *(array)*: Default: `["json"]`. - **Items** *(string)*: Must be one of: `["json", "md"]`. - **`upload`** *(object)*: Cannot contain additional properties. - **`server`** *(string, format: uri, required)*: URL of deployed portal API. - **`apiKey`** *(string, required)*: API key with write access to portal (use `process.env` for security). - **`organization`** *(string, required)*: Organization in code versioning system. - **`project`** *(string, required)*: Project in code versioning system. - **`categories`** *(array)*: Categorization of individual audits. - **Items** *(object)*: Cannot contain additional properties. - **`slug`** *(string, required)*: Human-readable unique ID, e.g. "performance". - **`refs`** *(array, required)* - **Items** *(object)*: Cannot contain additional properties. - **`slug`** *(string, required)*: Slug of an audit or group (depending on `type`). - **`weight`** *(integer, required)*: Weight used to calculate score. Minimum: `0`. - **`type`** *(string, required)*: Discriminant for reference kind, affects where `slug` is looked up. Must be one of: `["audit", "group"]`. - **`plugin`** *(string, required)*: Plugin slug (plugin should contain referenced audit or group). - **`title`** *(string, required)*: Category Title. - **`description`** *(string)*: Category description. - **`docsUrl`**: Category docs URL. - **Any of** - : Category docs URL. - **Any of** - - *string, format: uri*: Category docs URL. - *string* - **`isBinary`** *(boolean)*: Is this a binary category (i.e. only a perfect score considered a "pass")?
matejchalk commented 6 months ago

The Python generator looks best (most compact), but requires Python and Pip installation to run.

There are still some common problems in how the generated docs look:

The alternatives to using a 3rd party tool are:

The main advantage to doing it ourselves is we can make it look just right for what we need.

matejchalk commented 6 months ago

Came up with an alternative way to document the config automatically - generate equivalent TypeScript instead of Markdown via JSON Schema - has the advantage of being able to represent what JSON can't (e.g. functions). It's not perfect, but probably the best so far.


TypeScript definition generated by zod-to-ts ```ts /** Code PushUp configuration */ type CoreConfig = { /** List of plugins to be used (official, community-provided, or custom) */ plugins: { /** NPM package name */ packageName?: string | undefined; /** NPM version of the package */ version?: string | undefined; /** Descriptive name */ title: string; /** Description (markdown) */ description?: string | undefined; /** Plugin documentation site */ docsUrl?: (string | undefined) | string; /** References plugin. ID (unique within core config) */ slug: string; /** Icon from VSCode Material Icons extension */ icon: "git" | "yaml" | "xml" | "matlab" | "settings" | "shaderlab" | "diff" | "json" | "blink" | "java" | "razor" | "python" | "mojo" | "javascript" | "typescript" | "scala" | "handlebars" | "perl" | "haxe" | "puppet" | "elixir" | "livescript" | "erlang" | "twig" | "julia" | "elm" | "purescript" | "stylus" | "nunjucks" | "pug" | "robot" | "sass" | "less" | "css" | "visualstudio" | "angular" | "graphql" | "solidity" | "autoit" | "haml" | "yang" | "terraform" | "applescript" | "cake" | "cucumber" | "nim" | "apiblueprint" | "riot" | "postcss" | "coldfusion" | "haskell" | "dhall" | "cabal" | "nix" | "ruby" | "slim" | "php" | "php_elephant" | "php_elephant_pink" | "hack" | "react" | "mjml" | "processing" | "hcl" | "go" | "go_gopher" | "nodejs_alt" | "django" | "html" | "godot" | "godot-assets" | "vim" | "silverstripe" | "prolog" | "pawn" | "reason" | "sml" | "tex" | "salesforce" | "sas" | "docker" | "table" | "csharp" | "console" | "c" | "cpp" | "objective-c" | "objective-cpp" | "coffee" | "fsharp" | "editorconfig" | "clojure" | "groovy" | "markdown" | "jinja" | "proto" | "python-misc" | "vue" | "lua" | "lib" | "log" | "jupyter" | "document" | "pdf" | "powershell" | "r" | "rust" | "database" | "kusto" | "lock" | "svg" | "swift" | "react_ts" | "search" | "minecraft" | "rescript" | "otne" | "twine" | "grain" | "lolcode" | "idris" | "chess" | "gemini" | "vlang" | "wolframlanguage" | "shader" | "tree" | "svelte" | "dart" | "cadence" | "stylable" | "blink_light" | "jinja_light" | "playwright" | "sublime" | "image" | "routing" | "typescript-def" | "markojs" | "astro" | "vscode" | "qsharp" | "zip" | "vala" | "zig" | "exe" | "hex" | "jar" | "javaclass" | "h" | "hpp" | "rc" | "go-mod" | "url" | "gradle" | "word" | "certificate" | "key" | "font" | "gemfile" | "rubocop" | "rubocop_light" | "arduino" | "powerpoint" | "video" | "virtual" | "email" | "audio" | "raml" | "xaml" | "kotlin" | "dart_generated" | "actionscript" | "mxml" | "autohotkey" | "flash" | "swc" | "cmake" | "assembly" | "semgrep" | "vue-config" | "nuxt" | "ocaml" | "odin" | "javascript-map" | "css-map" | "test-ts" | "test-jsx" | "test-js" | "angular-component" | "angular-guard" | "angular-service" | "angular-pipe" | "angular-directive" | "angular-resolver" | "smarty" | "bucklescript" | "merlin" | "verilog" | "mathematica" | "vercel" | "vercel_light" | "verdaccio" | "next" | "next_light" | "remix" | "remix_light" | "laravel" | "vfl" | "kl" | "posthtml" | "todo" | "http" | "restql" | "kivy" | "graphcool" | "sbt" | "webpack" | "ionic" | "gulp" | "nodejs" | "npm" | "yarn" | "android" | "tune" | "turborepo" | "turborepo_light" | "babel" | "blitz" | "contributing" | "readme" | "changelog" | "architecture" | "credits" | "authors" | "flow" | "favicon" | "karma" | "bithound" | "svgo" | "appveyor" | "travis" | "codecov" | "sonarcloud" | "protractor" | "fusebox" | "heroku" | "gitlab" | "bower" | "eslint" | "conduct" | "watchman" | "aurelia" | "auto" | "auto_light" | "mocha" | "jenkins" | "firebase" | "figma" | "rollup" | "hardhat" | "stylelint" | "stylelint_light" | "code-climate" | "code-climate_light" | "prettier" | "renovate" | "apollo" | "nodemon" | "webhint" | "browserlist" | "browserlist_light" | "crystal" | "crystal_light" | "snyk" | "drone" | "drone_light" | "cuda" | "dotjs" | "ejs" | "sequelize" | "gatsby" | "wakatime" | "wakatime_light" | "circleci" | "circleci_light" | "cloudfoundry" | "grunt" | "jest" | "storybook" | "wepy" | "fastlane" | "hcl_light" | "helm" | "san" | "wallaby" | "stencil" | "red" | "makefile" | "foxpro" | "i18n" | "webassembly" | "semantic-release" | "semantic-release_light" | "bitbucket" | "d" | "mdx" | "mdsvex" | "ballerina" | "racket" | "bazel" | "mint" | "velocity" | "azure-pipelines" | "azure" | "vagrant" | "prisma" | "abc" | "asciidoc" | "istanbul" | "edge" | "scheme" | "lisp" | "tailwindcss" | "3d" | "buildkite" | "netlify" | "netlify_light" | "nest" | "moonscript" | "percy" | "gitpod" | "advpl_prw" | "advpl_ptm" | "advpl_tlpp" | "advpl_include" | "codeowners" | "gcp" | "disc" | "fortran" | "tcl" | "liquid" | "husky" | "coconut" | "tilt" | "capacitor" | "sketch" | "adonis" | "forth" | "uml" | "uml_light" | "meson" | "commitlint" | "buck" | "nrwl" | "opam" | "dune" | "imba" | "drawio" | "pascal" | "roadmap" | "nuget" | "command" | "stryker" | "denizenscript" | "modernizr" | "slug" | "stitches" | "stitches_light" | "nginx" | "replit" | "rescript-interface" | "snowpack" | "snowpack_light" | "brainfuck" | "bicep" | "cobol" | "quasar" | "dependabot" | "pipeline" | "vite" | "vitest" | "opa" | "lerna" | "windicss" | "textlint" | "lilypond" | "chess_light" | "sentry" | "phpunit" | "php-cs-fixer" | "robots" | "tsconfig" | "tauri" | "jsconfig" | "maven" | "ada" | "serverless" | "supabase" | "ember" | "horusec" | "poetry" | "coala" | "parcel" | "dinophp" | "teal" | "template" | "astyle" | "lighthouse" | "svgr" | "rome" | "cypress" | "siyuan" | "ndst" | "plop" | "tobi" | "tobimake" | "gleam" | "pnpm" | "pnpm_light" | "gridsome" | "steadybit" | "caddy" | "bun" | "bun_light" | "antlr" | "pinejs" | "nano-staged" | "nano-staged_light" | "craco" | "gamemaker" | "tldraw" | "tldraw_light" | "mercurial" | "deno" | "deno_light" | "plastic" | "typst" | "unocss" | "ifanr-cloud" | "mermaid" | "werf" | "roblox" | "panda" | "file" | "folder-robot" | "folder-robot-open" | "folder-src" | "folder-src-open" | "folder-dist" | "folder-dist-open" | "folder-css" | "folder-css-open" | "folder-sass" | "folder-sass-open" | "folder-images" | "folder-images-open" | "folder-scripts" | "folder-scripts-open" | "folder-node" | "folder-node-open" | "folder-javascript" | "folder-javascript-open" | "folder-json" | "folder-json-open" | "folder-font" | "folder-font-open" | "folder-bower" | "folder-bower-open" | "folder-test" | "folder-test-open" | "folder-jinja" | "folder-jinja-open" | "folder-jinja_light" | "folder-jinja-open_light" | "folder-markdown" | "folder-markdown-open" | "folder-php" | "folder-php-open" | "folder-phpmailer" | "folder-phpmailer-open" | "folder-sublime" | "folder-sublime-open" | "folder-docs" | "folder-docs-open" | "folder-git" | "folder-git-open" | "folder-github" | "folder-github-open" | "folder-gitlab" | "folder-gitlab-open" | "folder-vscode" | "folder-vscode-open" | "folder-views" | "folder-views-open" | "folder-vue" | "folder-vue-open" | "folder-vuepress" | "folder-vuepress-open" | "folder-expo" | "folder-expo-open" | "folder-config" | "folder-config-open" | "folder-i18n" | "folder-i18n-open" | "folder-components" | "folder-components-open" | "folder-verdaccio" | "folder-verdaccio-open" | "folder-aurelia" | "folder-aurelia-open" | "folder-resource" | "folder-resource-open" | "folder-lib" | "folder-lib-open" | "folder-theme" | "folder-theme-open" | "folder-webpack" | "folder-webpack-open" | "folder-global" | "folder-global-open" | "folder-public" | "folder-public-open" | "folder-include" | "folder-include-open" | "folder-docker" | "folder-docker-open" | "folder-database" | "folder-database-open" | "folder-log" | "folder-log-open" | "folder-target" | "folder-target-open" | "folder-temp" | "folder-temp-open" | "folder-aws" | "folder-aws-open" | "folder-audio" | "folder-audio-open" | "folder-video" | "folder-video-open" | "folder-kubernetes" | "folder-kubernetes-open" | "folder-import" | "folder-import-open" | "folder-export" | "folder-export-open" | "folder-wakatime" | "folder-wakatime-open" | "folder-circleci" | "folder-circleci-open" | "folder-wordpress" | "folder-wordpress-open" | "folder-gradle" | "folder-gradle-open" | "folder-coverage" | "folder-coverage-open" | "folder-class" | "folder-class-open" | "folder-other" | "folder-other-open" | "folder-lua" | "folder-lua-open" | "folder-typescript" | "folder-typescript-open" | "folder-graphql" | "folder-graphql-open" | "folder-routes" | "folder-routes-open" | "folder-ci" | "folder-ci-open" | "folder-benchmark" | "folder-benchmark-open" | "folder-messages" | "folder-messages-open" | "folder-less" | "folder-less-open" | "folder-gulp" | "folder-gulp-open" | "folder-python" | "folder-python-open" | "folder-mojo" | "folder-mojo-open" | "folder-debug" | "folder-debug-open" | "folder-fastlane" | "folder-fastlane-open" | "folder-plugin" | "folder-plugin-open" | "folder-middleware" | "folder-middleware-open" | "folder-controller" | "folder-controller-open" | "folder-ansible" | "folder-ansible-open" | "folder-server" | "folder-server-open" | "folder-client" | "folder-client-open" | "folder-tasks" | "folder-tasks-open" | "folder-android" | "folder-android-open" | "folder-ios" | "folder-ios-open" | "folder-upload" | "folder-upload-open" | "folder-download" | "folder-download-open" | "folder-tools" | "folder-tools-open" | "folder-helper" | "folder-helper-open" | "folder-serverless" | "folder-serverless-open" | "folder-api" | "folder-api-open" | "folder-app" | "folder-app-open" | "folder-apollo" | "folder-apollo-open" | "folder-archive" | "folder-archive-open" | "folder-batch" | "folder-batch-open" | "folder-buildkite" | "folder-buildkite-open" | "folder-cluster" | "folder-cluster-open" | "folder-command" | "folder-command-open" | "folder-constant" | "folder-constant-open" | "folder-container" | "folder-container-open" | "folder-content" | "folder-content-open" | "folder-context" | "folder-context-open" | "folder-core" | "folder-core-open" | "folder-delta" | "folder-delta-open" | "folder-dump" | "folder-dump-open" | "folder-examples" | "folder-examples-open" | "folder-environment" | "folder-environment-open" | "folder-functions" | "folder-functions-open" | "folder-generator" | "folder-generator-open" | "folder-hook" | "folder-hook-open" | "folder-job" | "folder-job-open" | "folder-keys" | "folder-keys-open" | "folder-layout" | "folder-layout-open" | "folder-mail" | "folder-mail-open" | "folder-mappings" | "folder-mappings-open" | "folder-meta" | "folder-meta-open" | "folder-changesets" | "folder-changesets-open" | "folder-packages" | "folder-packages-open" | "folder-shared" | "folder-shared-open" | "folder-shader" | "folder-shader-open" | "folder-stack" | "folder-stack-open" | "folder-template" | "folder-template-open" | "folder-utils" | "folder-utils-open" | "folder-supabase" | "folder-supabase-open" | "folder-private" | "folder-private-open" | "folder-error" | "folder-error-open" | "folder-event" | "folder-event-open" | "folder-secure" | "folder-secure-open" | "folder-custom" | "folder-custom-open" | "folder-mock" | "folder-mock-open" | "folder-syntax" | "folder-syntax-open" | "folder-vm" | "folder-vm-open" | "folder-stylus" | "folder-stylus-open" | "folder-flow" | "folder-flow-open" | "folder-rules" | "folder-rules-open" | "folder-review" | "folder-review-open" | "folder-animation" | "folder-animation-open" | "folder-guard" | "folder-guard-open" | "folder-prisma" | "folder-prisma-open" | "folder-pipe" | "folder-pipe-open" | "folder-svg" | "folder-svg-open" | "folder-terraform" | "folder-terraform-open" | "folder-mobile" | "folder-mobile-open" | "folder-stencil" | "folder-stencil-open" | "folder-firebase" | "folder-firebase-open" | "folder-svelte" | "folder-svelte-open" | "folder-update" | "folder-update-open" | "folder-intellij" | "folder-intellij-open" | "folder-intellij_light" | "folder-intellij-open_light" | "folder-azure-pipelines" | "folder-azure-pipelines-open" | "folder-mjml" | "folder-mjml-open" | "folder-admin" | "folder-admin-open" | "folder-scala" | "folder-scala-open" | "folder-connection" | "folder-connection-open" | "folder-quasar" | "folder-quasar-open" | "folder-next" | "folder-next-open" | "folder-cobol" | "folder-cobol-open" | "folder-yarn" | "folder-yarn-open" | "folder-husky" | "folder-husky-open" | "folder-storybook" | "folder-storybook-open" | "folder-base" | "folder-base-open" | "folder-cart" | "folder-cart-open" | "folder-home" | "folder-home-open" | "folder-project" | "folder-project-open" | "folder-interface" | "folder-interface-open" | "folder-netlify" | "folder-netlify-open" | "folder-enum" | "folder-enum-open" | "folder-contract" | "folder-contract-open" | "folder-queue" | "folder-queue-open" | "folder-vercel" | "folder-vercel-open" | "folder-cypress" | "folder-cypress-open" | "folder-decorators" | "folder-decorators-open" | "folder-java" | "folder-java-open" | "folder-resolver" | "folder-resolver-open" | "folder-angular" | "folder-angular-open" | "folder-unity" | "folder-unity-open" | "folder-pdf" | "folder-pdf-open" | "folder-proto" | "folder-proto-open" | "folder-plastic" | "folder-plastic-open" | "folder-gamemaker" | "folder-gamemaker-open" | "folder-mercurial" | "folder-mercurial-open" | "folder-godot" | "folder-godot-open" | "folder" | "folder-open" | "folder-root" | "folder-root-open"; runner: { /** Shell command to execute */ command: string; args?: string[] | undefined; /** Output path */ outputFile: string; outputTransform?: ((args_0: unknown, ...args_1: unknown[]) => { /** Reference to audit */ slug: string; /** Formatted value (e.g. '0.9 s', '2.1 MB') */ displayValue?: string | undefined; /** Raw numeric value */ value: number; /** Value between 0 and 1 */ score: number; /** Detailed information */ details?: { /** List of findings */ issues: { /** Descriptive error message */ message: string; /** Severity level */ severity: "info" | "warning" | "error"; /** Source file location */ source?: { /** Relative path to source file in Git repo */ file: string; /** Location in file */ position?: { /** Start line */ startLine: number; /** Start column */ startColumn?: number | undefined; /** End line */ endLine?: number | undefined; /** End column */ endColumn?: number | undefined; } | undefined; } | undefined; }[]; } | undefined; }[] | Promise<{ /** Reference to audit */ slug: string; /** Formatted value (e.g. '0.9 s', '2.1 MB') */ displayValue?: string | undefined; /** Raw numeric value */ value: number; /** Value between 0 and 1 */ score: number; /** Detailed information */ details?: { /** List of findings */ issues: { /** Descriptive error message */ message: string; /** Severity level */ severity: "info" | "warning" | "error"; /** Source file location */ source?: { /** Relative path to source file in Git repo */ file: string; /** Location in file */ position?: { /** Start line */ startLine: number; /** Start column */ startColumn?: number | undefined; /** End line */ endLine?: number | undefined; /** End column */ endColumn?: number | undefined; } | undefined; } | undefined; }[]; } | undefined; }[]>) | undefined; } | ((args_0: ((args_0: unknown, ...args_1: unknown[]) => void | undefined) | undefined, ...args_1: unknown[]) => { /** Reference to audit */ slug: string; /** Formatted value (e.g. '0.9 s', '2.1 MB') */ displayValue?: string | undefined; /** Raw numeric value */ value: number; /** Value between 0 and 1 */ score: number; /** Detailed information */ details?: { /** List of findings */ issues: { /** Descriptive error message */ message: string; /** Severity level */ severity: "info" | "warning" | "error"; /** Source file location */ source?: { /** Relative path to source file in Git repo */ file: string; /** Location in file */ position?: { /** Start line */ startLine: number; /** Start column */ startColumn?: number | undefined; /** End line */ endLine?: number | undefined; /** End column */ endColumn?: number | undefined; } | undefined; } | undefined; }[]; } | undefined; }[] | Promise<{ /** Reference to audit */ slug: string; /** Formatted value (e.g. '0.9 s', '2.1 MB') */ displayValue?: string | undefined; /** Raw numeric value */ value: number; /** Value between 0 and 1 */ score: number; /** Detailed information */ details?: { /** List of findings */ issues: { /** Descriptive error message */ message: string; /** Severity level */ severity: "info" | "warning" | "error"; /** Source file location */ source?: { /** Relative path to source file in Git repo */ file: string; /** Location in file */ position?: { /** Start line */ startLine: number; /** Start column */ startColumn?: number | undefined; /** End line */ endLine?: number | undefined; /** End column */ endColumn?: number | undefined; } | undefined; } | undefined; }[]; } | undefined; }[]>); audits: { /** ID (unique within plugin) */ slug: string; /** Descriptive name */ title: string; /** Description (markdown) */ description?: string | undefined; /** Link to documentation (rationale) */ docsUrl?: (string | undefined) | string; }[]; groups?: { /** Human-readable unique ID, e.g. "performance" */ slug: string; refs: { /** Reference slug to an audit within this plugin (e.g. 'max-lines') */ slug: string; /** Weight used to calculate score */ weight: number; }[]; /** Descriptive name for the group */ title: string; /** Description of the group (markdown) */ description?: string | undefined; /** Group documentation site */ docsUrl?: (string | undefined) | string; }[] | undefined; }[]; persist: { /** Artifacts folder */ outputDir: string; /** Artifacts file name (without extension) */ filename?: string; format?: ("json" | "md")[] | undefined; }; upload?: { /** URL of deployed portal API */ server: string; /** API key with write access to portal (use `process.env` for security) */ apiKey: string; /** Organization in code versioning system */ organization: string; /** Project in code versioning system */ project: string; } | undefined; categories: { /** Human-readable unique ID, e.g. "performance" */ slug: string; refs: { /** Slug of an audit or group (depending on `type`) */ slug: string; /** Weight used to calculate score */ weight: number; /** Discriminant for reference kind, affects where `slug` is looked up */ type: "audit" | "group"; /** Plugin slug (plugin should contain referenced audit or group) */ plugin: string; }[]; /** Category Title */ title: string; /** Category description */ description?: string | undefined; /** Category docs URL */ docsUrl?: (string | undefined) | string; /** Is this a binary category (i.e. only a perfect score considered a "pass")? */ isBinary?: boolean | undefined; }[]; }; ```
matejchalk commented 6 months ago

I've used up my timebox for this one.

@BioPhoton @vmasek What do you think? How should we proceed? I've described the alternatives above 🔝

My vote would be to generate the TypeScript definitions with zod-to-ts, because it's probably most readable for users and pretty low effort for us to maintain.

matejchalk commented 6 months ago

Follow-up issue defined: