@alisio/plugin-thesis 0.1.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 (547) hide show
  1. package/.agents/agents/thesis-architect.md +38 -0
  2. package/.agents/agents/thesis-coordinator.md +39 -0
  3. package/.agents/agents/thesis-editor.md +35 -0
  4. package/.agents/agents/thesis-evidence-auditor.md +37 -0
  5. package/.agents/agents/thesis-librarian.md +38 -0
  6. package/.agents/agents/thesis-methodologist.md +39 -0
  7. package/.agents/agents/thesis-reviewer.md +36 -0
  8. package/.agents/agents/thesis-writer.md +38 -0
  9. package/.agents/skills/thesis-build/SKILL.md +48 -0
  10. package/.agents/skills/thesis-citations/SKILL.md +49 -0
  11. package/.agents/skills/thesis-csl-authoring/SKILL.md +48 -0
  12. package/.agents/skills/thesis-editing/SKILL.md +49 -0
  13. package/.agents/skills/thesis-evidence/SKILL.md +48 -0
  14. package/.agents/skills/thesis-figures/SKILL.md +50 -0
  15. package/.agents/skills/thesis-institution-norms/SKILL.md +50 -0
  16. package/.agents/skills/thesis-intake/SKILL.md +48 -0
  17. package/.agents/skills/thesis-math/SKILL.md +48 -0
  18. package/.agents/skills/thesis-methodology/SKILL.md +49 -0
  19. package/.agents/skills/thesis-outline/SKILL.md +48 -0
  20. package/.agents/skills/thesis-policy/SKILL.md +48 -0
  21. package/.agents/skills/thesis-review/SKILL.md +49 -0
  22. package/.agents/skills/thesis-search/SKILL.md +47 -0
  23. package/.agents/skills/thesis-writing/SKILL.md +52 -0
  24. package/LICENSE +21 -0
  25. package/README.es.md +242 -0
  26. package/README.md +235 -0
  27. package/THIRD_PARTY_NOTICES.md +94 -0
  28. package/assets/architecture.svg +1 -0
  29. package/assets/evidence-pipeline.svg +1 -0
  30. package/assets/lifecycle.svg +1 -0
  31. package/assets/policy-resolution.svg +1 -0
  32. package/cover.webp +0 -0
  33. package/dist/authoring.d.ts +30 -0
  34. package/dist/authoring.d.ts.map +1 -0
  35. package/dist/authoring.js +681 -0
  36. package/dist/authoring.js.map +1 -0
  37. package/dist/brief.d.ts +40 -0
  38. package/dist/brief.d.ts.map +1 -0
  39. package/dist/brief.js +566 -0
  40. package/dist/brief.js.map +1 -0
  41. package/dist/cache.d.ts +8 -0
  42. package/dist/cache.d.ts.map +1 -0
  43. package/dist/cache.js +20 -0
  44. package/dist/cache.js.map +1 -0
  45. package/dist/checks/brief.d.ts +5 -0
  46. package/dist/checks/brief.d.ts.map +1 -0
  47. package/dist/checks/brief.js +38 -0
  48. package/dist/checks/brief.js.map +1 -0
  49. package/dist/checks/citations.d.ts +14 -0
  50. package/dist/checks/citations.d.ts.map +1 -0
  51. package/dist/checks/citations.js +87 -0
  52. package/dist/checks/citations.js.map +1 -0
  53. package/dist/checks/claims.d.ts +16 -0
  54. package/dist/checks/claims.d.ts.map +1 -0
  55. package/dist/checks/claims.js +147 -0
  56. package/dist/checks/claims.js.map +1 -0
  57. package/dist/checks/closing.d.ts +20 -0
  58. package/dist/checks/closing.d.ts.map +1 -0
  59. package/dist/checks/closing.js +168 -0
  60. package/dist/checks/closing.js.map +1 -0
  61. package/dist/checks/design.d.ts +5 -0
  62. package/dist/checks/design.d.ts.map +1 -0
  63. package/dist/checks/design.js +107 -0
  64. package/dist/checks/design.js.map +1 -0
  65. package/dist/checks/document.d.ts +17 -0
  66. package/dist/checks/document.d.ts.map +1 -0
  67. package/dist/checks/document.js +213 -0
  68. package/dist/checks/document.js.map +1 -0
  69. package/dist/checks/evidence.d.ts +7 -0
  70. package/dist/checks/evidence.d.ts.map +1 -0
  71. package/dist/checks/evidence.js +133 -0
  72. package/dist/checks/evidence.js.map +1 -0
  73. package/dist/checks/hygiene.d.ts +5 -0
  74. package/dist/checks/hygiene.d.ts.map +1 -0
  75. package/dist/checks/hygiene.js +37 -0
  76. package/dist/checks/hygiene.js.map +1 -0
  77. package/dist/checks/index.d.ts +21 -0
  78. package/dist/checks/index.d.ts.map +1 -0
  79. package/dist/checks/index.js +98 -0
  80. package/dist/checks/index.js.map +1 -0
  81. package/dist/checks/language.d.ts +14 -0
  82. package/dist/checks/language.d.ts.map +1 -0
  83. package/dist/checks/language.js +73 -0
  84. package/dist/checks/language.js.map +1 -0
  85. package/dist/checks/outline.d.ts +25 -0
  86. package/dist/checks/outline.d.ts.map +1 -0
  87. package/dist/checks/outline.js +214 -0
  88. package/dist/checks/outline.js.map +1 -0
  89. package/dist/checks/policy.d.ts +5 -0
  90. package/dist/checks/policy.d.ts.map +1 -0
  91. package/dist/checks/policy.js +129 -0
  92. package/dist/checks/policy.js.map +1 -0
  93. package/dist/checks/project.d.ts +65 -0
  94. package/dist/checks/project.d.ts.map +1 -0
  95. package/dist/checks/project.js +203 -0
  96. package/dist/checks/project.js.map +1 -0
  97. package/dist/checks/styles.d.ts +12 -0
  98. package/dist/checks/styles.d.ts.map +1 -0
  99. package/dist/checks/styles.js +67 -0
  100. package/dist/checks/styles.js.map +1 -0
  101. package/dist/checks/writing.d.ts +6 -0
  102. package/dist/checks/writing.d.ts.map +1 -0
  103. package/dist/checks/writing.js +115 -0
  104. package/dist/checks/writing.js.map +1 -0
  105. package/dist/chrome/detect.d.ts +19 -0
  106. package/dist/chrome/detect.d.ts.map +1 -0
  107. package/dist/chrome/detect.js +116 -0
  108. package/dist/chrome/detect.js.map +1 -0
  109. package/dist/claims.d.ts +19 -0
  110. package/dist/claims.d.ts.map +1 -0
  111. package/dist/claims.js +99 -0
  112. package/dist/claims.js.map +1 -0
  113. package/dist/cli.d.ts +11 -0
  114. package/dist/cli.d.ts.map +1 -0
  115. package/dist/cli.js +262 -0
  116. package/dist/cli.js.map +1 -0
  117. package/dist/context.d.ts +55 -0
  118. package/dist/context.d.ts.map +1 -0
  119. package/dist/context.js +62 -0
  120. package/dist/context.js.map +1 -0
  121. package/dist/coordinator.d.ts +139 -0
  122. package/dist/coordinator.d.ts.map +1 -0
  123. package/dist/coordinator.js +710 -0
  124. package/dist/coordinator.js.map +1 -0
  125. package/dist/delegate.d.ts +34 -0
  126. package/dist/delegate.d.ts.map +1 -0
  127. package/dist/delegate.js +105 -0
  128. package/dist/delegate.js.map +1 -0
  129. package/dist/diffguard.d.ts +24 -0
  130. package/dist/diffguard.d.ts.map +1 -0
  131. package/dist/diffguard.js +92 -0
  132. package/dist/diffguard.js.map +1 -0
  133. package/dist/doctor.d.ts +34 -0
  134. package/dist/doctor.d.ts.map +1 -0
  135. package/dist/doctor.js +155 -0
  136. package/dist/doctor.js.map +1 -0
  137. package/dist/draft.d.ts +64 -0
  138. package/dist/draft.d.ts.map +1 -0
  139. package/dist/draft.js +801 -0
  140. package/dist/draft.js.map +1 -0
  141. package/dist/figure.d.ts +13 -0
  142. package/dist/figure.d.ts.map +1 -0
  143. package/dist/figure.js +143 -0
  144. package/dist/figure.js.map +1 -0
  145. package/dist/finalize.d.ts +29 -0
  146. package/dist/finalize.d.ts.map +1 -0
  147. package/dist/finalize.js +230 -0
  148. package/dist/finalize.js.map +1 -0
  149. package/dist/index.d.ts +33 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +206 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/intake.d.ts +57 -0
  154. package/dist/intake.d.ts.map +1 -0
  155. package/dist/intake.js +772 -0
  156. package/dist/intake.js.map +1 -0
  157. package/dist/labels.d.ts +50 -0
  158. package/dist/labels.d.ts.map +1 -0
  159. package/dist/labels.js +98 -0
  160. package/dist/labels.js.map +1 -0
  161. package/dist/outline.d.ts +45 -0
  162. package/dist/outline.d.ts.map +1 -0
  163. package/dist/outline.js +148 -0
  164. package/dist/outline.js.map +1 -0
  165. package/dist/pack-commands.d.ts +18 -0
  166. package/dist/pack-commands.d.ts.map +1 -0
  167. package/dist/pack-commands.js +397 -0
  168. package/dist/pack-commands.js.map +1 -0
  169. package/dist/package-paths.d.ts +8 -0
  170. package/dist/package-paths.d.ts.map +1 -0
  171. package/dist/package-paths.js +13 -0
  172. package/dist/package-paths.js.map +1 -0
  173. package/dist/policy/context.d.ts +19 -0
  174. package/dist/policy/context.d.ts.map +1 -0
  175. package/dist/policy/context.js +62 -0
  176. package/dist/policy/context.js.map +1 -0
  177. package/dist/policy/ethics.d.ts +59 -0
  178. package/dist/policy/ethics.d.ts.map +1 -0
  179. package/dist/policy/ethics.js +106 -0
  180. package/dist/policy/ethics.js.map +1 -0
  181. package/dist/policy/kinds.d.ts +9 -0
  182. package/dist/policy/kinds.d.ts.map +1 -0
  183. package/dist/policy/kinds.js +68 -0
  184. package/dist/policy/kinds.js.map +1 -0
  185. package/dist/policy/packs.d.ts +53 -0
  186. package/dist/policy/packs.d.ts.map +1 -0
  187. package/dist/policy/packs.js +336 -0
  188. package/dist/policy/packs.js.map +1 -0
  189. package/dist/policy/resolver.d.ts +87 -0
  190. package/dist/policy/resolver.d.ts.map +1 -0
  191. package/dist/policy/resolver.js +337 -0
  192. package/dist/policy/resolver.js.map +1 -0
  193. package/dist/policy/rules.d.ts +65 -0
  194. package/dist/policy/rules.d.ts.map +1 -0
  195. package/dist/policy/rules.js +194 -0
  196. package/dist/policy/rules.js.map +1 -0
  197. package/dist/protocol.d.ts +46 -0
  198. package/dist/protocol.d.ts.map +1 -0
  199. package/dist/protocol.js +86 -0
  200. package/dist/protocol.js.map +1 -0
  201. package/dist/render/adapters/chrome-pdf/cdp.d.ts +36 -0
  202. package/dist/render/adapters/chrome-pdf/cdp.d.ts.map +1 -0
  203. package/dist/render/adapters/chrome-pdf/cdp.js +291 -0
  204. package/dist/render/adapters/chrome-pdf/cdp.js.map +1 -0
  205. package/dist/render/adapters/chrome-pdf/index.d.ts +10 -0
  206. package/dist/render/adapters/chrome-pdf/index.d.ts.map +1 -0
  207. package/dist/render/adapters/chrome-pdf/index.js +139 -0
  208. package/dist/render/adapters/chrome-pdf/index.js.map +1 -0
  209. package/dist/render/adapters/chrome-pdf/network.d.ts +7 -0
  210. package/dist/render/adapters/chrome-pdf/network.d.ts.map +1 -0
  211. package/dist/render/adapters/chrome-pdf/network.js +33 -0
  212. package/dist/render/adapters/chrome-pdf/network.js.map +1 -0
  213. package/dist/render/adapters/html-preview/index.d.ts +8 -0
  214. package/dist/render/adapters/html-preview/index.d.ts.map +1 -0
  215. package/dist/render/adapters/html-preview/index.js +62 -0
  216. package/dist/render/adapters/html-preview/index.js.map +1 -0
  217. package/dist/render/adapters/test-json/index.d.ts +8 -0
  218. package/dist/render/adapters/test-json/index.d.ts.map +1 -0
  219. package/dist/render/adapters/test-json/index.js +62 -0
  220. package/dist/render/adapters/test-json/index.js.map +1 -0
  221. package/dist/render/adapters/typst-pdf/emitter.d.ts +21 -0
  222. package/dist/render/adapters/typst-pdf/emitter.d.ts.map +1 -0
  223. package/dist/render/adapters/typst-pdf/emitter.js +259 -0
  224. package/dist/render/adapters/typst-pdf/emitter.js.map +1 -0
  225. package/dist/render/adapters/typst-pdf/escape.d.ts +14 -0
  226. package/dist/render/adapters/typst-pdf/escape.d.ts.map +1 -0
  227. package/dist/render/adapters/typst-pdf/escape.js +56 -0
  228. package/dist/render/adapters/typst-pdf/escape.js.map +1 -0
  229. package/dist/render/adapters/typst-pdf/index.d.ts +9 -0
  230. package/dist/render/adapters/typst-pdf/index.d.ts.map +1 -0
  231. package/dist/render/adapters/typst-pdf/index.js +154 -0
  232. package/dist/render/adapters/typst-pdf/index.js.map +1 -0
  233. package/dist/render/adapters/typst-pdf/profile.d.ts +3 -0
  234. package/dist/render/adapters/typst-pdf/profile.d.ts.map +1 -0
  235. package/dist/render/adapters/typst-pdf/profile.js +55 -0
  236. package/dist/render/adapters/typst-pdf/profile.js.map +1 -0
  237. package/dist/render/adapters/typst-pdf/runner.d.ts +52 -0
  238. package/dist/render/adapters/typst-pdf/runner.d.ts.map +1 -0
  239. package/dist/render/adapters/typst-pdf/runner.js +209 -0
  240. package/dist/render/adapters/typst-pdf/runner.js.map +1 -0
  241. package/dist/render/adapters/typst-pdf/setup.d.ts +30 -0
  242. package/dist/render/adapters/typst-pdf/setup.d.ts.map +1 -0
  243. package/dist/render/adapters/typst-pdf/setup.js +183 -0
  244. package/dist/render/adapters/typst-pdf/setup.js.map +1 -0
  245. package/dist/render/adapters/typst-pdf/version.d.ts +8 -0
  246. package/dist/render/adapters/typst-pdf/version.d.ts.map +1 -0
  247. package/dist/render/adapters/typst-pdf/version.js +14 -0
  248. package/dist/render/adapters/typst-pdf/version.js.map +1 -0
  249. package/dist/render/assemble.d.ts +28 -0
  250. package/dist/render/assemble.d.ts.map +1 -0
  251. package/dist/render/assemble.js +309 -0
  252. package/dist/render/assemble.js.map +1 -0
  253. package/dist/render/assets.d.ts +27 -0
  254. package/dist/render/assets.d.ts.map +1 -0
  255. package/dist/render/assets.js +232 -0
  256. package/dist/render/assets.js.map +1 -0
  257. package/dist/render/build.d.ts +43 -0
  258. package/dist/render/build.d.ts.map +1 -0
  259. package/dist/render/build.js +187 -0
  260. package/dist/render/build.js.map +1 -0
  261. package/dist/render/charts.d.ts +83 -0
  262. package/dist/render/charts.d.ts.map +1 -0
  263. package/dist/render/charts.js +633 -0
  264. package/dist/render/charts.js.map +1 -0
  265. package/dist/render/default-registry.d.ts +7 -0
  266. package/dist/render/default-registry.d.ts.map +1 -0
  267. package/dist/render/default-registry.js +15 -0
  268. package/dist/render/default-registry.js.map +1 -0
  269. package/dist/render/diagram-theme.d.ts +7 -0
  270. package/dist/render/diagram-theme.d.ts.map +1 -0
  271. package/dist/render/diagram-theme.js +50 -0
  272. package/dist/render/diagram-theme.js.map +1 -0
  273. package/dist/render/dialect.d.ts +23 -0
  274. package/dist/render/dialect.d.ts.map +1 -0
  275. package/dist/render/dialect.js +188 -0
  276. package/dist/render/dialect.js.map +1 -0
  277. package/dist/render/html/citations.d.ts +70 -0
  278. package/dist/render/html/citations.d.ts.map +1 -0
  279. package/dist/render/html/citations.js +371 -0
  280. package/dist/render/html/citations.js.map +1 -0
  281. package/dist/render/html/css.d.ts +14 -0
  282. package/dist/render/html/css.d.ts.map +1 -0
  283. package/dist/render/html/css.js +113 -0
  284. package/dist/render/html/css.js.map +1 -0
  285. package/dist/render/html/emitter.d.ts +20 -0
  286. package/dist/render/html/emitter.d.ts.map +1 -0
  287. package/dist/render/html/emitter.js +652 -0
  288. package/dist/render/html/emitter.js.map +1 -0
  289. package/dist/render/html/escape.d.ts +11 -0
  290. package/dist/render/html/escape.d.ts.map +1 -0
  291. package/dist/render/html/escape.js +32 -0
  292. package/dist/render/html/escape.js.map +1 -0
  293. package/dist/render/html/katex.d.ts +9 -0
  294. package/dist/render/html/katex.d.ts.map +1 -0
  295. package/dist/render/html/katex.js +39 -0
  296. package/dist/render/html/katex.js.map +1 -0
  297. package/dist/render/html/stage.d.ts +12 -0
  298. package/dist/render/html/stage.d.ts.map +1 -0
  299. package/dist/render/html/stage.js +30 -0
  300. package/dist/render/html/stage.js.map +1 -0
  301. package/dist/render/index.d.ts +5 -0
  302. package/dist/render/index.d.ts.map +1 -0
  303. package/dist/render/index.js +5 -0
  304. package/dist/render/index.js.map +1 -0
  305. package/dist/render/math.d.ts +9 -0
  306. package/dist/render/math.d.ts.map +1 -0
  307. package/dist/render/math.js +60 -0
  308. package/dist/render/math.js.map +1 -0
  309. package/dist/render/model.d.ts +233 -0
  310. package/dist/render/model.d.ts.map +1 -0
  311. package/dist/render/model.js +2 -0
  312. package/dist/render/model.js.map +1 -0
  313. package/dist/render/numbering.d.ts +51 -0
  314. package/dist/render/numbering.d.ts.map +1 -0
  315. package/dist/render/numbering.js +155 -0
  316. package/dist/render/numbering.js.map +1 -0
  317. package/dist/render/output-name.d.ts +4 -0
  318. package/dist/render/output-name.d.ts.map +1 -0
  319. package/dist/render/output-name.js +11 -0
  320. package/dist/render/output-name.js.map +1 -0
  321. package/dist/render/palettes.d.ts +22 -0
  322. package/dist/render/palettes.d.ts.map +1 -0
  323. package/dist/render/palettes.js +46 -0
  324. package/dist/render/palettes.js.map +1 -0
  325. package/dist/render/parse.d.ts +15 -0
  326. package/dist/render/parse.d.ts.map +1 -0
  327. package/dist/render/parse.js +637 -0
  328. package/dist/render/parse.js.map +1 -0
  329. package/dist/render/port.d.ts +79 -0
  330. package/dist/render/port.d.ts.map +1 -0
  331. package/dist/render/port.js +2 -0
  332. package/dist/render/port.js.map +1 -0
  333. package/dist/render/registry.d.ts +11 -0
  334. package/dist/render/registry.d.ts.map +1 -0
  335. package/dist/render/registry.js +21 -0
  336. package/dist/render/registry.js.map +1 -0
  337. package/dist/render/text.d.ts +13 -0
  338. package/dist/render/text.d.ts.map +1 -0
  339. package/dist/render/text.js +65 -0
  340. package/dist/render/text.js.map +1 -0
  341. package/dist/render/walk.d.ts +13 -0
  342. package/dist/render/walk.d.ts.map +1 -0
  343. package/dist/render/walk.js +69 -0
  344. package/dist/render/walk.js.map +1 -0
  345. package/dist/research/bibtex.d.ts +12 -0
  346. package/dist/research/bibtex.d.ts.map +1 -0
  347. package/dist/research/bibtex.js +99 -0
  348. package/dist/research/bibtex.js.map +1 -0
  349. package/dist/research/client.d.ts +112 -0
  350. package/dist/research/client.d.ts.map +1 -0
  351. package/dist/research/client.js +661 -0
  352. package/dist/research/client.js.map +1 -0
  353. package/dist/research/dossier.d.ts +31 -0
  354. package/dist/research/dossier.d.ts.map +1 -0
  355. package/dist/research/dossier.js +54 -0
  356. package/dist/research/dossier.js.map +1 -0
  357. package/dist/research/flow.d.ts +31 -0
  358. package/dist/research/flow.d.ts.map +1 -0
  359. package/dist/research/flow.js +635 -0
  360. package/dist/research/flow.js.map +1 -0
  361. package/dist/research/library.d.ts +79 -0
  362. package/dist/research/library.d.ts.map +1 -0
  363. package/dist/research/library.js +319 -0
  364. package/dist/research/library.js.map +1 -0
  365. package/dist/research/verify.d.ts +80 -0
  366. package/dist/research/verify.d.ts.map +1 -0
  367. package/dist/research/verify.js +307 -0
  368. package/dist/research/verify.js.map +1 -0
  369. package/dist/resources.d.ts +15 -0
  370. package/dist/resources.d.ts.map +1 -0
  371. package/dist/resources.js +148 -0
  372. package/dist/resources.js.map +1 -0
  373. package/dist/review.d.ts +22 -0
  374. package/dist/review.d.ts.map +1 -0
  375. package/dist/review.js +355 -0
  376. package/dist/review.js.map +1 -0
  377. package/dist/schemas.d.ts +252 -0
  378. package/dist/schemas.d.ts.map +1 -0
  379. package/dist/schemas.js +1020 -0
  380. package/dist/schemas.js.map +1 -0
  381. package/dist/sections.d.ts +30 -0
  382. package/dist/sections.d.ts.map +1 -0
  383. package/dist/sections.js +62 -0
  384. package/dist/sections.js.map +1 -0
  385. package/dist/storage.d.ts +21 -0
  386. package/dist/storage.d.ts.map +1 -0
  387. package/dist/storage.js +296 -0
  388. package/dist/storage.js.map +1 -0
  389. package/dist/style-commands.d.ts +15 -0
  390. package/dist/style-commands.d.ts.map +1 -0
  391. package/dist/style-commands.js +54 -0
  392. package/dist/style-commands.js.map +1 -0
  393. package/dist/styles/csl.d.ts +58 -0
  394. package/dist/styles/csl.d.ts.map +1 -0
  395. package/dist/styles/csl.js +112 -0
  396. package/dist/styles/csl.js.map +1 -0
  397. package/dist/styles/discovery.d.ts +45 -0
  398. package/dist/styles/discovery.d.ts.map +1 -0
  399. package/dist/styles/discovery.js +99 -0
  400. package/dist/styles/discovery.js.map +1 -0
  401. package/dist/styles/golden.d.ts +52 -0
  402. package/dist/styles/golden.d.ts.map +1 -0
  403. package/dist/styles/golden.js +216 -0
  404. package/dist/styles/golden.js.map +1 -0
  405. package/dist/styles/profile.d.ts +126 -0
  406. package/dist/styles/profile.d.ts.map +1 -0
  407. package/dist/styles/profile.js +582 -0
  408. package/dist/styles/profile.js.map +1 -0
  409. package/dist/styles/xml.d.ts +22 -0
  410. package/dist/styles/xml.d.ts.map +1 -0
  411. package/dist/styles/xml.js +179 -0
  412. package/dist/styles/xml.js.map +1 -0
  413. package/dist/types.d.ts +285 -0
  414. package/dist/types.d.ts.map +1 -0
  415. package/dist/types.js +155 -0
  416. package/dist/types.js.map +1 -0
  417. package/dist/typst-pins.d.ts +16 -0
  418. package/dist/typst-pins.d.ts.map +1 -0
  419. package/dist/typst-pins.js +39 -0
  420. package/dist/typst-pins.js.map +1 -0
  421. package/dist/version.d.ts +2 -0
  422. package/dist/version.d.ts.map +1 -0
  423. package/dist/version.js +3 -0
  424. package/dist/version.js.map +1 -0
  425. package/dist/workflow.d.ts +49 -0
  426. package/dist/workflow.d.ts.map +1 -0
  427. package/dist/workflow.js +722 -0
  428. package/dist/workflow.js.map +1 -0
  429. package/dist/workspace.d.ts +12 -0
  430. package/dist/workspace.d.ts.map +1 -0
  431. package/dist/workspace.js +71 -0
  432. package/dist/workspace.js.map +1 -0
  433. package/package.json +70 -0
  434. package/policy-packs/countries/CO/academic-standards/ntc-1486-2022.yaml +188 -0
  435. package/policy-packs/countries/CO/copyright/decision-andina-351.yaml +61 -0
  436. package/policy-packs/countries/CO/copyright/ley-1915-2018.yaml +25 -0
  437. package/policy-packs/countries/CO/copyright/ley-23-1982.yaml +64 -0
  438. package/policy-packs/countries/CO/domains/health/resolucion-8430-1993.yaml +219 -0
  439. package/policy-packs/countries/CO/higher-education/ley-30-1992.yaml +61 -0
  440. package/policy-packs/countries/CO/manifest.yaml +42 -0
  441. package/policy-packs/countries/CO/official-domains.yaml +90 -0
  442. package/policy-packs/countries/CO/privacy/ley-1581-2012.yaml +197 -0
  443. package/policy-packs/countries/CO/research-integrity/minciencias-res-0314-2018.yaml +64 -0
  444. package/policy-packs/global/academic-integrity.yaml +45 -0
  445. package/policy-packs/global/academic-writing.yaml +70 -0
  446. package/policy-packs/global/evidence-quality.yaml +81 -0
  447. package/policy-packs/global/manifest.yaml +54 -0
  448. package/policy-packs/global/objective-verbs.yaml +245 -0
  449. package/policy-packs/global/reporting-guidelines.yaml +392 -0
  450. package/policy-packs/global/work-types.yaml +195 -0
  451. package/styles/LICENSE-CSL +375 -0
  452. package/styles/apa.csl +2283 -0
  453. package/styles/catalog.json +43 -0
  454. package/styles/fixtures/apa-7.expected.json +25 -0
  455. package/styles/fixtures/icontec-ntc1486-2022.expected.json +25 -0
  456. package/styles/fixtures/ieee.expected.json +25 -0
  457. package/styles/fixtures/references.jsonl +8 -0
  458. package/styles/icontec-ntc1486-2022.csl +388 -0
  459. package/styles/ieee.csl +519 -0
  460. package/templates/html/runtime.js +159 -0
  461. package/templates/html/thesis.css +98 -0
  462. package/templates/html/vendor/katex/LICENSE +21 -0
  463. package/templates/html/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  464. package/templates/html/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  465. package/templates/html/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  466. package/templates/html/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  467. package/templates/html/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  468. package/templates/html/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  469. package/templates/html/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  470. package/templates/html/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  471. package/templates/html/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  472. package/templates/html/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  473. package/templates/html/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  474. package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  475. package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  476. package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  477. package/templates/html/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  478. package/templates/html/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  479. package/templates/html/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  480. package/templates/html/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  481. package/templates/html/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  482. package/templates/html/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  483. package/templates/html/vendor/katex/katex.min.css +1 -0
  484. package/templates/html/vendor/katex/katex.min.js +1 -0
  485. package/templates/html/vendor/mermaid/LICENSE +21 -0
  486. package/templates/html/vendor/mermaid/mermaid.min.js +3587 -0
  487. package/templates/html/vendor/pagedjs/LICENSE +21 -0
  488. package/templates/html/vendor/pagedjs/paged.polyfill.min.js +4 -0
  489. package/templates/palettes.json +57 -0
  490. package/templates/profiles/apa-7.profile.yaml +15 -0
  491. package/templates/profiles/generic.profile.yaml +20 -0
  492. package/templates/profiles/icontec-ntc1486-2022.profile.yaml +36 -0
  493. package/templates/profiles/ieee.profile.yaml +14 -0
  494. package/templates/typst/i18n/en.yaml +31 -0
  495. package/templates/typst/i18n/es.yaml +31 -0
  496. package/templates/typst/i18n/pt.yaml +31 -0
  497. package/templates/typst/thesis.typ +276 -0
  498. package/typst-packages/preview/merman/0.3.0/LICENSE +231 -0
  499. package/typst-packages/preview/merman/0.3.0/README.md +388 -0
  500. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cose-base-v1/LICENSE +21 -0
  501. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cose-base-v2/LICENSE +21 -0
  502. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape/LICENSE +19 -0
  503. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape-cose-bilkent/LICENSE +21 -0
  504. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape-fcose/LICENSE +19 -0
  505. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/d3-shape/LICENSE +13 -0
  506. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/dagre/LICENSE +19 -0
  507. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/dompurify/LICENSE +202 -0
  508. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/eclipse-elk/LICENSE.md +264 -0
  509. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/elkjs/LICENSE.md +264 -0
  510. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/fmin/LICENSE +27 -0
  511. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/graphlib/LICENSE +19 -0
  512. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/layout-base-v1/LICENSE +21 -0
  513. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/layout-base-v2/LICENSE +21 -0
  514. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/mermaid/LICENSE +21 -0
  515. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/rough-rs/LICENSE +21 -0
  516. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/roughjs/LICENSE +21 -0
  517. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/sanitize-url/LICENSE +21 -0
  518. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/venn-js/LICENSE +22 -0
  519. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/wasm-minimal-protocol/LICENSE +24 -0
  520. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/zenuml-core/LICENSE +21 -0
  521. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_NOTICES.md +265 -0
  522. package/typst-packages/preview/merman/0.3.0/lib.typ +1 -0
  523. package/typst-packages/preview/merman/0.3.0/merman_typst_plugin.wasm +0 -0
  524. package/typst-packages/preview/merman/0.3.0/src/capabilities.typ +5 -0
  525. package/typst-packages/preview/merman/0.3.0/src/context.typ +1 -0
  526. package/typst-packages/preview/merman/0.3.0/src/errors.typ +33 -0
  527. package/typst-packages/preview/merman/0.3.0/src/exports.typ +5 -0
  528. package/typst-packages/preview/merman/0.3.0/src/figure.typ +143 -0
  529. package/typst-packages/preview/merman/0.3.0/src/image.typ +50 -0
  530. package/typst-packages/preview/merman/0.3.0/src/options.typ +566 -0
  531. package/typst-packages/preview/merman/0.3.0/src/plugin.typ +1 -0
  532. package/typst-packages/preview/merman/0.3.0/src/raw.typ +22 -0
  533. package/typst-packages/preview/merman/0.3.0/src/render.typ +137 -0
  534. package/typst-packages/preview/merman/0.3.0/src/source.typ +7 -0
  535. package/typst-packages/preview/merman/0.3.0/src/units.typ +51 -0
  536. package/typst-packages/preview/merman/0.3.0/typst.toml +12 -0
  537. package/typst-packages/preview/mitex/0.2.7/CHANGELOG.md +69 -0
  538. package/typst-packages/preview/mitex/0.2.7/LICENSE +176 -0
  539. package/typst-packages/preview/mitex/0.2.7/README.md +154 -0
  540. package/typst-packages/preview/mitex/0.2.7/lib.typ +1 -0
  541. package/typst-packages/preview/mitex/0.2.7/mitex.typ +45 -0
  542. package/typst-packages/preview/mitex/0.2.7/mitex.wasm +0 -0
  543. package/typst-packages/preview/mitex/0.2.7/specs/README.md +250 -0
  544. package/typst-packages/preview/mitex/0.2.7/specs/latex/standard.typ +1187 -0
  545. package/typst-packages/preview/mitex/0.2.7/specs/mod.typ +12 -0
  546. package/typst-packages/preview/mitex/0.2.7/specs/prelude.typ +230 -0
  547. package/typst-packages/preview/mitex/0.2.7/typst.toml +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-commands.js","sourceRoot":"","sources":["../src/style-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type XmlElement } from "./xml.js";
2
+ /** CSL 1.0.2 namespace (spec 10.4). */
3
+ export declare const cslNamespace = "http://purl.org/net/xbiblio/csl";
4
+ export interface CslIssue {
5
+ code: "CSL-001";
6
+ message: string;
7
+ hint?: string;
8
+ }
9
+ export interface CslInfo {
10
+ /** Full `<info><id>` text. */
11
+ id: string;
12
+ /** Last path segment of the id; for workspace styles it must equal the file stem. */
13
+ styleId: string;
14
+ title: string;
15
+ updated: string;
16
+ citationFormat?: string;
17
+ hasRights: boolean;
18
+ independentParent: boolean;
19
+ }
20
+ export declare const styleIdPattern: RegExp;
21
+ export declare function lastSegment(id: string): string;
22
+ /** Read the `<info>` block of a parsed style. */
23
+ export declare function readInfo(root: XmlElement): CslInfo | undefined;
24
+ export interface InspectOptions {
25
+ /** Workspace styles: the file stem the id must match. Omit for shipped styles. */
26
+ stem?: string;
27
+ /** Ids (and file stems) of shipped styles, which a workspace style may not shadow. */
28
+ shipped?: ReadonlySet<string>;
29
+ }
30
+ export interface Inspected {
31
+ issues: CslIssue[];
32
+ info?: CslInfo;
33
+ }
34
+ /** CSL-001: structural validation of a style file. */
35
+ export declare function inspectCsl(text: string, options?: InspectOptions): Inspected;
36
+ export interface CatalogEntry {
37
+ id: string;
38
+ title: string;
39
+ /** File name inside the package `styles/` folder. */
40
+ file: string;
41
+ provisional: boolean;
42
+ citationFormat: "author-date" | "numeric" | "note" | "label";
43
+ /** Evidence types the style has no source for; they fall back to the closest type (CSL-021). */
44
+ fallbackTypes?: string[];
45
+ source: {
46
+ url: string;
47
+ license: string;
48
+ retrieved: string;
49
+ basis?: string;
50
+ };
51
+ }
52
+ export interface ShippedStyle extends CatalogEntry {
53
+ text: string;
54
+ }
55
+ export declare function loadCatalog(): CatalogEntry[];
56
+ export declare function shippedStyleIds(): Set<string>;
57
+ export declare function readShippedStyle(id: string): ShippedStyle | undefined;
58
+ //# sourceMappingURL=csl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csl.d.ts","sourceRoot":"","sources":["../../src/styles/csl.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,KAAK,UAAU,EAAY,MAAM,UAAU,CAAC;AAE9F,uCAAuC;AACvC,eAAO,MAAM,YAAY,oCAAoC,CAAC;AAE9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,cAAc,QAA8B,CAAC;AAE1D,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAkB9D;AAED,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,SAAS,CAiEhF;AAMD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7D,gGAAgG;IAChG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAO5C;AAED,wBAAgB,eAAe,IAAI,GAAG,CAAC,MAAM,CAAC,CAO7C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAIrE"}
@@ -0,0 +1,112 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { packagePath } from "../package-paths.js";
3
+ import { child, childrenNamed, parseXml, walkXml, XmlError } from "./xml.js";
4
+ /** CSL 1.0.2 namespace (spec 10.4). */
5
+ export const cslNamespace = "http://purl.org/net/xbiblio/csl";
6
+ export const styleIdPattern = /^[a-z0-9][a-z0-9-]{0,62}$/;
7
+ export function lastSegment(id) {
8
+ const trimmed = id.replace(/\/+$/, "");
9
+ return trimmed.slice(trimmed.lastIndexOf("/") + 1);
10
+ }
11
+ /** Read the `<info>` block of a parsed style. */
12
+ export function readInfo(root) {
13
+ const info = child(root, "info");
14
+ if (!info)
15
+ return undefined;
16
+ const id = child(info, "id")?.text ?? "";
17
+ const category = childrenNamed(info, "category").find((entry) => "citation-format" in entry.attrs);
18
+ return {
19
+ id,
20
+ styleId: lastSegment(id),
21
+ title: child(info, "title")?.text ?? "",
22
+ updated: child(info, "updated")?.text ?? "",
23
+ ...(category ? { citationFormat: category.attrs["citation-format"] } : {}),
24
+ hasRights: childrenNamed(info, "rights").length > 0,
25
+ independentParent: childrenNamed(info, "link").some((link) => link.attrs.rel === "independent-parent"),
26
+ };
27
+ }
28
+ /** CSL-001: structural validation of a style file. */
29
+ export function inspectCsl(text, options = {}) {
30
+ const issues = [];
31
+ const add = (message, hint) => issues.push({ code: "CSL-001", message, ...(hint ? { hint } : {}) });
32
+ let root;
33
+ try {
34
+ root = parseXml(text);
35
+ }
36
+ catch (error) {
37
+ if (error instanceof XmlError) {
38
+ add(`Not a safe, well-formed CSL file: ${error.message}`, /DOCTYPE|ENTITY|Entity/.test(error.message)
39
+ ? "Remove the DOCTYPE and entity declarations; styles may not declare a DTD."
40
+ : undefined);
41
+ return { issues };
42
+ }
43
+ throw error;
44
+ }
45
+ if (root.name !== "style")
46
+ add(`The root element must be <style>, found <${root.name}>`);
47
+ if (root.attrs.xmlns !== cslNamespace)
48
+ add(`The root element must declare xmlns="${cslNamespace}"`);
49
+ if (root.attrs.version !== "1.0")
50
+ add('The root element must have version="1.0" (CSL 1.0.2)');
51
+ const info = readInfo(root);
52
+ if (!info) {
53
+ add("The style has no <info> block");
54
+ return { issues };
55
+ }
56
+ if (!info.id)
57
+ add("<info> needs an <id>");
58
+ if (!info.title)
59
+ add("<info> needs a <title>");
60
+ if (!info.updated)
61
+ add("<info> needs an <updated> timestamp");
62
+ if (!info.hasRights)
63
+ add("<info> needs a <rights> notice (license of the style)");
64
+ if (!child(root, "citation"))
65
+ add("The style has no <citation> block");
66
+ if (!child(root, "bibliography"))
67
+ add("The style has no <bibliography> block");
68
+ if (options.stem !== undefined) {
69
+ if (!styleIdPattern.test(options.stem)) {
70
+ add(`The file name "${options.stem}.csl" is not a valid style id (lowercase letters, digits and hyphens)`);
71
+ }
72
+ if (info.id && info.styleId !== options.stem) {
73
+ add(`<info><id> ends in "${info.styleId}" but the file is ${options.stem}.csl; they must match`, `Use <id>${options.stem}</id> or an id URL ending in /${options.stem}.`);
74
+ }
75
+ if (options.shipped?.has(options.stem) || (info.id && options.shipped?.has(info.styleId))) {
76
+ add(`The id "${options.stem}" shadows a style shipped with the plugin; choose another id`);
77
+ }
78
+ if (info.independentParent) {
79
+ add('Workspace styles may not use <link rel="independent-parent">; make the style self-contained');
80
+ }
81
+ }
82
+ let external = 0;
83
+ walkXml(root, (node) => {
84
+ if (node.name === "link" && node.attrs.rel === "independent-parent")
85
+ external += 1;
86
+ });
87
+ if (external > 0 && options.stem === undefined) {
88
+ // Shipped styles are independent as well; a dependent style cannot be loaded offline.
89
+ add('A shipped style may not be dependent (<link rel="independent-parent">)');
90
+ }
91
+ return { issues, info };
92
+ }
93
+ let catalog;
94
+ export function loadCatalog() {
95
+ catalog ??= JSON.parse(readFileSync(packagePath("styles", "catalog.json"), "utf8")).styles;
96
+ return catalog;
97
+ }
98
+ export function shippedStyleIds() {
99
+ const ids = new Set();
100
+ for (const entry of loadCatalog()) {
101
+ ids.add(entry.id);
102
+ ids.add(entry.file.replace(/\.csl$/, ""));
103
+ }
104
+ return ids;
105
+ }
106
+ export function readShippedStyle(id) {
107
+ const entry = loadCatalog().find((candidate) => candidate.id === id);
108
+ if (!entry)
109
+ return undefined;
110
+ return { ...entry, text: readFileSync(packagePath("styles", entry.file), "utf8") };
111
+ }
112
+ //# sourceMappingURL=csl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csl.js","sourceRoot":"","sources":["../../src/styles/csl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type CatalogEntry, type CslInfo, type CslIssue, loadCatalog } from "./csl.js";
2
+ import { type PresentationProfile, type ProfileIssue, type WorkspaceProfileFile } from "./profile.js";
3
+ /**
4
+ * Discovery of workspace styles and profiles (spec 10.4.1): `thesis/styles/*.csl`,
5
+ * `thesis/styles/*.profile.yaml` and `thesis/styles/fixtures/<id>.expected.json`. Only regular
6
+ * files are read (symlinks are ignored), each capped in size.
7
+ */
8
+ export interface WorkspaceStyleFile {
9
+ /** File stem, which is the style id. */
10
+ id: string;
11
+ /** Path relative to the thesis root. */
12
+ file: string;
13
+ text: string;
14
+ }
15
+ export interface WorkspaceStyleAssets {
16
+ styles: WorkspaceStyleFile[];
17
+ profiles: WorkspaceProfileFile[];
18
+ /** Expected renderings by style id (raw JSON text). */
19
+ fixtures: Record<string, string>;
20
+ }
21
+ export declare function loadWorkspaceStyleAssets(root: string): Promise<WorkspaceStyleAssets>;
22
+ export interface ResolvedCitationStyle {
23
+ id: string;
24
+ title: string;
25
+ source: "shipped" | "workspace";
26
+ provisional: boolean;
27
+ citationFormat: string;
28
+ /** Style file name inside the build directory. */
29
+ file: string;
30
+ text: string;
31
+ info?: CslInfo;
32
+ }
33
+ export interface StyleResolution {
34
+ style?: ResolvedCitationStyle;
35
+ issues: CslIssue[];
36
+ }
37
+ /** Find a citation style by id among the shipped catalog and the workspace styles. */
38
+ export declare function resolveCitationStyle(id: string, workspace: readonly WorkspaceStyleFile[]): StyleResolution;
39
+ export interface ProfileResolution {
40
+ profile?: PresentationProfile;
41
+ issues: ProfileIssue[];
42
+ }
43
+ export declare function resolvePresentationProfile(id: string, workspace: readonly WorkspaceProfileFile[]): ProfileResolution;
44
+ export { type CatalogEntry, loadCatalog };
45
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/styles/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,WAAW,EAGZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAEjB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAEtB;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AA6BD,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiB1F;AAMD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,SAAS,kBAAkB,EAAE,GACvC,eAAe,CAuCjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,iBAAiB,CAMnB;AAED,OAAO,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { inspectCsl, loadCatalog, readShippedStyle, shippedStyleIds, } from "./csl.js";
4
+ import { loadShippedProfile, resolveWorkspaceProfile, } from "./profile.js";
5
+ const maxFiles = 50;
6
+ const maxBytes = 4 * 1024 * 1024;
7
+ async function readFiles(directory, suffix) {
8
+ let names;
9
+ try {
10
+ names = (await readdir(directory, { withFileTypes: true }))
11
+ .filter((entry) => entry.isFile() && entry.name.endsWith(suffix))
12
+ .map((entry) => entry.name)
13
+ .sort()
14
+ .slice(0, maxFiles);
15
+ }
16
+ catch (error) {
17
+ if (error.code === "ENOENT")
18
+ return [];
19
+ throw error;
20
+ }
21
+ const out = [];
22
+ for (const name of names) {
23
+ const path = join(directory, name);
24
+ const info = await stat(path);
25
+ out.push({ name, text: info.size > maxBytes ? "" : await readFile(path, "utf8") });
26
+ }
27
+ return out;
28
+ }
29
+ export async function loadWorkspaceStyleAssets(root) {
30
+ const base = join(root, "styles");
31
+ const styles = (await readFiles(base, ".csl")).map(({ name, text }) => ({
32
+ id: name.slice(0, -4),
33
+ file: `styles/${name}`,
34
+ text,
35
+ }));
36
+ const profiles = (await readFiles(base, ".profile.yaml")).map(({ name, text }) => ({
37
+ id: name.slice(0, -".profile.yaml".length),
38
+ file: `styles/${name}`,
39
+ text,
40
+ }));
41
+ const fixtures = {};
42
+ for (const { name, text } of await readFiles(join(base, "fixtures"), ".expected.json")) {
43
+ fixtures[name.slice(0, -".expected.json".length)] = text;
44
+ }
45
+ return { styles, profiles, fixtures };
46
+ }
47
+ /** Find a citation style by id among the shipped catalog and the workspace styles. */
48
+ export function resolveCitationStyle(id, workspace) {
49
+ const shipped = readShippedStyle(id);
50
+ if (shipped) {
51
+ return {
52
+ issues: [],
53
+ style: {
54
+ id,
55
+ title: shipped.title,
56
+ source: "shipped",
57
+ provisional: shipped.provisional,
58
+ citationFormat: shipped.citationFormat,
59
+ file: shipped.file,
60
+ text: shipped.text,
61
+ },
62
+ };
63
+ }
64
+ const found = workspace.find((entry) => entry.id === id);
65
+ if (!found) {
66
+ return {
67
+ issues: [
68
+ { code: "CSL-001", message: `Citation style "${id}" is neither shipped nor in styles/` },
69
+ ],
70
+ };
71
+ }
72
+ const inspected = inspectCsl(found.text, { stem: found.id, shipped: shippedStyleIds() });
73
+ if (inspected.issues.length > 0 || !inspected.info)
74
+ return { issues: inspected.issues };
75
+ return {
76
+ issues: [],
77
+ style: {
78
+ id,
79
+ title: inspected.info.title,
80
+ source: "workspace",
81
+ provisional: false,
82
+ citationFormat: inspected.info.citationFormat ?? "author-date",
83
+ file: `${id}.csl`,
84
+ text: found.text,
85
+ info: inspected.info,
86
+ },
87
+ };
88
+ }
89
+ export function resolvePresentationProfile(id, workspace) {
90
+ const shipped = loadShippedProfile(id);
91
+ if (shipped)
92
+ return { profile: shipped, issues: [] };
93
+ const found = workspace.find((entry) => entry.id === id);
94
+ if (!found)
95
+ return { issues: [] };
96
+ return resolveWorkspaceProfile(found);
97
+ }
98
+ export { loadCatalog };
99
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/styles/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { LoadedProject } from "../checks/project.js";
2
+ import type { EvidenceRecord, Finding } from "../types.js";
3
+ import { type ResolvedCitationStyle } from "./discovery.js";
4
+ /**
5
+ * Golden renderings of a citation style (CSL-010, spec 9.2 and 10.4.1). Eight fixture references
6
+ * (journal article, book, chapter, thesis, law, standard, web page, dataset) are cited once each
7
+ * and listed in a bibliography with the style; the rendered text is compared byte for byte with
8
+ * `styles/fixtures/<id>.expected.json`. The engine is Typst (its CSL processor is the one the
9
+ * thesis build uses), read through its HTML export. Without an engine the check is skipped with a
10
+ * warning. This module depends on the Typst adapter on purpose: the golden text is engine output.
11
+ */
12
+ export declare const fixtureKeys: readonly ["journal", "book", "chapter", "thesis", "law", "standard", "webpage", "dataset"];
13
+ export interface GoldenExpected {
14
+ version: 1;
15
+ styleId: string;
16
+ /** BCP-47 language the fixtures were rendered in. */
17
+ lang: string;
18
+ /** In-text citation (a footnote text for note styles) of each fixture, cited with `p. 12`. */
19
+ citations: Record<string, string>;
20
+ /** Reference list entry of each fixture. */
21
+ bibliography: Record<string, string>;
22
+ }
23
+ export declare function loadFixtureRecords(): EvidenceRecord[];
24
+ /** Plain text of an HTML fragment: tags removed, entities decoded, whitespace collapsed. */
25
+ export declare function htmlText(fragment: string): string;
26
+ /** The citation text and the first reference entry of one fixture document's HTML export. */
27
+ export declare function extractRendered(html: string): {
28
+ citation: string;
29
+ entry: string;
30
+ };
31
+ export interface RenderFixturesOptions {
32
+ binary: string;
33
+ lang?: string;
34
+ env?: NodeJS.ProcessEnv;
35
+ }
36
+ /** Render the eight fixtures with a style. Throws when Typst fails. */
37
+ export declare function renderStyleFixtures(style: Pick<ResolvedCitationStyle, "id" | "text">, options: RenderFixturesOptions): Promise<GoldenExpected>;
38
+ export declare const goldenText: (expected: GoldenExpected) => string;
39
+ /** Differences between the approved and the fresh rendering, one line each. */
40
+ export declare function diffGolden(expected: GoldenExpected, actual: GoldenExpected): string[];
41
+ export interface FixtureCheckOptions {
42
+ env: NodeJS.ProcessEnv;
43
+ cacheRoot: string;
44
+ /** Limit the check to one style id. */
45
+ only?: string;
46
+ }
47
+ /**
48
+ * CSL-010 for the workspace styles: render and compare. Styles without approved fixtures yield an
49
+ * info finding; without an engine the whole check is skipped with one warning.
50
+ */
51
+ export declare function styleFixtureFindings(project: LoadedProject, options: FixtureCheckOptions): Promise<Finding[]>;
52
+ //# sourceMappingURL=golden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"golden.d.ts","sourceRoot":"","sources":["../../src/styles/golden.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,KAAK,qBAAqB,EAAwB,MAAM,gBAAgB,CAAC;AAElF;;;;;;;GAOG;AAEH,eAAO,MAAM,WAAW,YACtB,SAAS,EACT,MAAM,EACN,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,SAAS,EACT,SAAS,CACD,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAOrD;AAWD,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAajF;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,uEAAuE;AACvE,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,MAAM,CAAC,EACjD,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA4CzB;AAED,eAAO,MAAM,UAAU,aAAc,cAAc,KAAG,MAAiC,CAAC;AAExF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAcrF;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,CA2EpB"}
@@ -0,0 +1,216 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { packagePath } from "../package-paths.js";
6
+ import { resolveTypst, runTypst } from "../render/adapters/typst-pdf/runner.js";
7
+ import { shippedStrings, typeLabels } from "../render/assemble.js";
8
+ import { bibtexEntry } from "../research/bibtex.js";
9
+ import { canonicalJson } from "../storage.js";
10
+ import { resolveCitationStyle } from "./discovery.js";
11
+ /**
12
+ * Golden renderings of a citation style (CSL-010, spec 9.2 and 10.4.1). Eight fixture references
13
+ * (journal article, book, chapter, thesis, law, standard, web page, dataset) are cited once each
14
+ * and listed in a bibliography with the style; the rendered text is compared byte for byte with
15
+ * `styles/fixtures/<id>.expected.json`. The engine is Typst (its CSL processor is the one the
16
+ * thesis build uses), read through its HTML export. Without an engine the check is skipped with a
17
+ * warning. This module depends on the Typst adapter on purpose: the golden text is engine output.
18
+ */
19
+ export const fixtureKeys = [
20
+ "journal",
21
+ "book",
22
+ "chapter",
23
+ "thesis",
24
+ "law",
25
+ "standard",
26
+ "webpage",
27
+ "dataset",
28
+ ];
29
+ export function loadFixtureRecords() {
30
+ const text = readFileSync(packagePath("styles", "fixtures", "references.jsonl"));
31
+ return text
32
+ .toString("utf8")
33
+ .split("\n")
34
+ .filter((line) => line.trim() !== "")
35
+ .map((line) => JSON.parse(line));
36
+ }
37
+ const entities = {
38
+ amp: "&",
39
+ lt: "<",
40
+ gt: ">",
41
+ quot: '"',
42
+ apos: "'",
43
+ nbsp: " ",
44
+ };
45
+ /** Plain text of an HTML fragment: tags removed, entities decoded, whitespace collapsed. */
46
+ export function htmlText(fragment) {
47
+ return fragment
48
+ .replace(/<[^>]*>/g, "")
49
+ .replace(/&(#x[0-9A-Fa-f]+|#\d+|[A-Za-z]+);/g, (match, body) => {
50
+ if (body.startsWith("#x"))
51
+ return String.fromCodePoint(Number.parseInt(body.slice(2), 16));
52
+ if (body.startsWith("#"))
53
+ return String.fromCodePoint(Number(body.slice(1)));
54
+ return entities[body] ?? match;
55
+ })
56
+ .replace(/\s+/g, " ")
57
+ .trim();
58
+ }
59
+ /** The citation text and the first reference entry of one fixture document's HTML export. */
60
+ export function extractRendered(html) {
61
+ const notes = /<section role="doc-endnotes"[^>]*>([\s\S]*?)<\/section>/.exec(html);
62
+ let citation;
63
+ if (notes) {
64
+ const item = /<li[^>]*>([\s\S]*?)<\/li>/.exec(notes[1]);
65
+ citation = htmlText((item?.[1] ?? "").replace(/<sup[^>]*>[\s\S]*?<\/sup>/g, ""));
66
+ }
67
+ else {
68
+ const paragraph = /<p>CITE:([\s\S]*?)<\/p>/.exec(html);
69
+ citation = htmlText(paragraph?.[1] ?? "");
70
+ }
71
+ const bibliography = /<section role="doc-bibliography"[^>]*>([\s\S]*?)<\/section>/.exec(html);
72
+ const entry = /<li[^>]*>([\s\S]*?)<\/li>/.exec(bibliography?.[1] ?? "");
73
+ return { citation, entry: htmlText(entry?.[1] ?? "") };
74
+ }
75
+ /** Render the eight fixtures with a style. Throws when Typst fails. */
76
+ export async function renderStyleFixtures(style, options) {
77
+ const lang = options.lang ?? "es";
78
+ const records = loadFixtureRecords();
79
+ const labels = typeLabels(shippedStrings(lang.split("-")[0] ?? "en") ?? shippedStrings("en") ?? {});
80
+ const directory = await mkdtemp(join(tmpdir(), "thesis-csl-"));
81
+ const packageCache = join(directory, ".pkgs");
82
+ const citations = {};
83
+ const bibliography = {};
84
+ try {
85
+ await mkdir(packageCache, { recursive: true });
86
+ await writeFile(join(directory, "style.csl"), style.text);
87
+ for (const key of fixtureKeys) {
88
+ const record = records.find((entry) => entry.citeKey === key);
89
+ if (!record)
90
+ throw new Error(`Fixture ${key} is missing`);
91
+ await writeFile(join(directory, "refs.bib"), bibtexEntry(record, labels));
92
+ await writeFile(join(directory, "main.typ"), `#set text(lang: "${lang.split("-")[0]}"${lang.includes("-") ? `, region: "${lang.split("-")[1]?.toLowerCase()}"` : ""})\nCITE: #cite(<${key}>, supplement: [p. 12])\n\n#bibliography("refs.bib", style: "/style.csl", title: none)\n`);
93
+ const outcome = await runTypst({
94
+ binary: options.binary,
95
+ buildDir: directory,
96
+ packageCache,
97
+ packagePath: packagePath("typst-packages"),
98
+ input: "main.typ",
99
+ output: "out.html",
100
+ html: true,
101
+ env: options.env ?? process.env,
102
+ });
103
+ if (outcome.code !== 0) {
104
+ throw new Error(`Typst could not render the fixture "${key}": ${outcome.stderr.trim().split("\n")[0] ?? "error"}`);
105
+ }
106
+ const rendered = extractRendered(await readFile(join(directory, "out.html"), "utf8"));
107
+ citations[key] = rendered.citation;
108
+ bibliography[key] = rendered.entry;
109
+ }
110
+ }
111
+ finally {
112
+ await rm(directory, { recursive: true, force: true });
113
+ }
114
+ return { version: 1, styleId: style.id, lang, citations, bibliography };
115
+ }
116
+ export const goldenText = (expected) => canonicalJson(expected);
117
+ /** Differences between the approved and the fresh rendering, one line each. */
118
+ export function diffGolden(expected, actual) {
119
+ const diffs = [];
120
+ for (const group of ["citations", "bibliography"]) {
121
+ for (const key of fixtureKeys) {
122
+ const want = expected[group][key];
123
+ const got = actual[group][key];
124
+ if (want !== got) {
125
+ diffs.push(`${group}.${key}: expected ${JSON.stringify(want ?? null)} but got ${JSON.stringify(got ?? null)}`);
126
+ }
127
+ }
128
+ }
129
+ return diffs;
130
+ }
131
+ /**
132
+ * CSL-010 for the workspace styles: render and compare. Styles without approved fixtures yield an
133
+ * info finding; without an engine the whole check is skipped with one warning.
134
+ */
135
+ export async function styleFixtureFindings(project, options) {
136
+ const styles = project.styleFiles.filter((style) => !options.only || style.id === options.only);
137
+ if (styles.length === 0)
138
+ return [];
139
+ const findings = [];
140
+ const engine = await resolveTypst(options.env, options.cacheRoot);
141
+ const withFixtures = styles.filter((style) => project.styleFixtures[style.id] !== undefined);
142
+ for (const style of styles) {
143
+ if (project.styleFixtures[style.id] === undefined) {
144
+ findings.push({
145
+ code: "CSL-010",
146
+ gate: "G0",
147
+ severity: "info",
148
+ file: style.file,
149
+ message: `Style ${style.id} has no approved fixtures (styles/fixtures/${style.id}.expected.json); its rendering is not checked`,
150
+ hint: "Approve its fixtures with /thesis:style new, or add the expected file by hand.",
151
+ });
152
+ }
153
+ }
154
+ if (withFixtures.length === 0)
155
+ return findings;
156
+ if (!engine.available) {
157
+ findings.push({
158
+ code: "CSL-010",
159
+ gate: "G0",
160
+ severity: "warning",
161
+ message: `The golden renderings of ${withFixtures.length} workspace style(s) were not checked: ${engine.reason}`,
162
+ ...(engine.hint ? { hint: engine.hint } : {}),
163
+ });
164
+ return findings;
165
+ }
166
+ for (const style of withFixtures) {
167
+ const resolved = resolveCitationStyle(style.id, project.styleFiles);
168
+ if (!resolved.style)
169
+ continue; // CSL-001 already reports it
170
+ let expected;
171
+ try {
172
+ expected = JSON.parse(project.styleFixtures[style.id]);
173
+ if (expected.version !== 1 || typeof expected.citations !== "object")
174
+ throw new Error("shape");
175
+ }
176
+ catch {
177
+ findings.push({
178
+ code: "CSL-010",
179
+ gate: "G0",
180
+ severity: "error",
181
+ file: `styles/fixtures/${style.id}.expected.json`,
182
+ message: "The expected fixtures file is not valid",
183
+ });
184
+ continue;
185
+ }
186
+ try {
187
+ const actual = await renderStyleFixtures(resolved.style, {
188
+ binary: engine.path,
189
+ lang: expected.lang,
190
+ env: options.env,
191
+ });
192
+ const diffs = diffGolden(expected, actual);
193
+ if (diffs.length > 0) {
194
+ findings.push({
195
+ code: "CSL-010",
196
+ gate: "G0",
197
+ severity: "error",
198
+ file: style.file,
199
+ message: `Style ${style.id} no longer renders its approved fixtures: ${diffs[0]}${diffs.length > 1 ? ` (+${diffs.length - 1} more)` : ""}`,
200
+ hint: "Review the change and approve new fixtures, or restore the style.",
201
+ });
202
+ }
203
+ }
204
+ catch (error) {
205
+ findings.push({
206
+ code: "CSL-010",
207
+ gate: "G0",
208
+ severity: "error",
209
+ file: style.file,
210
+ message: `Style ${style.id} could not render its fixtures: ${error.message}`,
211
+ });
212
+ }
213
+ }
214
+ return findings;
215
+ }
216
+ //# sourceMappingURL=golden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"golden.js","sourceRoot":"","sources":["../../src/styles/golden.ts"],"names":[],"mappings":"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"}