verify-format-support.mjs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { readFile } from 'node:fs/promises'
  2. import { dirname, join, resolve } from 'node:path'
  3. import { fileURLToPath } from 'node:url'
  4. import { loadEcosystemReleaseContext } from './lib/ecosystem-packages.mjs'
  5. import {
  6. readCoreRendererDefinitions,
  7. summarizeRendererSupport
  8. } from './lib/format-support.mjs'
  9. const expectedRendererCount = 24
  10. const expectedExtensionCount = 206
  11. const scriptDir = dirname(fileURLToPath(import.meta.url))
  12. const sourceRoot = resolve(scriptDir, '..')
  13. function fail(message) {
  14. throw new Error(`[format-support] ${message}`)
  15. }
  16. function assert(condition, message) {
  17. if (!condition) {
  18. fail(message)
  19. }
  20. }
  21. async function readJson(path) {
  22. return JSON.parse(await readFile(path, 'utf8'))
  23. }
  24. async function assertDocumentedCounts(path) {
  25. const content = await readFile(path, 'utf8')
  26. assert(
  27. content.includes(String(expectedExtensionCount)),
  28. `${path} must mention ${expectedExtensionCount} supported extensions`
  29. )
  30. assert(
  31. content.includes(String(expectedRendererCount)),
  32. `${path} must mention ${expectedRendererCount} preview pipelines`
  33. )
  34. }
  35. const renderers = await readCoreRendererDefinitions(sourceRoot)
  36. const summary = summarizeRendererSupport(renderers)
  37. assert(
  38. summary.rendererCount === expectedRendererCount,
  39. `Expected ${expectedRendererCount} renderer pipelines, got ${summary.rendererCount}`
  40. )
  41. assert(
  42. summary.rawExtensionCount === expectedExtensionCount,
  43. `Expected ${expectedExtensionCount} declared extensions, got ${summary.rawExtensionCount}`
  44. )
  45. assert(
  46. summary.uniqueExtensionCount === expectedExtensionCount,
  47. `Expected ${expectedExtensionCount} unique extensions, got ${summary.uniqueExtensionCount}`
  48. )
  49. assert(
  50. summary.duplicateExtensions.length === 0,
  51. `Duplicate extension ownership detected: ${summary.duplicateExtensions
  52. .map(item => `${item.extension}(${item.owners.join(',')})`)
  53. .join(', ')}`
  54. )
  55. for (const renderer of renderers.values()) {
  56. for (const extension of renderer.extensionList) {
  57. assert(
  58. extension === extension.toLowerCase(),
  59. `Extension ${extension} in renderer ${renderer.id} must stay lowercase`
  60. )
  61. assert(
  62. /^[a-z0-9]+$/.test(extension),
  63. `Extension ${extension} in renderer ${renderer.id} must be alphanumeric`
  64. )
  65. }
  66. }
  67. const matrix = await readJson(join(sourceRoot, 'ecosystem', 'smoke-matrix.json'))
  68. assert(
  69. matrix.coverage?.requireAllRendererIds === true,
  70. 'Smoke matrix must require every renderer id'
  71. )
  72. const { wrapperManifest } = await loadEcosystemReleaseContext(sourceRoot)
  73. const documentationFiles = [
  74. 'README.md',
  75. 'README.en.md',
  76. 'docs/guide/formats.md',
  77. 'docs/guide/index.md',
  78. 'docs/guide/overview.md',
  79. ...wrapperManifest.wrappers.flatMap(wrapper => [
  80. join(wrapper.packageDir, 'README.md'),
  81. join(wrapper.packageDir, 'README.en.md')
  82. ])
  83. ]
  84. for (const relativePath of documentationFiles) {
  85. await assertDocumentedCounts(join(sourceRoot, relativePath))
  86. }
  87. console.log(
  88. `[format-support] Verified ${summary.uniqueExtensionCount} extensions, ${summary.rendererCount} renderer pipelines, smoke matrix coverage, and ${documentationFiles.length} documentation count references.`
  89. )