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
255 stars 14 forks source link

Generate config docs from Zod schemas #242

Closed kristihoskova closed 10 months ago

kristihoskova commented 1 year ago

Spike for the research is 2h.

matejchalk commented 11 months ago

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

matejchalk commented 11 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 11 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 11 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 11 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 10 months ago

Follow-up issue defined: