@lickle/docs 0.0.0-dev.1

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 (407) hide show
  1. package/README.md +3 -0
  2. package/dist/esm/_lib/fs/index.js +20 -0
  3. package/dist/esm/_lib/fs/index.js.map +1 -0
  4. package/dist/esm/_lib/fs/watch.js +30 -0
  5. package/dist/esm/_lib/fs/watch.js.map +1 -0
  6. package/dist/esm/_lib/index.js +9 -0
  7. package/dist/esm/_lib/index.js.map +1 -0
  8. package/dist/esm/_lib/jiti/index.js +16 -0
  9. package/dist/esm/_lib/jiti/index.js.map +1 -0
  10. package/dist/esm/_lib/path/index.js +42 -0
  11. package/dist/esm/_lib/path/index.js.map +1 -0
  12. package/dist/esm/_lib/pkg/index.js +128 -0
  13. package/dist/esm/_lib/pkg/index.js.map +1 -0
  14. package/dist/esm/_lib/repo/index.js +100 -0
  15. package/dist/esm/_lib/repo/index.js.map +1 -0
  16. package/dist/esm/_lib/slug/index.js +23 -0
  17. package/dist/esm/_lib/slug/index.js.map +1 -0
  18. package/dist/esm/_lib/t.js +2 -0
  19. package/dist/esm/_lib/t.js.map +1 -0
  20. package/dist/esm/_lib/tsconfig/index.js +12 -0
  21. package/dist/esm/_lib/tsconfig/index.js.map +1 -0
  22. package/dist/esm/_lib/util/index.js +54 -0
  23. package/dist/esm/_lib/util/index.js.map +1 -0
  24. package/dist/esm/cli/cmd/dev.js +74 -0
  25. package/dist/esm/cli/cmd/dev.js.map +1 -0
  26. package/dist/esm/cli/cmd/index.js +4 -0
  27. package/dist/esm/cli/cmd/index.js.map +1 -0
  28. package/dist/esm/cli/cmd/init.js +74 -0
  29. package/dist/esm/cli/cmd/init.js.map +1 -0
  30. package/dist/esm/cli/cmd/json.js +28 -0
  31. package/dist/esm/cli/cmd/json.js.map +1 -0
  32. package/dist/esm/cli/env.js +5 -0
  33. package/dist/esm/cli/env.js.map +1 -0
  34. package/dist/esm/cli/index.js +13 -0
  35. package/dist/esm/cli/index.js.map +1 -0
  36. package/dist/esm/cli/vite/client/index.jsx +20 -0
  37. package/dist/esm/cli/vite/client/index.jsx.map +1 -0
  38. package/dist/esm/cli/vite/index.js +100 -0
  39. package/dist/esm/cli/vite/index.js.map +1 -0
  40. package/dist/esm/cli.js +5 -0
  41. package/dist/esm/cli.js.map +1 -0
  42. package/dist/esm/config/defaults.js +32 -0
  43. package/dist/esm/config/defaults.js.map +1 -0
  44. package/dist/esm/config/file.js +48 -0
  45. package/dist/esm/config/file.js.map +1 -0
  46. package/dist/esm/config/index.js +7 -0
  47. package/dist/esm/config/index.js.map +1 -0
  48. package/dist/esm/config/load.js +79 -0
  49. package/dist/esm/config/load.js.map +1 -0
  50. package/dist/esm/config/types.js +2 -0
  51. package/dist/esm/config/types.js.map +1 -0
  52. package/dist/esm/core/index.js +3 -0
  53. package/dist/esm/core/index.js.map +1 -0
  54. package/dist/esm/core/project/debug.js +26 -0
  55. package/dist/esm/core/project/debug.js.map +1 -0
  56. package/dist/esm/core/project/index.js +39 -0
  57. package/dist/esm/core/project/index.js.map +1 -0
  58. package/dist/esm/core/project/naming.js +39 -0
  59. package/dist/esm/core/project/naming.js.map +1 -0
  60. package/dist/esm/core/project/routing.js +173 -0
  61. package/dist/esm/core/project/routing.js.map +1 -0
  62. package/dist/esm/core/project/types.js +4 -0
  63. package/dist/esm/core/project/types.js.map +1 -0
  64. package/dist/esm/core/reflect/index.js +10 -0
  65. package/dist/esm/core/reflect/index.js.map +1 -0
  66. package/dist/esm/core/reflect/indexed.js +195 -0
  67. package/dist/esm/core/reflect/indexed.js.map +1 -0
  68. package/dist/esm/core/reflect/resolve.js +157 -0
  69. package/dist/esm/core/reflect/resolve.js.map +1 -0
  70. package/dist/esm/core/reflect/scan.js +787 -0
  71. package/dist/esm/core/reflect/scan.js.map +1 -0
  72. package/dist/esm/core/reflect/state.js +29 -0
  73. package/dist/esm/core/reflect/state.js.map +1 -0
  74. package/dist/esm/core/reflect/types.js +16 -0
  75. package/dist/esm/core/reflect/types.js.map +1 -0
  76. package/dist/esm/core/reflect/walk.js +106 -0
  77. package/dist/esm/core/reflect/walk.js.map +1 -0
  78. package/dist/esm/solidjs/index.js +2 -0
  79. package/dist/esm/solidjs/index.js.map +1 -0
  80. package/dist/esm/solidjs/jsx-runtime.js +2 -0
  81. package/dist/esm/solidjs/jsx-runtime.js.map +1 -0
  82. package/dist/esm/ui/App.jsx +71 -0
  83. package/dist/esm/ui/App.jsx.map +1 -0
  84. package/dist/esm/ui/components/Breadcrumb.jsx +45 -0
  85. package/dist/esm/ui/components/Breadcrumb.jsx.map +1 -0
  86. package/dist/esm/ui/components/Code/index.jsx +89 -0
  87. package/dist/esm/ui/components/Code/index.jsx.map +1 -0
  88. package/dist/esm/ui/components/Comment.jsx +176 -0
  89. package/dist/esm/ui/components/Comment.jsx.map +1 -0
  90. package/dist/esm/ui/components/Declaration.jsx +147 -0
  91. package/dist/esm/ui/components/Declaration.jsx.map +1 -0
  92. package/dist/esm/ui/components/Header.jsx +66 -0
  93. package/dist/esm/ui/components/Header.jsx.map +1 -0
  94. package/dist/esm/ui/components/Layout.jsx +44 -0
  95. package/dist/esm/ui/components/Layout.jsx.map +1 -0
  96. package/dist/esm/ui/components/Link.jsx +34 -0
  97. package/dist/esm/ui/components/Link.jsx.map +1 -0
  98. package/dist/esm/ui/components/LivePreview/Example.jsx +76 -0
  99. package/dist/esm/ui/components/LivePreview/Example.jsx.map +1 -0
  100. package/dist/esm/ui/components/LivePreview/Sandbox.jsx +25 -0
  101. package/dist/esm/ui/components/LivePreview/Sandbox.jsx.map +1 -0
  102. package/dist/esm/ui/components/LivePreview/index.js +4 -0
  103. package/dist/esm/ui/components/LivePreview/index.js.map +1 -0
  104. package/dist/esm/ui/components/LivePreview/transform.js +16 -0
  105. package/dist/esm/ui/components/LivePreview/transform.js.map +1 -0
  106. package/dist/esm/ui/components/Markdown.jsx +14 -0
  107. package/dist/esm/ui/components/Markdown.jsx.map +1 -0
  108. package/dist/esm/ui/components/Page.jsx +121 -0
  109. package/dist/esm/ui/components/Page.jsx.map +1 -0
  110. package/dist/esm/ui/components/References.jsx +32 -0
  111. package/dist/esm/ui/components/References.jsx.map +1 -0
  112. package/dist/esm/ui/components/SearchPalette.jsx +178 -0
  113. package/dist/esm/ui/components/SearchPalette.jsx.map +1 -0
  114. package/dist/esm/ui/components/Sidebar.jsx +63 -0
  115. package/dist/esm/ui/components/Sidebar.jsx.map +1 -0
  116. package/dist/esm/ui/components/Syntax.jsx +10 -0
  117. package/dist/esm/ui/components/Syntax.jsx.map +1 -0
  118. package/dist/esm/ui/components/ThemeToggle.jsx +25 -0
  119. package/dist/esm/ui/components/ThemeToggle.jsx.map +1 -0
  120. package/dist/esm/ui/components/Type.jsx +444 -0
  121. package/dist/esm/ui/components/Type.jsx.map +1 -0
  122. package/dist/esm/ui/components/index.js +16 -0
  123. package/dist/esm/ui/components/index.js.map +1 -0
  124. package/dist/esm/ui/context/components.jsx +30 -0
  125. package/dist/esm/ui/context/components.jsx.map +1 -0
  126. package/dist/esm/ui/context/global.js +15 -0
  127. package/dist/esm/ui/context/global.js.map +1 -0
  128. package/dist/esm/ui/context/index.js +5 -0
  129. package/dist/esm/ui/context/index.js.map +1 -0
  130. package/dist/esm/ui/context/markup/index.jsx +25 -0
  131. package/dist/esm/ui/context/markup/index.jsx.map +1 -0
  132. package/dist/esm/ui/context/markup/markdown.js +34 -0
  133. package/dist/esm/ui/context/markup/markdown.js.map +1 -0
  134. package/dist/esm/ui/context/markup/shiki.js +58 -0
  135. package/dist/esm/ui/context/markup/shiki.js.map +1 -0
  136. package/dist/esm/ui/context/markup/util.js +22 -0
  137. package/dist/esm/ui/context/markup/util.js.map +1 -0
  138. package/dist/esm/ui/context/project/index.jsx +27 -0
  139. package/dist/esm/ui/context/project/index.jsx.map +1 -0
  140. package/dist/esm/ui/context/project/indexed.js +47 -0
  141. package/dist/esm/ui/context/project/indexed.js.map +1 -0
  142. package/dist/esm/ui/context/project/types.js +2 -0
  143. package/dist/esm/ui/context/project/types.js.map +1 -0
  144. package/dist/esm/ui/context/theme.jsx +36 -0
  145. package/dist/esm/ui/context/theme.jsx.map +1 -0
  146. package/dist/esm/ui/hooks/index.js +94 -0
  147. package/dist/esm/ui/hooks/index.js.map +1 -0
  148. package/dist/esm/ui/index.js +5 -0
  149. package/dist/esm/ui/index.js.map +1 -0
  150. package/dist/esm/ui/renderer.jsx +21 -0
  151. package/dist/esm/ui/renderer.jsx.map +1 -0
  152. package/dist/esm/ui/util/comment.js +14 -0
  153. package/dist/esm/ui/util/comment.js.map +1 -0
  154. package/dist/esm/ui/util/kind.js +85 -0
  155. package/dist/esm/ui/util/kind.js.map +1 -0
  156. package/dist/esm/ui/util/markdown.js +66 -0
  157. package/dist/esm/ui/util/markdown.js.map +1 -0
  158. package/dist/esm/ui/util/search.js +75 -0
  159. package/dist/esm/ui/util/search.js.map +1 -0
  160. package/dist/ts/_lib/fs/index.d.ts +6 -0
  161. package/dist/ts/_lib/fs/index.d.ts.map +1 -0
  162. package/dist/ts/_lib/fs/watch.d.ts +14 -0
  163. package/dist/ts/_lib/fs/watch.d.ts.map +1 -0
  164. package/dist/ts/_lib/index.d.ts +10 -0
  165. package/dist/ts/_lib/index.d.ts.map +1 -0
  166. package/dist/ts/_lib/jiti/index.d.ts +2 -0
  167. package/dist/ts/_lib/jiti/index.d.ts.map +1 -0
  168. package/dist/ts/_lib/path/index.d.ts +12 -0
  169. package/dist/ts/_lib/path/index.d.ts.map +1 -0
  170. package/dist/ts/_lib/pkg/index.d.ts +28 -0
  171. package/dist/ts/_lib/pkg/index.d.ts.map +1 -0
  172. package/dist/ts/_lib/repo/index.d.ts +30 -0
  173. package/dist/ts/_lib/repo/index.d.ts.map +1 -0
  174. package/dist/ts/_lib/slug/index.d.ts +4 -0
  175. package/dist/ts/_lib/slug/index.d.ts.map +1 -0
  176. package/dist/ts/_lib/t.d.ts +11 -0
  177. package/dist/ts/_lib/t.d.ts.map +1 -0
  178. package/dist/ts/_lib/tsconfig/index.d.ts +8 -0
  179. package/dist/ts/_lib/tsconfig/index.d.ts.map +1 -0
  180. package/dist/ts/_lib/util/index.d.ts +9 -0
  181. package/dist/ts/_lib/util/index.d.ts.map +1 -0
  182. package/dist/ts/cli/cmd/dev.d.ts +27 -0
  183. package/dist/ts/cli/cmd/dev.d.ts.map +1 -0
  184. package/dist/ts/cli/cmd/index.d.ts +4 -0
  185. package/dist/ts/cli/cmd/index.d.ts.map +1 -0
  186. package/dist/ts/cli/cmd/init.d.ts +14 -0
  187. package/dist/ts/cli/cmd/init.d.ts.map +1 -0
  188. package/dist/ts/cli/cmd/json.d.ts +12 -0
  189. package/dist/ts/cli/cmd/json.d.ts.map +1 -0
  190. package/dist/ts/cli/env.d.ts +2 -0
  191. package/dist/ts/cli/env.d.ts.map +1 -0
  192. package/dist/ts/cli/index.d.ts +78 -0
  193. package/dist/ts/cli/index.d.ts.map +1 -0
  194. package/dist/ts/cli/vite/client/index.d.ts +10 -0
  195. package/dist/ts/cli/vite/client/index.d.ts.map +1 -0
  196. package/dist/ts/cli/vite/index.d.ts +12 -0
  197. package/dist/ts/cli/vite/index.d.ts.map +1 -0
  198. package/dist/ts/cli.d.ts +3 -0
  199. package/dist/ts/cli.d.ts.map +1 -0
  200. package/dist/ts/config/defaults.d.ts +10 -0
  201. package/dist/ts/config/defaults.d.ts.map +1 -0
  202. package/dist/ts/config/file.d.ts +3 -0
  203. package/dist/ts/config/file.d.ts.map +1 -0
  204. package/dist/ts/config/index.d.ts +6 -0
  205. package/dist/ts/config/index.d.ts.map +1 -0
  206. package/dist/ts/config/load.d.ts +36 -0
  207. package/dist/ts/config/load.d.ts.map +1 -0
  208. package/dist/ts/config/types.d.ts +56 -0
  209. package/dist/ts/config/types.d.ts.map +1 -0
  210. package/dist/ts/core/index.d.ts +3 -0
  211. package/dist/ts/core/index.d.ts.map +1 -0
  212. package/dist/ts/core/project/debug.d.ts +3 -0
  213. package/dist/ts/core/project/debug.d.ts.map +1 -0
  214. package/dist/ts/core/project/index.d.ts +17 -0
  215. package/dist/ts/core/project/index.d.ts.map +1 -0
  216. package/dist/ts/core/project/naming.d.ts +23 -0
  217. package/dist/ts/core/project/naming.d.ts.map +1 -0
  218. package/dist/ts/core/project/routing.d.ts +61 -0
  219. package/dist/ts/core/project/routing.d.ts.map +1 -0
  220. package/dist/ts/core/project/types.d.ts +56 -0
  221. package/dist/ts/core/project/types.d.ts.map +1 -0
  222. package/dist/ts/core/reflect/index.d.ts +22 -0
  223. package/dist/ts/core/reflect/index.d.ts.map +1 -0
  224. package/dist/ts/core/reflect/indexed.d.ts +83 -0
  225. package/dist/ts/core/reflect/indexed.d.ts.map +1 -0
  226. package/dist/ts/core/reflect/resolve.d.ts +3 -0
  227. package/dist/ts/core/reflect/resolve.d.ts.map +1 -0
  228. package/dist/ts/core/reflect/scan.d.ts +218 -0
  229. package/dist/ts/core/reflect/scan.d.ts.map +1 -0
  230. package/dist/ts/core/reflect/state.d.ts +44 -0
  231. package/dist/ts/core/reflect/state.d.ts.map +1 -0
  232. package/dist/ts/core/reflect/types.d.ts +289 -0
  233. package/dist/ts/core/reflect/types.d.ts.map +1 -0
  234. package/dist/ts/core/reflect/walk.d.ts +28 -0
  235. package/dist/ts/core/reflect/walk.d.ts.map +1 -0
  236. package/dist/ts/solidjs/index.d.ts +2 -0
  237. package/dist/ts/solidjs/index.d.ts.map +1 -0
  238. package/dist/ts/solidjs/jsx-runtime.d.ts +2 -0
  239. package/dist/ts/solidjs/jsx-runtime.d.ts.map +1 -0
  240. package/dist/ts/ui/App.d.ts +17 -0
  241. package/dist/ts/ui/App.d.ts.map +1 -0
  242. package/dist/ts/ui/components/Breadcrumb.d.ts +4 -0
  243. package/dist/ts/ui/components/Breadcrumb.d.ts.map +1 -0
  244. package/dist/ts/ui/components/Code/index.d.ts +17 -0
  245. package/dist/ts/ui/components/Code/index.d.ts.map +1 -0
  246. package/dist/ts/ui/components/Comment.d.ts +49 -0
  247. package/dist/ts/ui/components/Comment.d.ts.map +1 -0
  248. package/dist/ts/ui/components/Declaration.d.ts +122 -0
  249. package/dist/ts/ui/components/Declaration.d.ts.map +1 -0
  250. package/dist/ts/ui/components/Header.d.ts +5 -0
  251. package/dist/ts/ui/components/Header.d.ts.map +1 -0
  252. package/dist/ts/ui/components/Layout.d.ts +5 -0
  253. package/dist/ts/ui/components/Layout.d.ts.map +1 -0
  254. package/dist/ts/ui/components/Link.d.ts +15 -0
  255. package/dist/ts/ui/components/Link.d.ts.map +1 -0
  256. package/dist/ts/ui/components/LivePreview/Example.d.ts +16 -0
  257. package/dist/ts/ui/components/LivePreview/Example.d.ts.map +1 -0
  258. package/dist/ts/ui/components/LivePreview/Sandbox.d.ts +20 -0
  259. package/dist/ts/ui/components/LivePreview/Sandbox.d.ts.map +1 -0
  260. package/dist/ts/ui/components/LivePreview/index.d.ts +4 -0
  261. package/dist/ts/ui/components/LivePreview/index.d.ts.map +1 -0
  262. package/dist/ts/ui/components/LivePreview/transform.d.ts +19 -0
  263. package/dist/ts/ui/components/LivePreview/transform.d.ts.map +1 -0
  264. package/dist/ts/ui/components/Markdown.d.ts +11 -0
  265. package/dist/ts/ui/components/Markdown.d.ts.map +1 -0
  266. package/dist/ts/ui/components/Page.d.ts +21 -0
  267. package/dist/ts/ui/components/Page.d.ts.map +1 -0
  268. package/dist/ts/ui/components/References.d.ts +2 -0
  269. package/dist/ts/ui/components/References.d.ts.map +1 -0
  270. package/dist/ts/ui/components/SearchPalette.d.ts +5 -0
  271. package/dist/ts/ui/components/SearchPalette.d.ts.map +1 -0
  272. package/dist/ts/ui/components/Sidebar.d.ts +5 -0
  273. package/dist/ts/ui/components/Sidebar.d.ts.map +1 -0
  274. package/dist/ts/ui/components/Syntax.d.ts +15 -0
  275. package/dist/ts/ui/components/Syntax.d.ts.map +1 -0
  276. package/dist/ts/ui/components/ThemeToggle.d.ts +2 -0
  277. package/dist/ts/ui/components/ThemeToggle.d.ts.map +1 -0
  278. package/dist/ts/ui/components/Type.d.ts +82 -0
  279. package/dist/ts/ui/components/Type.d.ts.map +1 -0
  280. package/dist/ts/ui/components/index.d.ts +15 -0
  281. package/dist/ts/ui/components/index.d.ts.map +1 -0
  282. package/dist/ts/ui/context/components.d.ts +124 -0
  283. package/dist/ts/ui/context/components.d.ts.map +1 -0
  284. package/dist/ts/ui/context/global.d.ts +210 -0
  285. package/dist/ts/ui/context/global.d.ts.map +1 -0
  286. package/dist/ts/ui/context/index.d.ts +5 -0
  287. package/dist/ts/ui/context/index.d.ts.map +1 -0
  288. package/dist/ts/ui/context/markup/index.d.ts +20 -0
  289. package/dist/ts/ui/context/markup/index.d.ts.map +1 -0
  290. package/dist/ts/ui/context/markup/markdown.d.ts +4 -0
  291. package/dist/ts/ui/context/markup/markdown.d.ts.map +1 -0
  292. package/dist/ts/ui/context/markup/shiki.d.ts +17 -0
  293. package/dist/ts/ui/context/markup/shiki.d.ts.map +1 -0
  294. package/dist/ts/ui/context/markup/util.d.ts +11 -0
  295. package/dist/ts/ui/context/markup/util.d.ts.map +1 -0
  296. package/dist/ts/ui/context/project/index.d.ts +25 -0
  297. package/dist/ts/ui/context/project/index.d.ts.map +1 -0
  298. package/dist/ts/ui/context/project/indexed.d.ts +4 -0
  299. package/dist/ts/ui/context/project/indexed.d.ts.map +1 -0
  300. package/dist/ts/ui/context/project/types.d.ts +13 -0
  301. package/dist/ts/ui/context/project/types.d.ts.map +1 -0
  302. package/dist/ts/ui/context/theme.d.ts +12 -0
  303. package/dist/ts/ui/context/theme.d.ts.map +1 -0
  304. package/dist/ts/ui/hooks/index.d.ts +29 -0
  305. package/dist/ts/ui/hooks/index.d.ts.map +1 -0
  306. package/dist/ts/ui/index.d.ts +5 -0
  307. package/dist/ts/ui/index.d.ts.map +1 -0
  308. package/dist/ts/ui/renderer.d.ts +200 -0
  309. package/dist/ts/ui/renderer.d.ts.map +1 -0
  310. package/dist/ts/ui/util/comment.d.ts +4 -0
  311. package/dist/ts/ui/util/comment.d.ts.map +1 -0
  312. package/dist/ts/ui/util/kind.d.ts +15 -0
  313. package/dist/ts/ui/util/kind.d.ts.map +1 -0
  314. package/dist/ts/ui/util/markdown.d.ts +8 -0
  315. package/dist/ts/ui/util/markdown.d.ts.map +1 -0
  316. package/dist/ts/ui/util/search.d.ts +20 -0
  317. package/dist/ts/ui/util/search.d.ts.map +1 -0
  318. package/package.json +89 -0
  319. package/src/_lib/fs/index.ts +23 -0
  320. package/src/_lib/fs/watch.ts +40 -0
  321. package/src/_lib/index.ts +9 -0
  322. package/src/_lib/jiti/index.ts +18 -0
  323. package/src/_lib/path/index.ts +44 -0
  324. package/src/_lib/pkg/index.ts +165 -0
  325. package/src/_lib/repo/index.ts +138 -0
  326. package/src/_lib/slug/index.ts +26 -0
  327. package/src/_lib/t.ts +17 -0
  328. package/src/_lib/tsconfig/index.ts +20 -0
  329. package/src/_lib/util/index.ts +53 -0
  330. package/src/cli/cmd/dev.ts +86 -0
  331. package/src/cli/cmd/index.ts +3 -0
  332. package/src/cli/cmd/init.ts +80 -0
  333. package/src/cli/cmd/json.ts +28 -0
  334. package/src/cli/env.ts +6 -0
  335. package/src/cli/index.ts +14 -0
  336. package/src/cli/vite/client/index.html +27 -0
  337. package/src/cli/vite/client/index.tsx +30 -0
  338. package/src/cli/vite/client/public/apple-touch-icon.png +0 -0
  339. package/src/cli/vite/client/public/favicon-96x96.png +0 -0
  340. package/src/cli/vite/client/public/favicon.ico +0 -0
  341. package/src/cli/vite/client/public/favicon.svg +1 -0
  342. package/src/cli/vite/client/public/site.webmanifest +21 -0
  343. package/src/cli/vite/client/public/web-app-manifest-192x192.png +0 -0
  344. package/src/cli/vite/client/public/web-app-manifest-512x512.png +0 -0
  345. package/src/cli/vite/index.ts +115 -0
  346. package/src/cli.ts +6 -0
  347. package/src/config/defaults.ts +36 -0
  348. package/src/config/file.ts +53 -0
  349. package/src/config/index.ts +11 -0
  350. package/src/config/load.ts +95 -0
  351. package/src/config/types.ts +59 -0
  352. package/src/core/index.ts +2 -0
  353. package/src/core/project/debug.ts +30 -0
  354. package/src/core/project/index.ts +58 -0
  355. package/src/core/project/naming.ts +49 -0
  356. package/src/core/project/routing.ts +234 -0
  357. package/src/core/project/types.ts +47 -0
  358. package/src/core/reflect/index.ts +18 -0
  359. package/src/core/reflect/indexed.ts +242 -0
  360. package/src/core/reflect/resolve.ts +159 -0
  361. package/src/core/reflect/scan.ts +816 -0
  362. package/src/core/reflect/state.ts +75 -0
  363. package/src/core/reflect/types.ts +164 -0
  364. package/src/core/reflect/walk.ts +121 -0
  365. package/src/solidjs/index.ts +1 -0
  366. package/src/solidjs/jsx-runtime.ts +1 -0
  367. package/src/ui/App.tsx +115 -0
  368. package/src/ui/components/Breadcrumb.tsx +53 -0
  369. package/src/ui/components/Code/index.tsx +112 -0
  370. package/src/ui/components/Comment.tsx +221 -0
  371. package/src/ui/components/Declaration.tsx +210 -0
  372. package/src/ui/components/Header.tsx +99 -0
  373. package/src/ui/components/Layout.tsx +62 -0
  374. package/src/ui/components/Link.tsx +43 -0
  375. package/src/ui/components/LivePreview/Example.tsx +104 -0
  376. package/src/ui/components/LivePreview/Sandbox.tsx +36 -0
  377. package/src/ui/components/LivePreview/index.ts +3 -0
  378. package/src/ui/components/LivePreview/transform.ts +28 -0
  379. package/src/ui/components/Markdown.tsx +16 -0
  380. package/src/ui/components/Page.tsx +162 -0
  381. package/src/ui/components/References.tsx +34 -0
  382. package/src/ui/components/SearchPalette.tsx +266 -0
  383. package/src/ui/components/Sidebar.tsx +107 -0
  384. package/src/ui/components/Syntax.tsx +10 -0
  385. package/src/ui/components/ThemeToggle.tsx +50 -0
  386. package/src/ui/components/Type.tsx +583 -0
  387. package/src/ui/components/index.ts +15 -0
  388. package/src/ui/context/components.tsx +103 -0
  389. package/src/ui/context/global.ts +33 -0
  390. package/src/ui/context/index.ts +4 -0
  391. package/src/ui/context/markup/index.tsx +39 -0
  392. package/src/ui/context/markup/markdown.ts +37 -0
  393. package/src/ui/context/markup/shiki.ts +72 -0
  394. package/src/ui/context/markup/util.ts +20 -0
  395. package/src/ui/context/project/index.tsx +47 -0
  396. package/src/ui/context/project/indexed.ts +52 -0
  397. package/src/ui/context/project/types.ts +14 -0
  398. package/src/ui/context/theme.tsx +45 -0
  399. package/src/ui/hooks/index.ts +116 -0
  400. package/src/ui/index.ts +4 -0
  401. package/src/ui/renderer.tsx +31 -0
  402. package/src/ui/util/comment.ts +12 -0
  403. package/src/ui/util/kind.ts +120 -0
  404. package/src/ui/util/markdown.ts +74 -0
  405. package/src/ui/util/search.ts +84 -0
  406. package/theme.css +301 -0
  407. package/tsconfig.client.json +12 -0
@@ -0,0 +1,787 @@
1
+ import { makeScanState } from "./state.js";
2
+ import ts from 'typescript';
3
+ export const scan = (rootFiles, options) => {
4
+ const compilerOptions = { jsx: ts.JsxEmit.ReactJSX, ...options.compilerOptions };
5
+ const program = ts.createProgram(rootFiles, compilerOptions);
6
+ const checker = program.getTypeChecker();
7
+ const s = makeScanState(checker, options);
8
+ const files = new Array();
9
+ for (const file of rootFiles) {
10
+ const sf = program.getSourceFile(file);
11
+ if (!sf)
12
+ continue;
13
+ files.push(sf);
14
+ }
15
+ while (files.length) {
16
+ const sf = files.shift();
17
+ scan.SourceFile(s, sf, files);
18
+ }
19
+ return s;
20
+ };
21
+ scan.SourceFile = (s, node, queue) => {
22
+ if (s.seen.has(node) || !s.include(node))
23
+ return;
24
+ s.seen.add(node);
25
+ s.parent = s.root;
26
+ const f = statement(s, node, 'module', () => ({ path: s.getPath(node) }));
27
+ s.parent = f.id;
28
+ node.statements.forEach((stmt) => {
29
+ if (ts.isExportDeclaration(stmt))
30
+ return scan.ExportDeclaration(s, stmt, queue);
31
+ if (ts.isExportAssignment(stmt))
32
+ return scan.ExportAssignment(s, stmt);
33
+ scan.Statement(s, stmt);
34
+ });
35
+ return;
36
+ };
37
+ scan.Statement = (s, node) => {
38
+ if (ts.isVariableStatement(node)) {
39
+ return node.declarationList.declarations.forEach((d) => scan.VariableDeclaration(s, d));
40
+ }
41
+ if (ts.isVariableDeclaration(node))
42
+ return scan.VariableDeclaration(s, node);
43
+ if (ts.isFunctionDeclaration(node))
44
+ return scan.FunctionDeclaration(s, node);
45
+ if (ts.isClassDeclaration(node))
46
+ return scan.ClassDeclaration(s, node);
47
+ if (ts.isInterfaceDeclaration(node))
48
+ return scan.InterfaceDeclaration(s, node);
49
+ if (ts.isTypeAliasDeclaration(node))
50
+ return scan.TypeAliasDeclaration(s, node);
51
+ if (ts.isEnumDeclaration(node))
52
+ return scan.EnumDeclaration(s, node);
53
+ if (ts.isModuleDeclaration(node))
54
+ return scan.ModuleDeclaration(s, node);
55
+ };
56
+ scan.VariableDeclaration = (s, node) => {
57
+ const init = node.initializer;
58
+ if (init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init))) {
59
+ return statement(s, node, 'function', () => functionBody(s, init));
60
+ }
61
+ return statement(s, node, 'variable', () => ({
62
+ type: node.type ? scan.Type(s, node.type) : inferAt(s, node),
63
+ defaultValue: node.initializer?.getText(),
64
+ }));
65
+ };
66
+ scan.FunctionDeclaration = (s, decl) => {
67
+ return statement(s, decl, 'function', () => functionBody(s, decl));
68
+ };
69
+ scan.ClassDeclaration = (s, node) => {
70
+ const constructors = [];
71
+ const properties = [];
72
+ const methods = [];
73
+ let indexSignature;
74
+ for (const m of node.members) {
75
+ if (ts.isConstructorDeclaration(m))
76
+ constructors.push(signature(s, m));
77
+ else if (ts.isPropertyDeclaration(m) && ts.isIdentifier(m.name))
78
+ properties.push(property(s, m));
79
+ else if (ts.isMethodDeclaration(m) && ts.isIdentifier(m.name))
80
+ methods.push(method(s, m));
81
+ else if (ts.isIndexSignatureDeclaration(m))
82
+ indexSignature = indexSignatureDecl(s, m);
83
+ }
84
+ return statement(s, node, 'class', () => ({
85
+ ...generics(s, node),
86
+ ...heritage(s, node),
87
+ constructors,
88
+ properties,
89
+ methods,
90
+ ...(indexSignature ? { indexSignature } : {}),
91
+ }));
92
+ };
93
+ scan.InterfaceDeclaration = (s, node) => statement(s, node, 'interface', () => ({
94
+ ...generics(s, node),
95
+ ...interfaceExtends(s, node),
96
+ ...objectMembers(s, node.members),
97
+ }));
98
+ scan.TypeAliasDeclaration = (s, node) => statement(s, node, 'type-alias', () => ({
99
+ ...generics(s, node),
100
+ type: scan.Type(s, node.type),
101
+ }));
102
+ scan.EnumDeclaration = (s, node) => statement(s, node, 'enum', () => ({
103
+ const: !!node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword),
104
+ members: node.members.map((m) => enumMember(s, m)),
105
+ }));
106
+ scan.ModuleDeclaration = (s, node) => {
107
+ const ns = statement(s, node, 'namespace', () => ({}));
108
+ const body = node.body;
109
+ if (!body)
110
+ return ns;
111
+ const prev = s.parent;
112
+ s.parent = ns.id;
113
+ if (ts.isModuleBlock(body)) {
114
+ body.statements.forEach((stmt) => scan.Statement(s, stmt));
115
+ }
116
+ else if (ts.isModuleDeclaration(body)) {
117
+ // `namespace A.B { … }` → recurse on the inner `B`.
118
+ scan.ModuleDeclaration(s, body);
119
+ }
120
+ s.parent = prev;
121
+ return ns;
122
+ };
123
+ scan.ExportDeclaration = (s, node, queue) => {
124
+ const spec = node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier) ? node.moduleSpecifier.text : undefined;
125
+ // Enqueue the source module so its declarations exist for resolution.
126
+ if (spec) {
127
+ const sym = s.checker.getSymbolAtLocation(node.moduleSpecifier);
128
+ const decl = sym?.valueDeclaration ?? sym?.declarations?.[0];
129
+ if (decl && ts.isSourceFile(decl) && !s.seen.has(decl) && s.include(decl)) {
130
+ queue.push(decl);
131
+ }
132
+ }
133
+ // Emit an `export` declaration node (ref filled by resolver).
134
+ const exp = statement(s, node, 'export', () => ({ names: [], star: false }));
135
+ s.exports.push(exp);
136
+ if (!node.exportClause) {
137
+ if (!spec)
138
+ return;
139
+ s.exportsForm.set(exp.id, 'star');
140
+ s.exportsSpec.set(exp.id, spec);
141
+ s.exportsOrigin.set(exp.id, node);
142
+ exp.star = true;
143
+ return;
144
+ }
145
+ if (ts.isNamespaceExport(node.exportClause)) {
146
+ if (!spec)
147
+ return;
148
+ s.exportsForm.set(exp.id, 'namespace-from');
149
+ s.exportsSpec.set(exp.id, spec);
150
+ s.exportsAlias.set(exp.id, node.exportClause.name.text);
151
+ s.exportsOrigin.set(exp.id, node);
152
+ return;
153
+ }
154
+ const entries = node.exportClause.elements.map((el) => ({
155
+ name: (el.propertyName ?? el.name).text,
156
+ ...(el.propertyName ? { as: el.name.text } : {}),
157
+ }));
158
+ s.exportsForm.set(exp.id, spec ? 'named-from' : 'named-local');
159
+ if (spec)
160
+ s.exportsSpec.set(exp.id, spec);
161
+ s.exportsEntries.set(exp.id, entries);
162
+ s.exportsOrigin.set(exp.id, node);
163
+ };
164
+ // `export default <expr>` / `export = <expr>`. The target is resolved later.
165
+ scan.ExportAssignment = (s, node) => {
166
+ const exp = statement(s, node, 'export', () => ({ names: [], star: false }));
167
+ s.exports.push(exp);
168
+ s.exportsForm.set(exp.id, 'assignment');
169
+ s.exportsOrigin.set(exp.id, node);
170
+ return exp;
171
+ };
172
+ // ---------------- Type Components ----------------
173
+ scan.Type = (s, node) => {
174
+ if (ts.isLiteralTypeNode(node))
175
+ return scan.Literal(s, node);
176
+ if (ts.isArrayTypeNode(node))
177
+ return scan.Array(s, node);
178
+ if (ts.isTupleTypeNode(node))
179
+ return scan.Tuple(s, node);
180
+ if (ts.isUnionTypeNode(node))
181
+ return scan.Union(s, node);
182
+ if (ts.isIntersectionTypeNode(node))
183
+ return scan.Intersection(s, node);
184
+ if (ts.isTypeOperatorNode(node))
185
+ return scan.TypeOperator(s, node);
186
+ if (ts.isFunctionTypeNode(node) || ts.isConstructorTypeNode(node))
187
+ return scan.FunctionType(s, node);
188
+ if (ts.isTypeLiteralNode(node))
189
+ return scan.Record(s, node);
190
+ if (ts.isParenthesizedTypeNode(node))
191
+ return scan.Type(s, node.type);
192
+ if (ts.isConditionalTypeNode(node))
193
+ return scan.Conditional(s, node);
194
+ if (ts.isInferTypeNode(node))
195
+ return scan.Infer(s, node);
196
+ if (ts.isIndexedAccessTypeNode(node))
197
+ return scan.IndexedAccess(s, node);
198
+ if (ts.isMappedTypeNode(node))
199
+ return scan.Mapped(s, node);
200
+ if (ts.isTypeQueryNode(node))
201
+ return scan.Query(s, node);
202
+ if (ts.isTemplateLiteralTypeNode(node))
203
+ return scan.TemplateLiteral(s, node);
204
+ if (ts.isTypePredicateNode(node))
205
+ return scan.Predicate(s, node);
206
+ if (ts.isImportTypeNode(node))
207
+ return scan.ImportType(s, node);
208
+ const name = INTRINSICS[node.kind];
209
+ if (name)
210
+ return scan.Intrinsic(s, node, name);
211
+ if (ts.isTypeReferenceNode(node))
212
+ return scan.TypeReference(s, node);
213
+ return scan.Unknown(s, node);
214
+ };
215
+ scan.Literal = (s, node) => type(s, node, 'literal', { value: literalValue(node.literal) });
216
+ scan.Array = (s, node) => type(s, node, 'array', { elementType: scan.Type(s, node.elementType) });
217
+ scan.Union = (s, node) => type(s, node, 'union', { types: node.types.map((t) => scan.Type(s, t)) });
218
+ scan.Intersection = (s, node) => type(s, node, 'intersection', { types: node.types.map((t) => scan.Type(s, t)) });
219
+ scan.Tuple = (s, node) => type(s, node, 'tuple', { elements: node.elements.map((el) => tupleElement(s, el)) });
220
+ scan.TypeOperator = (s, node) => type(s, node, 'type-operator', { operator: TYPE_OPERATORS[node.operator], target: scan.Type(s, node.type) });
221
+ scan.FunctionType = (s, node) => type(s, node, 'function-type', { signatures: [signature(s, node)] });
222
+ scan.Record = (s, node) => type(s, node, 'record', objectMembers(s, node.members));
223
+ scan.Conditional = (s, node) => type(s, node, 'conditional', {
224
+ check: scan.Type(s, node.checkType),
225
+ extends: scan.Type(s, node.extendsType),
226
+ true: scan.Type(s, node.trueType),
227
+ false: scan.Type(s, node.falseType),
228
+ });
229
+ scan.Infer = (s, node) => type(s, node, 'infer', {
230
+ name: node.typeParameter.name.text,
231
+ ...(node.typeParameter.constraint ? { constraint: scan.Type(s, node.typeParameter.constraint) } : {}),
232
+ });
233
+ scan.IndexedAccess = (s, node) => type(s, node, 'indexed-access', { object: scan.Type(s, node.objectType), index: scan.Type(s, node.indexType) });
234
+ scan.Mapped = (s, node) => type(s, node, 'mapped', {
235
+ typeParameter: scan.TypeParam(s, node.typeParameter),
236
+ ...(node.nameType ? { nameType: scan.Type(s, node.nameType) } : {}),
237
+ ...(node.type ? { type: scan.Type(s, node.type) } : {}),
238
+ ...(node.questionToken ? { optional: true } : {}),
239
+ ...(node.readonlyToken ? { readonly: true } : {}),
240
+ });
241
+ scan.Query = (s, node) => type(s, node, 'query', {
242
+ name: node.exprName.getText(),
243
+ ...(node.typeArguments?.length ? { args: node.typeArguments.map((a) => scan.Type(s, a)) } : {}),
244
+ });
245
+ scan.TemplateLiteral = (s, node) => type(s, node, 'template-literal', {
246
+ head: node.head.text,
247
+ spans: node.templateSpans.map((sp) => ({ type: scan.Type(s, sp.type), literal: sp.literal.text })),
248
+ });
249
+ scan.Predicate = (s, node) => type(s, node, 'predicate', {
250
+ parameter: node.parameterName.getText(),
251
+ ...(node.assertsModifier ? { asserts: true } : {}),
252
+ ...(node.type ? { type: scan.Type(s, node.type) } : {}),
253
+ });
254
+ scan.ImportType = (s, node) => {
255
+ const arg = ts.isLiteralTypeNode(node.argument) && ts.isStringLiteral(node.argument.literal)
256
+ ? node.argument.literal.text
257
+ : node.argument.getText();
258
+ return type(s, node, 'import-type', {
259
+ argument: arg,
260
+ ...(node.qualifier ? { qualifier: node.qualifier.getText() } : {}),
261
+ ...(node.isTypeOf ? { isTypeOf: true } : {}),
262
+ ...(node.typeArguments?.length ? { args: node.typeArguments.map((a) => scan.Type(s, a)) } : {}),
263
+ });
264
+ };
265
+ scan.TypeReference = (s, node) => {
266
+ const r = type(s, node, 'reference', { type: 'internal', targetId: 0 });
267
+ r.id = s.nextId();
268
+ r.owner = s.currentStmt;
269
+ r.name = getName(node) ?? 'unknown';
270
+ if (node.typeArguments?.length)
271
+ r.args = node.typeArguments.map((a) => scan.Type(s, a));
272
+ s.references.push(r);
273
+ s.referenceOrigins.set(r.id, node);
274
+ return r;
275
+ };
276
+ scan.Unknown = (s, node) => type(s, node, 'unknown', { text: node.getText(), nodeType: ts.SyntaxKind[node.kind] });
277
+ scan.Intrinsic = (s, node, name) => {
278
+ return type(s, node, 'intrinsic', { name });
279
+ };
280
+ scan.TypeParam = (s, node) => {
281
+ return part(s, node, 'generic', {
282
+ constraint: node.constraint ? scan.Type(s, node.constraint) : undefined,
283
+ default: node.default ? scan.Type(s, node.default) : undefined,
284
+ });
285
+ };
286
+ // ---------------- Inference ----------------
287
+ /**
288
+ * Infer a declaration's type from the checker when no annotation is present.
289
+ * Builds a structured `Type` for the common shapes (primitives, literals,
290
+ * unions, arrays, named references, object literals) and falls back to the
291
+ * checker's string form for anything more exotic — the hybrid contract.
292
+ */
293
+ const inferAt = (s, node) => fromType(s, node, s.checker.getTypeAtLocation(node), new Set());
294
+ const inferReturn = (s, node) => {
295
+ const sig = s.checker.getSignatureFromDeclaration(node);
296
+ return sig ? fromType(s, node, sig.getReturnType(), new Set()) : scan.Intrinsic(s, node, 'unknown');
297
+ };
298
+ const fromType = (s, ctx, type, seen) => structured(s, ctx, type, seen) ?? inferredText(s, ctx, type);
299
+ const inferredText = (s, ctx, type) => inode(s, 'unknown', { text: s.checker.typeToString(type, ctx, ts.TypeFormatFlags.NoTruncation), nodeType: 'inferred' });
300
+ const structured = (s, ctx, type, seen) => {
301
+ const f = type.flags;
302
+ // Literals first — their flags never overlap the primitive intrinsics.
303
+ if (f & ts.TypeFlags.StringLiteral)
304
+ return inode(s, 'literal', { value: type.value });
305
+ if (f & ts.TypeFlags.NumberLiteral)
306
+ return inode(s, 'literal', { value: type.value });
307
+ if (f & ts.TypeFlags.BigIntLiteral) {
308
+ const v = type.value;
309
+ return inode(s, 'literal', { value: BigInt((v.negative ? '-' : '') + v.base10Value) });
310
+ }
311
+ if (f & ts.TypeFlags.BooleanLiteral)
312
+ return inode(s, 'literal', { value: type.intrinsicName === 'true' });
313
+ const intr = intrinsicName(f);
314
+ if (intr)
315
+ return inode(s, 'intrinsic', { name: intr });
316
+ // Keep a named alias rather than expanding it inline.
317
+ const alias = type.aliasSymbol;
318
+ if (alias && isNamed(alias))
319
+ return inferRef(s, alias.getName(), alias, mapArgs(s, ctx, type.aliasTypeArguments, seen));
320
+ if (type.isUnion())
321
+ return inode(s, 'union', { types: type.types.map((t) => fromType(s, ctx, t, seen)) });
322
+ if (type.isIntersection())
323
+ return inode(s, 'intersection', { types: type.types.map((t) => fromType(s, ctx, t, seen)) });
324
+ return objectType(s, ctx, type, seen);
325
+ };
326
+ /** Arrays, named references, and anonymous object literals. */
327
+ const objectType = (s, ctx, type, seen) => {
328
+ if (!(type.flags & ts.TypeFlags.Object))
329
+ return undefined;
330
+ const obj = type;
331
+ if (obj.objectFlags & ts.ObjectFlags.Reference) {
332
+ const ref = type;
333
+ if (ref.target.objectFlags & ts.ObjectFlags.Tuple)
334
+ return undefined; // → string form
335
+ const args = s.checker.getTypeArguments(ref);
336
+ const tname = ref.target.symbol?.getName();
337
+ if ((tname === 'Array' || tname === 'ReadonlyArray') && args.length === 1)
338
+ return inode(s, 'array', { elementType: fromType(s, ctx, args[0], seen) });
339
+ const sym = type.getSymbol();
340
+ if (sym && isNamed(sym))
341
+ return inferRef(s, sym.getName(), sym, mapArgs(s, ctx, args, seen));
342
+ }
343
+ const sym = type.getSymbol();
344
+ if (sym && isNamed(sym))
345
+ return inferRef(s, sym.getName(), sym, undefined);
346
+ // Callable / constructable objects are too rich for a record — defer to text.
347
+ if (type.getCallSignatures().length || type.getConstructSignatures().length)
348
+ return undefined;
349
+ const props = type.getProperties();
350
+ if (!props.length || seen.has(type))
351
+ return undefined;
352
+ seen.add(type);
353
+ return inode(s, 'record', { properties: props.map((p) => inferProp(s, ctx, p, seen)), methods: [] });
354
+ };
355
+ const inferProp = (s, ctx, sym, seen) => {
356
+ const decl = sym.valueDeclaration ?? sym.declarations?.[0] ?? ctx;
357
+ const pt = s.checker.getTypeOfSymbolAtLocation(sym, decl);
358
+ return {
359
+ kind: 'property',
360
+ parent: s.parent,
361
+ sources: [],
362
+ name: sym.getName(),
363
+ type: fromType(s, ctx, pt, seen),
364
+ ...(sym.flags & ts.SymbolFlags.Optional ? { optional: true } : {}),
365
+ };
366
+ };
367
+ const inferRef = (s, name, symbol, args) => {
368
+ const r = {
369
+ kind: 'reference',
370
+ parent: s.parent,
371
+ sources: [],
372
+ type: 'internal',
373
+ targetId: 0,
374
+ id: s.nextId(),
375
+ name,
376
+ owner: s.currentStmt,
377
+ ...(args?.length ? { args } : {}),
378
+ };
379
+ s.references.push(r);
380
+ s.referenceSymbols.set(r.id, symbol);
381
+ return r;
382
+ };
383
+ const mapArgs = (s, ctx, args, seen) => args?.length ? args.map((a) => fromType(s, ctx, a, seen)) : undefined;
384
+ /** A symbol that should render as a clickable name rather than an expanded shape. */
385
+ const isNamed = (sym) => {
386
+ if (sym.flags & ts.SymbolFlags.TypeParameter)
387
+ return false;
388
+ const n = sym.getName();
389
+ return !!n && !n.startsWith('__');
390
+ };
391
+ const inode = (s, kind, fields) => ({ kind, parent: s.parent, sources: [], ...fields });
392
+ const intrinsicName = (f) => {
393
+ if (f & ts.TypeFlags.String)
394
+ return 'string';
395
+ if (f & ts.TypeFlags.Number)
396
+ return 'number';
397
+ if (f & ts.TypeFlags.Boolean)
398
+ return 'boolean';
399
+ if (f & ts.TypeFlags.BigInt)
400
+ return 'bigint';
401
+ if (f & (ts.TypeFlags.ESSymbol | ts.TypeFlags.UniqueESSymbol))
402
+ return 'symbol';
403
+ if (f & ts.TypeFlags.Void)
404
+ return 'void';
405
+ if (f & ts.TypeFlags.Undefined)
406
+ return 'undefined';
407
+ if (f & ts.TypeFlags.Null)
408
+ return 'null';
409
+ if (f & ts.TypeFlags.Never)
410
+ return 'never';
411
+ if (f & ts.TypeFlags.Any)
412
+ return 'any';
413
+ if (f & ts.TypeFlags.Unknown)
414
+ return 'unknown';
415
+ if (f & ts.TypeFlags.NonPrimitive)
416
+ return 'object';
417
+ return undefined;
418
+ };
419
+ // ---------------- Type Components ----------------
420
+ const signature = (s, node) => part(s, node, 'signature', {
421
+ ...(node.typeParameters ? { generics: node.typeParameters.map((tp) => scan.TypeParam(s, tp)) } : {}),
422
+ params: node.parameters.map((p) => parameter(s, p)),
423
+ return: node.type ? scan.Type(s, node.type) : inferReturn(s, node),
424
+ });
425
+ const parameter = (b, node) => part(b, node, 'parameter', {
426
+ type: node.type ? scan.Type(b, node.type) : inferAt(b, node),
427
+ optional: !!node.questionToken || !!node.initializer,
428
+ ...(node.dotDotDotToken ? { rest: true } : {}),
429
+ ...(node.initializer ? { default: node.initializer.getText() } : {}),
430
+ });
431
+ const functionBody = (s, node) => ({
432
+ signatures: [signature(s, node)],
433
+ });
434
+ const commentForNode = (b, node) => {
435
+ const all = ts.getJSDocCommentsAndTags(node);
436
+ if (!all.length)
437
+ return undefined;
438
+ const parts = [];
439
+ const tags = [];
440
+ let seenBlock = false;
441
+ for (const doc of all) {
442
+ if (!ts.isJSDoc(doc))
443
+ continue;
444
+ seenBlock = true;
445
+ appendCommentBody(doc.comment, parts);
446
+ if (doc.tags)
447
+ for (const t of doc.tags) {
448
+ const tag = buildTag(b, t);
449
+ if (tag.tag === '@module')
450
+ return undefined;
451
+ tags.push(tag);
452
+ }
453
+ }
454
+ if (!seenBlock)
455
+ return undefined;
456
+ return { parts, ...(tags.length ? { tags } : {}) };
457
+ };
458
+ /** Flatten a JSDoc comment into `parts`. */
459
+ const appendCommentBody = (comment, parts) => {
460
+ if (!comment)
461
+ return;
462
+ if (typeof comment === 'string') {
463
+ const trimmed = comment.trim();
464
+ if (trimmed)
465
+ parts.push({ kind: 'text', text: trimmed });
466
+ return;
467
+ }
468
+ for (const c of comment) {
469
+ if (c.kind === ts.SyntaxKind.JSDocText) {
470
+ parts.push({ kind: 'text', text: c.text });
471
+ continue;
472
+ }
473
+ const target = c.name?.getText() ?? '';
474
+ const linkText = c.text || undefined;
475
+ const style = ts.isJSDocLinkCode(c) ? 'code' : ts.isJSDocLinkPlain(c) ? 'plain' : undefined;
476
+ parts.push({ kind: 'link', target, ...(linkText ? { text: linkText } : {}), ...(style ? { style } : {}) });
477
+ }
478
+ };
479
+ const buildTag = (s, tag) => {
480
+ const text = ts.getTextOfJSDocComment(tag.comment)?.trim() ?? '';
481
+ const exprType = (te) => (te ? scan.Type(s, te.type) : undefined);
482
+ if (ts.isJSDocPropertyTag(tag)) {
483
+ return {
484
+ tag: '@property',
485
+ name: tag.name.getText(),
486
+ type: exprType(tag.typeExpression),
487
+ text,
488
+ };
489
+ }
490
+ if (ts.isJSDocParameterTag(tag)) {
491
+ return {
492
+ tag: '@param',
493
+ name: tag.name.getText(),
494
+ type: exprType(tag.typeExpression),
495
+ ...(tag.isBracketed ? { optional: true } : {}),
496
+ text,
497
+ };
498
+ }
499
+ if (ts.isJSDocReturnTag(tag)) {
500
+ const type = exprType(tag.typeExpression);
501
+ return { tag: '@returns', ...(type ? { type } : {}), text };
502
+ }
503
+ if (ts.isJSDocThrowsTag(tag)) {
504
+ const type = exprType(tag.typeExpression);
505
+ return { tag: '@throws', ...(type ? { type } : {}), text };
506
+ }
507
+ if (ts.isJSDocTypeTag(tag))
508
+ return { tag: '@type', type: exprType(tag.typeExpression), text };
509
+ if (ts.isJSDocSatisfiesTag(tag))
510
+ return { tag: '@satisfies', type: exprType(tag.typeExpression), text };
511
+ if (ts.isJSDocTemplateTag(tag)) {
512
+ return { tag: '@template', generics: tag.typeParameters.map((tp) => scan.TypeParam(s, tp)), text };
513
+ }
514
+ if (ts.isJSDocSeeTag(tag)) {
515
+ return { tag: '@see', ...(tag.name ? { target: tag.name.name.getText() } : {}), text };
516
+ }
517
+ if (ts.isJSDocAugmentsTag(tag))
518
+ return { tag: '@augments', class: scan.Type(s, tag.class), text };
519
+ if (ts.isJSDocImplementsTag(tag))
520
+ return { tag: '@implements', class: scan.Type(s, tag.class), text };
521
+ const name = '@' + tag.tagName.text;
522
+ // `@example` carries semantic indentation; re-extract from source so the
523
+ // leader-strip never eats author tabs (see `rawTagBody`).
524
+ if (name === '@example')
525
+ return parseExample(rawTagBody(tag));
526
+ return { tag: name, text };
527
+ };
528
+ /**
529
+ * Reconstruct the body of a JSDoc tag from source, stripping the per-line
530
+ * `*` leader and at most one *space* of separator. Unlike
531
+ * `ts.getTextOfJSDocComment` — which strips `[ \t]?` and so eats a single
532
+ * tab of user indentation — this preserves tabs intact.
533
+ */
534
+ const rawTagBody = (tag) => {
535
+ const src = tag.getSourceFile().text;
536
+ // Body starts immediately after the tag name (`@example`), runs to tag end.
537
+ const raw = src.slice(tag.tagName.end, tag.end);
538
+ return raw
539
+ .split('\n')
540
+ .map((line, i) => (i === 0 ? line : line.replace(/^[ \t]*\*( ?)/, '')))
541
+ .join('\n')
542
+ .trim();
543
+ };
544
+ /**
545
+ * Pull an optional caption out of an `@example` body. Two forms are recognised:
546
+ * 1. Legacy JSDoc: `<caption>…</caption>` prefix.
547
+ * 2. TypeDoc-style: any text on the line(s) before the first fenced code
548
+ * block becomes the caption; the fence and its body become the code.
549
+ * When neither pattern matches, the entire body is treated as `code`.
550
+ */
551
+ const parseExample = (raw) => {
552
+ const html = raw.match(/^<caption>([\s\S]*?)<\/caption>\s*([\s\S]*)$/);
553
+ if (html)
554
+ return { tag: '@example', caption: html[1].trim(), code: html[2].trim() };
555
+ const fence = raw.search(/^```/m);
556
+ if (fence > 0) {
557
+ const caption = raw.slice(0, fence).trim();
558
+ if (caption)
559
+ return { tag: '@example', caption, code: raw.slice(fence).trim() };
560
+ }
561
+ return { tag: '@example', code: raw.trim() };
562
+ };
563
+ export const commentForModule = (s, sf) => {
564
+ if (sf.statements.length === 0)
565
+ return undefined;
566
+ // 1. Target the leading comment ranges for the first statement per your rules
567
+ const sourceText = sf.getFullText();
568
+ const commentRanges = ts.getLeadingCommentRanges(sourceText, sf.statements[0].pos);
569
+ if (!commentRanges || commentRanges.length === 0)
570
+ return undefined;
571
+ const parts = [];
572
+ const tags = [];
573
+ let seenBlock = false;
574
+ // 2. Evaluate each comment text range
575
+ for (let i = 0; i < commentRanges.length; i++) {
576
+ const range = commentRanges[i];
577
+ const commentText = sourceText.slice(range.pos, range.end);
578
+ // Apply your specific layout logic
579
+ const isModuleComment = i < commentRanges.length - 1 || commentText.includes('@module');
580
+ if (isModuleComment) {
581
+ // 3. Trick the compiler into parsing the raw text snippet back into an AST Node block
582
+ // We append an empty statement (;) so the parser attaches the JSDoc to a valid target.
583
+ const dummyFile = ts.createSourceFile('dummy.ts', `${commentText}\n;`, ts.ScriptTarget.Latest, true);
584
+ // 4. Safely extract the compiled JSDoc node from the dummy file
585
+ const dummyStmt = dummyFile.statements[0];
586
+ if (dummyStmt) {
587
+ const jsdocBlocks = ts.getJSDocCommentsAndTags(dummyStmt);
588
+ const matchingBlock = jsdocBlocks.find(ts.isJSDoc);
589
+ if (matchingBlock) {
590
+ seenBlock = true;
591
+ // Feed the generated AST structure down your pipeline seamlessly
592
+ appendCommentBody(matchingBlock.comment, parts);
593
+ if (matchingBlock.tags) {
594
+ for (const t of matchingBlock.tags) {
595
+ tags.push(buildTag(s, t));
596
+ }
597
+ }
598
+ }
599
+ }
600
+ }
601
+ }
602
+ if (!seenBlock)
603
+ return undefined;
604
+ return { parts, ...(tags.length ? { tags } : {}) };
605
+ };
606
+ const statement = (s, node, kind, fields) => {
607
+ const b = base(s, node);
608
+ s.currentStmt = b.id;
609
+ Object.assign(b, fields(), { kind });
610
+ s.declarations.push(b);
611
+ return b;
612
+ };
613
+ const type = (s, node, kind, fields) => {
614
+ const nd = typeBase(s, node);
615
+ Object.assign(nd, { kind }, fields);
616
+ return nd;
617
+ };
618
+ const part = (s, node, kind, fields) => {
619
+ const nd = typeBase(s, node);
620
+ Object.assign(nd, { kind }, fields);
621
+ if (nd.name === undefined) {
622
+ const n = getName(node);
623
+ if (n !== undefined)
624
+ nd.name = n;
625
+ }
626
+ return nd;
627
+ };
628
+ const base = (s, node) => {
629
+ const result = typeBase(s, node);
630
+ result.id = s.nextId();
631
+ result.name = getName(node) ?? 'unknown';
632
+ result.exported = isExported(node);
633
+ const named = node.name;
634
+ const sym = s.checker.getSymbolAtLocation(named ?? node);
635
+ if (sym)
636
+ s.symbolsById.set(result.id, sym);
637
+ return result;
638
+ };
639
+ const typeBase = (s, node) => {
640
+ const result = { parent: s.parent, sources: [] };
641
+ const named = node.name;
642
+ const sym = s.checker.getSymbolAtLocation(named ?? node);
643
+ if (sym?.declarations?.length)
644
+ result.sources = sym.declarations.map((d) => sourceOf(s, d));
645
+ else
646
+ result.sources = [sourceOf(s, node)];
647
+ const comment = ts.isSourceFile(node) ? commentForModule(s, node) : commentForNode(s, node);
648
+ if (comment)
649
+ result.comment = comment;
650
+ return result;
651
+ };
652
+ const sourceOf = (s, node) => {
653
+ const sf = node.getSourceFile();
654
+ const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart());
655
+ return { file: s.getPath(sf), line: line + 1, column: character + 1 };
656
+ };
657
+ // ---------------- Utilities ----------------
658
+ export const isExported = (node) => {
659
+ if (ts.isExportDeclaration(node) || ts.isExportAssignment(node))
660
+ return true;
661
+ // `export const x` carries the modifier on the enclosing `VariableStatement`.
662
+ if (ts.isVariableDeclaration(node)) {
663
+ const stmt = node.parent?.parent;
664
+ return !!stmt && ts.isVariableStatement(stmt) && isExported(stmt);
665
+ }
666
+ const mods = node.modifiers;
667
+ return !!mods?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
668
+ };
669
+ export const getName = (node) => {
670
+ if (ts.isTypeReferenceNode(node))
671
+ return node.typeName.getText();
672
+ if (ts.isExpressionWithTypeArguments(node))
673
+ return node.expression.getText();
674
+ if (ts.isTypeQueryNode(node))
675
+ return node.exprName.getText();
676
+ if (ts.isDeclarationStatement(node))
677
+ return ts.getNameOfDeclaration(node)?.getText();
678
+ if (ts.isExpression(node))
679
+ return ts.getNameOfDeclaration(node)?.getText();
680
+ if (node.name)
681
+ return node.name.getText();
682
+ return undefined;
683
+ };
684
+ const property = (s, node) => part(s, node, 'property', {
685
+ type: node.type ? scan.Type(s, node.type) : inferAt(s, node),
686
+ ...(node.questionToken ? { optional: true } : {}),
687
+ ...('initializer' in node && node.initializer ? { defaultValue: node.initializer.getText() } : {}),
688
+ });
689
+ const method = (s, node) => part(s, node, 'method', { signatures: [signature(s, node)] });
690
+ const indexSignatureDecl = (s, node) => part(s, node, 'index-signature', {
691
+ parameter: parameter(s, node.parameters[0]),
692
+ type: node.type ? scan.Type(s, node.type) : scan.Intrinsic(s, node, 'unknown'),
693
+ });
694
+ const enumMember = (s, node) => {
695
+ const value = s.checker.getConstantValue(node);
696
+ return part(s, node, 'enum-member', { ...(value !== undefined ? { value } : {}) });
697
+ };
698
+ const generics = (s, node) => node.typeParameters?.length ? { generics: node.typeParameters.map((tp) => scan.TypeParam(s, tp)) } : {};
699
+ const heritage = (s, node) => {
700
+ const out = {};
701
+ for (const h of node.heritageClauses ?? []) {
702
+ const types = h.types.map((t) => scan.Type(s, t));
703
+ if (h.token === ts.SyntaxKind.ExtendsKeyword)
704
+ out.extends = types;
705
+ else
706
+ out.implements = types;
707
+ }
708
+ return out;
709
+ };
710
+ const interfaceExtends = (s, node) => {
711
+ const ext = node.heritageClauses?.flatMap((h) => h.types).map((t) => scan.Type(s, t));
712
+ return ext?.length ? { extends: ext } : {};
713
+ };
714
+ const objectMembers = (s, members) => {
715
+ const properties = [];
716
+ const methods = [];
717
+ const callSignatures = [];
718
+ const constructSignatures = [];
719
+ let indexSignature;
720
+ for (const m of members) {
721
+ if (ts.isPropertySignature(m) && ts.isIdentifier(m.name))
722
+ properties.push(property(s, m));
723
+ else if (ts.isMethodSignature(m) && ts.isIdentifier(m.name))
724
+ methods.push(method(s, m));
725
+ else if (ts.isCallSignatureDeclaration(m))
726
+ callSignatures.push(signature(s, m));
727
+ else if (ts.isConstructSignatureDeclaration(m))
728
+ constructSignatures.push(signature(s, m));
729
+ else if (ts.isIndexSignatureDeclaration(m))
730
+ indexSignature = indexSignatureDecl(s, m);
731
+ }
732
+ return {
733
+ properties,
734
+ methods,
735
+ ...(callSignatures.length ? { callSignatures } : {}),
736
+ ...(constructSignatures.length ? { constructSignatures } : {}),
737
+ ...(indexSignature ? { indexSignature } : {}),
738
+ };
739
+ };
740
+ const literalValue = (lit) => {
741
+ if (lit.kind === ts.SyntaxKind.NullKeyword)
742
+ return null;
743
+ if (ts.isStringLiteral(lit))
744
+ return lit.text;
745
+ if (ts.isNumericLiteral(lit))
746
+ return Number(lit.text);
747
+ if (lit.kind === ts.SyntaxKind.TrueKeyword)
748
+ return true;
749
+ if (lit.kind === ts.SyntaxKind.FalseKeyword)
750
+ return false;
751
+ if (ts.isBigIntLiteral(lit))
752
+ return BigInt(lit.text.replace(/n$/, ''));
753
+ return lit.getText();
754
+ };
755
+ const tupleElement = (s, el) => {
756
+ if (ts.isNamedTupleMember(el))
757
+ return part(s, el, 'tuple-element', {
758
+ type: scan.Type(s, el.type),
759
+ ...(el.questionToken ? { optional: true } : {}),
760
+ ...(el.dotDotDotToken ? { rest: true } : {}),
761
+ });
762
+ if (ts.isOptionalTypeNode(el))
763
+ return part(s, el, 'tuple-element', { type: scan.Type(s, el.type), optional: true });
764
+ if (ts.isRestTypeNode(el))
765
+ return part(s, el, 'tuple-element', { type: scan.Type(s, el.type), rest: true });
766
+ return part(s, el, 'tuple-element', { type: scan.Type(s, el) });
767
+ };
768
+ const INTRINSICS = {
769
+ [ts.SyntaxKind.StringKeyword]: 'string',
770
+ [ts.SyntaxKind.NumberKeyword]: 'number',
771
+ [ts.SyntaxKind.BooleanKeyword]: 'boolean',
772
+ [ts.SyntaxKind.BigIntKeyword]: 'bigint',
773
+ [ts.SyntaxKind.SymbolKeyword]: 'symbol',
774
+ [ts.SyntaxKind.VoidKeyword]: 'void',
775
+ [ts.SyntaxKind.UndefinedKeyword]: 'undefined',
776
+ [ts.SyntaxKind.NeverKeyword]: 'never',
777
+ [ts.SyntaxKind.AnyKeyword]: 'any',
778
+ [ts.SyntaxKind.UnknownKeyword]: 'unknown',
779
+ [ts.SyntaxKind.ObjectKeyword]: 'object',
780
+ [ts.SyntaxKind.ThisType]: 'this',
781
+ };
782
+ const TYPE_OPERATORS = {
783
+ [ts.SyntaxKind.KeyOfKeyword]: 'keyof',
784
+ [ts.SyntaxKind.ReadonlyKeyword]: 'readonly',
785
+ [ts.SyntaxKind.UniqueKeyword]: 'unique',
786
+ };
787
+ //# sourceMappingURL=scan.js.map