@lepid-labs/weft-core 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 (266) hide show
  1. package/LICENSE +21 -0
  2. package/dist/anchors/__tests__/markdown.test.d.ts +2 -0
  3. package/dist/anchors/__tests__/markdown.test.d.ts.map +1 -0
  4. package/dist/anchors/__tests__/markdown.test.js +130 -0
  5. package/dist/anchors/__tests__/markdown.test.js.map +1 -0
  6. package/dist/anchors/__tests__/openapi.test.d.ts +2 -0
  7. package/dist/anchors/__tests__/openapi.test.d.ts.map +1 -0
  8. package/dist/anchors/__tests__/openapi.test.js +115 -0
  9. package/dist/anchors/__tests__/openapi.test.js.map +1 -0
  10. package/dist/anchors/index.d.ts +35 -0
  11. package/dist/anchors/index.d.ts.map +1 -0
  12. package/dist/anchors/index.js +68 -0
  13. package/dist/anchors/index.js.map +1 -0
  14. package/dist/anchors/markdown.d.ts +15 -0
  15. package/dist/anchors/markdown.d.ts.map +1 -0
  16. package/dist/anchors/markdown.js +71 -0
  17. package/dist/anchors/markdown.js.map +1 -0
  18. package/dist/anchors/openapi.d.ts +24 -0
  19. package/dist/anchors/openapi.d.ts.map +1 -0
  20. package/dist/anchors/openapi.js +75 -0
  21. package/dist/anchors/openapi.js.map +1 -0
  22. package/dist/browser.d.ts +10 -0
  23. package/dist/browser.d.ts.map +1 -0
  24. package/dist/browser.js +8 -0
  25. package/dist/browser.js.map +1 -0
  26. package/dist/config.d.ts +47 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +393 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/config.test.d.ts +2 -0
  31. package/dist/config.test.d.ts.map +1 -0
  32. package/dist/config.test.js +454 -0
  33. package/dist/config.test.js.map +1 -0
  34. package/dist/content.d.ts +37 -0
  35. package/dist/content.d.ts.map +1 -0
  36. package/dist/content.js +57 -0
  37. package/dist/content.js.map +1 -0
  38. package/dist/content.test.d.ts +2 -0
  39. package/dist/content.test.d.ts.map +1 -0
  40. package/dist/content.test.js +100 -0
  41. package/dist/content.test.js.map +1 -0
  42. package/dist/contributions.d.ts +64 -0
  43. package/dist/contributions.d.ts.map +1 -0
  44. package/dist/contributions.js +184 -0
  45. package/dist/contributions.js.map +1 -0
  46. package/dist/contributions.test.d.ts +2 -0
  47. package/dist/contributions.test.d.ts.map +1 -0
  48. package/dist/contributions.test.js +202 -0
  49. package/dist/contributions.test.js.map +1 -0
  50. package/dist/fetch/auth.d.ts +15 -0
  51. package/dist/fetch/auth.d.ts.map +1 -0
  52. package/dist/fetch/auth.js +38 -0
  53. package/dist/fetch/auth.js.map +1 -0
  54. package/dist/fetch/cache.d.ts +25 -0
  55. package/dist/fetch/cache.d.ts.map +1 -0
  56. package/dist/fetch/cache.js +68 -0
  57. package/dist/fetch/cache.js.map +1 -0
  58. package/dist/fetch/cache.test.d.ts +2 -0
  59. package/dist/fetch/cache.test.d.ts.map +1 -0
  60. package/dist/fetch/cache.test.js +73 -0
  61. package/dist/fetch/cache.test.js.map +1 -0
  62. package/dist/fetch/clone.d.ts +26 -0
  63. package/dist/fetch/clone.d.ts.map +1 -0
  64. package/dist/fetch/clone.js +105 -0
  65. package/dist/fetch/clone.js.map +1 -0
  66. package/dist/fetch/fetch.test.d.ts +2 -0
  67. package/dist/fetch/fetch.test.d.ts.map +1 -0
  68. package/dist/fetch/fetch.test.js +167 -0
  69. package/dist/fetch/fetch.test.js.map +1 -0
  70. package/dist/fetch/resolve.d.ts +34 -0
  71. package/dist/fetch/resolve.d.ts.map +1 -0
  72. package/dist/fetch/resolve.js +59 -0
  73. package/dist/fetch/resolve.js.map +1 -0
  74. package/dist/freshness.d.ts +29 -0
  75. package/dist/freshness.d.ts.map +1 -0
  76. package/dist/freshness.js +170 -0
  77. package/dist/freshness.js.map +1 -0
  78. package/dist/freshness.test.d.ts +2 -0
  79. package/dist/freshness.test.d.ts.map +1 -0
  80. package/dist/freshness.test.js +209 -0
  81. package/dist/freshness.test.js.map +1 -0
  82. package/dist/frontmatter.d.ts +15 -0
  83. package/dist/frontmatter.d.ts.map +1 -0
  84. package/dist/frontmatter.js +24 -0
  85. package/dist/frontmatter.js.map +1 -0
  86. package/dist/frontmatter.test.d.ts +2 -0
  87. package/dist/frontmatter.test.d.ts.map +1 -0
  88. package/dist/frontmatter.test.js +54 -0
  89. package/dist/frontmatter.test.js.map +1 -0
  90. package/dist/git.d.ts +55 -0
  91. package/dist/git.d.ts.map +1 -0
  92. package/dist/git.js +127 -0
  93. package/dist/git.js.map +1 -0
  94. package/dist/git.test.d.ts +2 -0
  95. package/dist/git.test.d.ts.map +1 -0
  96. package/dist/git.test.js +198 -0
  97. package/dist/git.test.js.map +1 -0
  98. package/dist/includes.d.ts +53 -0
  99. package/dist/includes.d.ts.map +1 -0
  100. package/dist/includes.js +73 -0
  101. package/dist/includes.js.map +1 -0
  102. package/dist/includes.test.d.ts +2 -0
  103. package/dist/includes.test.d.ts.map +1 -0
  104. package/dist/includes.test.js +106 -0
  105. package/dist/includes.test.js.map +1 -0
  106. package/dist/index.d.ts +33 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +23 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/links/__tests__/markdown.test.d.ts +2 -0
  111. package/dist/links/__tests__/markdown.test.d.ts.map +1 -0
  112. package/dist/links/__tests__/markdown.test.js +173 -0
  113. package/dist/links/__tests__/markdown.test.js.map +1 -0
  114. package/dist/links/__tests__/sidecar.test.d.ts +2 -0
  115. package/dist/links/__tests__/sidecar.test.d.ts.map +1 -0
  116. package/dist/links/__tests__/sidecar.test.js +238 -0
  117. package/dist/links/__tests__/sidecar.test.js.map +1 -0
  118. package/dist/links/index.d.ts +3 -0
  119. package/dist/links/index.d.ts.map +1 -0
  120. package/dist/links/index.js +3 -0
  121. package/dist/links/index.js.map +1 -0
  122. package/dist/links/markdown.d.ts +13 -0
  123. package/dist/links/markdown.d.ts.map +1 -0
  124. package/dist/links/markdown.js +93 -0
  125. package/dist/links/markdown.js.map +1 -0
  126. package/dist/links/sidecar.d.ts +12 -0
  127. package/dist/links/sidecar.d.ts.map +1 -0
  128. package/dist/links/sidecar.js +88 -0
  129. package/dist/links/sidecar.js.map +1 -0
  130. package/dist/manifest.d.ts +45 -0
  131. package/dist/manifest.d.ts.map +1 -0
  132. package/dist/manifest.js +269 -0
  133. package/dist/manifest.js.map +1 -0
  134. package/dist/manifest.test.d.ts +2 -0
  135. package/dist/manifest.test.d.ts.map +1 -0
  136. package/dist/manifest.test.js +625 -0
  137. package/dist/manifest.test.js.map +1 -0
  138. package/dist/multi-repo.test.d.ts +2 -0
  139. package/dist/multi-repo.test.d.ts.map +1 -0
  140. package/dist/multi-repo.test.js +179 -0
  141. package/dist/multi-repo.test.js.map +1 -0
  142. package/dist/node-path.d.ts +13 -0
  143. package/dist/node-path.d.ts.map +1 -0
  144. package/dist/node-path.js +21 -0
  145. package/dist/node-path.js.map +1 -0
  146. package/dist/node-path.test.d.ts +2 -0
  147. package/dist/node-path.test.d.ts.map +1 -0
  148. package/dist/node-path.test.js +29 -0
  149. package/dist/node-path.test.js.map +1 -0
  150. package/dist/published-links.d.ts +16 -0
  151. package/dist/published-links.d.ts.map +1 -0
  152. package/dist/published-links.js +59 -0
  153. package/dist/published-links.js.map +1 -0
  154. package/dist/published-links.test.d.ts +2 -0
  155. package/dist/published-links.test.d.ts.map +1 -0
  156. package/dist/published-links.test.js +82 -0
  157. package/dist/published-links.test.js.map +1 -0
  158. package/dist/repos.d.ts +32 -0
  159. package/dist/repos.d.ts.map +1 -0
  160. package/dist/repos.js +46 -0
  161. package/dist/repos.js.map +1 -0
  162. package/dist/repos.test.d.ts +2 -0
  163. package/dist/repos.test.d.ts.map +1 -0
  164. package/dist/repos.test.js +61 -0
  165. package/dist/repos.test.js.map +1 -0
  166. package/dist/scalar-source.d.ts +15 -0
  167. package/dist/scalar-source.d.ts.map +1 -0
  168. package/dist/scalar-source.js +21 -0
  169. package/dist/scalar-source.js.map +1 -0
  170. package/dist/search.d.ts +14 -0
  171. package/dist/search.d.ts.map +1 -0
  172. package/dist/search.js +59 -0
  173. package/dist/search.js.map +1 -0
  174. package/dist/service-concurrency.test.d.ts +2 -0
  175. package/dist/service-concurrency.test.d.ts.map +1 -0
  176. package/dist/service-concurrency.test.js +89 -0
  177. package/dist/service-concurrency.test.js.map +1 -0
  178. package/dist/service-history.test.d.ts +2 -0
  179. package/dist/service-history.test.d.ts.map +1 -0
  180. package/dist/service-history.test.js +76 -0
  181. package/dist/service-history.test.js.map +1 -0
  182. package/dist/service.d.ts +118 -0
  183. package/dist/service.d.ts.map +1 -0
  184. package/dist/service.js +347 -0
  185. package/dist/service.js.map +1 -0
  186. package/dist/service.test.d.ts +2 -0
  187. package/dist/service.test.d.ts.map +1 -0
  188. package/dist/service.test.js +313 -0
  189. package/dist/service.test.js.map +1 -0
  190. package/dist/types.d.ts +403 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/validate/__tests__/artifacts.test.d.ts +2 -0
  195. package/dist/validate/__tests__/artifacts.test.d.ts.map +1 -0
  196. package/dist/validate/__tests__/artifacts.test.js +167 -0
  197. package/dist/validate/__tests__/artifacts.test.js.map +1 -0
  198. package/dist/validate/__tests__/assertions.test.d.ts +2 -0
  199. package/dist/validate/__tests__/assertions.test.d.ts.map +1 -0
  200. package/dist/validate/__tests__/assertions.test.js +254 -0
  201. package/dist/validate/__tests__/assertions.test.js.map +1 -0
  202. package/dist/validate/__tests__/duplicates.test.d.ts +2 -0
  203. package/dist/validate/__tests__/duplicates.test.d.ts.map +1 -0
  204. package/dist/validate/__tests__/duplicates.test.js +130 -0
  205. package/dist/validate/__tests__/duplicates.test.js.map +1 -0
  206. package/dist/validate/__tests__/edge-resolution.test.d.ts +2 -0
  207. package/dist/validate/__tests__/edge-resolution.test.d.ts.map +1 -0
  208. package/dist/validate/__tests__/edge-resolution.test.js +279 -0
  209. package/dist/validate/__tests__/edge-resolution.test.js.map +1 -0
  210. package/dist/validate/__tests__/history.test.d.ts +2 -0
  211. package/dist/validate/__tests__/history.test.d.ts.map +1 -0
  212. package/dist/validate/__tests__/history.test.js +93 -0
  213. package/dist/validate/__tests__/history.test.js.map +1 -0
  214. package/dist/validate/__tests__/includes.test.d.ts +2 -0
  215. package/dist/validate/__tests__/includes.test.d.ts.map +1 -0
  216. package/dist/validate/__tests__/includes.test.js +93 -0
  217. package/dist/validate/__tests__/includes.test.js.map +1 -0
  218. package/dist/validate/__tests__/registry.test.d.ts +2 -0
  219. package/dist/validate/__tests__/registry.test.d.ts.map +1 -0
  220. package/dist/validate/__tests__/registry.test.js +78 -0
  221. package/dist/validate/__tests__/registry.test.js.map +1 -0
  222. package/dist/validate/__tests__/run.test.d.ts +2 -0
  223. package/dist/validate/__tests__/run.test.d.ts.map +1 -0
  224. package/dist/validate/__tests__/run.test.js +215 -0
  225. package/dist/validate/__tests__/run.test.js.map +1 -0
  226. package/dist/validate/history.d.ts +23 -0
  227. package/dist/validate/history.d.ts.map +1 -0
  228. package/dist/validate/history.js +45 -0
  229. package/dist/validate/history.js.map +1 -0
  230. package/dist/validate/index.d.ts +10 -0
  231. package/dist/validate/index.d.ts.map +1 -0
  232. package/dist/validate/index.js +9 -0
  233. package/dist/validate/index.js.map +1 -0
  234. package/dist/validate/registry.d.ts +27 -0
  235. package/dist/validate/registry.d.ts.map +1 -0
  236. package/dist/validate/registry.js +67 -0
  237. package/dist/validate/registry.js.map +1 -0
  238. package/dist/validate/rules/artifacts.d.ts +25 -0
  239. package/dist/validate/rules/artifacts.d.ts.map +1 -0
  240. package/dist/validate/rules/artifacts.js +87 -0
  241. package/dist/validate/rules/artifacts.js.map +1 -0
  242. package/dist/validate/rules/assertions.d.ts +19 -0
  243. package/dist/validate/rules/assertions.d.ts.map +1 -0
  244. package/dist/validate/rules/assertions.js +149 -0
  245. package/dist/validate/rules/assertions.js.map +1 -0
  246. package/dist/validate/rules/duplicates.d.ts +20 -0
  247. package/dist/validate/rules/duplicates.d.ts.map +1 -0
  248. package/dist/validate/rules/duplicates.js +0 -0
  249. package/dist/validate/rules/duplicates.js.map +1 -0
  250. package/dist/validate/rules/edge-resolution.d.ts +15 -0
  251. package/dist/validate/rules/edge-resolution.d.ts.map +1 -0
  252. package/dist/validate/rules/edge-resolution.js +185 -0
  253. package/dist/validate/rules/edge-resolution.js.map +1 -0
  254. package/dist/validate/rules/includes.d.ts +21 -0
  255. package/dist/validate/rules/includes.d.ts.map +1 -0
  256. package/dist/validate/rules/includes.js +112 -0
  257. package/dist/validate/rules/includes.js.map +1 -0
  258. package/dist/validate/run.d.ts +20 -0
  259. package/dist/validate/run.d.ts.map +1 -0
  260. package/dist/validate/run.js +90 -0
  261. package/dist/validate/run.js.map +1 -0
  262. package/dist/validate/types.d.ts +101 -0
  263. package/dist/validate/types.d.ts.map +1 -0
  264. package/dist/validate/types.js +2 -0
  265. package/dist/validate/types.js.map +1 -0
  266. package/package.json +54 -0
@@ -0,0 +1,100 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { countLines, hashBytes, hashContent, normalizeContent } from "./content.js";
3
+ const BOM = "\uFEFF";
4
+ describe("normalizeContent", () => {
5
+ it("converts CRLF to LF", () => {
6
+ expect(normalizeContent("a\r\nb\r\n")).toBe("a\nb\n");
7
+ });
8
+ it("strips a leading BOM", () => {
9
+ expect(normalizeContent(`${BOM}# Title`)).toBe("# Title");
10
+ });
11
+ it("leaves a BOM-like character that is not leading alone", () => {
12
+ expect(normalizeContent(`a${BOM}b`)).toBe(`a${BOM}b`);
13
+ });
14
+ it("leaves already-normalized content untouched", () => {
15
+ expect(normalizeContent("a\nb\n")).toBe("a\nb\n");
16
+ });
17
+ });
18
+ describe("hashContent", () => {
19
+ it("is stable for identical content", () => {
20
+ expect(hashContent("# Title\n")).toBe(hashContent("# Title\n"));
21
+ });
22
+ it("changes when the content changes", () => {
23
+ expect(hashContent("# Title\n")).not.toBe(hashContent("# Title!\n"));
24
+ });
25
+ // The point of normalizing: git does not preserve line endings across
26
+ // platforms, so a raw-byte hash would report every document as changed the
27
+ // moment CI checked it out with different ones.
28
+ it("is identical for CRLF and LF versions of the same document", () => {
29
+ expect(hashContent("# Title\n\nBody.\n")).toBe(hashContent("# Title\r\n\r\nBody.\r\n"));
30
+ });
31
+ it("is identical with and without a BOM", () => {
32
+ expect(hashContent("# Title\n")).toBe(hashContent(`${BOM}# Title\n`));
33
+ });
34
+ it("covers frontmatter, not just the body", () => {
35
+ const withTitle = "---\ntitle: A\n---\n\nBody.\n";
36
+ const withOther = "---\ntitle: B\n---\n\nBody.\n";
37
+ expect(hashContent(withTitle)).not.toBe(hashContent(withOther));
38
+ });
39
+ it("is a short lowercase hex digest", () => {
40
+ expect(hashContent("anything")).toMatch(/^[0-9a-f]{16}$/);
41
+ });
42
+ // Documented so an external build can declare a hash rather than have Weft
43
+ // recompute it: strip BOM, CRLF to LF, SHA-256, first 16 hex characters.
44
+ it("matches a SHA-256 of the normalized text computed independently", async () => {
45
+ const { createHash } = await import("node:crypto");
46
+ const content = "# Title\r\n";
47
+ const expected = createHash("sha256").update("# Title\n", "utf8").digest("hex").slice(0, 16);
48
+ expect(hashContent(content)).toBe(expected);
49
+ });
50
+ });
51
+ describe("hashBytes", () => {
52
+ const bytes = (...values) => Uint8Array.from(values);
53
+ it("is stable for identical bytes", () => {
54
+ expect(hashBytes(bytes(1, 2, 3))).toBe(hashBytes(bytes(1, 2, 3)));
55
+ });
56
+ it("changes when a single byte changes", () => {
57
+ expect(hashBytes(bytes(1, 2, 3))).not.toBe(hashBytes(bytes(1, 2, 4)));
58
+ });
59
+ // The opposite of hashContent on purpose: a PDF holds byte sequences that
60
+ // look like CRLF and are not line endings, so normalizing would hash
61
+ // something the file never was.
62
+ it("does not normalize line endings the way hashContent does", () => {
63
+ const crlf = bytes(0x61, 0x0d, 0x0a);
64
+ const lf = bytes(0x61, 0x0a);
65
+ expect(hashBytes(crlf)).not.toBe(hashBytes(lf));
66
+ });
67
+ it("hashes bytes that are not valid UTF-8 at all", () => {
68
+ expect(hashBytes(bytes(0xff, 0xfe, 0xfd))).toMatch(/^[0-9a-f]{16}$/);
69
+ });
70
+ it("is a short lowercase hex digest, like the text hash", () => {
71
+ expect(hashBytes(bytes(0))).toMatch(/^[0-9a-f]{16}$/);
72
+ });
73
+ it("matches a SHA-256 of the raw bytes computed independently", async () => {
74
+ const { createHash } = await import("node:crypto");
75
+ const input = bytes(0xde, 0xad, 0xbe, 0xef);
76
+ const expected = createHash("sha256").update(input).digest("hex").slice(0, 16);
77
+ expect(hashBytes(input)).toBe(expected);
78
+ });
79
+ });
80
+ describe("countLines", () => {
81
+ it("does not count a trailing newline as another line", () => {
82
+ expect(countLines("a\nb\nc\n")).toBe(3);
83
+ });
84
+ it("counts a final line with no trailing newline", () => {
85
+ expect(countLines("a\nb\nc")).toBe(3);
86
+ });
87
+ it("counts a single line", () => {
88
+ expect(countLines("just one line")).toBe(1);
89
+ });
90
+ it("counts blank lines between content", () => {
91
+ expect(countLines("a\n\nb\n")).toBe(3);
92
+ });
93
+ it("returns 0 for an empty document", () => {
94
+ expect(countLines("")).toBe(0);
95
+ });
96
+ it("counts CRLF content the same as LF", () => {
97
+ expect(countLines("a\r\nb\r\nc\r\n")).toBe(countLines("a\nb\nc\n"));
98
+ });
99
+ });
100
+ //# sourceMappingURL=content.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.test.js","sourceRoot":"","sources":["../src/content.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpF,MAAM,GAAG,GAAG,QAAQ,CAAC;AAErB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,gBAAgB,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,gBAAgB,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,2EAA2E;IAC3E,gDAAgD;IAChD,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG,+BAA+B,CAAC;QAClD,MAAM,SAAS,GAAG,+BAA+B,CAAC;QAElD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,yEAAyE;IACzE,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE7F,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,MAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/D,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,qEAAqE;IACrE,gCAAgC;IAChC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE7B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/E,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { WeftConfig, WeftEdge, WeftNode } from "./types.js";
2
+ /** Contribution file schema version this build understands. */
3
+ export declare const CONTRIBUTION_VERSION = 1;
4
+ /**
5
+ * Node fields a contribution may set on a document Weft already indexed.
6
+ *
7
+ * `id`, `type`, `anchors` and `project` are excluded on purpose: the first
8
+ * three are facts about the file Weft read, and the last is graph topology. A
9
+ * build tool contributes what it knows that Weft cannot see, and overriding
10
+ * extraction output is not that.
11
+ */
12
+ declare const PATCHABLE_FIELDS: readonly ["title", "description", "theme", "ogImage", "hiddenFromNav", "contentHash", "lineCount", "version", "modified"];
13
+ /** Field patch applied to a node that already exists in the graph. */
14
+ export type NodePatch = Partial<Pick<WeftNode, (typeof PATCHABLE_FIELDS)[number]>>;
15
+ /**
16
+ * Facts an external build declares about the graph.
17
+ *
18
+ * Weft indexes source; a renderer knows things source cannot express — what a
19
+ * templated link resolved to, what it generated and from what. One format for
20
+ * all of them, so Weft never needs a per-tool adapter.
21
+ */
22
+ export interface Contribution {
23
+ version: number;
24
+ /** Producing tool, echoed in messages so a bad contribution is traceable. */
25
+ tool?: string;
26
+ /** Nodes the build knows about that indexing source cannot discover. */
27
+ nodes?: WeftNode[];
28
+ /** Edges the build knows about. */
29
+ edges?: WeftEdge[];
30
+ /** Field patches for nodes that already exist, keyed by node id. */
31
+ metadata?: Record<string, NodePatch>;
32
+ }
33
+ /** A parsed contribution and the file it came from, for error messages. */
34
+ export interface LoadedContribution {
35
+ contribution: Contribution;
36
+ /** Path relative to the project root. */
37
+ file: string;
38
+ }
39
+ /** Validate one parsed contribution file. */
40
+ export declare function validateContribution(raw: unknown, file: string): Contribution;
41
+ /**
42
+ * Read every configured contribution file.
43
+ *
44
+ * Paths are globs relative to the project root, resolved in sorted order so a
45
+ * merge is reproducible regardless of how the filesystem enumerates them.
46
+ */
47
+ export declare function loadContributions(config: WeftConfig): Promise<LoadedContribution[]>;
48
+ /**
49
+ * Merge contributions into a graph.
50
+ *
51
+ * Order is defined and part of the contract: Weft indexes source first, then
52
+ * contributions apply in the order their files sorted. Indexing rendered output
53
+ * instead would lose sidecars and source structure, so the build contributes
54
+ * resolved facts afterwards rather than replacing the scan.
55
+ */
56
+ export declare function applyContributions(graph: {
57
+ nodes: WeftNode[];
58
+ edges: WeftEdge[];
59
+ }, contributions: LoadedContribution[]): {
60
+ nodes: WeftNode[];
61
+ edges: WeftEdge[];
62
+ };
63
+ export {};
64
+ //# sourceMappingURL=contributions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributions.d.ts","sourceRoot":"","sources":["../src/contributions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjE,+DAA+D;AAC/D,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAUtC;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,2HAYZ,CAAC;AAEX,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,mCAAmC;IACnC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrC;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;CACb;AAmED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAgC7E;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsBzF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,EAC/C,aAAa,EAAE,kBAAkB,EAAE,GACjC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAsC1C"}
@@ -0,0 +1,184 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { glob } from "glob";
4
+ import { parse } from "yaml";
5
+ /** Contribution file schema version this build understands. */
6
+ export const CONTRIBUTION_VERSION = 1;
7
+ /**
8
+ * Node types a contribution may declare.
9
+ *
10
+ * `artifact` matters most here: a build knows what it generated and from what,
11
+ * and a generated output is never discoverable by indexing source.
12
+ */
13
+ const NODE_TYPES = ["markdown", "openapi", "artifact"];
14
+ /**
15
+ * Node fields a contribution may set on a document Weft already indexed.
16
+ *
17
+ * `id`, `type`, `anchors` and `project` are excluded on purpose: the first
18
+ * three are facts about the file Weft read, and the last is graph topology. A
19
+ * build tool contributes what it knows that Weft cannot see, and overriding
20
+ * extraction output is not that.
21
+ */
22
+ const PATCHABLE_FIELDS = [
23
+ "title",
24
+ "description",
25
+ "theme",
26
+ "ogImage",
27
+ "hiddenFromNav",
28
+ "contentHash",
29
+ "lineCount",
30
+ // A build tool often knows a version Weft cannot see — one kept in a release
31
+ // file or a tag rather than in the document's own frontmatter.
32
+ "version",
33
+ "modified",
34
+ ];
35
+ function fail(file, message) {
36
+ return new Error(`weft contribution: ${message} (in ${file})`);
37
+ }
38
+ function isPlainObject(value) {
39
+ return typeof value === "object" && value !== null && !Array.isArray(value);
40
+ }
41
+ function validateNode(raw, file, index) {
42
+ if (!isPlainObject(raw))
43
+ throw fail(file, `nodes[${index}] must be a mapping`);
44
+ if (typeof raw.id !== "string" || !raw.id) {
45
+ throw fail(file, `nodes[${index}] is missing "id"`);
46
+ }
47
+ if (!NODE_TYPES.includes(raw.type)) {
48
+ throw fail(file, `nodes[${index}] ("${raw.id}") must have type ${NODE_TYPES.map((t) => `"${t}"`).join(", ")}`);
49
+ }
50
+ if (raw.anchors !== undefined && !Array.isArray(raw.anchors)) {
51
+ throw fail(file, `nodes[${index}] ("${raw.id}") has a non-array "anchors"`);
52
+ }
53
+ return {
54
+ ...raw,
55
+ title: typeof raw.title === "string" ? raw.title : raw.id,
56
+ anchors: raw.anchors ?? [],
57
+ };
58
+ }
59
+ function validateEdge(raw, file, index) {
60
+ if (!isPlainObject(raw))
61
+ throw fail(file, `edges[${index}] must be a mapping`);
62
+ const endpoint = (key) => {
63
+ const value = raw[key];
64
+ if (!isPlainObject(value) || typeof value.node !== "string" || !value.node) {
65
+ throw fail(file, `edges[${index}] needs a "${key}.node" string`);
66
+ }
67
+ return value;
68
+ };
69
+ const from = endpoint("from");
70
+ const to = endpoint("to");
71
+ if (raw.type !== undefined && typeof raw.type !== "string") {
72
+ throw fail(file, `edges[${index}] has a non-string "type"`);
73
+ }
74
+ return { ...raw, from, to, type: raw.type ?? "references" };
75
+ }
76
+ function validatePatch(raw, file, nodeId) {
77
+ if (!isPlainObject(raw))
78
+ throw fail(file, `metadata["${nodeId}"] must be a mapping`);
79
+ for (const key of Object.keys(raw)) {
80
+ if (!PATCHABLE_FIELDS.includes(key)) {
81
+ throw fail(file, `metadata["${nodeId}"] cannot set "${key}" — patchable fields are ${PATCHABLE_FIELDS.join(", ")}`);
82
+ }
83
+ }
84
+ return raw;
85
+ }
86
+ /** Validate one parsed contribution file. */
87
+ export function validateContribution(raw, file) {
88
+ if (!isPlainObject(raw))
89
+ throw fail(file, "file must contain a top-level mapping");
90
+ if (raw.version !== CONTRIBUTION_VERSION) {
91
+ throw fail(file, `"version" must be ${CONTRIBUTION_VERSION}, got ${JSON.stringify(raw.version)}`);
92
+ }
93
+ if (raw.tool !== undefined && typeof raw.tool !== "string") {
94
+ throw fail(file, '"tool" must be a string');
95
+ }
96
+ const nodes = raw.nodes ?? [];
97
+ const edges = raw.edges ?? [];
98
+ if (!Array.isArray(nodes))
99
+ throw fail(file, '"nodes" must be an array');
100
+ if (!Array.isArray(edges))
101
+ throw fail(file, '"edges" must be an array');
102
+ if (raw.metadata !== undefined && !isPlainObject(raw.metadata)) {
103
+ throw fail(file, '"metadata" must be a mapping of node id to fields');
104
+ }
105
+ const metadata = {};
106
+ for (const [nodeId, patch] of Object.entries(raw.metadata ?? {})) {
107
+ metadata[nodeId] = validatePatch(patch, file, nodeId);
108
+ }
109
+ return {
110
+ version: CONTRIBUTION_VERSION,
111
+ ...(typeof raw.tool === "string" ? { tool: raw.tool } : {}),
112
+ nodes: nodes.map((node, i) => validateNode(node, file, i)),
113
+ edges: edges.map((edge, i) => validateEdge(edge, file, i)),
114
+ metadata,
115
+ };
116
+ }
117
+ /**
118
+ * Read every configured contribution file.
119
+ *
120
+ * Paths are globs relative to the project root, resolved in sorted order so a
121
+ * merge is reproducible regardless of how the filesystem enumerates them.
122
+ */
123
+ export async function loadContributions(config) {
124
+ if (!config.contributions?.length)
125
+ return [];
126
+ const files = await glob(config.contributions, {
127
+ cwd: config.rootDir,
128
+ nodir: true,
129
+ posix: true,
130
+ });
131
+ const loaded = [];
132
+ for (const file of files.sort()) {
133
+ const source = await readFile(resolve(config.rootDir, file), "utf8");
134
+ let raw;
135
+ try {
136
+ raw = parse(source);
137
+ }
138
+ catch (err) {
139
+ throw fail(file, `failed to parse: ${err.message}`);
140
+ }
141
+ loaded.push({ contribution: validateContribution(raw ?? {}, file), file });
142
+ }
143
+ return loaded;
144
+ }
145
+ /**
146
+ * Merge contributions into a graph.
147
+ *
148
+ * Order is defined and part of the contract: Weft indexes source first, then
149
+ * contributions apply in the order their files sorted. Indexing rendered output
150
+ * instead would lose sidecars and source structure, so the build contributes
151
+ * resolved facts afterwards rather than replacing the scan.
152
+ */
153
+ export function applyContributions(graph, contributions) {
154
+ if (!contributions.length)
155
+ return graph;
156
+ const nodes = [...graph.nodes];
157
+ const edges = [...graph.edges];
158
+ const indexOf = new Map(nodes.map((node, i) => [node.id, i]));
159
+ for (const { contribution, file } of contributions) {
160
+ for (const node of contribution.nodes ?? []) {
161
+ const existing = indexOf.get(node.id);
162
+ if (existing === undefined) {
163
+ indexOf.set(node.id, nodes.length);
164
+ nodes.push(node);
165
+ continue;
166
+ }
167
+ // Weft already indexed this path. Usually that means build output is
168
+ // landing under docsDir, which is worth saying out loud.
169
+ console.warn(`weft contribution: "${node.id}" is already indexed from source; merging over it (in ${file}). Is build output inside docsDir?`);
170
+ nodes[existing] = { ...nodes[existing], ...node };
171
+ }
172
+ for (const [nodeId, patch] of Object.entries(contribution.metadata ?? {})) {
173
+ const existing = indexOf.get(nodeId);
174
+ if (existing === undefined) {
175
+ console.warn(`weft contribution: metadata for unknown node "${nodeId}" ignored (in ${file})`);
176
+ continue;
177
+ }
178
+ nodes[existing] = { ...nodes[existing], ...patch };
179
+ }
180
+ edges.push(...(contribution.edges ?? []));
181
+ }
182
+ return { nodes, edges };
183
+ }
184
+ //# sourceMappingURL=contributions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributions.js","sourceRoot":"","sources":["../src/contributions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contributions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributions.test.d.ts","sourceRoot":"","sources":["../src/contributions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { applyContributions, loadContributions, validateContribution, } from "./contributions.js";
6
+ const dirs = [];
7
+ function tempRoot(files = {}) {
8
+ const dir = mkdtempSync(join(tmpdir(), "weft-contrib-"));
9
+ dirs.push(dir);
10
+ for (const [name, content] of Object.entries(files)) {
11
+ writeFileSync(join(dir, name), content);
12
+ }
13
+ return dir;
14
+ }
15
+ afterEach(() => {
16
+ for (const dir of dirs.splice(0))
17
+ rmSync(dir, { recursive: true, force: true });
18
+ vi.restoreAllMocks();
19
+ });
20
+ function config(root, contributions) {
21
+ return {
22
+ rootDir: resolve(root),
23
+ docsDir: "docs",
24
+ entryPoint: "docs/README.md",
25
+ ignore: [],
26
+ ...(contributions ? { contributions } : {}),
27
+ };
28
+ }
29
+ function node(id, extra = {}) {
30
+ return { id, type: "markdown", title: id, anchors: [], ...extra };
31
+ }
32
+ function loaded(contribution, file = "build/weft.json") {
33
+ return { contribution: validateContribution({ version: 1, ...contribution }, file), file };
34
+ }
35
+ describe("validateContribution", () => {
36
+ it("accepts a minimal contribution", () => {
37
+ expect(validateContribution({ version: 1 }, "c.json")).toEqual({
38
+ version: 1,
39
+ nodes: [],
40
+ edges: [],
41
+ metadata: {},
42
+ });
43
+ });
44
+ it("keeps the producing tool for traceability", () => {
45
+ expect(validateContribution({ version: 1, tool: "quarto 1.4" }, "c.json").tool).toBe("quarto 1.4");
46
+ });
47
+ it("rejects a wrong schema version, naming the file", () => {
48
+ expect(() => validateContribution({ version: 99 }, "c.json")).toThrow(/"version" must be 1.*in c\.json/s);
49
+ });
50
+ it("rejects a non-mapping top level", () => {
51
+ expect(() => validateContribution([], "c.json")).toThrow(/top-level mapping/);
52
+ });
53
+ it("defaults a contributed node's title and anchors", () => {
54
+ const { nodes } = validateContribution({ version: 1, nodes: [{ id: "gen.md", type: "markdown" }] }, "c.json");
55
+ expect(nodes?.[0]).toEqual({ id: "gen.md", type: "markdown", title: "gen.md", anchors: [] });
56
+ });
57
+ it("rejects a node without an id or with an unknown type", () => {
58
+ expect(() => validateContribution({ version: 1, nodes: [{ type: "markdown" }] }, "c")).toThrow(/nodes\[0\] is missing "id"/);
59
+ expect(() => validateContribution({ version: 1, nodes: [{ id: "a.md", type: "prose" }] }, "c")).toThrow(/must have type "markdown", "openapi", "artifact"/);
60
+ });
61
+ it("accepts a contributed artifact", () => {
62
+ // The build is the only party that knows what it generated, and a
63
+ // generated output is never discoverable by indexing source.
64
+ const { nodes } = validateContribution({ version: 1, nodes: [{ id: "out/guide.pdf", type: "artifact", hiddenFromNav: true }] }, "c.json");
65
+ expect(nodes?.[0]).toMatchObject({ id: "out/guide.pdf", type: "artifact" });
66
+ });
67
+ it("accepts a contributed derives-from edge carrying a source hash", () => {
68
+ const { edges } = validateContribution({
69
+ version: 1,
70
+ edges: [
71
+ {
72
+ from: { node: "out/guide.pdf" },
73
+ to: { node: "guide.md" },
74
+ type: "derives-from",
75
+ sourceHash: "abc123abc123abc1",
76
+ },
77
+ ],
78
+ }, "c.json");
79
+ expect(edges?.[0].sourceHash).toBe("abc123abc123abc1");
80
+ });
81
+ it("defaults a contributed edge's type", () => {
82
+ const { edges } = validateContribution({ version: 1, edges: [{ from: { node: "a.md" }, to: { node: "b.md" } }] }, "c.json");
83
+ expect(edges?.[0].type).toBe("references");
84
+ });
85
+ it("rejects an edge missing an endpoint node", () => {
86
+ expect(() => validateContribution({ version: 1, edges: [{ from: { node: "a.md" }, to: {} }] }, "c")).toThrow(/edges\[0\] needs a "to\.node" string/);
87
+ });
88
+ it("rejects a metadata patch touching extraction output or identity", () => {
89
+ for (const field of ["id", "type", "anchors", "project"]) {
90
+ expect(() => validateContribution({ version: 1, metadata: { "a.md": { [field]: "x" } } }, "c")).toThrow(new RegExp(`cannot set "${field}"`));
91
+ }
92
+ });
93
+ it("accepts the patchable fields", () => {
94
+ const { metadata } = validateContribution({
95
+ version: 1,
96
+ metadata: { "a.md": { title: "Resolved", contentHash: "abc", lineCount: 12 } },
97
+ }, "c.json");
98
+ expect(metadata?.["a.md"]).toEqual({ title: "Resolved", contentHash: "abc", lineCount: 12 });
99
+ });
100
+ });
101
+ describe("loadContributions", () => {
102
+ it("returns nothing when none are configured", async () => {
103
+ expect(await loadContributions(config(tempRoot()))).toEqual([]);
104
+ });
105
+ it("reads a configured JSON contribution", async () => {
106
+ const root = tempRoot({
107
+ "weft-build.json": JSON.stringify({ version: 1, tool: "renderer", nodes: [] }),
108
+ });
109
+ const [first] = await loadContributions(config(root, ["weft-build.json"]));
110
+ expect(first.contribution.tool).toBe("renderer");
111
+ expect(first.file).toBe("weft-build.json");
112
+ });
113
+ it("reads YAML as well, since the parser is shared with config", async () => {
114
+ const root = tempRoot({ "c.yaml": "version: 1\ntool: sphinx\n" });
115
+ const [first] = await loadContributions(config(root, ["c.yaml"]));
116
+ expect(first.contribution.tool).toBe("sphinx");
117
+ });
118
+ it("resolves globs in sorted order, so a merge is reproducible", async () => {
119
+ const root = tempRoot({
120
+ "b.json": JSON.stringify({ version: 1, tool: "b" }),
121
+ "a.json": JSON.stringify({ version: 1, tool: "a" }),
122
+ });
123
+ const files = await loadContributions(config(root, ["*.json"]));
124
+ expect(files.map((f) => f.contribution.tool)).toEqual(["a", "b"]);
125
+ });
126
+ it("ignores a glob that matches nothing", async () => {
127
+ expect(await loadContributions(config(tempRoot(), ["nope/*.json"]))).toEqual([]);
128
+ });
129
+ it("reports a malformed file by name", async () => {
130
+ const root = tempRoot({ "c.json": "{ this is not valid" });
131
+ await expect(loadContributions(config(root, ["c.json"]))).rejects.toThrow(/c\.json/);
132
+ });
133
+ });
134
+ describe("applyContributions", () => {
135
+ const base = () => ({
136
+ nodes: [node("README.md"), node("api.md")],
137
+ edges: [],
138
+ });
139
+ it("returns the graph untouched when there is nothing to apply", () => {
140
+ const graph = base();
141
+ expect(applyContributions(graph, [])).toBe(graph);
142
+ });
143
+ it("adds a node the build knows about", () => {
144
+ const result = applyContributions(base(), [
145
+ loaded({ nodes: [{ id: "generated.md", type: "markdown", title: "Generated" }] }),
146
+ ]);
147
+ expect(result.nodes.map((n) => n.id)).toEqual(["README.md", "api.md", "generated.md"]);
148
+ });
149
+ it("adds edges the build knows about", () => {
150
+ const result = applyContributions(base(), [
151
+ loaded({
152
+ edges: [{ from: { node: "api.md" }, to: { node: "README.md" }, type: "derives-from" }],
153
+ }),
154
+ ]);
155
+ expect(result.edges).toHaveLength(1);
156
+ expect(result.edges[0].type).toBe("derives-from");
157
+ });
158
+ it("patches metadata onto an indexed node", () => {
159
+ // What a renderer resolved that source could not express.
160
+ const result = applyContributions(base(), [
161
+ loaded({ metadata: { "api.md": { title: "API v2.41" } } }),
162
+ ]);
163
+ expect(result.nodes.find((n) => n.id === "api.md")?.title).toBe("API v2.41");
164
+ expect(result.nodes.find((n) => n.id === "README.md")?.title).toBe("README.md");
165
+ });
166
+ it("leaves fields the patch does not mention alone", () => {
167
+ const graph = { nodes: [node("a.md", { description: "kept", lineCount: 5 })], edges: [] };
168
+ const result = applyContributions(graph, [loaded({ metadata: { "a.md": { lineCount: 9 } } })]);
169
+ expect(result.nodes[0]).toMatchObject({ description: "kept", lineCount: 9 });
170
+ });
171
+ it("warns rather than fails on metadata for an unknown node", () => {
172
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
173
+ const result = applyContributions(base(), [
174
+ loaded({ metadata: { "ghost.md": { title: "X" } } }),
175
+ ]);
176
+ expect(result.nodes).toHaveLength(2);
177
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('unknown node "ghost.md"'));
178
+ });
179
+ it("warns when a contributed node was already indexed from source", () => {
180
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
181
+ // The signature of build output landing under docsDir.
182
+ const result = applyContributions(base(), [
183
+ loaded({ nodes: [{ id: "api.md", type: "markdown", title: "Rendered API" }] }),
184
+ ]);
185
+ expect(result.nodes).toHaveLength(2);
186
+ expect(result.nodes.find((n) => n.id === "api.md")?.title).toBe("Rendered API");
187
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("already indexed from source"));
188
+ });
189
+ it("applies contributions in order, so a later one wins", () => {
190
+ const result = applyContributions(base(), [
191
+ loaded({ metadata: { "api.md": { title: "first" } } }, "a.json"),
192
+ loaded({ metadata: { "api.md": { title: "second" } } }, "b.json"),
193
+ ]);
194
+ expect(result.nodes.find((n) => n.id === "api.md")?.title).toBe("second");
195
+ });
196
+ it("does not mutate the graph it was given", () => {
197
+ const graph = base();
198
+ applyContributions(graph, [loaded({ nodes: [{ id: "new.md", type: "markdown" }] })]);
199
+ expect(graph.nodes).toHaveLength(2);
200
+ });
201
+ });
202
+ //# sourceMappingURL=contributions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributions.test.js","sourceRoot":"","sources":["../src/contributions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Resolve a GitHub token: `GH_TOKEN`, then `GITHUB_TOKEN`, then `gh auth token`
3
+ * when the GitHub CLI is on PATH. No credential store of our own — anyone with
4
+ * a private repo to fetch already has one of these.
5
+ */
6
+ export declare function resolveToken(env?: NodeJS.ProcessEnv): Promise<string | undefined>;
7
+ /**
8
+ * Environment that hands git an Authorization header for github.com.
9
+ *
10
+ * Passed as `GIT_CONFIG_*` variables rather than `-c` arguments or a rewritten
11
+ * remote URL, so the token never lands in a process listing or in the cached
12
+ * clone's `.git/config`.
13
+ */
14
+ export declare function gitAuthEnv(token: string | undefined): NodeJS.ProcessEnv;
15
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/fetch/auth.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAsB,YAAY,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAS7B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,UAAU,CAQvE"}