@gtkx/codegen 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/descriptor-render.d.ts +12 -15
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +59 -38
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +25 -10
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +37 -9
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +80 -38
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +25 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +139 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -1
  19. package/dist/analysis/param-capability.js +3 -4
  20. package/dist/analysis/param-capability.js.map +1 -1
  21. package/dist/analysis/param-structure.js +2 -2
  22. package/dist/analysis/param-structure.js.map +1 -1
  23. package/dist/analysis/ts-type.d.ts +3 -2
  24. package/dist/analysis/ts-type.d.ts.map +1 -1
  25. package/dist/analysis/ts-type.js +26 -26
  26. package/dist/analysis/ts-type.js.map +1 -1
  27. package/dist/analysis/type-key.d.ts +5 -0
  28. package/dist/analysis/type-key.d.ts.map +1 -0
  29. package/dist/analysis/type-key.js +9 -0
  30. package/dist/analysis/type-key.js.map +1 -0
  31. package/dist/analysis/type-shape.d.ts +3 -2
  32. package/dist/analysis/type-shape.d.ts.map +1 -1
  33. package/dist/analysis/type-shape.js +2 -1
  34. package/dist/analysis/type-shape.js.map +1 -1
  35. package/dist/compile.d.ts +14 -6
  36. package/dist/compile.d.ts.map +1 -1
  37. package/dist/compile.js +125 -24
  38. package/dist/compile.js.map +1 -1
  39. package/dist/docs/api-reference.d.ts +2 -0
  40. package/dist/docs/api-reference.d.ts.map +1 -1
  41. package/dist/docs/api-reference.js +11 -10
  42. package/dist/docs/api-reference.js.map +1 -1
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +5 -3
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/pipeline.d.ts +1 -0
  47. package/dist/docs/pipeline.d.ts.map +1 -1
  48. package/dist/docs/pipeline.js +93 -19
  49. package/dist/docs/pipeline.js.map +1 -1
  50. package/dist/docs/render.d.ts +2 -1
  51. package/dist/docs/render.d.ts.map +1 -1
  52. package/dist/docs/render.js +5 -4
  53. package/dist/docs/render.js.map +1 -1
  54. package/dist/docs/symbol-page.d.ts.map +1 -1
  55. package/dist/docs/symbol-page.js +10 -9
  56. package/dist/docs/symbol-page.js.map +1 -1
  57. package/dist/fingerprint.d.ts +20 -3
  58. package/dist/fingerprint.d.ts.map +1 -1
  59. package/dist/fingerprint.js +56 -37
  60. package/dist/fingerprint.js.map +1 -1
  61. package/dist/gi.d.ts +1 -0
  62. package/dist/gi.d.ts.map +1 -1
  63. package/dist/gi.js +8 -2
  64. package/dist/gi.js.map +1 -1
  65. package/dist/gir/ancestry.d.ts +7 -1
  66. package/dist/gir/ancestry.d.ts.map +1 -1
  67. package/dist/gir/ancestry.js +9 -1
  68. package/dist/gir/ancestry.js.map +1 -1
  69. package/dist/gir/annotations.d.ts +1 -2
  70. package/dist/gir/annotations.d.ts.map +1 -1
  71. package/dist/gir/annotations.js +1 -1
  72. package/dist/gir/annotations.js.map +1 -1
  73. package/dist/gir/cursor-overrides.d.ts +8 -0
  74. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  75. package/dist/gir/cursor-overrides.js +6 -0
  76. package/dist/gir/cursor-overrides.js.map +1 -0
  77. package/dist/gir/emittable.d.ts +7 -0
  78. package/dist/gir/emittable.d.ts.map +1 -0
  79. package/dist/gir/emittable.js +3 -0
  80. package/dist/gir/emittable.js.map +1 -0
  81. package/dist/gir/function.d.ts.map +1 -1
  82. package/dist/gir/function.js +28 -2
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/gir-path.d.ts +1 -1
  85. package/dist/gir/gir-path.js +1 -1
  86. package/dist/gir/gir-path.js.map +1 -1
  87. package/dist/gir/library.d.ts +5 -1
  88. package/dist/gir/library.d.ts.map +1 -1
  89. package/dist/gir/library.js +9 -2
  90. package/dist/gir/library.js.map +1 -1
  91. package/dist/gir/namespace.d.ts +5 -1
  92. package/dist/gir/namespace.d.ts.map +1 -1
  93. package/dist/gir/namespace.js +4 -2
  94. package/dist/gir/namespace.js.map +1 -1
  95. package/dist/gir/parameter.d.ts +13 -1
  96. package/dist/gir/parameter.d.ts.map +1 -1
  97. package/dist/gir/parameter.js +1 -0
  98. package/dist/gir/parameter.js.map +1 -1
  99. package/dist/gir/parse.d.ts.map +1 -1
  100. package/dist/gir/parse.js +6 -6
  101. package/dist/gir/parse.js.map +1 -1
  102. package/dist/gir/primitives.js +1 -1
  103. package/dist/gir/primitives.js.map +1 -1
  104. package/dist/guards.d.ts +16 -0
  105. package/dist/guards.d.ts.map +1 -0
  106. package/dist/guards.js +11 -0
  107. package/dist/guards.js.map +1 -0
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.js +2 -0
  111. package/dist/internal.js.map +1 -1
  112. package/dist/json.d.ts +3 -0
  113. package/dist/json.d.ts.map +1 -0
  114. package/dist/json.js +11 -0
  115. package/dist/json.js.map +1 -0
  116. package/dist/khronos/args.d.ts.map +1 -1
  117. package/dist/khronos/args.js +8 -6
  118. package/dist/khronos/args.js.map +1 -1
  119. package/dist/khronos/modules.d.ts.map +1 -1
  120. package/dist/khronos/modules.js +22 -7
  121. package/dist/khronos/modules.js.map +1 -1
  122. package/dist/khronos/parse.d.ts.map +1 -1
  123. package/dist/khronos/parse.js +3 -4
  124. package/dist/khronos/parse.js.map +1 -1
  125. package/dist/khronos/pipeline.d.ts +1 -1
  126. package/dist/khronos/pipeline.d.ts.map +1 -1
  127. package/dist/khronos/pipeline.js.map +1 -1
  128. package/dist/khronos/plan.d.ts +1 -7
  129. package/dist/khronos/plan.d.ts.map +1 -1
  130. package/dist/khronos/plan.js +1 -1
  131. package/dist/khronos/plan.js.map +1 -1
  132. package/dist/khronos/render.d.ts.map +1 -1
  133. package/dist/khronos/render.js +8 -4
  134. package/dist/khronos/render.js.map +1 -1
  135. package/dist/runner.d.ts +7 -1
  136. package/dist/runner.d.ts.map +1 -1
  137. package/dist/runner.js +21 -3
  138. package/dist/runner.js.map +1 -1
  139. package/dist/staging.d.ts +5 -0
  140. package/dist/staging.d.ts.map +1 -0
  141. package/dist/staging.js +57 -0
  142. package/dist/staging.js.map +1 -0
  143. package/dist/store/compile-store.d.ts +0 -1
  144. package/dist/store/compile-store.d.ts.map +1 -1
  145. package/dist/store/compile-store.js +7 -32
  146. package/dist/store/compile-store.js.map +1 -1
  147. package/dist/store/gi/callables.d.ts +6 -3
  148. package/dist/store/gi/callables.d.ts.map +1 -1
  149. package/dist/store/gi/callables.js +40 -30
  150. package/dist/store/gi/callables.js.map +1 -1
  151. package/dist/store/gi/callback.d.ts.map +1 -1
  152. package/dist/store/gi/callback.js +9 -5
  153. package/dist/store/gi/callback.js.map +1 -1
  154. package/dist/store/gi/class.d.ts.map +1 -1
  155. package/dist/store/gi/class.js +104 -44
  156. package/dist/store/gi/class.js.map +1 -1
  157. package/dist/store/gi/companion.d.ts.map +1 -1
  158. package/dist/store/gi/companion.js +6 -6
  159. package/dist/store/gi/companion.js.map +1 -1
  160. package/dist/store/gi/constant.d.ts.map +1 -1
  161. package/dist/store/gi/constant.js +11 -3
  162. package/dist/store/gi/constant.js.map +1 -1
  163. package/dist/store/gi/constructor-props.js +1 -1
  164. package/dist/store/gi/constructor-props.js.map +1 -1
  165. package/dist/store/gi/enum.d.ts.map +1 -1
  166. package/dist/store/gi/enum.js +29 -12
  167. package/dist/store/gi/enum.js.map +1 -1
  168. package/dist/store/gi/function.d.ts +1 -3
  169. package/dist/store/gi/function.d.ts.map +1 -1
  170. package/dist/store/gi/function.js +24 -18
  171. package/dist/store/gi/function.js.map +1 -1
  172. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  173. package/dist/store/gi/gtype-binding.js +4 -1
  174. package/dist/store/gi/gtype-binding.js.map +1 -1
  175. package/dist/store/gi/interface.d.ts.map +1 -1
  176. package/dist/store/gi/interface.js +34 -19
  177. package/dist/store/gi/interface.js.map +1 -1
  178. package/dist/store/gi/method.d.ts +7 -6
  179. package/dist/store/gi/method.d.ts.map +1 -1
  180. package/dist/store/gi/method.js +13 -24
  181. package/dist/store/gi/method.js.map +1 -1
  182. package/dist/store/gi/param-marshal.d.ts +3 -2
  183. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  184. package/dist/store/gi/param-marshal.js +50 -5
  185. package/dist/store/gi/param-marshal.js.map +1 -1
  186. package/dist/store/gi/pipeline.d.ts.map +1 -1
  187. package/dist/store/gi/pipeline.js +21 -10
  188. package/dist/store/gi/pipeline.js.map +1 -1
  189. package/dist/store/gi/properties.d.ts +2 -1
  190. package/dist/store/gi/properties.d.ts.map +1 -1
  191. package/dist/store/gi/properties.js +6 -3
  192. package/dist/store/gi/properties.js.map +1 -1
  193. package/dist/store/gi/property-accessor.d.ts +10 -8
  194. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  195. package/dist/store/gi/property-accessor.js +49 -91
  196. package/dist/store/gi/property-accessor.js.map +1 -1
  197. package/dist/store/gi/record-constructor.d.ts +8 -1
  198. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  199. package/dist/store/gi/record-constructor.js +34 -13
  200. package/dist/store/gi/record-constructor.js.map +1 -1
  201. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  202. package/dist/store/gi/record-field-accessor.js +20 -4
  203. package/dist/store/gi/record-field-accessor.js.map +1 -1
  204. package/dist/store/gi/record-layout.d.ts +6 -1
  205. package/dist/store/gi/record-layout.d.ts.map +1 -1
  206. package/dist/store/gi/record-layout.js +8 -1
  207. package/dist/store/gi/record-layout.js.map +1 -1
  208. package/dist/store/gi/record.d.ts.map +1 -1
  209. package/dist/store/gi/record.js +19 -8
  210. package/dist/store/gi/record.js.map +1 -1
  211. package/dist/store/gi/registration.js +2 -2
  212. package/dist/store/gi/registration.js.map +1 -1
  213. package/dist/store/gi/return-wrap.js +1 -1
  214. package/dist/store/gi/return-wrap.js.map +1 -1
  215. package/dist/store/gi/signal.d.ts +2 -1
  216. package/dist/store/gi/signal.d.ts.map +1 -1
  217. package/dist/store/gi/signal.js +55 -28
  218. package/dist/store/gi/signal.js.map +1 -1
  219. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  220. package/dist/store/gi/value-marshalable.js +2 -1
  221. package/dist/store/gi/value-marshalable.js.map +1 -1
  222. package/dist/store/gi/vtable.d.ts +4 -1
  223. package/dist/store/gi/vtable.d.ts.map +1 -1
  224. package/dist/store/gi/vtable.js +60 -17
  225. package/dist/store/gi/vtable.js.map +1 -1
  226. package/dist/store/gi-store.d.ts +1 -0
  227. package/dist/store/gi-store.d.ts.map +1 -1
  228. package/dist/store/gi-store.js +15 -20
  229. package/dist/store/gi-store.js.map +1 -1
  230. package/dist/store/jsx/generated-elements.d.ts +2 -1
  231. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  232. package/dist/store/jsx/generated-elements.js +13 -7
  233. package/dist/store/jsx/generated-elements.js.map +1 -1
  234. package/dist/store/jsx/jsx.js +3 -3
  235. package/dist/store/jsx/jsx.js.map +1 -1
  236. package/dist/store/jsx/metadata.d.ts.map +1 -1
  237. package/dist/store/jsx/metadata.js +3 -1
  238. package/dist/store/jsx/metadata.js.map +1 -1
  239. package/dist/store/jsx-store.d.ts.map +1 -1
  240. package/dist/store/jsx-store.js +3 -4
  241. package/dist/store/jsx-store.js.map +1 -1
  242. package/dist/store/resolve-store.d.ts +14 -3
  243. package/dist/store/resolve-store.d.ts.map +1 -1
  244. package/dist/store/resolve-store.js +98 -15
  245. package/dist/store/resolve-store.js.map +1 -1
  246. package/dist/store/store-fs.d.ts +9 -7
  247. package/dist/store/store-fs.d.ts.map +1 -1
  248. package/dist/store/store-fs.js +54 -25
  249. package/dist/store/store-fs.js.map +1 -1
  250. package/dist/store/store-links.d.ts +3 -0
  251. package/dist/store/store-links.d.ts.map +1 -0
  252. package/dist/store/store-links.js +39 -0
  253. package/dist/store/store-links.js.map +1 -0
  254. package/dist/writer/comparison-context.d.ts +4 -0
  255. package/dist/writer/comparison-context.d.ts.map +1 -0
  256. package/dist/writer/comparison-context.js +13 -0
  257. package/dist/writer/comparison-context.js.map +1 -0
  258. package/dist/writer/context.d.ts +3 -3
  259. package/dist/writer/context.d.ts.map +1 -1
  260. package/dist/writer/context.js +11 -6
  261. package/dist/writer/context.js.map +1 -1
  262. package/dist/writer/module.d.ts +13 -5
  263. package/dist/writer/module.d.ts.map +1 -1
  264. package/dist/writer/module.js +68 -11
  265. package/dist/writer/module.js.map +1 -1
  266. package/dist/xml.d.ts +8 -1
  267. package/dist/xml.d.ts.map +1 -1
  268. package/dist/xml.js +70 -1
  269. package/dist/xml.js.map +1 -1
  270. package/overrides/gobject/object.ts.ejs +2 -0
  271. package/package.json +14 -3
  272. package/src/analysis/descriptor-render.ts +106 -52
  273. package/src/analysis/descriptor.ts +76 -15
  274. package/src/analysis/inheritance.ts +134 -44
  275. package/src/analysis/interface-conflicts.ts +235 -0
  276. package/src/analysis/param-capability.ts +3 -6
  277. package/src/analysis/param-structure.ts +2 -2
  278. package/src/analysis/ts-type.ts +43 -28
  279. package/src/analysis/type-key.ts +14 -0
  280. package/src/analysis/type-shape.ts +5 -2
  281. package/src/compile.ts +192 -27
  282. package/src/docs/api-reference.ts +13 -10
  283. package/src/docs/element-page.ts +5 -2
  284. package/src/docs/pipeline.ts +140 -24
  285. package/src/docs/render.ts +7 -3
  286. package/src/docs/symbol-page.ts +12 -11
  287. package/src/fingerprint.ts +95 -47
  288. package/src/gi.ts +10 -2
  289. package/src/gir/ancestry.ts +17 -1
  290. package/src/gir/annotations.ts +1 -1
  291. package/src/gir/cursor-overrides.ts +12 -0
  292. package/src/gir/emittable.ts +8 -0
  293. package/src/gir/function.ts +45 -9
  294. package/src/gir/gir-path.ts +1 -1
  295. package/src/gir/library.ts +10 -2
  296. package/src/gir/namespace.ts +8 -2
  297. package/src/gir/parameter.ts +15 -0
  298. package/src/gir/parse.ts +10 -7
  299. package/src/gir/primitives.ts +1 -1
  300. package/src/guards.ts +23 -0
  301. package/src/internal.ts +2 -0
  302. package/src/json.ts +11 -0
  303. package/src/khronos/args.ts +9 -6
  304. package/src/khronos/modules.ts +25 -9
  305. package/src/khronos/parse.ts +3 -4
  306. package/src/khronos/pipeline.ts +1 -1
  307. package/src/khronos/plan.ts +0 -1
  308. package/src/khronos/render.ts +8 -6
  309. package/src/runner.ts +26 -4
  310. package/src/staging.ts +67 -0
  311. package/src/store/compile-store.ts +7 -38
  312. package/src/store/gi/callables.ts +60 -33
  313. package/src/store/gi/callback.ts +9 -9
  314. package/src/store/gi/class.ts +140 -53
  315. package/src/store/gi/companion.ts +7 -6
  316. package/src/store/gi/constant.ts +13 -3
  317. package/src/store/gi/constructor-props.ts +1 -1
  318. package/src/store/gi/enum.ts +36 -26
  319. package/src/store/gi/function.ts +30 -24
  320. package/src/store/gi/gtype-binding.ts +7 -2
  321. package/src/store/gi/interface.ts +39 -20
  322. package/src/store/gi/method.ts +26 -32
  323. package/src/store/gi/param-marshal.ts +77 -6
  324. package/src/store/gi/pipeline.ts +25 -15
  325. package/src/store/gi/properties.ts +8 -4
  326. package/src/store/gi/property-accessor.ts +73 -161
  327. package/src/store/gi/record-constructor.ts +53 -21
  328. package/src/store/gi/record-field-accessor.ts +26 -4
  329. package/src/store/gi/record-layout.ts +11 -1
  330. package/src/store/gi/record.ts +20 -12
  331. package/src/store/gi/registration.ts +2 -2
  332. package/src/store/gi/return-wrap.ts +1 -1
  333. package/src/store/gi/signal.ts +66 -42
  334. package/src/store/gi/value-marshalable.ts +3 -1
  335. package/src/store/gi/vtable.ts +97 -20
  336. package/src/store/gi-store.ts +26 -31
  337. package/src/store/jsx/generated-elements.ts +17 -8
  338. package/src/store/jsx/jsx.ts +3 -3
  339. package/src/store/jsx/metadata.ts +4 -1
  340. package/src/store/jsx-store.ts +3 -4
  341. package/src/store/resolve-store.ts +133 -18
  342. package/src/store/store-fs.ts +82 -35
  343. package/src/store/store-links.ts +49 -0
  344. package/src/writer/comparison-context.ts +18 -0
  345. package/src/writer/context.ts +12 -6
  346. package/src/writer/module.ts +101 -14
  347. package/src/xml.ts +103 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api-reference.js","sourceRoot":"","sources":["../../src/docs/api-reference.ts"],"names":[],"mappings":"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","sourcesContent":["import { pascalCase, sortStrings, sortStringsBy } from \"@gtkx/utils\";\nimport type { GirClass } from \"../gir/class.js\";\nimport type { GirFunction } from \"../gir/function.js\";\nimport type { GirRecord } from \"../gir/record.js\";\nimport { Library } from \"../gir/library.js\";\nimport { type GirNamespace, namespaceDirectory } from \"../gir/namespace.js\";\nimport { dedupeCallables, isEmittableCallable } from \"../store/gi/callables.js\";\nimport { namespaceFunctionExportName } from \"../store/gi/function.js\";\nimport { type ElementProps, setElementProps } from \"../store/jsx/element-prop-imports.js\";\nimport { collectIntrinsicElementClasses, type GlibNamedClass } from \"../store/jsx/intrinsic-elements.js\";\nimport { type OmittedProps, setOmittedProps } from \"../store/jsx/omitted-props.js\";\nimport { type ElementPageContext, renderElementPage } from \"./element-page.js\";\nimport { docsSignatureContext, firstSentence, namespaceOrder } from \"./render.js\";\nimport { type GiSymbolEntry, renderSymbolPage, type SymbolPageOptions } from \"./symbol-page.js\";\n\n/** What to index and the element config the rendered pages reflect. */\ntype ApiReferenceOptions = {\n /** GIR library identifiers to load, such as `\"Gtk-4.0\"`; their dependencies are pulled in too. */\n libraries: string[];\n /** Directories to search for `.gir` files. */\n girPath: string[];\n /** Base props interfaces per element, as read by `readBuiltinElements`; without it pages miss them. */\n props?: ElementProps;\n /** GObject properties the project omits from generated props; without it pages show props that do not exist. */\n omittedProps?: OmittedProps;\n};\n\n/** Narrows an `ApiReference.symbols` enumeration. */\ntype ApiSymbolQuery = {\n /** GIR namespace to keep, matched case-insensitively; every namespace when omitted. */\n namespace?: string;\n /** Symbol kinds to keep; every kind when omitted. */\n kinds?: ApiSymbolKind[];\n};\n\n/** What an indexed symbol is: one of the GIR symbol kinds, or a JSX element. */\ntype ApiSymbolKind =\n \"alias\" |\n \"callback\" |\n \"class\" |\n \"constant\" |\n \"element\" |\n \"enum\" |\n \"function\" |\n \"interface\" |\n \"record\";\n\n/** An indexed symbol, without its reference page. */\ntype ApiSymbol = {\n /** GIR namespace declaring the symbol, such as `\"Gtk\"`. */\n namespace: string;\n /** Name within the namespace, which for an element is its GLib type name. */\n name: string;\n /** Kind the reference groups and filters the symbol by, `\"element\"` for a JSX tag. */\n kind: ApiSymbolKind;\n /** First sentence of the symbol's GIR documentation, elided past 220 characters and empty when it has none. */\n summary: string;\n};\n\n/** How much of one namespace the reference indexes. */\ntype ApiNamespaceSummary = {\n /** GIR namespace name, such as `\"Gtk\"`. */\n name: string;\n /** The `@gtkx/gi` subpath the namespace's symbols are imported from. */\n importPath: string;\n /** How many symbols other than JSX elements the namespace contributes. */\n symbols: number;\n /** How many JSX elements the namespace contributes. */\n elements: number;\n};\n\n/** What an `ApiReference.lookup` found: a rendered page, several candidates for the name, or nothing. */\ntype ApiLookupResult =\n | {\n /** Discriminant selecting the variant. */\n outcome: \"page\";\n /** Index entry for the symbol the query resolved to. */\n symbol: ApiSymbol;\n /** The symbol's complete reference page, rendered as Markdown. */\n markdown: string;\n } |\n {\n /** Discriminant selecting the variant. */\n outcome: \"ambiguous\";\n /** Every symbol the name answers to, to be narrowed by namespace or kind. */\n candidates: ApiSymbol[];\n } |\n {\n /** Discriminant selecting the variant. */\n outcome: \"notFound\";\n };\n\n/** A fuzzy search over indexed symbol names. */\ntype ApiSearchOptions = {\n /** Text matched case-insensitively against each symbol's name and its qualified `Namespace.Name` form. */\n query: string;\n /** GIR namespace to keep, matched case-insensitively; every namespace when omitted. */\n namespace?: string;\n /** Symbol kinds to keep; every kind when omitted. */\n kinds?: ApiSymbolKind[];\n /** Maximum number of results, 20 by default. */\n limit?: number;\n};\n\n/** An indexed JSX element, carrying the widget class its page renders from. */\ntype ElementEntry = {\n /** Discriminant marking the entry as a JSX element rather than a GIR symbol. */\n kind: \"element\";\n /** GIR namespace declaring the widget class. */\n namespace: GirNamespace;\n /** Element name, which is the class's GLib type name such as `GtkButton`. */\n name: string;\n /** Documentation text carried by the widget class's GIR node. */\n doc: string | undefined;\n /** The widget class the element is generated from. */\n element: GlibNamedClass;\n};\n\n/** Anything the index holds: a GIR symbol or a JSX element. */\ntype SymbolEntry = GiSymbolEntry | ElementEntry;\n\n/** A search hit: an indexed entry and how well its name answered the query. */\ntype ScoredEntry = {\n /** Match strength, ranked best first: an exact name, then a prefix, then a substring. */\n score: number;\n /** The entry that matched. */\n entry: SymbolEntry;\n};\n\n/** Every kind the reference indexes, in the order a namespace overview groups its symbols. */\nconst API_SYMBOL_KINDS: ApiSymbolKind[] = [\n \"element\",\n \"class\",\n \"interface\",\n \"record\",\n \"enum\",\n \"callback\",\n \"alias\",\n \"function\",\n \"constant\",\n];\n\nconst KIND_SECTION_TITLES: Record<ApiSymbolKind, string> = {\n element: \"JSX elements\",\n class: \"Classes\",\n interface: \"Interfaces\",\n record: \"Records\",\n enum: \"Enums\",\n callback: \"Callbacks\",\n alias: \"Aliases\",\n function: \"Functions\",\n constant: \"Constants\",\n};\n\nconst DEFAULT_SEARCH_LIMIT = 20;\n\nconst compareNames = (a: string, b: string): number => {\n if (a < b) {\n return -1;\n }\n\n return a > b ? 1 : 0;\n};\n\nconst symbolKindSet = (kinds: ApiSymbolKind[] | undefined): Set<ApiSymbolKind> | undefined =>\n kinds === undefined ? undefined : new Set(kinds);\n\nconst isQueriedEntry = (\n entry: SymbolEntry,\n namespaceFilter: string | undefined,\n kinds: Set<ApiSymbolKind> | undefined,\n): boolean => {\n if (namespaceFilter !== undefined && entry.namespace.name.toLowerCase() !== namespaceFilter) {\n return false;\n }\n\n return kinds === undefined || kinds.has(entry.kind);\n};\n\nconst compareApiSymbols = (a: ApiSymbol, b: ApiSymbol): number => {\n const byNamespace = namespaceOrder(a.namespace).localeCompare(namespaceOrder(b.namespace));\n\n return byNamespace === 0 ? a.name.localeCompare(b.name) : byNamespace;\n};\n\n/**\n * Loads the GIR data for the given libraries and indexes every symbol and JSX element in it. The result is\n * a read-only view: it generates no store and needs none, so a tool can explore the bindings a project would\n * get without running codegen.\n *\n * @param options Which libraries to index, where to find them, and the project's element config.\n * @returns The indexed reference.\n */\nconst loadApiReference = (options: ApiReferenceOptions): ApiReference => new ApiReference(options);\n\nconst functionEntry = (\n namespace: GirNamespace,\n docsContext: ReturnType<typeof docsSignatureContext>,\n fn: GirFunction,\n): GiSymbolEntry | undefined => {\n if (!isEmittableCallable(docsContext, fn)) {\n return undefined;\n }\n\n const cIdentifier = fn.cIdentifier;\n\n if (cIdentifier === undefined) {\n return undefined;\n }\n\n const name = namespaceFunctionExportName(cIdentifier, fn.name, namespace.cSymbolPrefixes);\n\n return { kind: \"function\", namespace, name, doc: fn.doc, fn };\n};\n\nconst classEntry = (namespace: GirNamespace, klass: GirClass): GiSymbolEntry | undefined => {\n if (!klass.introspectable || klass.name.length === 0) {\n return undefined;\n }\n\n const kind = klass.isInterface ? \"interface\" : \"class\";\n\n return { kind, namespace, name: pascalCase(klass.name), doc: klass.doc, klass };\n};\n\nconst classEntries = (namespace: GirNamespace): GiSymbolEntry[] => {\n const entries: GiSymbolEntry[] = [];\n\n for (const klass of [...namespace.classes, ...namespace.interfaces]) {\n const entry = classEntry(namespace, klass);\n\n if (entry !== undefined) {\n entries.push(entry);\n }\n }\n\n return entries;\n};\n\nconst recordEntry = (namespace: GirNamespace, record: GirRecord): GiSymbolEntry | undefined => {\n if (!record.introspectable || record.isVtable || record.name.length === 0) {\n return undefined;\n }\n\n return { kind: \"record\", namespace, name: record.name, doc: record.doc, record };\n};\n\nconst recordEntries = (namespace: GirNamespace): GiSymbolEntry[] => {\n const entries: GiSymbolEntry[] = [];\n\n for (const record of namespace.records) {\n const entry = recordEntry(namespace, record);\n\n if (entry !== undefined) {\n entries.push(entry);\n }\n }\n\n return entries;\n};\n\nconst valueEntries = (namespace: GirNamespace): GiSymbolEntry[] => [\n ...namespace.enums\n .filter((enumeration) => enumeration.introspectable)\n .map<GiSymbolEntry>((enumeration) => ({\n kind: \"enum\",\n namespace,\n name: enumeration.name,\n doc: enumeration.doc,\n enumeration,\n })),\n ...namespace.callbacks\n .filter((callback) => callback.introspectable)\n .map<GiSymbolEntry>((callback) => ({\n kind: \"callback\",\n namespace,\n name: callback.name,\n doc: callback.doc,\n callback,\n })),\n ...namespace.aliases.map<GiSymbolEntry>((alias) => ({\n kind: \"alias\",\n namespace,\n name: alias.name,\n doc: alias.doc,\n alias,\n })),\n ...namespace.constants.map<GiSymbolEntry>((constant) => ({\n kind: \"constant\",\n namespace,\n name: constant.name,\n doc: constant.doc,\n constant,\n })),\n];\n\nconst narrowToExactMatches = (candidates: SymbolEntry[], trimmed: string, isQualified: boolean): SymbolEntry[] => {\n if (candidates.length <= 1) {\n return candidates;\n }\n\n const exact = candidates.filter(\n (entry) => (isQualified ? `${entry.namespace.name}.${entry.name}` : entry.name) === trimmed,\n );\n\n return exact.length > 0 ? exact : candidates;\n};\n\nconst getScoredEntry = (\n entry: SymbolEntry,\n query: string,\n namespaceFilter: string | undefined,\n kinds: Set<ApiSymbolKind> | undefined,\n): ScoredEntry | undefined => {\n if (!isQueriedEntry(entry, namespaceFilter, kinds)) {\n return undefined;\n }\n\n const score = searchScore(entry, query);\n\n if (score === 0) {\n return undefined;\n }\n\n return { score, entry };\n};\n\nconst compareScoredEntries = (a: ScoredEntry, b: ScoredEntry): number =>\n b.score - a.score ||\n a.entry.name.length - b.entry.name.length ||\n compareNames(a.entry.name, b.entry.name) ||\n compareNames(namespaceOrder(a.entry.namespace.name), namespaceOrder(b.entry.namespace.name)) ||\n compareNames(a.entry.kind, b.entry.kind);\n\nconst searchScore = (entry: SymbolEntry, query: string): number => {\n const name = entry.name.toLowerCase();\n const qualified = `${entry.namespace.name.toLowerCase()}.${name}`;\n\n if (name === query || qualified === query) {\n return 3;\n }\n\n if (name.startsWith(query)) {\n return 2;\n }\n\n if (name.includes(query) || qualified.includes(query)) {\n return 1;\n }\n\n return 0;\n};\n\n/** An index over the GIR data a project's bindings are generated from, queryable and renderable as Markdown. */\nclass ApiReference {\n private library: Library;\n private libraries: string[];\n private elementContext: ElementPageContext;\n private entries: SymbolEntry[] = [];\n private byQualified: Map<string, SymbolEntry[]> = new Map();\n private byName: Map<string, SymbolEntry[]> = new Map();\n private byNamespace: Map<string, SymbolEntry[]> = new Map();\n private elementsByClass: Map<string, string> = new Map();\n\n private props: ElementProps;\n private omittedProps: OmittedProps;\n\n /** Indexes every symbol and JSX element in the GIR data the options point at. */\n constructor(options: ApiReferenceOptions) {\n this.libraries = options.libraries;\n this.props = options.props ?? {};\n this.omittedProps = options.omittedProps ?? {};\n this.library = Library.load(options.libraries, options.girPath);\n this.elementContext = { library: this.library, linkFor: (): string | undefined => undefined };\n this.buildIndex();\n }\n\n private applyElementConfig(): void {\n setElementProps(this.props);\n setOmittedProps(this.omittedProps);\n }\n\n private add(entry: SymbolEntry): void {\n this.entries.push(entry);\n\n const push = (map: Map<string, SymbolEntry[]>, key: string): void => {\n const list = map.get(key) ?? [];\n list.push(entry);\n map.set(key, list);\n };\n\n push(this.byQualified, `${entry.namespace.name}.${entry.name}`.toLowerCase());\n push(this.byName, entry.name.toLowerCase());\n push(this.byNamespace, entry.namespace.name);\n }\n\n private buildIndex(): void {\n for (const namespace of this.library.namespaces.values()) {\n this.indexNamespace(namespace);\n }\n\n for (const element of collectIntrinsicElementClasses(this.library)) {\n this.add({\n kind: \"element\",\n namespace: element.namespace,\n name: element.glibName,\n doc: element.klass.doc,\n element,\n });\n\n this.elementsByClass.set(`${element.namespace.name}.${element.klass.name}`, element.glibName);\n }\n }\n\n private indexNamespace(namespace: GirNamespace): void {\n const entries = [\n ...classEntries(namespace),\n ...recordEntries(namespace),\n ...valueEntries(namespace),\n ];\n\n for (const entry of entries) {\n this.add(entry);\n }\n\n this.indexFunctions(namespace);\n }\n\n private indexFunctions(namespace: GirNamespace): void {\n if (namespace.sharedLibrary === undefined) {\n return;\n }\n\n const docsContext = docsSignatureContext(namespace, this.library);\n\n for (const fn of dedupeCallables(namespace.functions)) {\n const entry = functionEntry(namespace, docsContext, fn);\n\n if (entry !== undefined) {\n this.add(entry);\n }\n }\n }\n\n private toApiSymbol(entry: SymbolEntry): ApiSymbol {\n return {\n namespace: entry.namespace.name,\n name: entry.name,\n kind: entry.kind,\n summary: firstSentence(entry.doc),\n };\n }\n\n private symbolPageOptions(): SymbolPageOptions {\n return {\n library: this.library,\n elementNameFor: (namespaceName, className) => this.elementsByClass.get(`${namespaceName}.${className}`),\n };\n }\n\n private renderPage(entry: SymbolEntry): string {\n if (entry.kind === \"element\") {\n this.applyElementConfig();\n\n return renderElementPage(entry.element, this.elementContext);\n }\n\n return renderSymbolPage(entry, this.symbolPageOptions());\n }\n\n private findNamespace(name: string): GirNamespace | undefined {\n const lower = name.toLowerCase();\n\n for (const namespace of this.library.namespaces.values()) {\n if (namespace.name.toLowerCase() === lower) {\n return namespace;\n }\n }\n\n return undefined;\n }\n\n private lookupCandidates(trimmed: string, kind: ApiSymbolKind | undefined): SymbolEntry[] {\n const isQualified = trimmed.includes(\".\");\n const map = isQualified ? this.byQualified : this.byName;\n let candidates = map.get(trimmed.toLowerCase()) ?? [];\n\n if (kind !== undefined) {\n candidates = candidates.filter((entry) => entry.kind === kind);\n }\n\n return narrowToExactMatches(candidates, trimmed, isQualified);\n }\n\n private scoreEntries(\n query: string,\n namespaceFilter: string | undefined,\n kinds: Set<ApiSymbolKind> | undefined,\n ): ScoredEntry[] {\n const scored: ScoredEntry[] = [];\n\n for (const entry of this.entries) {\n const item = getScoredEntry(entry, query, namespaceFilter, kinds);\n\n if (item !== undefined) {\n scored.push(item);\n }\n }\n\n return scored;\n }\n\n /** Paths of the `.gir` files the index was built from, including the ones pulled in as dependencies. */\n get girFiles(): string[] {\n return this.library.girFiles;\n }\n\n /**\n * Resolves a name to a single symbol and renders its reference page. The name may be bare (`Button`) or\n * qualified (`Gtk.Button`), and is matched case-insensitively; a name several symbols answer to is\n * reported as ambiguous rather than picked between.\n *\n * @param kind Restricts the match to one kind, which is how a class and its JSX element are told apart.\n */\n lookup(query: string, kind?: ApiSymbolKind): ApiLookupResult {\n const trimmed = query.trim();\n\n if (trimmed.length === 0) {\n return { outcome: \"notFound\" };\n }\n\n const candidates = this.lookupCandidates(trimmed, kind);\n const entry = candidates[0];\n\n if (entry === undefined) {\n return { outcome: \"notFound\" };\n }\n\n if (candidates.length > 1) {\n return { outcome: \"ambiguous\", candidates: candidates.map((candidate) => this.toApiSymbol(candidate)) };\n }\n\n return { outcome: \"page\", symbol: this.toApiSymbol(entry), markdown: this.renderPage(entry) };\n }\n\n /** Every indexed symbol the query keeps, ordered by namespace (Gtk, then Adw, then alphabetically) and name. */\n symbols(query: ApiSymbolQuery = {}): ApiSymbol[] {\n const namespaceFilter = query.namespace?.toLowerCase();\n const kinds = symbolKindSet(query.kinds);\n\n return this.entries\n .filter((entry) => isQueriedEntry(entry, namespaceFilter, kinds))\n .map((entry) => this.toApiSymbol(entry))\n .toSorted(compareApiSymbols);\n }\n\n /**\n * Symbols whose name matches the query, best first: an exact name beats a prefix, which beats a\n * substring, and shorter names win ties. An empty query matches nothing.\n */\n search(options: ApiSearchOptions): ApiSymbol[] {\n const query = options.query.trim().toLowerCase();\n\n if (query.length === 0) {\n return [];\n }\n\n const limit = Math.max(1, Math.floor(options.limit ?? DEFAULT_SEARCH_LIMIT));\n const namespaceFilter = options.namespace?.toLowerCase();\n const scored = this.scoreEntries(query, namespaceFilter, symbolKindSet(options.kinds));\n scored.sort(compareScoredEntries);\n\n return scored.slice(0, limit).map((item) => this.toApiSymbol(item.entry));\n }\n\n /** A summary of every indexed namespace, ordered Gtk, Adw, then alphabetically. */\n namespaces(): ApiNamespaceSummary[] {\n const summaries = [...this.byNamespace].map(([name, entries]) => ({\n name,\n importPath: `@gtkx/gi/${namespaceDirectory({ name })}`,\n symbols: entries.filter((entry) => entry.kind !== \"element\").length,\n elements: entries.filter((entry) => entry.kind === \"element\").length,\n }));\n\n return sortStringsBy(summaries, (summary) => namespaceOrder(summary.name));\n }\n\n /**\n * Sorted names of everything a namespace contributes, JSX elements included. The namespace is matched\n * case-insensitively, and an unindexed one yields an empty array.\n */\n symbolNames(namespaceName: string): string[] {\n const namespace = this.findNamespace(namespaceName);\n\n if (namespace === undefined) {\n return [];\n }\n\n const entries = this.byNamespace.get(namespace.name) ?? [];\n\n return sortStrings(entries.map((entry) => entry.name));\n }\n\n /** Renders the reference's Markdown landing page: every namespace, its import path, and its totals. */\n overview(): string {\n const rows = this.namespaces().map(\n (summary) =>\n `| ${summary.name} | \\`${summary.importPath}\\` | ${String(summary.symbols)} | ` +\n `${String(summary.elements)} |`,\n );\n\n const librariesList = this.libraries.map((library) => `\\`${library}\\``).join(\", \");\n\n return [\n \"# API Reference\",\n \"\",\n `Generated bindings for ${librariesList} and the namespaces they pull in. Classes, interfaces, ` +\n \"records, enums, callbacks, aliases, functions, and constants are imported from \" +\n \"`@gtkx/gi/<namespace>`; JSX elements are imported from `@gtkx/jsx/<namespace>`.\",\n \"\",\n \"Every symbol has a reference page addressed by its qualified name (for example `Gtk.Button`, \" +\n \"`Gtk.Orientation`, `GLib.idleAdd`) and every JSX element by its element name \" +\n \"(for example `GtkButton`).\",\n \"\",\n \"| Namespace | Import | Symbols | JSX elements |\",\n \"| --- | --- | --- | --- |\",\n ...rows,\n \"\",\n ].join(\"\\n\");\n }\n\n /**\n * Renders one namespace's Markdown page: its import line and its symbol names grouped by kind. The\n * namespace is matched case-insensitively, and an unindexed one yields undefined.\n */\n namespaceOverview(name: string): string | undefined {\n const namespace = this.findNamespace(name);\n\n if (namespace === undefined) {\n return undefined;\n }\n\n const entries = this.byNamespace.get(namespace.name) ?? [];\n const directory = namespaceDirectory(namespace);\n\n const lines = [\n `# ${namespace.name}`,\n \"\",\n `\\`\\`\\`ts\\nimport * as ${namespace.name} from \"@gtkx/gi/${directory}\";\\n\\`\\`\\``,\n ];\n\n for (const kind of API_SYMBOL_KINDS) {\n const names = entries.filter((entry) => entry.kind === kind).map((entry) => entry.name);\n\n if (names.length === 0) {\n continue;\n }\n\n lines.push(\n \"\",\n `## ${KIND_SECTION_TITLES[kind]} (${String(names.length)})`,\n \"\",\n sortStrings(names)\n .map((symbolName) => `\\`${symbolName}\\``)\n .join(\", \"),\n );\n }\n\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n }\n}\n\nexport type { ApiReference };\nexport {\n API_SYMBOL_KINDS,\n loadApiReference,\n type ApiReferenceOptions,\n type ApiSymbolKind,\n type ApiSymbol,\n type ApiNamespaceSummary,\n type ApiLookupResult,\n type ApiSearchOptions,\n type ApiSymbolQuery,\n};\n"]}
1
+ {"version":3,"file":"api-reference.js","sourceRoot":"","sources":["../../src/docs/api-reference.ts"],"names":[],"mappings":"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","sourcesContent":["import { sanitizeIdentifier, sanitizeTypeIdentifier, sortStrings, sortStringsBy } from \"@gtkx/utils\";\nimport type { GirClass } from \"../gir/class.js\";\nimport type { GirFunction } from \"../gir/function.js\";\nimport type { GirRecord } from \"../gir/record.js\";\nimport { isEmittableEntity } from \"../gir/emittable.js\";\nimport { Library } from \"../gir/library.js\";\nimport { type GirNamespace, namespaceDirectory } from \"../gir/namespace.js\";\nimport { dedupeCallables, isEmittableCallable } from \"../store/gi/callables.js\";\nimport { namespaceFunctionExportName } from \"../store/gi/function.js\";\nimport { type ElementProps, setElementProps } from \"../store/jsx/element-prop-imports.js\";\nimport { collectIntrinsicElementClasses, type GlibNamedClass } from \"../store/jsx/intrinsic-elements.js\";\nimport { type OmittedProps, setOmittedProps } from \"../store/jsx/omitted-props.js\";\nimport { type ElementPageContext, renderElementPage } from \"./element-page.js\";\nimport { docsSignatureContext, firstSentence, namespaceOrder } from \"./render.js\";\nimport { type GiSymbolEntry, renderSymbolPage, type SymbolPageOptions } from \"./symbol-page.js\";\n\n/** What to index and the element config the rendered pages reflect. */\ntype ApiReferenceOptions = {\n /** GIR library identifiers to load, such as `\"Gtk-4.0\"`; their dependencies are pulled in too. */\n libraries: string[];\n /** Directories to search for `.gir` files. */\n girPath: string[];\n /** Base props interfaces per element, as read by `readBuiltinElements`; without it pages miss them. */\n props?: ElementProps;\n /** GObject properties the project omits from generated props; without it pages show props that do not exist. */\n omittedProps?: OmittedProps;\n /** Describes GIR byte sequences as `Uint8Array` rather than `number[]`; defaults to false. */\n isByteArrayTyped?: boolean;\n};\n\n/** Narrows an `ApiReference.symbols` enumeration. */\ntype ApiSymbolQuery = {\n /** GIR namespace to keep, matched case-insensitively; every namespace when omitted. */\n namespace?: string;\n /** Symbol kinds to keep; every kind when omitted. */\n kinds?: ApiSymbolKind[];\n};\n\n/** What an indexed symbol is: one of the GIR symbol kinds, or a JSX element. */\ntype ApiSymbolKind =\n \"alias\" |\n \"callback\" |\n \"class\" |\n \"constant\" |\n \"element\" |\n \"enum\" |\n \"function\" |\n \"interface\" |\n \"record\";\n\n/** An indexed symbol, without its reference page. */\ntype ApiSymbol = {\n /** GIR namespace declaring the symbol, such as `\"Gtk\"`. */\n namespace: string;\n /** Name within the namespace, which for an element is its GLib type name. */\n name: string;\n /** Kind the reference groups and filters the symbol by, `\"element\"` for a JSX tag. */\n kind: ApiSymbolKind;\n /** First sentence of the symbol's GIR documentation, elided past 220 characters and empty when it has none. */\n summary: string;\n};\n\n/** How much of one namespace the reference indexes. */\ntype ApiNamespaceSummary = {\n /** GIR namespace name, such as `\"Gtk\"`. */\n name: string;\n /** The `@gtkx/gi` subpath the namespace's symbols are imported from. */\n importPath: string;\n /** How many symbols other than JSX elements the namespace contributes. */\n symbols: number;\n /** How many JSX elements the namespace contributes. */\n elements: number;\n};\n\n/** What an `ApiReference.lookup` found: a rendered page, several candidates for the name, or nothing. */\ntype ApiLookupResult =\n | {\n /** Discriminant selecting the variant. */\n outcome: \"page\";\n /** Index entry for the symbol the query resolved to. */\n symbol: ApiSymbol;\n /** The symbol's complete reference page, rendered as Markdown. */\n markdown: string;\n } |\n {\n /** Discriminant selecting the variant. */\n outcome: \"ambiguous\";\n /** Every symbol the name answers to, to be narrowed by namespace or kind. */\n candidates: ApiSymbol[];\n } |\n {\n /** Discriminant selecting the variant. */\n outcome: \"notFound\";\n };\n\n/** A fuzzy search over indexed symbol names. */\ntype ApiSearchOptions = {\n /** Text matched case-insensitively against each symbol's name and its qualified `Namespace.Name` form. */\n query: string;\n /** GIR namespace to keep, matched case-insensitively; every namespace when omitted. */\n namespace?: string;\n /** Symbol kinds to keep; every kind when omitted. */\n kinds?: ApiSymbolKind[];\n /** Maximum number of results, 20 by default. */\n limit?: number;\n};\n\n/** An indexed JSX element, carrying the widget class its page renders from. */\ntype ElementEntry = {\n /** Discriminant marking the entry as a JSX element rather than a GIR symbol. */\n kind: \"element\";\n /** GIR namespace declaring the widget class. */\n namespace: GirNamespace;\n /** Element name, which is the class's GLib type name such as `GtkButton`. */\n name: string;\n /** Documentation text carried by the widget class's GIR node. */\n doc: string | undefined;\n /** The widget class the element is generated from. */\n element: GlibNamedClass;\n};\n\n/** Anything the index holds: a GIR symbol or a JSX element. */\ntype SymbolEntry = GiSymbolEntry | ElementEntry;\n\n/** A search hit: an indexed entry and how well its name answered the query. */\ntype ScoredEntry = {\n /** Match strength, ranked best first: an exact name, then a prefix, then a substring. */\n score: number;\n /** The entry that matched. */\n entry: SymbolEntry;\n};\n\n/** Every kind the reference indexes, in the order a namespace overview groups its symbols. */\nconst API_SYMBOL_KINDS: ApiSymbolKind[] = [\n \"element\",\n \"class\",\n \"interface\",\n \"record\",\n \"enum\",\n \"callback\",\n \"alias\",\n \"function\",\n \"constant\",\n];\n\nconst KIND_SECTION_TITLES: Record<ApiSymbolKind, string> = {\n element: \"JSX elements\",\n class: \"Classes\",\n interface: \"Interfaces\",\n record: \"Records\",\n enum: \"Enums\",\n callback: \"Callbacks\",\n alias: \"Aliases\",\n function: \"Functions\",\n constant: \"Constants\",\n};\n\nconst DEFAULT_SEARCH_LIMIT = 20;\n\nconst compareNames = (a: string, b: string): number => {\n if (a < b) {\n return -1;\n }\n\n return a > b ? 1 : 0;\n};\n\nconst symbolKindSet = (kinds: ApiSymbolKind[] | undefined): Set<ApiSymbolKind> | undefined =>\n kinds === undefined ? undefined : new Set(kinds);\n\nconst isQueriedEntry = (\n entry: SymbolEntry,\n namespaceFilter: string | undefined,\n kinds: Set<ApiSymbolKind> | undefined,\n): boolean => {\n if (namespaceFilter !== undefined && entry.namespace.name.toLowerCase() !== namespaceFilter) {\n return false;\n }\n\n return kinds === undefined || kinds.has(entry.kind);\n};\n\nconst compareApiSymbols = (a: ApiSymbol, b: ApiSymbol): number => {\n const byNamespace = namespaceOrder(a.namespace).localeCompare(namespaceOrder(b.namespace));\n\n return byNamespace === 0 ? a.name.localeCompare(b.name) : byNamespace;\n};\n\n/**\n * Loads the GIR data for the given libraries and indexes every symbol and JSX element in it. The result is\n * a read-only view: it generates no store and needs none, so a tool can explore the bindings a project would\n * get without running codegen.\n *\n * @param options Which libraries to index, where to find them, and the project's element config.\n * @returns The indexed reference.\n */\nconst loadApiReference = (options: ApiReferenceOptions): ApiReference => new ApiReference(options);\n\nconst functionEntry = (\n namespace: GirNamespace,\n docsContext: ReturnType<typeof docsSignatureContext>,\n fn: GirFunction,\n): GiSymbolEntry | undefined => {\n if (!isEmittableCallable(docsContext, fn)) {\n return undefined;\n }\n\n const cIdentifier = fn.cIdentifier;\n\n if (cIdentifier === undefined) {\n return undefined;\n }\n\n const name = namespaceFunctionExportName(cIdentifier, fn.name, namespace.cSymbolPrefixes);\n\n return { kind: \"function\", namespace, name, doc: fn.doc, fn };\n};\n\nconst classEntry = (namespace: GirNamespace, klass: GirClass): GiSymbolEntry | undefined => {\n if (!isEmittableEntity(klass)) {\n return undefined;\n }\n\n const kind = klass.isInterface ? \"interface\" : \"class\";\n\n return { kind, namespace, name: sanitizeTypeIdentifier(klass.name), doc: klass.doc, klass };\n};\n\nconst classEntries = (namespace: GirNamespace): GiSymbolEntry[] => {\n const entries: GiSymbolEntry[] = [];\n\n for (const klass of [...namespace.classes, ...namespace.interfaces]) {\n const entry = classEntry(namespace, klass);\n\n if (entry !== undefined) {\n entries.push(entry);\n }\n }\n\n return entries;\n};\n\nconst recordEntry = (namespace: GirNamespace, record: GirRecord): GiSymbolEntry | undefined => {\n if (record.isVtable || !isEmittableEntity(record)) {\n return undefined;\n }\n\n return { kind: \"record\", namespace, name: sanitizeTypeIdentifier(record.name), doc: record.doc, record };\n};\n\nconst recordEntries = (namespace: GirNamespace): GiSymbolEntry[] => {\n const entries: GiSymbolEntry[] = [];\n\n for (const record of namespace.records) {\n const entry = recordEntry(namespace, record);\n\n if (entry !== undefined) {\n entries.push(entry);\n }\n }\n\n return entries;\n};\n\nconst valueEntries = (namespace: GirNamespace): GiSymbolEntry[] => [\n ...namespace.enums\n .filter((enumeration) => enumeration.introspectable)\n .map<GiSymbolEntry>((enumeration) => ({\n kind: \"enum\",\n namespace,\n name: sanitizeTypeIdentifier(enumeration.name),\n doc: enumeration.doc,\n enumeration,\n })),\n ...namespace.callbacks\n .filter((callback) => callback.introspectable)\n .map<GiSymbolEntry>((callback) => ({\n kind: \"callback\",\n namespace,\n name: sanitizeTypeIdentifier(callback.name),\n doc: callback.doc,\n callback,\n })),\n ...namespace.aliases.map<GiSymbolEntry>((alias) => ({\n kind: \"alias\",\n namespace,\n name: sanitizeTypeIdentifier(alias.name),\n doc: alias.doc,\n alias,\n })),\n ...namespace.constants.map<GiSymbolEntry>((constant) => ({\n kind: \"constant\",\n namespace,\n name: sanitizeIdentifier(constant.name),\n doc: constant.doc,\n constant,\n })),\n];\n\nconst narrowToExactMatches = (candidates: SymbolEntry[], trimmed: string, isQualified: boolean): SymbolEntry[] => {\n if (candidates.length <= 1) {\n return candidates;\n }\n\n const exact = candidates.filter(\n (entry) => (isQualified ? `${entry.namespace.name}.${entry.name}` : entry.name) === trimmed,\n );\n\n return exact.length > 0 ? exact : candidates;\n};\n\nconst getScoredEntry = (\n entry: SymbolEntry,\n query: string,\n namespaceFilter: string | undefined,\n kinds: Set<ApiSymbolKind> | undefined,\n): ScoredEntry | undefined => {\n if (!isQueriedEntry(entry, namespaceFilter, kinds)) {\n return undefined;\n }\n\n const score = searchScore(entry, query);\n\n if (score === 0) {\n return undefined;\n }\n\n return { score, entry };\n};\n\nconst compareScoredEntries = (a: ScoredEntry, b: ScoredEntry): number =>\n b.score - a.score ||\n a.entry.name.length - b.entry.name.length ||\n compareNames(a.entry.name, b.entry.name) ||\n compareNames(namespaceOrder(a.entry.namespace.name), namespaceOrder(b.entry.namespace.name)) ||\n compareNames(a.entry.kind, b.entry.kind);\n\nconst searchScore = (entry: SymbolEntry, query: string): number => {\n const name = entry.name.toLowerCase();\n const qualified = `${entry.namespace.name.toLowerCase()}.${name}`;\n\n if (name === query || qualified === query) {\n return 3;\n }\n\n if (name.startsWith(query)) {\n return 2;\n }\n\n if (name.includes(query) || qualified.includes(query)) {\n return 1;\n }\n\n return 0;\n};\n\n/** An index over the GIR data a project's bindings are generated from, queryable and renderable as Markdown. */\nclass ApiReference {\n private library: Library;\n private libraries: string[];\n private elementContext: ElementPageContext;\n private entries: SymbolEntry[] = [];\n private byQualified: Map<string, SymbolEntry[]> = new Map();\n private byName: Map<string, SymbolEntry[]> = new Map();\n private byNamespace: Map<string, SymbolEntry[]> = new Map();\n private elementsByClass: Map<string, string> = new Map();\n\n private props: ElementProps;\n private omittedProps: OmittedProps;\n\n /** Indexes every symbol and JSX element in the GIR data the options point at. */\n constructor(options: ApiReferenceOptions) {\n this.libraries = options.libraries;\n this.props = options.props ?? {};\n this.omittedProps = options.omittedProps ?? {};\n this.library = Library.load(options.libraries, options.girPath, options.isByteArrayTyped === true);\n this.elementContext = { library: this.library, linkFor: (): string | undefined => undefined };\n this.buildIndex();\n }\n\n private applyElementConfig(): void {\n setElementProps(this.props);\n setOmittedProps(this.omittedProps);\n }\n\n private add(entry: SymbolEntry): void {\n this.entries.push(entry);\n\n const push = (map: Map<string, SymbolEntry[]>, key: string): void => {\n const list = map.get(key) ?? [];\n list.push(entry);\n map.set(key, list);\n };\n\n push(this.byQualified, `${entry.namespace.name}.${entry.name}`.toLowerCase());\n push(this.byName, entry.name.toLowerCase());\n push(this.byNamespace, entry.namespace.name);\n }\n\n private buildIndex(): void {\n for (const namespace of this.library.namespaces.values()) {\n this.indexNamespace(namespace);\n }\n\n for (const element of collectIntrinsicElementClasses(this.library)) {\n this.add({\n kind: \"element\",\n namespace: element.namespace,\n name: element.glibName,\n doc: element.klass.doc,\n element,\n });\n\n this.elementsByClass.set(`${element.namespace.name}.${element.klass.name}`, element.glibName);\n }\n }\n\n private indexNamespace(namespace: GirNamespace): void {\n const entries = [\n ...classEntries(namespace),\n ...recordEntries(namespace),\n ...valueEntries(namespace),\n ];\n\n for (const entry of entries) {\n this.add(entry);\n }\n\n this.indexFunctions(namespace);\n }\n\n private indexFunctions(namespace: GirNamespace): void {\n if (namespace.sharedLibrary === undefined) {\n return;\n }\n\n const docsContext = docsSignatureContext(namespace, this.library);\n\n for (const fn of dedupeCallables(namespace.functions)) {\n const entry = functionEntry(namespace, docsContext, fn);\n\n if (entry !== undefined) {\n this.add(entry);\n }\n }\n }\n\n private toApiSymbol(entry: SymbolEntry): ApiSymbol {\n return {\n namespace: entry.namespace.name,\n name: entry.name,\n kind: entry.kind,\n summary: firstSentence(entry.doc),\n };\n }\n\n private symbolPageOptions(): SymbolPageOptions {\n return {\n library: this.library,\n elementNameFor: (namespaceName, className) => this.elementsByClass.get(`${namespaceName}.${className}`),\n };\n }\n\n private renderPage(entry: SymbolEntry): string {\n if (entry.kind === \"element\") {\n this.applyElementConfig();\n\n return renderElementPage(entry.element, this.elementContext);\n }\n\n return renderSymbolPage(entry, this.symbolPageOptions());\n }\n\n private findNamespace(name: string): GirNamespace | undefined {\n const lower = name.toLowerCase();\n\n for (const namespace of this.library.namespaces.values()) {\n if (namespace.name.toLowerCase() === lower) {\n return namespace;\n }\n }\n\n return undefined;\n }\n\n private lookupCandidates(trimmed: string, kind: ApiSymbolKind | undefined): SymbolEntry[] {\n const isQualified = trimmed.includes(\".\");\n const map = isQualified ? this.byQualified : this.byName;\n let candidates = map.get(trimmed.toLowerCase()) ?? [];\n\n if (kind !== undefined) {\n candidates = candidates.filter((entry) => entry.kind === kind);\n }\n\n return narrowToExactMatches(candidates, trimmed, isQualified);\n }\n\n private scoreEntries(\n query: string,\n namespaceFilter: string | undefined,\n kinds: Set<ApiSymbolKind> | undefined,\n ): ScoredEntry[] {\n const scored: ScoredEntry[] = [];\n\n for (const entry of this.entries) {\n const item = getScoredEntry(entry, query, namespaceFilter, kinds);\n\n if (item !== undefined) {\n scored.push(item);\n }\n }\n\n return scored;\n }\n\n /** Paths of the `.gir` files the index was built from, including the ones pulled in as dependencies. */\n get girFiles(): string[] {\n return this.library.girFiles;\n }\n\n /**\n * Resolves a name to a single symbol and renders its reference page. The name may be bare (`Button`) or\n * qualified (`Gtk.Button`), and is matched case-insensitively; a name several symbols answer to is\n * reported as ambiguous rather than picked between.\n *\n * @param kind Restricts the match to one kind, which is how a class and its JSX element are told apart.\n */\n lookup(query: string, kind?: ApiSymbolKind): ApiLookupResult {\n const trimmed = query.trim();\n\n if (trimmed.length === 0) {\n return { outcome: \"notFound\" };\n }\n\n const candidates = this.lookupCandidates(trimmed, kind);\n const entry = candidates[0];\n\n if (entry === undefined) {\n return { outcome: \"notFound\" };\n }\n\n if (candidates.length > 1) {\n return { outcome: \"ambiguous\", candidates: candidates.map((candidate) => this.toApiSymbol(candidate)) };\n }\n\n return { outcome: \"page\", symbol: this.toApiSymbol(entry), markdown: this.renderPage(entry) };\n }\n\n /** Every indexed symbol the query keeps, ordered by namespace (Gtk, then Adw, then alphabetically) and name. */\n symbols(query: ApiSymbolQuery = {}): ApiSymbol[] {\n const namespaceFilter = query.namespace?.toLowerCase();\n const kinds = symbolKindSet(query.kinds);\n\n return this.entries\n .filter((entry) => isQueriedEntry(entry, namespaceFilter, kinds))\n .map((entry) => this.toApiSymbol(entry))\n .toSorted(compareApiSymbols);\n }\n\n /**\n * Symbols whose name matches the query, best first: an exact name beats a prefix, which beats a\n * substring, and shorter names win ties. An empty query matches nothing.\n */\n search(options: ApiSearchOptions): ApiSymbol[] {\n const query = options.query.trim().toLowerCase();\n\n if (query.length === 0) {\n return [];\n }\n\n const limit = Math.max(1, Math.floor(options.limit ?? DEFAULT_SEARCH_LIMIT));\n const namespaceFilter = options.namespace?.toLowerCase();\n const scored = this.scoreEntries(query, namespaceFilter, symbolKindSet(options.kinds));\n scored.sort(compareScoredEntries);\n\n return scored.slice(0, limit).map((item) => this.toApiSymbol(item.entry));\n }\n\n /** A summary of every indexed namespace, ordered Gtk, Adw, then alphabetically. */\n namespaces(): ApiNamespaceSummary[] {\n const summaries = [...this.byNamespace].map(([name, entries]) => ({\n name,\n importPath: `@gtkx/gi/${namespaceDirectory({ name })}`,\n symbols: entries.filter((entry) => entry.kind !== \"element\").length,\n elements: entries.filter((entry) => entry.kind === \"element\").length,\n }));\n\n return sortStringsBy(summaries, (summary) => namespaceOrder(summary.name));\n }\n\n /**\n * Sorted names of everything a namespace contributes, JSX elements included. The namespace is matched\n * case-insensitively, and an unindexed one yields an empty array.\n */\n symbolNames(namespaceName: string): string[] {\n const namespace = this.findNamespace(namespaceName);\n\n if (namespace === undefined) {\n return [];\n }\n\n const entries = this.byNamespace.get(namespace.name) ?? [];\n\n return sortStrings(entries.map((entry) => entry.name));\n }\n\n /** Renders the reference's Markdown landing page: every namespace, its import path, and its totals. */\n overview(): string {\n const rows = this.namespaces().map(\n (summary) =>\n `| ${summary.name} | \\`${summary.importPath}\\` | ${String(summary.symbols)} | ` +\n `${String(summary.elements)} |`,\n );\n\n const librariesList = this.libraries.map((library) => `\\`${library}\\``).join(\", \");\n\n return [\n \"# API Reference\",\n \"\",\n `Generated bindings for ${librariesList} and the namespaces they pull in. Classes, interfaces, ` +\n \"records, enums, callbacks, aliases, functions, and constants are imported from \" +\n \"`@gtkx/gi/<namespace>`; JSX elements are imported from `@gtkx/jsx/<namespace>`.\",\n \"\",\n \"Every symbol has a reference page addressed by its qualified name (for example `Gtk.Button`, \" +\n \"`Gtk.Orientation`, `GLib.idleAdd`) and every JSX element by its element name \" +\n \"(for example `GtkButton`).\",\n \"\",\n \"| Namespace | Import | Symbols | JSX elements |\",\n \"| --- | --- | --- | --- |\",\n ...rows,\n \"\",\n ].join(\"\\n\");\n }\n\n /**\n * Renders one namespace's Markdown page: its import line and its symbol names grouped by kind. The\n * namespace is matched case-insensitively, and an unindexed one yields undefined.\n */\n namespaceOverview(name: string): string | undefined {\n const namespace = this.findNamespace(name);\n\n if (namespace === undefined) {\n return undefined;\n }\n\n const entries = this.byNamespace.get(namespace.name) ?? [];\n const directory = namespaceDirectory(namespace);\n\n const lines = [\n `# ${namespace.name}`,\n \"\",\n `\\`\\`\\`ts\\nimport * as ${namespace.name} from \"@gtkx/gi/${directory}\";\\n\\`\\`\\``,\n ];\n\n for (const kind of API_SYMBOL_KINDS) {\n const names = entries.filter((entry) => entry.kind === kind).map((entry) => entry.name);\n\n if (names.length === 0) {\n continue;\n }\n\n lines.push(\n \"\",\n `## ${KIND_SECTION_TITLES[kind]} (${String(names.length)})`,\n \"\",\n sortStrings(names)\n .map((symbolName) => `\\`${symbolName}\\``)\n .join(\", \"),\n );\n }\n\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n }\n}\n\nexport type { ApiReference };\nexport {\n API_SYMBOL_KINDS,\n loadApiReference,\n type ApiReferenceOptions,\n type ApiSymbolKind,\n type ApiSymbol,\n type ApiNamespaceSummary,\n type ApiLookupResult,\n type ApiSearchOptions,\n type ApiSymbolQuery,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"element-page.d.ts","sourceRoot":"","sources":["../../src/docs/element-page.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAOjD,OAAO,EAEH,KAAK,cAAc,EAItB,MAAM,oCAAoC,CAAC;AAsB5C,6DAA6D;AAC7D,KAAK,kBAAkB,GAAG;IACtB,6FAA6F;IAC7F,OAAO,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACrD,CAAC;AA+NF,QAAA,MAAM,iBAAiB,GAAI,OAAO,cAAc,EAAE,SAAS,kBAAkB,KAAG,MAc/E,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"element-page.d.ts","sourceRoot":"","sources":["../../src/docs/element-page.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAOjD,OAAO,EAEH,KAAK,cAAc,EAItB,MAAM,oCAAoC,CAAC;AAuB5C,6DAA6D;AAC7D,KAAK,kBAAkB,GAAG;IACtB,6FAA6F;IAC7F,OAAO,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACrD,CAAC;AAiOF,QAAA,MAAM,iBAAiB,GAAI,OAAO,cAAc,EAAE,SAAS,kBAAkB,KAAG,MAc/E,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,CAAC"}
@@ -8,7 +8,7 @@ import { getGlibName, implementedInterfaces, newlyImplementedInterfaces, signalH
8
8
  import { isOmittedProp } from "../store/jsx/omitted-props.js";
9
9
  import { isObjectProp } from "../store/jsx/props.js";
10
10
  import { handwrittenPropsFor } from "./handwritten-props.js";
11
- import { annotationNotes, classMethodEntries, docMarkdown, firstSentence, implementsLine, joinSections, methodsSectionBlocks, originSignatureBlocks, propertyMetaLine, renderDocsSignalSignature, renderDocsType, signalTags, sortedMetaBlocks, } from "./render.js";
11
+ import { annotationNotes, classMethodEntries, docMarkdown, firstSentence, implementsLine, joinSections, methodsSectionBlocks, originSignatureBlocks, propertyMetaLine, qualifiedClassName, renderDocsSignalSignature, renderDocsType, signalTags, sortedMetaBlocks, } from "./render.js";
12
12
  const frontmatter = (entry) => {
13
13
  const sentence = firstSentence(entry.klass.doc);
14
14
  const description = sentence.length > 0 ? sentence : `API reference for the ${entry.glibName} element.`;
@@ -26,7 +26,9 @@ const hierarchySection = (entry, context) => {
26
26
  }
27
27
  const parts = ancestors.map((ancestor) => {
28
28
  const glib = getGlibName(ancestor.klass);
29
- return glib === undefined ? `\`${ancestor.namespaceName}.${ancestor.klass.name}\`` : glibLabel(context, glib);
29
+ return glib === undefined
30
+ ? `\`${qualifiedClassName(ancestor.namespaceName, ancestor.klass.name)}\``
31
+ : glibLabel(context, glib);
30
32
  });
31
33
  parts.push(`**${entry.glibName}**`);
32
34
  const lines = ["## Hierarchy", parts.join(" → ")];
@@ -152,7 +154,7 @@ const methodsSection = (entry, context, selfType) => {
152
154
  return methodsSectionBlocks(entries, intro);
153
155
  };
154
156
  const renderElementPage = (entry, context) => {
155
- const selfType = `${entry.namespace.name}.${entry.klass.name}`;
157
+ const selfType = qualifiedClassName(entry.namespace.name, entry.klass.name);
156
158
  return joinSections([
157
159
  frontmatter(entry),
158
160
  `# ${entry.glibName}`,
@@ -1 +1 @@
1
- {"version":3,"file":"element-page.js","sourceRoot":"","sources":["../../src/docs/element-page.ts"],"names":[],"mappings":"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","sourcesContent":["import { toCamelIdentifier, upperFirst } from \"@gtkx/utils\";\nimport type { GirClass } from \"../gir/class.js\";\nimport type { Library } from \"../gir/library.js\";\nimport type { HandwrittenProp } from \"./handwritten-props.js\";\nimport { ancestorChain } from \"../gir/ancestry.js\";\nimport { type GirNamespace, namespaceDirectory } from \"../gir/namespace.js\";\nimport { type GirProperty, isConstructableProperty } from \"../gir/property.js\";\nimport { annotationSpec } from \"../store/gi/doc-spec.js\";\nimport { elementPropTypeFor } from \"../store/jsx/element-prop-imports.js\";\nimport {\n getGlibName,\n type GlibNamedClass,\n implementedInterfaces,\n newlyImplementedInterfaces,\n signalHandlerName,\n} from \"../store/jsx/intrinsic-elements.js\";\nimport { isOmittedProp } from \"../store/jsx/omitted-props.js\";\nimport { isObjectProp } from \"../store/jsx/props.js\";\nimport { handwrittenPropsFor } from \"./handwritten-props.js\";\nimport {\n annotationNotes,\n classMethodEntries,\n docMarkdown,\n firstSentence,\n implementsLine,\n joinSections,\n type MetaDocEntry,\n methodsSectionBlocks,\n originSignatureBlocks,\n type OriginSignatureEntry,\n propertyMetaLine,\n renderDocsSignalSignature,\n renderDocsType,\n signalTags,\n sortedMetaBlocks,\n} from \"./render.js\";\n\n/** Shared state an element's reference page renders from. */\ntype ElementPageContext = {\n /** Parsed GIR the element, its ancestors, and the interfaces it implements are read from. */\n library: Library;\n /** Resolves a GLib type name to the URL of its page, undefined when it has none. */\n linkFor: (glibName: string) => string | undefined;\n};\n\ntype MemberOwner = {\n klass: GirClass;\n namespace: GirNamespace;\n origin: string | undefined;\n glibName: string | undefined;\n};\n\nconst frontmatter = (entry: GlibNamedClass): string => {\n const sentence = firstSentence(entry.klass.doc);\n const description = sentence.length > 0 ? sentence : `API reference for the ${entry.glibName} element.`;\n\n return `---\\ndescription: ${JSON.stringify(description)}\\n---`;\n};\n\nconst importBlock = (entry: GlibNamedClass): string =>\n `\\`\\`\\`tsx\\nimport { ${entry.glibName} } from \"@gtkx/jsx/${namespaceDirectory(entry.namespace)}\";\\n\\`\\`\\``;\n\nconst glibLabel = (context: ElementPageContext, glibName: string): string => {\n const link = context.linkFor(glibName);\n\n return link === undefined ? `\\`${glibName}\\`` : `[${glibName}](${link})`;\n};\n\nconst hierarchySection = (entry: GlibNamedClass, context: ElementPageContext): string[] => {\n const ancestors = [...ancestorChain(context.library, entry.klass, entry.namespace.name)].slice(1).toReversed();\n\n if (ancestors.length === 0) {\n return [];\n }\n\n const parts = ancestors.map((ancestor) => {\n const glib = getGlibName(ancestor.klass);\n\n return glib === undefined ? `\\`${ancestor.namespaceName}.${ancestor.klass.name}\\`` : glibLabel(context, glib);\n });\n\n parts.push(`**${entry.glibName}**`);\n const lines = [\"## Hierarchy\", parts.join(\" → \")];\n\n const interfaces = implementedInterfaces(entry.klass, entry.namespace, context.library)\n .map((iface) => getGlibName(iface.klass))\n .filter((name): name is string => name !== undefined);\n\n lines.push(...implementsLine(interfaces));\n\n return lines;\n};\n\nconst memberOwners = (entry: GlibNamedClass, context: ElementPageContext): MemberOwner[] => [\n { klass: entry.klass, namespace: entry.namespace, origin: undefined, glibName: entry.glibName },\n ...newlyImplementedInterfaces(\n entry.klass,\n entry.namespace,\n context.library,\n (glibName) => glibName !== undefined && elementPropTypeFor(glibName) !== undefined,\n ).map((iface) => {\n const glibName = getGlibName(iface.klass);\n\n return { klass: iface.klass, namespace: iface.namespace, origin: glibName, glibName };\n }),\n];\n\nconst propertyEntry = (\n context: ElementPageContext,\n owner: MemberOwner,\n property: GirProperty,\n jsName: string,\n): MetaDocEntry => {\n const isObject = isObjectProp(context.library, property);\n const baseType = renderDocsType(context.library, property.type, false);\n const type = isObject ? `${baseType} | ReactElement` : baseType;\n\n const accessNotes = isConstructableProperty(property)\n ? []\n : [`read-only, observe with \\`onNotify${upperFirst(jsName)}\\``];\n\n return {\n name: jsName,\n meta: propertyMetaLine({ type, property, accessNotes, origin: owner.origin }),\n doc: docMarkdown(property.doc),\n tags: annotationSpec(property.annotations),\n };\n};\n\nconst handwrittenPropMeta = (prop: HandwrittenProp, owner: MemberOwner): string =>\n [`\\`${prop.type}\\``, ...(owner.origin === undefined ? [] : [`from \\`${owner.origin}\\``])].join(\" · \");\n\nconst handwrittenPropEntries = (owner: MemberOwner, seen: Set<string>): MetaDocEntry[] => {\n const declared = owner.glibName === undefined ? undefined : elementPropTypeFor(owner.glibName);\n\n if (declared === undefined) {\n return [];\n }\n\n const entries: MetaDocEntry[] = [];\n\n for (const prop of handwrittenPropsFor(declared)) {\n if (seen.has(prop.name)) {\n continue;\n }\n\n seen.add(prop.name);\n entries.push({ name: prop.name, meta: handwrittenPropMeta(prop, owner), doc: prop.doc });\n }\n\n return entries;\n};\n\nconst propJsName = (property: GirProperty, owner: MemberOwner, seen: Set<string>): string | undefined => {\n if (!property.introspectable) {\n return undefined;\n }\n\n const jsName = toCamelIdentifier(property.name);\n\n if (seen.has(jsName) || isOmittedProp(owner.glibName, jsName)) {\n return undefined;\n }\n\n seen.add(jsName);\n\n return jsName;\n};\n\nconst ownerPropEntries = (context: ElementPageContext, owner: MemberOwner, seen: Set<string>): MetaDocEntry[] => {\n const entries: MetaDocEntry[] = [...handwrittenPropEntries(owner, seen)];\n\n for (const property of owner.klass.properties) {\n const jsName = propJsName(property, owner, seen);\n\n if (jsName !== undefined) {\n entries.push(propertyEntry(context, owner, property, jsName));\n }\n }\n\n return entries;\n};\n\nconst propertyEntries = (entry: GlibNamedClass, context: ElementPageContext, seen: Set<string>): MetaDocEntry[] => {\n const entries: MetaDocEntry[] = [];\n\n for (const owner of memberOwners(entry, context)) {\n entries.push(...ownerPropEntries(context, owner, seen));\n }\n\n return entries;\n};\n\nconst propsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {\n const seen: Set<string> = new Set();\n const entries = propertyEntries(entry, context, seen);\n\n const intro = [\n `\\`ref\\` receives the \\`${selfType}\\` instance.`,\n \"Every mutable property also has an `onNotify<Prop>` handler prop called with the new value \" +\n \"when the property changes.\",\n \"Props inherited from ancestor elements are documented on their own pages.\",\n ].join(\" \");\n\n if (entries.length === 0) {\n return [\"## Props\", intro];\n }\n\n return [\"## Props\", intro, ...sortedMetaBlocks(entries)];\n};\n\nconst ownerSignalEntries = (\n context: ElementPageContext,\n owner: MemberOwner,\n selfType: string,\n seen: Set<string>,\n): OriginSignatureEntry[] => {\n const entries: OriginSignatureEntry[] = [];\n\n for (const signal of owner.klass.signals) {\n const name = signalHandlerName(signal.name);\n\n if (seen.has(name)) {\n continue;\n }\n\n seen.add(name);\n\n entries.push({\n name,\n signature: renderDocsSignalSignature(context.library, signal, selfType),\n doc: docMarkdown(signal.doc),\n tags: signalTags(signal, true),\n origin: owner.origin,\n });\n }\n\n return entries;\n};\n\nconst signalsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {\n const seen: Set<string> = new Set();\n const entries: OriginSignatureEntry[] = [];\n\n for (const owner of memberOwners(entry, context)) {\n entries.push(...ownerSignalEntries(context, owner, selfType, seen));\n }\n\n if (entries.length === 0) {\n return [];\n }\n\n return [\"## Signals\", ...originSignatureBlocks(entries)];\n};\n\nconst methodsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {\n const entries = classMethodEntries(context.library, entry.namespace, entry.klass);\n const importPath = `@gtkx/gi/${namespaceDirectory(entry.namespace)}`;\n\n const intro =\n `Methods are called on the \\`${selfType}\\` instance, obtained with the \\`ref\\` prop or ` +\n `imported from \\`${importPath}\\`. Methods inherited from ancestors are documented on their own pages.`;\n\n return methodsSectionBlocks(entries, intro);\n};\n\nconst renderElementPage = (entry: GlibNamedClass, context: ElementPageContext): string => {\n const selfType = `${entry.namespace.name}.${entry.klass.name}`;\n\n return joinSections([\n frontmatter(entry),\n `# ${entry.glibName}`,\n docMarkdown(entry.klass.doc),\n ...annotationNotes(entry.klass.annotations),\n importBlock(entry),\n ...hierarchySection(entry, context),\n ...propsSection(entry, context, selfType),\n ...signalsSection(entry, context, selfType),\n ...methodsSection(entry, context, selfType),\n ]);\n};\n\nexport { renderElementPage, type ElementPageContext };\n"]}
1
+ {"version":3,"file":"element-page.js","sourceRoot":"","sources":["../../src/docs/element-page.ts"],"names":[],"mappings":"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","sourcesContent":["import { toCamelIdentifier, upperFirst } from \"@gtkx/utils\";\nimport type { GirClass } from \"../gir/class.js\";\nimport type { Library } from \"../gir/library.js\";\nimport type { HandwrittenProp } from \"./handwritten-props.js\";\nimport { ancestorChain } from \"../gir/ancestry.js\";\nimport { type GirNamespace, namespaceDirectory } from \"../gir/namespace.js\";\nimport { type GirProperty, isConstructableProperty } from \"../gir/property.js\";\nimport { annotationSpec } from \"../store/gi/doc-spec.js\";\nimport { elementPropTypeFor } from \"../store/jsx/element-prop-imports.js\";\nimport {\n getGlibName,\n type GlibNamedClass,\n implementedInterfaces,\n newlyImplementedInterfaces,\n signalHandlerName,\n} from \"../store/jsx/intrinsic-elements.js\";\nimport { isOmittedProp } from \"../store/jsx/omitted-props.js\";\nimport { isObjectProp } from \"../store/jsx/props.js\";\nimport { handwrittenPropsFor } from \"./handwritten-props.js\";\nimport {\n annotationNotes,\n classMethodEntries,\n docMarkdown,\n firstSentence,\n implementsLine,\n joinSections,\n type MetaDocEntry,\n methodsSectionBlocks,\n originSignatureBlocks,\n type OriginSignatureEntry,\n propertyMetaLine,\n qualifiedClassName,\n renderDocsSignalSignature,\n renderDocsType,\n signalTags,\n sortedMetaBlocks,\n} from \"./render.js\";\n\n/** Shared state an element's reference page renders from. */\ntype ElementPageContext = {\n /** Parsed GIR the element, its ancestors, and the interfaces it implements are read from. */\n library: Library;\n /** Resolves a GLib type name to the URL of its page, undefined when it has none. */\n linkFor: (glibName: string) => string | undefined;\n};\n\ntype MemberOwner = {\n klass: GirClass;\n namespace: GirNamespace;\n origin: string | undefined;\n glibName: string | undefined;\n};\n\nconst frontmatter = (entry: GlibNamedClass): string => {\n const sentence = firstSentence(entry.klass.doc);\n const description = sentence.length > 0 ? sentence : `API reference for the ${entry.glibName} element.`;\n\n return `---\\ndescription: ${JSON.stringify(description)}\\n---`;\n};\n\nconst importBlock = (entry: GlibNamedClass): string =>\n `\\`\\`\\`tsx\\nimport { ${entry.glibName} } from \"@gtkx/jsx/${namespaceDirectory(entry.namespace)}\";\\n\\`\\`\\``;\n\nconst glibLabel = (context: ElementPageContext, glibName: string): string => {\n const link = context.linkFor(glibName);\n\n return link === undefined ? `\\`${glibName}\\`` : `[${glibName}](${link})`;\n};\n\nconst hierarchySection = (entry: GlibNamedClass, context: ElementPageContext): string[] => {\n const ancestors = [...ancestorChain(context.library, entry.klass, entry.namespace.name)].slice(1).toReversed();\n\n if (ancestors.length === 0) {\n return [];\n }\n\n const parts = ancestors.map((ancestor) => {\n const glib = getGlibName(ancestor.klass);\n\n return glib === undefined\n ? `\\`${qualifiedClassName(ancestor.namespaceName, ancestor.klass.name)}\\``\n : glibLabel(context, glib);\n });\n\n parts.push(`**${entry.glibName}**`);\n const lines = [\"## Hierarchy\", parts.join(\" → \")];\n\n const interfaces = implementedInterfaces(entry.klass, entry.namespace, context.library)\n .map((iface) => getGlibName(iface.klass))\n .filter((name): name is string => name !== undefined);\n\n lines.push(...implementsLine(interfaces));\n\n return lines;\n};\n\nconst memberOwners = (entry: GlibNamedClass, context: ElementPageContext): MemberOwner[] => [\n { klass: entry.klass, namespace: entry.namespace, origin: undefined, glibName: entry.glibName },\n ...newlyImplementedInterfaces(\n entry.klass,\n entry.namespace,\n context.library,\n (glibName) => glibName !== undefined && elementPropTypeFor(glibName) !== undefined,\n ).map((iface) => {\n const glibName = getGlibName(iface.klass);\n\n return { klass: iface.klass, namespace: iface.namespace, origin: glibName, glibName };\n }),\n];\n\nconst propertyEntry = (\n context: ElementPageContext,\n owner: MemberOwner,\n property: GirProperty,\n jsName: string,\n): MetaDocEntry => {\n const isObject = isObjectProp(context.library, property);\n const baseType = renderDocsType(context.library, property.type, false);\n const type = isObject ? `${baseType} | ReactElement` : baseType;\n\n const accessNotes = isConstructableProperty(property)\n ? []\n : [`read-only, observe with \\`onNotify${upperFirst(jsName)}\\``];\n\n return {\n name: jsName,\n meta: propertyMetaLine({ type, property, accessNotes, origin: owner.origin }),\n doc: docMarkdown(property.doc),\n tags: annotationSpec(property.annotations),\n };\n};\n\nconst handwrittenPropMeta = (prop: HandwrittenProp, owner: MemberOwner): string =>\n [`\\`${prop.type}\\``, ...(owner.origin === undefined ? [] : [`from \\`${owner.origin}\\``])].join(\" · \");\n\nconst handwrittenPropEntries = (owner: MemberOwner, seen: Set<string>): MetaDocEntry[] => {\n const declared = owner.glibName === undefined ? undefined : elementPropTypeFor(owner.glibName);\n\n if (declared === undefined) {\n return [];\n }\n\n const entries: MetaDocEntry[] = [];\n\n for (const prop of handwrittenPropsFor(declared)) {\n if (seen.has(prop.name)) {\n continue;\n }\n\n seen.add(prop.name);\n entries.push({ name: prop.name, meta: handwrittenPropMeta(prop, owner), doc: prop.doc });\n }\n\n return entries;\n};\n\nconst propJsName = (property: GirProperty, owner: MemberOwner, seen: Set<string>): string | undefined => {\n if (!property.introspectable) {\n return undefined;\n }\n\n const jsName = toCamelIdentifier(property.name);\n\n if (seen.has(jsName) || isOmittedProp(owner.glibName, jsName)) {\n return undefined;\n }\n\n seen.add(jsName);\n\n return jsName;\n};\n\nconst ownerPropEntries = (context: ElementPageContext, owner: MemberOwner, seen: Set<string>): MetaDocEntry[] => {\n const entries: MetaDocEntry[] = [...handwrittenPropEntries(owner, seen)];\n\n for (const property of owner.klass.properties) {\n const jsName = propJsName(property, owner, seen);\n\n if (jsName !== undefined) {\n entries.push(propertyEntry(context, owner, property, jsName));\n }\n }\n\n return entries;\n};\n\nconst propertyEntries = (entry: GlibNamedClass, context: ElementPageContext, seen: Set<string>): MetaDocEntry[] => {\n const entries: MetaDocEntry[] = [];\n\n for (const owner of memberOwners(entry, context)) {\n entries.push(...ownerPropEntries(context, owner, seen));\n }\n\n return entries;\n};\n\nconst propsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {\n const seen: Set<string> = new Set();\n const entries = propertyEntries(entry, context, seen);\n\n const intro = [\n `\\`ref\\` receives the \\`${selfType}\\` instance.`,\n \"Every mutable property also has an `onNotify<Prop>` handler prop called with the new value \" +\n \"when the property changes.\",\n \"Props inherited from ancestor elements are documented on their own pages.\",\n ].join(\" \");\n\n if (entries.length === 0) {\n return [\"## Props\", intro];\n }\n\n return [\"## Props\", intro, ...sortedMetaBlocks(entries)];\n};\n\nconst ownerSignalEntries = (\n context: ElementPageContext,\n owner: MemberOwner,\n selfType: string,\n seen: Set<string>,\n): OriginSignatureEntry[] => {\n const entries: OriginSignatureEntry[] = [];\n\n for (const signal of owner.klass.signals) {\n const name = signalHandlerName(signal.name);\n\n if (seen.has(name)) {\n continue;\n }\n\n seen.add(name);\n\n entries.push({\n name,\n signature: renderDocsSignalSignature(context.library, signal, selfType),\n doc: docMarkdown(signal.doc),\n tags: signalTags(signal, true),\n origin: owner.origin,\n });\n }\n\n return entries;\n};\n\nconst signalsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {\n const seen: Set<string> = new Set();\n const entries: OriginSignatureEntry[] = [];\n\n for (const owner of memberOwners(entry, context)) {\n entries.push(...ownerSignalEntries(context, owner, selfType, seen));\n }\n\n if (entries.length === 0) {\n return [];\n }\n\n return [\"## Signals\", ...originSignatureBlocks(entries)];\n};\n\nconst methodsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {\n const entries = classMethodEntries(context.library, entry.namespace, entry.klass);\n const importPath = `@gtkx/gi/${namespaceDirectory(entry.namespace)}`;\n\n const intro =\n `Methods are called on the \\`${selfType}\\` instance, obtained with the \\`ref\\` prop or ` +\n `imported from \\`${importPath}\\`. Methods inherited from ancestors are documented on their own pages.`;\n\n return methodsSectionBlocks(entries, intro);\n};\n\nconst renderElementPage = (entry: GlibNamedClass, context: ElementPageContext): string => {\n const selfType = qualifiedClassName(entry.namespace.name, entry.klass.name);\n\n return joinSections([\n frontmatter(entry),\n `# ${entry.glibName}`,\n docMarkdown(entry.klass.doc),\n ...annotationNotes(entry.klass.annotations),\n importBlock(entry),\n ...hierarchySection(entry, context),\n ...propsSection(entry, context, selfType),\n ...signalsSection(entry, context, selfType),\n ...methodsSection(entry, context, selfType),\n ]);\n};\n\nexport { renderElementPage, type ElementPageContext };\n"]}
@@ -18,6 +18,7 @@ type DocsOptions = {
18
18
  props?: ElementProps;
19
19
  omittedProps?: OmittedProps;
20
20
  isForced?: boolean;
21
+ isByteArrayTyped?: boolean;
21
22
  };
22
23
  type DocsResult = {
23
24
  isRegenerated: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/docs/pipeline.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,sCAAsC,CAAC;AAE1F,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,+BAA+B,CAAC;AAInF,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,WAAW,GAAG;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAcF,KAAK,UAAU,GAAG;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC/B,CAAC;AAuKF,QAAA,MAAM,SAAS,GAAI,SAAS,WAAW,KAAG,UAyBzC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/docs/pipeline.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,sCAAsC,CAAC;AAE1F,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,+BAA+B,CAAC;AAInF,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,WAAW,GAAG;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAeF,KAAK,UAAU,GAAG;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC/B,CAAC;AAkRF,QAAA,MAAM,SAAS,GAAI,SAAS,WAAW,KAAG,UAwBzC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1,15 +1,20 @@
1
1
  import { sortStringsBy } from "@gtkx/utils";
2
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { mkdirSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
3
3
  import { dirname, join } from "node:path";
4
- import { computeGiFingerprint, FINGERPRINT_FILENAME, isGiStoreFresh } from "../fingerprint.js";
4
+ import { computeDocsFingerprint, FINGERPRINT_FILENAME, isDocsOutputFresh, } from "../fingerprint.js";
5
5
  import { Library } from "../gir/library.js";
6
6
  import { namespaceDirectory } from "../gir/namespace.js";
7
+ import { arrayGuard, hasFields, isString } from "../guards.js";
8
+ import { readJsonFile } from "../json.js";
7
9
  import { setElementProps } from "../store/jsx/element-prop-imports.js";
8
10
  import { collectIntrinsicElementClasses } from "../store/jsx/intrinsic-elements.js";
9
11
  import { setOmittedProps } from "../store/jsx/omitted-props.js";
10
12
  import { renderElementPage } from "./element-page.js";
11
13
  import { elementSlug, firstSentence, namespaceOrder } from "./render.js";
12
14
  const MANIFEST_FILENAME = "manifest.json";
15
+ const MANIFEST_GENERATOR = "gtkx-docs";
16
+ const ROOT_INDEX_FILENAME = "index.md";
17
+ const DEFAULT_BASE_PATH = "/reference";
13
18
  const namespaceIndexPage = (namespace, elements) => {
14
19
  const rows = elements.map((entry, index) => {
15
20
  const link = namespace.elements[index]?.link ?? "";
@@ -85,9 +90,22 @@ const buildElementLinks = (elements, basePath) => {
85
90
  }
86
91
  return linkByGlibName;
87
92
  };
93
+ const isEntryInsideOutDir = (value) => value.length > 0 && value !== "." && value !== ".." && !value.includes("/") && !value.includes("\\");
94
+ const isChildEntry = (value) => isString(value) && isEntryInsideOutDir(value);
95
+ const ownedEntry = (entry, source) => {
96
+ if (isEntryInsideOutDir(entry)) {
97
+ return entry;
98
+ }
99
+ throw new Error(`Refusing to generate documentation outside the output directory: ${source} maps to \`${entry}\`, ` +
100
+ "which is not an entry inside it. The GIR that declares it is malformed.");
101
+ };
102
+ const elementPagePath = (directory, entry) => {
103
+ const slug = ownedEntry(elementSlug(entry.klass.name), `the element ${entry.glibName}`);
104
+ return `${directory}/${slug}.md`;
105
+ };
88
106
  const namespacePages = (input) => {
89
107
  const { name, elements, basePath, linkByGlibName, pageContext } = input;
90
- const directory = name.toLowerCase();
108
+ const directory = ownedEntry(namespaceDirectory({ name }), `the GIR namespace ${name}`);
91
109
  const docs = {
92
110
  name,
93
111
  directory,
@@ -95,7 +113,7 @@ const namespacePages = (input) => {
95
113
  elements: elements.map((entry) => ({ text: entry.glibName, link: linkByGlibName.get(entry.glibName) ?? "" })),
96
114
  };
97
115
  const pages = elements.map((entry) => ({
98
- path: `${directory}/${elementSlug(entry.klass.name)}.md`,
116
+ path: elementPagePath(directory, entry),
99
117
  content: renderElementPage(entry, pageContext),
100
118
  }));
101
119
  pages.push({ path: `${directory}/index.md`, content: namespaceIndexPage(docs, elements) });
@@ -115,17 +133,65 @@ const generatePages = (options, basePath, library) => {
115
133
  pages.push(...result.pages);
116
134
  namespaces.push(result.docs);
117
135
  }
118
- pages.push({ path: "index.md", content: rootIndexPage(namespaces, options.libraries) });
136
+ pages.push({ path: ROOT_INDEX_FILENAME, content: rootIndexPage(namespaces, options.libraries) });
119
137
  return { pages, namespaces };
120
138
  };
121
- const cachedDocsResult = (options, manifestPath) => {
122
- if (options.isForced === true || !isGiStoreFresh(options.outDir, options.libraries, options.girPath)) {
139
+ const isGeneratorTag = (value) => value === MANIFEST_GENERATOR;
140
+ const isDocsElementLink = (value) => hasFields(value, { text: isString, link: isString });
141
+ const isDocsNamespace = (value) => hasFields(value, {
142
+ name: isString,
143
+ directory: isChildEntry,
144
+ link: isString,
145
+ elements: arrayGuard(isDocsElementLink),
146
+ });
147
+ const isDocsManifest = (value) => hasFields(value, { generator: isGeneratorTag, namespaces: arrayGuard(isDocsNamespace) });
148
+ const readDocsManifest = (manifestPath) => {
149
+ const parsed = readJsonFile(manifestPath);
150
+ return isDocsManifest(parsed) ? parsed : undefined;
151
+ };
152
+ const outDirRefusal = (outDir, reason) => new Error(`Refusing to generate documentation into ${outDir}: ${reason}. Point the output directory at an ` +
153
+ "empty directory or at one gtkx generated, or remove it yourself first.");
154
+ const giInputs = (options, girFiles) => ({
155
+ girFiles,
156
+ libraries: options.libraries,
157
+ girPath: options.girPath,
158
+ isByteArrayTyped: options.isByteArrayTyped === true,
159
+ });
160
+ const assertOwnedOutDir = (options, manifest) => {
161
+ const stats = statSync(options.outDir, { throwIfNoEntry: false });
162
+ if (stats === undefined) {
163
+ return;
164
+ }
165
+ if (!stats.isDirectory()) {
166
+ throw outDirRefusal(options.outDir, "it already exists and is not a directory");
167
+ }
168
+ if (manifest !== undefined || readdirSync(options.outDir).length === 0) {
169
+ return;
170
+ }
171
+ throw outDirRefusal(options.outDir, `it is not empty and holds no ${MANIFEST_FILENAME} written by \`gtkx docs\`, ` +
172
+ "so its contents are not gtkx's to replace");
173
+ };
174
+ const clearOutDir = (options, manifest) => {
175
+ if (manifest === undefined) {
176
+ return;
177
+ }
178
+ const entries = [
179
+ ...manifest.namespaces.map((namespace) => namespace.directory),
180
+ ROOT_INDEX_FILENAME,
181
+ MANIFEST_FILENAME,
182
+ FINGERPRINT_FILENAME,
183
+ ];
184
+ for (const entry of entries) {
185
+ rmSync(join(options.outDir, entry), { recursive: true, force: true });
186
+ }
187
+ };
188
+ const cachedDocsResult = (options, manifest, input) => {
189
+ if (manifest === undefined || options.isForced === true) {
123
190
  return undefined;
124
191
  }
125
- if (!existsSync(manifestPath)) {
192
+ if (!isDocsOutputFresh(options.outDir, giInputs(options, []), input)) {
126
193
  return undefined;
127
194
  }
128
- const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
129
195
  return { isRegenerated: false, namespaces: manifest.namespaces };
130
196
  };
131
197
  const writePages = (outDir, pages) => {
@@ -135,23 +201,31 @@ const writePages = (outDir, pages) => {
135
201
  writeFileSync(target, page.content);
136
202
  }
137
203
  };
204
+ const docsFingerprintInput = (options) => ({
205
+ basePath: options.basePath ?? DEFAULT_BASE_PATH,
206
+ props: options.props ?? {},
207
+ omittedProps: options.omittedProps ?? {},
208
+ });
138
209
  const writeDocs = (options) => {
139
- setElementProps(options.props ?? {});
140
- setOmittedProps(options.omittedProps ?? {});
141
- const basePath = options.basePath ?? "/reference";
210
+ const input = docsFingerprintInput(options);
211
+ setElementProps(input.props);
212
+ setOmittedProps(input.omittedProps);
142
213
  const manifestPath = join(options.outDir, MANIFEST_FILENAME);
143
- const cached = cachedDocsResult(options, manifestPath);
214
+ const previous = readDocsManifest(manifestPath);
215
+ const cached = cachedDocsResult(options, previous, input);
144
216
  if (cached !== undefined) {
145
217
  return cached;
146
218
  }
147
- const library = Library.load(options.libraries, options.girPath);
148
- const { pages, namespaces } = generatePages(options, basePath, library);
149
- rmSync(options.outDir, { recursive: true, force: true });
219
+ assertOwnedOutDir(options, previous);
220
+ const library = Library.load(options.libraries, options.girPath, options.isByteArrayTyped === true);
221
+ const { pages, namespaces } = generatePages(options, input.basePath, library);
222
+ clearOutDir(options, previous);
150
223
  mkdirSync(options.outDir, { recursive: true });
151
- writePages(options.outDir, pages);
152
- const manifest = { namespaces };
224
+ const manifest = { generator: MANIFEST_GENERATOR, namespaces };
153
225
  writeFileSync(manifestPath, JSON.stringify(manifest));
154
- writeFileSync(join(options.outDir, FINGERPRINT_FILENAME), JSON.stringify(computeGiFingerprint(library.girFiles, options.libraries, options.girPath)));
226
+ writePages(options.outDir, pages);
227
+ const fingerprint = computeDocsFingerprint(giInputs(options, library.girFiles), input);
228
+ writeFileSync(join(options.outDir, FINGERPRINT_FILENAME), JSON.stringify(fingerprint));
155
229
  return { isRegenerated: true, namespaces };
156
230
  };
157
231
  export { writeDocs };
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/docs/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStringsBy } from \"@gtkx/utils\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { computeGiFingerprint, FINGERPRINT_FILENAME, isGiStoreFresh } from \"../fingerprint.js\";\nimport { Library } from \"../gir/library.js\";\nimport { namespaceDirectory } from \"../gir/namespace.js\";\nimport { type ElementProps, setElementProps } from \"../store/jsx/element-prop-imports.js\";\nimport { collectIntrinsicElementClasses, type GlibNamedClass } from \"../store/jsx/intrinsic-elements.js\";\nimport { type OmittedProps, setOmittedProps } from \"../store/jsx/omitted-props.js\";\nimport { type ElementPageContext, renderElementPage } from \"./element-page.js\";\nimport { elementSlug, firstSentence, namespaceOrder } from \"./render.js\";\n\ntype DocsElementLink = {\n text: string;\n link: string;\n};\n\ntype DocsNamespace = {\n name: string;\n directory: string;\n link: string;\n elements: DocsElementLink[];\n};\n\ntype DocsOptions = {\n libraries: string[];\n girPath: string[];\n outDir: string;\n basePath?: string;\n props?: ElementProps;\n omittedProps?: OmittedProps;\n isForced?: boolean;\n};\n\ntype DocsManifest = {\n namespaces: DocsNamespace[];\n};\n\ntype GeneratedDocs = {\n pages: { path: string; content: string }[];\n namespaces: DocsNamespace[];\n};\n\ntype Page = { path: string; content: string };\ntype NamespacePages = { docs: DocsNamespace; pages: Page[] };\n\ntype DocsResult = {\n isRegenerated: boolean;\n namespaces: DocsNamespace[];\n};\n\nconst MANIFEST_FILENAME = \"manifest.json\";\n\nconst namespaceIndexPage = (namespace: DocsNamespace, elements: GlibNamedClass[]): string => {\n const rows = elements.map((entry, index) => {\n const link = namespace.elements[index]?.link ?? \"\";\n const description = firstSentence(entry.klass.doc).replaceAll(\"|\", String.raw`\\|`);\n\n return `| [${entry.glibName}](${link}) | ${description} |`;\n });\n\n const description =\n `Reference pages for the ${String(namespace.elements.length)} JSX elements in ` +\n `the ${namespace.name} namespace.`;\n\n return [\n \"---\",\n `description: ${JSON.stringify(description)}`,\n \"---\",\n \"\",\n `# ${namespace.name} elements`,\n \"\",\n `Elements in this namespace are imported from \\`@gtkx/jsx/${namespace.directory}\\`; the matching ` +\n `classes, enums, and functions are imported from \\`@gtkx/gi/${namespace.directory}\\`.`,\n \"\",\n \"| Element | Description |\",\n \"| --- | --- |\",\n ...rows,\n \"\",\n ].join(\"\\n\");\n};\n\nconst rootIndexPage = (namespaces: DocsNamespace[], libraries: string[]): string => {\n const rows = namespaces.map(\n (ns) => `| [${ns.name}](${ns.link}) | \\`@gtkx/jsx/${ns.directory}\\` | ${String(ns.elements.length)} |`,\n );\n\n const librariesList = libraries.map((library) => `\\`${library}\\``).join(\", \");\n\n return [\n \"---\",\n \"description: \\\"Generated reference documentation for every JSX element in this project's GIR libraries.\\\"\",\n \"---\",\n \"\",\n \"# Element Reference\",\n \"\",\n \"This reference documents every JSX element generated from the GObject-Introspection data for \" +\n `${librariesList}, together with the namespaces they pull in. It is produced by \\`gtkx docs\\` ` +\n \"using the same pipeline that generates the `@gtkx/jsx` and `@gtkx/gi` bindings, so every page \" +\n \"matches the types your editor sees.\",\n \"\",\n \"Each element page lists:\",\n \"\",\n \"- **Props** derived from GObject properties, plus the element props GTKX adds (such as `children` \" +\n \"and named slots), with types, defaults, and upstream documentation.\",\n \"- **Signals** as `on<Signal>` handler props with their exact handler signatures.\",\n \"- **Methods** available on the underlying instance through the `ref` prop.\",\n \"\",\n \"## Namespaces\",\n \"\",\n \"| Namespace | Import | Elements |\",\n \"| --- | --- | --- |\",\n ...rows,\n \"\",\n ].join(\"\\n\");\n};\n\nconst groupElementsByNamespace = (elements: GlibNamedClass[]): Map<string, GlibNamedClass[]> => {\n const byNamespace: Map<string, GlibNamedClass[]> = new Map();\n\n for (const entry of elements) {\n const list = byNamespace.get(entry.namespace.name) ?? [];\n list.push(entry);\n byNamespace.set(entry.namespace.name, list);\n }\n\n return byNamespace;\n};\n\nconst buildElementLinks = (elements: GlibNamedClass[], basePath: string): Map<string, string> => {\n const linkByGlibName: Map<string, string> = new Map();\n\n for (const entry of elements) {\n const directory = namespaceDirectory(entry.namespace);\n const link = `${basePath}/${directory}/${elementSlug(entry.klass.name)}`;\n\n if (linkByGlibName.values().some((existing) => existing === link)) {\n throw new Error(`Docs page slug collision for ${entry.glibName} at ${link}`);\n }\n\n linkByGlibName.set(entry.glibName, link);\n }\n\n return linkByGlibName;\n};\n\nconst namespacePages = (input: {\n name: string;\n elements: GlibNamedClass[];\n basePath: string;\n linkByGlibName: Map<string, string>;\n pageContext: ElementPageContext;\n}): NamespacePages => {\n const { name, elements, basePath, linkByGlibName, pageContext } = input;\n const directory = name.toLowerCase();\n\n const docs: DocsNamespace = {\n name,\n directory,\n link: `${basePath}/${directory}/`,\n elements: elements.map((entry) => ({ text: entry.glibName, link: linkByGlibName.get(entry.glibName) ?? \"\" })),\n };\n\n const pages: Page[] = elements.map((entry) => ({\n path: `${directory}/${elementSlug(entry.klass.name)}.md`,\n content: renderElementPage(entry, pageContext),\n }));\n\n pages.push({ path: `${directory}/index.md`, content: namespaceIndexPage(docs, elements) });\n\n return { docs, pages };\n};\n\nconst generatePages = (options: DocsOptions, basePath: string, library: Library): GeneratedDocs => {\n const intrinsicElements = collectIntrinsicElementClasses(library);\n const byNamespace = groupElementsByNamespace(intrinsicElements);\n const linkByGlibName = buildElementLinks(intrinsicElements, basePath);\n const pageContext: ElementPageContext = { library, linkFor: (glibName) => linkByGlibName.get(glibName) };\n const pages: Page[] = [];\n const namespaces: DocsNamespace[] = [];\n const orderedNames = sortStringsBy(byNamespace.keys(), namespaceOrder);\n\n for (const name of orderedNames) {\n const elements = sortStringsBy(byNamespace.get(name) ?? [], (entry) => entry.glibName);\n const result = namespacePages({ name, elements, basePath, linkByGlibName, pageContext });\n pages.push(...result.pages);\n namespaces.push(result.docs);\n }\n\n pages.push({ path: \"index.md\", content: rootIndexPage(namespaces, options.libraries) });\n\n return { pages, namespaces };\n};\n\nconst cachedDocsResult = (options: DocsOptions, manifestPath: string): DocsResult | undefined => {\n if (options.isForced === true || !isGiStoreFresh(options.outDir, options.libraries, options.girPath)) {\n return undefined;\n }\n\n if (!existsSync(manifestPath)) {\n return undefined;\n }\n\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as DocsManifest;\n\n return { isRegenerated: false, namespaces: manifest.namespaces };\n};\n\nconst writePages = (outDir: string, pages: Page[]): void => {\n for (const page of pages) {\n const target = join(outDir, page.path);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, page.content);\n }\n};\n\nconst writeDocs = (options: DocsOptions): DocsResult => {\n setElementProps(options.props ?? {});\n setOmittedProps(options.omittedProps ?? {});\n const basePath = options.basePath ?? \"/reference\";\n const manifestPath = join(options.outDir, MANIFEST_FILENAME);\n const cached = cachedDocsResult(options, manifestPath);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const library = Library.load(options.libraries, options.girPath);\n const { pages, namespaces } = generatePages(options, basePath, library);\n rmSync(options.outDir, { recursive: true, force: true });\n mkdirSync(options.outDir, { recursive: true });\n writePages(options.outDir, pages);\n const manifest: DocsManifest = { namespaces };\n writeFileSync(manifestPath, JSON.stringify(manifest));\n\n writeFileSync(\n join(options.outDir, FINGERPRINT_FILENAME),\n JSON.stringify(computeGiFingerprint(library.girFiles, options.libraries, options.girPath)),\n );\n\n return { isRegenerated: true, namespaces };\n};\n\nexport { writeDocs };\n"]}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/docs/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStringsBy } from \"@gtkx/utils\";\nimport { mkdirSync, readdirSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport {\n computeDocsFingerprint,\n type DocsFingerprintInput,\n FINGERPRINT_FILENAME,\n type GiInputs,\n isDocsOutputFresh,\n} from \"../fingerprint.js\";\nimport { Library } from \"../gir/library.js\";\nimport { namespaceDirectory } from \"../gir/namespace.js\";\nimport { arrayGuard, hasFields, isString } from \"../guards.js\";\nimport { readJsonFile } from \"../json.js\";\nimport { type ElementProps, setElementProps } from \"../store/jsx/element-prop-imports.js\";\nimport { collectIntrinsicElementClasses, type GlibNamedClass } from \"../store/jsx/intrinsic-elements.js\";\nimport { type OmittedProps, setOmittedProps } from \"../store/jsx/omitted-props.js\";\nimport { type ElementPageContext, renderElementPage } from \"./element-page.js\";\nimport { elementSlug, firstSentence, namespaceOrder } from \"./render.js\";\n\ntype DocsElementLink = {\n text: string;\n link: string;\n};\n\ntype DocsNamespace = {\n name: string;\n directory: string;\n link: string;\n elements: DocsElementLink[];\n};\n\ntype DocsOptions = {\n libraries: string[];\n girPath: string[];\n outDir: string;\n basePath?: string;\n props?: ElementProps;\n omittedProps?: OmittedProps;\n isForced?: boolean;\n isByteArrayTyped?: boolean;\n};\n\ntype DocsManifest = {\n generator: string;\n namespaces: DocsNamespace[];\n};\n\ntype GeneratedDocs = {\n pages: { path: string; content: string }[];\n namespaces: DocsNamespace[];\n};\n\ntype Page = { path: string; content: string };\ntype NamespacePages = { docs: DocsNamespace; pages: Page[] };\n\ntype DocsResult = {\n isRegenerated: boolean;\n namespaces: DocsNamespace[];\n};\n\nconst MANIFEST_FILENAME = \"manifest.json\";\nconst MANIFEST_GENERATOR = \"gtkx-docs\";\nconst ROOT_INDEX_FILENAME = \"index.md\";\nconst DEFAULT_BASE_PATH = \"/reference\";\n\nconst namespaceIndexPage = (namespace: DocsNamespace, elements: GlibNamedClass[]): string => {\n const rows = elements.map((entry, index) => {\n const link = namespace.elements[index]?.link ?? \"\";\n const description = firstSentence(entry.klass.doc).replaceAll(\"|\", String.raw`\\|`);\n\n return `| [${entry.glibName}](${link}) | ${description} |`;\n });\n\n const description =\n `Reference pages for the ${String(namespace.elements.length)} JSX elements in ` +\n `the ${namespace.name} namespace.`;\n\n return [\n \"---\",\n `description: ${JSON.stringify(description)}`,\n \"---\",\n \"\",\n `# ${namespace.name} elements`,\n \"\",\n `Elements in this namespace are imported from \\`@gtkx/jsx/${namespace.directory}\\`; the matching ` +\n `classes, enums, and functions are imported from \\`@gtkx/gi/${namespace.directory}\\`.`,\n \"\",\n \"| Element | Description |\",\n \"| --- | --- |\",\n ...rows,\n \"\",\n ].join(\"\\n\");\n};\n\nconst rootIndexPage = (namespaces: DocsNamespace[], libraries: string[]): string => {\n const rows = namespaces.map(\n (ns) => `| [${ns.name}](${ns.link}) | \\`@gtkx/jsx/${ns.directory}\\` | ${String(ns.elements.length)} |`,\n );\n\n const librariesList = libraries.map((library) => `\\`${library}\\``).join(\", \");\n\n return [\n \"---\",\n \"description: \\\"Generated reference documentation for every JSX element in this project's GIR libraries.\\\"\",\n \"---\",\n \"\",\n \"# Element Reference\",\n \"\",\n \"This reference documents every JSX element generated from the GObject-Introspection data for \" +\n `${librariesList}, together with the namespaces they pull in. It is produced by \\`gtkx docs\\` ` +\n \"using the same pipeline that generates the `@gtkx/jsx` and `@gtkx/gi` bindings, so every page \" +\n \"matches the types your editor sees.\",\n \"\",\n \"Each element page lists:\",\n \"\",\n \"- **Props** derived from GObject properties, plus the element props GTKX adds (such as `children` \" +\n \"and named slots), with types, defaults, and upstream documentation.\",\n \"- **Signals** as `on<Signal>` handler props with their exact handler signatures.\",\n \"- **Methods** available on the underlying instance through the `ref` prop.\",\n \"\",\n \"## Namespaces\",\n \"\",\n \"| Namespace | Import | Elements |\",\n \"| --- | --- | --- |\",\n ...rows,\n \"\",\n ].join(\"\\n\");\n};\n\nconst groupElementsByNamespace = (elements: GlibNamedClass[]): Map<string, GlibNamedClass[]> => {\n const byNamespace: Map<string, GlibNamedClass[]> = new Map();\n\n for (const entry of elements) {\n const list = byNamespace.get(entry.namespace.name) ?? [];\n list.push(entry);\n byNamespace.set(entry.namespace.name, list);\n }\n\n return byNamespace;\n};\n\nconst buildElementLinks = (elements: GlibNamedClass[], basePath: string): Map<string, string> => {\n const linkByGlibName: Map<string, string> = new Map();\n\n for (const entry of elements) {\n const directory = namespaceDirectory(entry.namespace);\n const link = `${basePath}/${directory}/${elementSlug(entry.klass.name)}`;\n\n if (linkByGlibName.values().some((existing) => existing === link)) {\n throw new Error(`Docs page slug collision for ${entry.glibName} at ${link}`);\n }\n\n linkByGlibName.set(entry.glibName, link);\n }\n\n return linkByGlibName;\n};\n\nconst isEntryInsideOutDir = (value: string): boolean =>\n value.length > 0 && value !== \".\" && value !== \"..\" && !value.includes(\"/\") && !value.includes(\"\\\\\");\n\nconst isChildEntry = (value: unknown): value is string => isString(value) && isEntryInsideOutDir(value);\n\nconst ownedEntry = (entry: string, source: string): string => {\n if (isEntryInsideOutDir(entry)) {\n return entry;\n }\n\n throw new Error(\n `Refusing to generate documentation outside the output directory: ${source} maps to \\`${entry}\\`, ` +\n \"which is not an entry inside it. The GIR that declares it is malformed.\",\n );\n};\n\nconst elementPagePath = (directory: string, entry: GlibNamedClass): string => {\n const slug = ownedEntry(elementSlug(entry.klass.name), `the element ${entry.glibName}`);\n\n return `${directory}/${slug}.md`;\n};\n\nconst namespacePages = (input: {\n name: string;\n elements: GlibNamedClass[];\n basePath: string;\n linkByGlibName: Map<string, string>;\n pageContext: ElementPageContext;\n}): NamespacePages => {\n const { name, elements, basePath, linkByGlibName, pageContext } = input;\n const directory = ownedEntry(namespaceDirectory({ name }), `the GIR namespace ${name}`);\n\n const docs: DocsNamespace = {\n name,\n directory,\n link: `${basePath}/${directory}/`,\n elements: elements.map((entry) => ({ text: entry.glibName, link: linkByGlibName.get(entry.glibName) ?? \"\" })),\n };\n\n const pages: Page[] = elements.map((entry) => ({\n path: elementPagePath(directory, entry),\n content: renderElementPage(entry, pageContext),\n }));\n\n pages.push({ path: `${directory}/index.md`, content: namespaceIndexPage(docs, elements) });\n\n return { docs, pages };\n};\n\nconst generatePages = (options: DocsOptions, basePath: string, library: Library): GeneratedDocs => {\n const intrinsicElements = collectIntrinsicElementClasses(library);\n const byNamespace = groupElementsByNamespace(intrinsicElements);\n const linkByGlibName = buildElementLinks(intrinsicElements, basePath);\n const pageContext: ElementPageContext = { library, linkFor: (glibName) => linkByGlibName.get(glibName) };\n const pages: Page[] = [];\n const namespaces: DocsNamespace[] = [];\n const orderedNames = sortStringsBy(byNamespace.keys(), namespaceOrder);\n\n for (const name of orderedNames) {\n const elements = sortStringsBy(byNamespace.get(name) ?? [], (entry) => entry.glibName);\n const result = namespacePages({ name, elements, basePath, linkByGlibName, pageContext });\n pages.push(...result.pages);\n namespaces.push(result.docs);\n }\n\n pages.push({ path: ROOT_INDEX_FILENAME, content: rootIndexPage(namespaces, options.libraries) });\n\n return { pages, namespaces };\n};\n\nconst isGeneratorTag = (value: unknown): value is string => value === MANIFEST_GENERATOR;\n\nconst isDocsElementLink = (value: unknown): value is DocsElementLink =>\n hasFields<DocsElementLink>(value, { text: isString, link: isString });\n\nconst isDocsNamespace = (value: unknown): value is DocsNamespace =>\n hasFields<DocsNamespace>(value, {\n name: isString,\n directory: isChildEntry,\n link: isString,\n elements: arrayGuard(isDocsElementLink),\n });\n\nconst isDocsManifest = (value: unknown): value is DocsManifest =>\n hasFields<DocsManifest>(value, { generator: isGeneratorTag, namespaces: arrayGuard(isDocsNamespace) });\n\nconst readDocsManifest = (manifestPath: string): DocsManifest | undefined => {\n const parsed = readJsonFile(manifestPath);\n\n return isDocsManifest(parsed) ? parsed : undefined;\n};\n\nconst outDirRefusal = (outDir: string, reason: string): Error =>\n new Error(\n `Refusing to generate documentation into ${outDir}: ${reason}. Point the output directory at an ` +\n \"empty directory or at one gtkx generated, or remove it yourself first.\",\n );\n\nconst giInputs = (options: DocsOptions, girFiles: string[]): GiInputs => ({\n girFiles,\n libraries: options.libraries,\n girPath: options.girPath,\n isByteArrayTyped: options.isByteArrayTyped === true,\n});\n\nconst assertOwnedOutDir = (options: DocsOptions, manifest: DocsManifest | undefined): void => {\n const stats = statSync(options.outDir, { throwIfNoEntry: false });\n\n if (stats === undefined) {\n return;\n }\n\n if (!stats.isDirectory()) {\n throw outDirRefusal(options.outDir, \"it already exists and is not a directory\");\n }\n\n if (manifest !== undefined || readdirSync(options.outDir).length === 0) {\n return;\n }\n\n throw outDirRefusal(\n options.outDir,\n `it is not empty and holds no ${MANIFEST_FILENAME} written by \\`gtkx docs\\`, ` +\n \"so its contents are not gtkx's to replace\",\n );\n};\n\nconst clearOutDir = (options: DocsOptions, manifest: DocsManifest | undefined): void => {\n if (manifest === undefined) {\n return;\n }\n\n const entries = [\n ...manifest.namespaces.map((namespace) => namespace.directory),\n ROOT_INDEX_FILENAME,\n MANIFEST_FILENAME,\n FINGERPRINT_FILENAME,\n ];\n\n for (const entry of entries) {\n rmSync(join(options.outDir, entry), { recursive: true, force: true });\n }\n};\n\nconst cachedDocsResult = (\n options: DocsOptions,\n manifest: DocsManifest | undefined,\n input: DocsFingerprintInput,\n): DocsResult | undefined => {\n if (manifest === undefined || options.isForced === true) {\n return undefined;\n }\n\n if (!isDocsOutputFresh(options.outDir, giInputs(options, []), input)) {\n return undefined;\n }\n\n return { isRegenerated: false, namespaces: manifest.namespaces };\n};\n\nconst writePages = (outDir: string, pages: Page[]): void => {\n for (const page of pages) {\n const target = join(outDir, page.path);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, page.content);\n }\n};\n\nconst docsFingerprintInput = (options: DocsOptions): DocsFingerprintInput => ({\n basePath: options.basePath ?? DEFAULT_BASE_PATH,\n props: options.props ?? {},\n omittedProps: options.omittedProps ?? {},\n});\n\nconst writeDocs = (options: DocsOptions): DocsResult => {\n const input = docsFingerprintInput(options);\n setElementProps(input.props);\n setOmittedProps(input.omittedProps);\n const manifestPath = join(options.outDir, MANIFEST_FILENAME);\n const previous = readDocsManifest(manifestPath);\n const cached = cachedDocsResult(options, previous, input);\n\n if (cached !== undefined) {\n return cached;\n }\n\n assertOwnedOutDir(options, previous);\n const library = Library.load(options.libraries, options.girPath, options.isByteArrayTyped === true);\n const { pages, namespaces } = generatePages(options, input.basePath, library);\n clearOutDir(options, previous);\n mkdirSync(options.outDir, { recursive: true });\n const manifest: DocsManifest = { generator: MANIFEST_GENERATOR, namespaces };\n writeFileSync(manifestPath, JSON.stringify(manifest));\n writePages(options.outDir, pages);\n const fingerprint = computeDocsFingerprint(giInputs(options, library.girFiles), input);\n writeFileSync(join(options.outDir, FINGERPRINT_FILENAME), JSON.stringify(fingerprint));\n\n return { isRegenerated: true, namespaces };\n};\n\nexport { writeDocs };\n"]}