@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,454 @@
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 { isNamespaced, loadConfig, nodeIdFor, projectRefs, resolveDocsRoots, rootForNodeId, rootForPath, slugify, } from "./config.js";
6
+ const ROOT = resolve("/project");
7
+ function config(overrides = {}) {
8
+ return {
9
+ rootDir: ROOT,
10
+ docsDir: "docs",
11
+ entryPoint: "docs/README.md",
12
+ ignore: [],
13
+ ...overrides,
14
+ };
15
+ }
16
+ describe("loadConfig", () => {
17
+ const dirs = [];
18
+ function tempRoot(files = {}) {
19
+ const dir = mkdtempSync(join(tmpdir(), "weft-config-"));
20
+ dirs.push(dir);
21
+ for (const [name, content] of Object.entries(files)) {
22
+ writeFileSync(join(dir, name), content);
23
+ }
24
+ return dir;
25
+ }
26
+ afterEach(() => {
27
+ for (const dir of dirs.splice(0))
28
+ rmSync(dir, { recursive: true, force: true });
29
+ vi.restoreAllMocks();
30
+ });
31
+ it("returns defaults when no config file exists", async () => {
32
+ const root = tempRoot();
33
+ const config = await loadConfig(root);
34
+ expect(config).toEqual({
35
+ rootDir: resolve(root),
36
+ docsDir: "docs",
37
+ entryPoint: "docs/README.md",
38
+ ignore: ["**/node_modules/**", "**/dist/**", "**/_site/**", "**/_book/**", "**/.quarto/**"],
39
+ });
40
+ });
41
+ it("excludes common build output by default, but not names that are usually sources", async () => {
42
+ const { ignore } = await loadConfig(tempRoot());
43
+ expect(ignore).toContain("**/_site/**");
44
+ expect(ignore).toContain("**/_book/**");
45
+ // Excluding site/, public/, build/ or out/ by default would silently hide
46
+ // real documents in projects that keep sources there.
47
+ expect(ignore.some((p) => /(site|public|build|out)/.test(p.replace("_site", "")))).toBe(false);
48
+ });
49
+ it("loads weft.config.yaml and merges defaults", async () => {
50
+ const root = tempRoot({
51
+ "weft.config.yaml": [
52
+ "docsDir: documentation",
53
+ "layout: reader",
54
+ "docOrder:",
55
+ " - features.md",
56
+ "docOrderStrict: true",
57
+ ].join("\n"),
58
+ });
59
+ const config = await loadConfig(root);
60
+ expect(config.docsDir).toBe("documentation");
61
+ expect(config.layout).toBe("reader");
62
+ expect(config.docOrder).toEqual(["features.md"]);
63
+ expect(config.docOrderStrict).toBe(true);
64
+ expect(config.entryPoint).toBe("docs/README.md");
65
+ });
66
+ it("loads weft.config.yml", async () => {
67
+ const root = tempRoot({ "weft.config.yml": "docsDir: d" });
68
+ expect((await loadConfig(root)).docsDir).toBe("d");
69
+ });
70
+ it("loads weft.config.json", async () => {
71
+ const root = tempRoot({ "weft.config.json": '{ "docsDir": "j" }' });
72
+ expect((await loadConfig(root)).docsDir).toBe("j");
73
+ });
74
+ it("prefers .yaml over .yml and .json", async () => {
75
+ const root = tempRoot({
76
+ "weft.config.yaml": "docsDir: a",
77
+ "weft.config.yml": "docsDir: b",
78
+ "weft.config.json": '{ "docsDir": "c" }',
79
+ });
80
+ expect((await loadConfig(root)).docsDir).toBe("a");
81
+ });
82
+ it("treats an empty config file as all defaults", async () => {
83
+ const root = tempRoot({ "weft.config.yaml": "" });
84
+ expect((await loadConfig(root)).docsDir).toBe("docs");
85
+ });
86
+ it("rejects malformed yaml, naming the file", async () => {
87
+ const root = tempRoot({ "weft.config.yaml": "docsDir: [unclosed" });
88
+ await expect(loadConfig(root)).rejects.toThrow(/failed to parse weft\.config\.yaml/);
89
+ });
90
+ it("rejects a non-mapping top level", async () => {
91
+ const root = tempRoot({ "weft.config.yaml": "- just\n- a\n- list" });
92
+ await expect(loadConfig(root)).rejects.toThrow(/top-level mapping/);
93
+ });
94
+ it("rejects wrong field types, naming the field", async () => {
95
+ const root = tempRoot({ "weft.config.yaml": "docsDir: [not, a, string]" });
96
+ await expect(loadConfig(root)).rejects.toThrow(/"docsDir" must be a string/);
97
+ });
98
+ it("rejects non-string entries in string arrays", async () => {
99
+ const root = tempRoot({ "weft.config.yaml": "docOrder:\n - ok.md\n - 42" });
100
+ await expect(loadConfig(root)).rejects.toThrow(/"docOrder" must be an array of strings/);
101
+ });
102
+ it("loads artifact globs", async () => {
103
+ const root = tempRoot({ "weft.config.yaml": "artifacts:\n - '**/*.pdf'" });
104
+ expect((await loadConfig(root)).artifacts).toEqual(["**/*.pdf"]);
105
+ });
106
+ it("rejects non-string artifact globs", async () => {
107
+ const root = tempRoot({ "weft.config.yaml": "artifacts: '**/*.pdf'" });
108
+ await expect(loadConfig(root)).rejects.toThrow(/"artifacts" must be an array of strings/);
109
+ });
110
+ it("leaves artifacts unset when not configured", async () => {
111
+ const root = tempRoot({ "weft.config.yaml": "docsDir: d" });
112
+ expect((await loadConfig(root)).artifacts).toBeUndefined();
113
+ });
114
+ it("rejects bad enum values", async () => {
115
+ const root = tempRoot({ "weft.config.yaml": "layout: fancy" });
116
+ await expect(loadConfig(root)).rejects.toThrow(/"layout" must be "reader" or "default"/);
117
+ });
118
+ it("rejects a non-boolean docOrderStrict", async () => {
119
+ const root = tempRoot({ "weft.config.yaml": "docOrderStrict: yep" });
120
+ await expect(loadConfig(root)).rejects.toThrow(/"docOrderStrict" must be a boolean/);
121
+ });
122
+ it("warns on unknown keys but still loads", async () => {
123
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
124
+ const root = tempRoot({ "weft.config.yaml": "docsDir: docs\ntypo: true" });
125
+ expect((await loadConfig(root)).docsDir).toBe("docs");
126
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('unknown option "typo"'));
127
+ });
128
+ it("loads per-rule severities", async () => {
129
+ const root = tempRoot({
130
+ "weft.config.yaml": ["rules:", " edge-target-missing: warn", " some-check: off"].join("\n"),
131
+ });
132
+ expect((await loadConfig(root)).rules).toEqual({
133
+ "edge-target-missing": "warn",
134
+ "some-check": "off",
135
+ });
136
+ });
137
+ it("rejects a non-mapping rules block", async () => {
138
+ const root = tempRoot({ "weft.config.yaml": "rules:\n - edge-target-missing" });
139
+ await expect(loadConfig(root)).rejects.toThrow(/"rules" must be a mapping of rule id to severity/);
140
+ });
141
+ it("rejects an unknown severity, naming the rule", async () => {
142
+ const root = tempRoot({ "weft.config.yaml": "rules:\n some-check: fatal" });
143
+ await expect(loadConfig(root)).rejects.toThrow(/"rules\.some-check" must be "error", "warn", "info", "off"/);
144
+ });
145
+ it("loads a valid extensions map", async () => {
146
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n .qmd: markdown" });
147
+ expect((await loadConfig(root)).extensions).toEqual({ ".qmd": "markdown" });
148
+ });
149
+ it("rejects a non-object extensions value", async () => {
150
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n - .qmd" });
151
+ await expect(loadConfig(root)).rejects.toThrow(/"extensions" must be a mapping of extension to doc type/);
152
+ });
153
+ it("rejects an extensions key that does not start with a dot", async () => {
154
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n qmd: markdown" });
155
+ await expect(loadConfig(root)).rejects.toThrow(/extensions\["qmd"\]" must be a key starting/);
156
+ });
157
+ it("rejects an extensions value outside markdown/openapi", async () => {
158
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n .qmd: html" });
159
+ await expect(loadConfig(root)).rejects.toThrow(/extensions\[".qmd"\]" must be "markdown" or "openapi"/);
160
+ });
161
+ it("rejects remapping a built-in extension that contradicts EXTENSION_MAP", async () => {
162
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n .yaml: markdown" });
163
+ await expect(loadConfig(root)).rejects.toThrow(/cannot remap \.yaml.*built-in extension parsed as "openapi"/);
164
+ });
165
+ it("rejects remapping .json to markdown", async () => {
166
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n .json: markdown" });
167
+ await expect(loadConfig(root)).rejects.toThrow(/cannot remap \.json/);
168
+ });
169
+ it("allows a key that agrees with its built-in mapping, only opting it into scanning", async () => {
170
+ const root = tempRoot({ "weft.config.yaml": "extensions:\n .json: openapi" });
171
+ expect((await loadConfig(root)).extensions).toEqual({ ".json": "openapi" });
172
+ });
173
+ it("loads a valid includes block", async () => {
174
+ const root = tempRoot({
175
+ "weft.config.yaml": "includes:\n headingShift: none\n contributes: inline",
176
+ });
177
+ expect((await loadConfig(root)).includes).toEqual({
178
+ headingShift: "none",
179
+ contributes: "inline",
180
+ });
181
+ });
182
+ it("rejects a non-mapping includes value", async () => {
183
+ const root = tempRoot({ "weft.config.yaml": "includes:\n - headingShift" });
184
+ await expect(loadConfig(root)).rejects.toThrow(/"includes" must be a mapping/);
185
+ });
186
+ it("rejects an unknown include option", async () => {
187
+ const root = tempRoot({ "weft.config.yaml": "includes:\n depth: 3" });
188
+ await expect(loadConfig(root)).rejects.toThrow(/includes\.depth/);
189
+ });
190
+ it("rejects an include option value outside its enum", async () => {
191
+ const root = tempRoot({ "weft.config.yaml": "includes:\n headingShift: sideways" });
192
+ await expect(loadConfig(root)).rejects.toThrow(/"includes\.headingShift" must be "auto" or "none"/);
193
+ });
194
+ it("rejects a legacy JS/TS config with a migration message", async () => {
195
+ const root = tempRoot({ "weft.config.ts": "export default {};" });
196
+ await expect(loadConfig(root)).rejects.toThrow(/found weft\.config\.ts.*no longer supported[\s\S]*weft\.config\.yaml/);
197
+ });
198
+ it("ignores a legacy config when a static config exists", async () => {
199
+ const root = tempRoot({
200
+ "weft.config.yaml": "docsDir: d",
201
+ "weft.config.ts": "export default {};",
202
+ });
203
+ expect((await loadConfig(root)).docsDir).toBe("d");
204
+ });
205
+ });
206
+ describe("resolveDocsRoots", () => {
207
+ it("returns a single unnamespaced root when no projects are configured", () => {
208
+ const roots = resolveDocsRoots(config());
209
+ expect(roots).toHaveLength(1);
210
+ expect(roots[0].slug).toBe("");
211
+ expect(roots[0].dir).toBe("docs");
212
+ expect(roots[0].absDir).toBe(resolve(ROOT, "docs"));
213
+ expect(isNamespaced(roots)).toBe(false);
214
+ expect(projectRefs(roots)).toEqual([]);
215
+ });
216
+ it("normalizes trailing slashes and ./ prefixes", () => {
217
+ const roots = resolveDocsRoots(config({ docsDir: "./docs/" }));
218
+ expect(roots[0].dir).toBe("docs");
219
+ });
220
+ it("resolves one root per configured project", () => {
221
+ const roots = resolveDocsRoots(config({
222
+ projects: [
223
+ { name: "Alpha", docsDir: "products/alpha/docs" },
224
+ { name: "Beta", docsDir: "products/beta/docs" },
225
+ ],
226
+ }));
227
+ expect(roots.map((r) => r.slug)).toEqual(["alpha", "beta"]);
228
+ expect(roots[0].absDir).toBe(resolve(ROOT, "products/alpha/docs"));
229
+ expect(isNamespaced(roots)).toBe(true);
230
+ });
231
+ it("derives a kebab-case slug from the project name", () => {
232
+ const roots = resolveDocsRoots(config({ projects: [{ name: "Design System!", docsDir: "ds/docs" }] }));
233
+ expect(roots[0].slug).toBe("design-system");
234
+ });
235
+ it("honours an explicit slug", () => {
236
+ const roots = resolveDocsRoots(config({ projects: [{ name: "Beta", docsDir: "b/docs", slug: "b" }] }));
237
+ expect(roots[0].slug).toBe("b");
238
+ });
239
+ it("exposes projects as manifest records", () => {
240
+ const roots = resolveDocsRoots(config({ projects: [{ name: "Alpha", docsDir: "products/alpha/docs" }] }));
241
+ expect(projectRefs(roots)).toEqual([
242
+ { name: "Alpha", slug: "alpha", docsDir: "products/alpha/docs" },
243
+ ]);
244
+ });
245
+ it("throws on an empty projects array", () => {
246
+ expect(() => resolveDocsRoots(config({ projects: [] }))).toThrow(/non-empty array/);
247
+ });
248
+ it("throws on a project missing name", () => {
249
+ expect(() => resolveDocsRoots(config({ projects: [{ docsDir: "a/docs" }] }))).toThrow(/missing "name"/);
250
+ });
251
+ it("throws on a project missing docsDir", () => {
252
+ expect(() => resolveDocsRoots(config({ projects: [{ name: "Alpha" }] }))).toThrow(/missing "docsDir"/);
253
+ });
254
+ it("throws on duplicate slugs", () => {
255
+ expect(() => resolveDocsRoots(config({
256
+ projects: [
257
+ { name: "Alpha", docsDir: "a/docs" },
258
+ { name: "alpha", docsDir: "b/docs" },
259
+ ],
260
+ }))).toThrow(/duplicate project slug "alpha"/);
261
+ });
262
+ it("throws when a name yields an empty slug", () => {
263
+ expect(() => resolveDocsRoots(config({ projects: [{ name: "!!!", docsDir: "a/docs" }] }))).toThrow(/empty slug/);
264
+ });
265
+ });
266
+ describe("slugify", () => {
267
+ it("kebab-cases and strips punctuation", () => {
268
+ expect(slugify("Alpha")).toBe("alpha");
269
+ expect(slugify(" Design System ")).toBe("design-system");
270
+ expect(slugify("v2.0 API")).toBe("v2-0-api");
271
+ });
272
+ });
273
+ describe("node id helpers", () => {
274
+ const roots = resolveDocsRoots(config({
275
+ projects: [
276
+ { name: "Alpha", docsDir: "products/alpha/docs" },
277
+ { name: "Beta", docsDir: "products/beta/docs" },
278
+ ],
279
+ }));
280
+ it("namespaces ids in multi-project mode", () => {
281
+ expect(nodeIdFor(roots[0], "features.md")).toBe("alpha/features.md");
282
+ });
283
+ it("leaves ids bare in single-project mode", () => {
284
+ const [single] = resolveDocsRoots(config());
285
+ expect(nodeIdFor(single, "features.md")).toBe("features.md");
286
+ });
287
+ it("finds the root owning an absolute path", () => {
288
+ const hit = rootForPath(roots, resolve(ROOT, "products/beta/docs/api.yaml"));
289
+ expect(hit?.slug).toBe("beta");
290
+ });
291
+ it("returns undefined for a path outside every root", () => {
292
+ expect(rootForPath(roots, resolve(ROOT, "src/main.ts"))).toBeUndefined();
293
+ });
294
+ it("prefers the most deeply nested root", () => {
295
+ const nested = resolveDocsRoots(config({
296
+ projects: [
297
+ { name: "Outer", docsDir: "docs" },
298
+ { name: "Inner", docsDir: "docs/inner" },
299
+ ],
300
+ }));
301
+ expect(rootForPath(nested, resolve(ROOT, "docs/inner/a.md"))?.slug).toBe("inner");
302
+ expect(rootForPath(nested, resolve(ROOT, "docs/a.md"))?.slug).toBe("outer");
303
+ });
304
+ it("splits a node id into root and relative path", () => {
305
+ expect(rootForNodeId(roots, "beta/api.yaml")).toMatchObject({
306
+ relPath: "api.yaml",
307
+ root: { slug: "beta" },
308
+ });
309
+ });
310
+ it("returns undefined for an id with an unknown project", () => {
311
+ expect(rootForNodeId(roots, "gamma/api.yaml")).toBeUndefined();
312
+ });
313
+ });
314
+ describe("loadConfig (repos and local override)", () => {
315
+ const dirs = [];
316
+ function tempRoot(files = {}) {
317
+ const dir = mkdtempSync(join(tmpdir(), "weft-config-"));
318
+ dirs.push(dir);
319
+ for (const [name, content] of Object.entries(files)) {
320
+ writeFileSync(join(dir, name), content);
321
+ }
322
+ return dir;
323
+ }
324
+ afterEach(() => {
325
+ for (const dir of dirs.splice(0))
326
+ rmSync(dir, { recursive: true, force: true });
327
+ });
328
+ it("loads a repos map from the committed config", async () => {
329
+ const config = await loadConfig(tempRoot({ "weft.config.yaml": "repos:\n acme/alpha: ../alpha\n" }));
330
+ expect(config.repos).toEqual({ "acme/alpha": "../alpha" });
331
+ });
332
+ it("rejects a repos key that is not an org/repo identity", async () => {
333
+ const root = tempRoot({ "weft.config.yaml": "repos:\n alpha: ../alpha\n" });
334
+ await expect(loadConfig(root)).rejects.toThrow(/org\/repo/);
335
+ });
336
+ it("rejects a non-string repos value", async () => {
337
+ const root = tempRoot({ "weft.config.yaml": "repos:\n acme/alpha: 3\n" });
338
+ await expect(loadConfig(root)).rejects.toThrow(/must be a path/);
339
+ });
340
+ it("merges local repos over committed ones, per identity", async () => {
341
+ const config = await loadConfig(tempRoot({
342
+ "weft.config.yaml": "repos:\n acme/alpha: ../alpha\n acme/beta: ../beta\n",
343
+ "weft.config.local.yaml": "repos:\n acme/alpha: /checkouts/alpha\n",
344
+ }));
345
+ expect(config.repos).toEqual({ "acme/alpha": "/checkouts/alpha", "acme/beta": "../beta" });
346
+ });
347
+ it("applies local repos when no committed config exists", async () => {
348
+ const config = await loadConfig(tempRoot({ "weft.config.local.yaml": "repos:\n acme/alpha: ../alpha\n" }));
349
+ expect(config.repos).toEqual({ "acme/alpha": "../alpha" });
350
+ });
351
+ it("rejects any key other than the local allowlist in the local config", async () => {
352
+ const root = tempRoot({
353
+ "weft.config.yaml": "docsDir: docs\n",
354
+ "weft.config.local.yaml": "docsDir: elsewhere\n",
355
+ });
356
+ await expect(loadConfig(root)).rejects.toThrow(/may only set "repos", "style", "styleUrl"/);
357
+ });
358
+ it("lets the local config override the committed style", async () => {
359
+ const root = tempRoot({
360
+ "weft.config.yaml": "style: luminous-precision\n",
361
+ "weft.config.local.yaml": "style: neon-butterfly\n",
362
+ });
363
+ expect((await loadConfig(root)).style).toBe("neon-butterfly");
364
+ });
365
+ it("tolerates an empty local config file", async () => {
366
+ const config = await loadConfig(tempRoot({ "weft.config.local.yaml": "" }));
367
+ expect(config.repos).toBeUndefined();
368
+ });
369
+ it("loads a single style name", async () => {
370
+ const root = tempRoot({ "weft.config.yaml": "style: luminous-precision\n" });
371
+ expect((await loadConfig(root)).style).toBe("luminous-precision");
372
+ });
373
+ it("loads a {dark, light} pair", async () => {
374
+ const root = tempRoot({
375
+ "weft.config.yaml": "style:\n dark: luminous-precision\n light: summer-cloud\n",
376
+ });
377
+ expect((await loadConfig(root)).style).toEqual({
378
+ dark: "luminous-precision",
379
+ light: "summer-cloud",
380
+ });
381
+ });
382
+ it("rejects a non-string, non-pair style", async () => {
383
+ const root = tempRoot({ "weft.config.yaml": "style:\n - luminous-precision\n" });
384
+ await expect(loadConfig(root)).rejects.toThrow(/"style" must be a style name or a \{dark, light\} pair/);
385
+ });
386
+ it("rejects a pair missing a half", async () => {
387
+ const root = tempRoot({ "weft.config.yaml": "style:\n dark: luminous-precision\n" });
388
+ await expect(loadConfig(root)).rejects.toThrow(/"style" must be/);
389
+ });
390
+ it("rejects a pair with an extra key", async () => {
391
+ const root = tempRoot({
392
+ "weft.config.yaml": "style:\n dark: a\n light: b\n dim: c\n",
393
+ });
394
+ await expect(loadConfig(root)).rejects.toThrow(/"style" must be/);
395
+ });
396
+ it("loads styleUrl as a plain string", async () => {
397
+ const root = tempRoot({
398
+ "weft.config.yaml": "styleUrl: https://cdn.example.com/styles\n",
399
+ });
400
+ expect((await loadConfig(root)).styleUrl).toBe("https://cdn.example.com/styles");
401
+ });
402
+ });
403
+ describe("resolveDocsRoots (repo-backed roots)", () => {
404
+ it("resolves a repo-backed root against the mapped checkout", () => {
405
+ const roots = resolveDocsRoots(config({
406
+ repos: { "acme/alpha": "../alpha" },
407
+ projects: [
408
+ { name: "Meta", docsDir: "docs" },
409
+ { name: "Alpha", docsDir: "docs", repo: "acme/alpha" },
410
+ ],
411
+ }));
412
+ expect(roots[0]).toMatchObject({ slug: "meta", external: false });
413
+ expect(roots[0].repo).toBeUndefined();
414
+ expect(roots[1]).toMatchObject({
415
+ slug: "alpha",
416
+ dir: "docs",
417
+ absDir: resolve(ROOT, "../alpha/docs"),
418
+ repo: "acme/alpha",
419
+ external: true,
420
+ });
421
+ });
422
+ it("marks a plain relative root that escapes rootDir as external", () => {
423
+ const roots = resolveDocsRoots(config({ projects: [{ name: "Sibling", docsDir: "../repo-a/docs" }] }));
424
+ expect(roots[0].external).toBe(true);
425
+ expect(roots[0].repo).toBeUndefined();
426
+ });
427
+ it("marks the implicit single root external when docsDir escapes rootDir", () => {
428
+ expect(resolveDocsRoots(config({ docsDir: "../elsewhere/docs" }))[0].external).toBe(true);
429
+ expect(resolveDocsRoots(config())[0].external).toBe(false);
430
+ });
431
+ it("throws when a project names an unmapped repo, pointing at the local config", () => {
432
+ expect(() => resolveDocsRoots(config({ projects: [{ name: "Alpha", docsDir: "docs", repo: "acme/alpha" }] }))).toThrow(/weft\.config\.local\.yaml/);
433
+ });
434
+ it("throws on a repo that is not an org/repo identity", () => {
435
+ expect(() => resolveDocsRoots(config({ projects: [{ name: "Alpha", docsDir: "docs", repo: "alpha" }] }))).toThrow(/org\/repo/);
436
+ });
437
+ it("carries manifestInRepo through to the root", () => {
438
+ const roots = resolveDocsRoots(config({
439
+ repos: { "acme/alpha": "../alpha" },
440
+ projects: [{ name: "Alpha", docsDir: "docs", repo: "acme/alpha", manifestInRepo: true }],
441
+ }));
442
+ expect(roots[0].manifestInRepo).toBe(true);
443
+ });
444
+ it("records the repo identity in the project refs, keeping docsDir checkout-relative", () => {
445
+ const roots = resolveDocsRoots(config({
446
+ repos: { "acme/alpha": "../alpha" },
447
+ projects: [{ name: "Alpha", docsDir: "docs", repo: "acme/alpha" }],
448
+ }));
449
+ expect(projectRefs(roots)).toEqual([
450
+ { name: "Alpha", slug: "alpha", docsDir: "docs", repo: "acme/alpha" },
451
+ ]);
452
+ });
453
+ });
454
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Strip the platform noise that would otherwise make identical content hash
3
+ * differently in two checkouts.
4
+ *
5
+ * Git does not preserve line endings across platforms any more than it
6
+ * preserves modification times, so hashing raw bytes would make a document
7
+ * look changed purely because CI checked it out with LF and a Windows working
8
+ * tree has CRLF — meaningless in exactly the environment these checks run in.
9
+ * A leading BOM is dropped for the same reason.
10
+ */
11
+ export declare function normalizeContent(content: string): string;
12
+ /**
13
+ * Content hash of a document, over its normalized full text including any
14
+ * frontmatter.
15
+ *
16
+ * Reproducible outside Weft, which matters for a build tool that wants to
17
+ * declare what it generated rather than have Weft recompute it: strip a leading
18
+ * BOM, convert CRLF to LF, take SHA-256, keep the first 16 hex characters.
19
+ */
20
+ export declare function hashContent(content: string): string;
21
+ /**
22
+ * Content hash of a file Weft cannot read as text, over its exact bytes.
23
+ *
24
+ * Same algorithm as `hashContent` minus the normalizing, because normalizing is
25
+ * a text operation: a PDF holds byte sequences that look like CRLF and are not
26
+ * line endings, and rewriting them would hash something the file never was.
27
+ *
28
+ * The two recipes share a field on the node but are never compared with each
29
+ * other — a document's hash is only ever matched against another document's.
30
+ */
31
+ export declare function hashBytes(bytes: Uint8Array): string;
32
+ /**
33
+ * Number of lines of text, counting the way an editor and `wc -l` agree on: a
34
+ * trailing newline terminates the last line rather than starting an empty one.
35
+ */
36
+ export declare function countLines(content: string): number;
37
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,57 @@
1
+ import { createHash } from "node:crypto";
2
+ /** Characters of the hex digest kept. 64 bits is far more than a docs set needs to avoid collisions. */
3
+ const HASH_LENGTH = 16;
4
+ /**
5
+ * Strip the platform noise that would otherwise make identical content hash
6
+ * differently in two checkouts.
7
+ *
8
+ * Git does not preserve line endings across platforms any more than it
9
+ * preserves modification times, so hashing raw bytes would make a document
10
+ * look changed purely because CI checked it out with LF and a Windows working
11
+ * tree has CRLF — meaningless in exactly the environment these checks run in.
12
+ * A leading BOM is dropped for the same reason.
13
+ */
14
+ export function normalizeContent(content) {
15
+ return content.replace(/^\uFEFF/, "").replace(/\r\n/g, "\n");
16
+ }
17
+ /**
18
+ * Content hash of a document, over its normalized full text including any
19
+ * frontmatter.
20
+ *
21
+ * Reproducible outside Weft, which matters for a build tool that wants to
22
+ * declare what it generated rather than have Weft recompute it: strip a leading
23
+ * BOM, convert CRLF to LF, take SHA-256, keep the first 16 hex characters.
24
+ */
25
+ export function hashContent(content) {
26
+ return createHash("sha256")
27
+ .update(normalizeContent(content), "utf8")
28
+ .digest("hex")
29
+ .slice(0, HASH_LENGTH);
30
+ }
31
+ /**
32
+ * Content hash of a file Weft cannot read as text, over its exact bytes.
33
+ *
34
+ * Same algorithm as `hashContent` minus the normalizing, because normalizing is
35
+ * a text operation: a PDF holds byte sequences that look like CRLF and are not
36
+ * line endings, and rewriting them would hash something the file never was.
37
+ *
38
+ * The two recipes share a field on the node but are never compared with each
39
+ * other — a document's hash is only ever matched against another document's.
40
+ */
41
+ export function hashBytes(bytes) {
42
+ return createHash("sha256").update(bytes).digest("hex").slice(0, HASH_LENGTH);
43
+ }
44
+ /**
45
+ * Number of lines of text, counting the way an editor and `wc -l` agree on: a
46
+ * trailing newline terminates the last line rather than starting an empty one.
47
+ */
48
+ export function countLines(content) {
49
+ const normalized = normalizeContent(content);
50
+ if (!normalized)
51
+ return 0;
52
+ const lines = normalized.split("\n");
53
+ if (lines[lines.length - 1] === "")
54
+ lines.pop();
55
+ return lines.length;
56
+ }
57
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,wGAAwG;AACxG,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;SACzC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB;IAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACzC,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=content.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.test.d.ts","sourceRoot":"","sources":["../src/content.test.ts"],"names":[],"mappings":""}