@grove-dev/core 0.3.1 → 0.3.2

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 (109) hide show
  1. package/README.md +16 -142
  2. package/dist/build-data.d.ts.map +1 -1
  3. package/dist/build-data.js +12 -4
  4. package/dist/build-data.js.map +1 -1
  5. package/dist/contributors.d.ts +3 -0
  6. package/dist/contributors.d.ts.map +1 -1
  7. package/dist/contributors.js +43 -38
  8. package/dist/contributors.js.map +1 -1
  9. package/dist/directory-client.d.ts +11 -0
  10. package/dist/directory-client.d.ts.map +1 -0
  11. package/dist/directory-client.js +11 -0
  12. package/dist/directory-client.js.map +1 -0
  13. package/dist/directory-display.d.ts +27 -0
  14. package/dist/directory-display.d.ts.map +1 -0
  15. package/dist/directory-display.js +104 -0
  16. package/dist/directory-display.js.map +1 -0
  17. package/dist/directory-format.d.ts +29 -0
  18. package/dist/directory-format.d.ts.map +1 -0
  19. package/dist/directory-format.js +72 -0
  20. package/dist/directory-format.js.map +1 -0
  21. package/dist/directory-lenses.d.ts +59 -0
  22. package/dist/directory-lenses.d.ts.map +1 -0
  23. package/dist/directory-lenses.js +199 -0
  24. package/dist/directory-lenses.js.map +1 -0
  25. package/dist/directory-repo.d.ts +20 -0
  26. package/dist/directory-repo.d.ts.map +1 -0
  27. package/dist/directory-repo.js +31 -0
  28. package/dist/directory-repo.js.map +1 -0
  29. package/dist/directory-scores.d.ts +37 -0
  30. package/dist/directory-scores.d.ts.map +1 -0
  31. package/dist/directory-scores.js +76 -0
  32. package/dist/directory-scores.js.map +1 -0
  33. package/dist/directory-search.d.ts +119 -0
  34. package/dist/directory-search.d.ts.map +1 -0
  35. package/dist/directory-search.js +398 -0
  36. package/dist/directory-search.js.map +1 -0
  37. package/dist/directory-taxonomy.d.ts +11 -0
  38. package/dist/directory-taxonomy.d.ts.map +1 -0
  39. package/dist/directory-taxonomy.js +22 -0
  40. package/dist/directory-taxonomy.js.map +1 -0
  41. package/dist/index.d.ts +9 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +17 -6
  44. package/dist/index.js.map +1 -1
  45. package/dist/llms.js +1 -1
  46. package/dist/llms.js.map +1 -1
  47. package/dist/prepare.d.ts +18 -0
  48. package/dist/prepare.d.ts.map +1 -0
  49. package/dist/prepare.js +72 -0
  50. package/dist/prepare.js.map +1 -0
  51. package/dist/schema.d.ts +53 -0
  52. package/dist/schema.d.ts.map +1 -1
  53. package/dist/schema.js +30 -0
  54. package/dist/schema.js.map +1 -1
  55. package/dist/validate.js +4 -2
  56. package/dist/validate.js.map +1 -1
  57. package/package.json +9 -2
  58. package/dist/build-data.test.d.ts +0 -2
  59. package/dist/build-data.test.d.ts.map +0 -1
  60. package/dist/build-data.test.js +0 -196
  61. package/dist/build-data.test.js.map +0 -1
  62. package/dist/contributors.test.d.ts +0 -2
  63. package/dist/contributors.test.d.ts.map +0 -1
  64. package/dist/contributors.test.js +0 -79
  65. package/dist/contributors.test.js.map +0 -1
  66. package/dist/decisions.test.d.ts +0 -2
  67. package/dist/decisions.test.d.ts.map +0 -1
  68. package/dist/decisions.test.js +0 -205
  69. package/dist/decisions.test.js.map +0 -1
  70. package/dist/enrich.test.d.ts +0 -2
  71. package/dist/enrich.test.d.ts.map +0 -1
  72. package/dist/enrich.test.js +0 -105
  73. package/dist/enrich.test.js.map +0 -1
  74. package/dist/github-client.test.d.ts +0 -2
  75. package/dist/github-client.test.d.ts.map +0 -1
  76. package/dist/github-client.test.js +0 -176
  77. package/dist/github-client.test.js.map +0 -1
  78. package/dist/github.test.d.ts +0 -2
  79. package/dist/github.test.d.ts.map +0 -1
  80. package/dist/github.test.js +0 -73
  81. package/dist/github.test.js.map +0 -1
  82. package/dist/health.test.d.ts +0 -2
  83. package/dist/health.test.d.ts.map +0 -1
  84. package/dist/health.test.js +0 -183
  85. package/dist/health.test.js.map +0 -1
  86. package/dist/importer.test.d.ts +0 -2
  87. package/dist/importer.test.d.ts.map +0 -1
  88. package/dist/importer.test.js +0 -173
  89. package/dist/importer.test.js.map +0 -1
  90. package/dist/llms.test.d.ts +0 -2
  91. package/dist/llms.test.d.ts.map +0 -1
  92. package/dist/llms.test.js +0 -39
  93. package/dist/llms.test.js.map +0 -1
  94. package/dist/public-api.test.d.ts +0 -2
  95. package/dist/public-api.test.d.ts.map +0 -1
  96. package/dist/public-api.test.js +0 -13
  97. package/dist/public-api.test.js.map +0 -1
  98. package/dist/sitemap.test.d.ts +0 -2
  99. package/dist/sitemap.test.d.ts.map +0 -1
  100. package/dist/sitemap.test.js +0 -35
  101. package/dist/sitemap.test.js.map +0 -1
  102. package/dist/slug.test.d.ts +0 -2
  103. package/dist/slug.test.d.ts.map +0 -1
  104. package/dist/slug.test.js +0 -101
  105. package/dist/slug.test.js.map +0 -1
  106. package/dist/validate.test.d.ts +0 -2
  107. package/dist/validate.test.d.ts.map +0 -1
  108. package/dist/validate.test.js +0 -272
  109. package/dist/validate.test.js.map +0 -1
@@ -1,272 +0,0 @@
1
- /**
2
- * @grove-dev/core — `validateProject` unit tests.
3
- *
4
- * The brief calls out two silent try/catch blocks in validate.ts:
5
- * - line 70: `readdir(recordsDir).catch(() => [])` — missing
6
- * records dir is silently treated as zero records.
7
- * Tests pin this behaviour so a future "throw on
8
- * missing dir" change is visible.
9
- * - line 54-69: the Zod parse step at line 109 is wrapped in a
10
- * try/catch that produces structured `zod_error`
11
- * issues. Tests cover BOTH the valid-input path
12
- * (no issues) and the malformed-input path
13
- * (one or more issues with the right codes).
14
- *
15
- * Tests use `tmpdir()` (per the brief — no fs mocks) and chdir
16
- * into the test dir for the duration of each test (validateProject
17
- * resolves paths against `process.cwd()`).
18
- */
19
- import { describe, it, expect } from "vitest";
20
- import { mkdir, writeFile, rm, mkdtemp } from "node:fs/promises";
21
- import { tmpdir } from "node:os";
22
- import { join } from "node:path";
23
- import { validateProject } from "./validate.js";
24
- function makeConfig(overrides = {}) {
25
- return {
26
- site: { name: "test", tagline: "test" },
27
- paths: {
28
- recordsDir: "data/records",
29
- generatedDir: "data/generated",
30
- health: "data/health.yml",
31
- decisions: "data/decisions.yml",
32
- },
33
- blueprint: "project-directory",
34
- nav: [],
35
- theme: {},
36
- integrations: {},
37
- ...overrides,
38
- };
39
- }
40
- /**
41
- * Run `fn` with `process.cwd()` set to a fresh tmpdir. Restores
42
- * the original CWD in a finally block so test failures (or thrown
43
- * asserts) cannot leave the runner in a deleted directory.
44
- *
45
- * `mkdtemp` is the right helper here: `os.tmpdir({prefix})` (the
46
- * Node 22 form) does NOT create a subdir, it just returns the
47
- * env TMPDIR. `mkdtemp(prefix + '-')` creates a unique directory
48
- * under the env TMPDIR.
49
- */
50
- async function withTmpCwd(prefix, fn) {
51
- const cwd = await mkdtemp(join(tmpdir(), prefix + "-"));
52
- const original = process.cwd();
53
- process.chdir(cwd);
54
- try {
55
- return await fn(cwd);
56
- }
57
- finally {
58
- process.chdir(original);
59
- await rm(cwd, { recursive: true, force: true });
60
- }
61
- }
62
- describe("validateProject — happy path", () => {
63
- it("returns ok=true with no issues when the records dir is empty", async () => {
64
- await withTmpCwd("grove-validate-empty-", async (cwd) => {
65
- await mkdir(join(cwd, "data", "records"), { recursive: true });
66
- const result = await validateProject(makeConfig());
67
- expect(result.ok).toBe(true);
68
- expect(result.errors).toEqual([]);
69
- expect(result.warnings).toEqual([]);
70
- });
71
- });
72
- it("warns when a record uses a category missing from configured taxonomy", async () => {
73
- await withTmpCwd("grove-validate-taxonomy-", async (cwd) => {
74
- await mkdir(join(cwd, "data", "records"), { recursive: true });
75
- await mkdir(join(cwd, "data", "taxonomy"), { recursive: true });
76
- await writeFile(join(cwd, "data", "taxonomy", "categories.yml"), "- id: news\n name: News and Magazine\n");
77
- await writeFile(join(cwd, "data", "records", "reader.yml"), [
78
- "kind: project",
79
- "slug: reader",
80
- "name: Reader",
81
- "description: a reader",
82
- "category: news-and-magazine",
83
- "links: {}",
84
- "curation: { reviewed: false, labels: [], lenses: [] }",
85
- "scores: {}",
86
- ].join("\n"));
87
- const result = await validateProject(makeConfig());
88
- expect(result.warnings).toContainEqual({
89
- code: "unknown_taxonomy_value",
90
- message: 'reader: category "news-and-magazine" is not defined in data/taxonomy/categories.yml',
91
- severity: "warning",
92
- });
93
- });
94
- });
95
- it("validates a single well-formed record and returns ok=true", async () => {
96
- await withTmpCwd("grove-validate-ok-", async (cwd) => {
97
- await mkdir(join(cwd, "data", "records"), { recursive: true });
98
- await writeFile(join(cwd, "data", "records", "demo.yml"), [
99
- "kind: project",
100
- "slug: demo",
101
- "name: Demo",
102
- "description: a demo",
103
- "category: tools",
104
- "links: {}",
105
- "curation: { reviewed: false, labels: [], lenses: [] }",
106
- "scores: {}",
107
- ].join("\n"));
108
- const result = await validateProject(makeConfig());
109
- expect(result.ok).toBe(true);
110
- expect(result.errors).toEqual([]);
111
- expect(result.warnings).toEqual([]);
112
- });
113
- });
114
- it("emits a slug_mismatch warning when filename and record.slug differ", async () => {
115
- await withTmpCwd("grove-validate-mismatch-", async (cwd) => {
116
- await mkdir(join(cwd, "data", "records"), { recursive: true });
117
- // Filename is "demo", record.slug is "different-slug". This
118
- // is a warning, not an error — the record is still considered
119
- // valid; the warning helps curators notice the mismatch.
120
- await writeFile(join(cwd, "data", "records", "demo.yml"), [
121
- "kind: project",
122
- "slug: different-slug",
123
- "name: Demo",
124
- "description: a demo",
125
- "category: tools",
126
- "links: {}",
127
- "curation: { reviewed: false, labels: [], lenses: [] }",
128
- "scores: {}",
129
- ].join("\n"));
130
- const result = await validateProject(makeConfig());
131
- expect(result.ok).toBe(true); // warnings do not fail by default
132
- expect(result.warnings.some((w) => w.code === "slug_mismatch")).toBe(true);
133
- });
134
- });
135
- });
136
- describe("validateProject — silent try/catch at line 70 (missing records dir)", () => {
137
- it("returns a missing_records_dir error, NOT a throw, when recordsDir does not exist", async () => {
138
- await withTmpCwd("grove-validate-missing-", async () => {
139
- // validateProject at line 60 checks `exists(recordsDir)` first
140
- // and emits a `missing_records_dir` error. The brief flagged
141
- // the readdir at line 70 with a `.catch(() => [])` as audit
142
- // concern. Pin the *current* behaviour: a missing dir is a
143
- // top-level error with the code `missing_records_dir`, not a
144
- // throw and not a silent pass.
145
- const config = makeConfig({
146
- paths: {
147
- recordsDir: "data/does-not-exist",
148
- generatedDir: "data/generated",
149
- health: "data/health.yml",
150
- decisions: "data/decisions.yml",
151
- },
152
- });
153
- const result = await validateProject(config);
154
- expect(result.ok).toBe(false);
155
- expect(result.errors.some((e) => e.code === "missing_records_dir")).toBe(true);
156
- });
157
- });
158
- });
159
- describe("validateProject — silent try/catch at lines 54-69 (Zod parse)", () => {
160
- it("emits zod_error issues for a record missing required fields", async () => {
161
- await withTmpCwd("grove-validate-bad-fields-", async (cwd) => {
162
- await mkdir(join(cwd, "data", "records"), { recursive: true });
163
- // project requires `name` (min 1). The minimal stub here is
164
- // missing it, so Zod should reject with one or more
165
- // zod_error issues — the validation pipeline's structured
166
- // error path that CLI's `grove validate` renders.
167
- await writeFile(join(cwd, "data", "records", "broken.yml"), [
168
- "kind: project",
169
- "slug: broken",
170
- "description: missing the name field",
171
- "category: tools",
172
- "links: {}",
173
- "curation: { reviewed: false, labels: [], lenses: [] }",
174
- "scores: {}",
175
- ].join("\n"));
176
- const result = await validateProject(makeConfig());
177
- expect(result.ok).toBe(false);
178
- expect(result.errors.length).toBeGreaterThan(0);
179
- // The error code from the Zod try/catch is "zod_error", and
180
- // the path should mention the missing field ("name").
181
- const zodErr = result.errors.find((e) => e.code === "zod_error");
182
- expect(zodErr).toBeDefined();
183
- expect(zodErr?.message).toContain("name");
184
- });
185
- });
186
- it("emits a schema_error (not zod_error) when the YAML is an empty mapping", async () => {
187
- await withTmpCwd("grove-validate-empty-yml-", async (cwd) => {
188
- await mkdir(join(cwd, "data", "records"), { recursive: true });
189
- // Edge case the brief flagged: parseYaml returns `null` for
190
- // an empty document, and the code at line 79-88 treats that
191
- // as `schema_error` (not zod_error) because the value never
192
- // reaches the Zod parse step. Pin the specific code.
193
- await writeFile(join(cwd, "data", "records", "empty.yml"), "");
194
- const result = await validateProject(makeConfig());
195
- expect(result.ok).toBe(false);
196
- const e = result.errors.find((err) => err.code === "schema_error");
197
- expect(e).toBeDefined();
198
- expect(e?.message).toContain("empty");
199
- });
200
- });
201
- it("strict mode: a single warning causes ok=false", async () => {
202
- await withTmpCwd("grove-validate-strict-", async (cwd) => {
203
- await mkdir(join(cwd, "data", "records"), { recursive: true });
204
- // Pin the strict-mode contract: any warning becomes a
205
- // failure. The `slug_mismatch` test above returns ok=true
206
- // (warnings don't fail by default) — the same record with
207
- // `strict: true` returns ok=false.
208
- await writeFile(join(cwd, "data", "records", "demo.yml"), [
209
- "kind: project",
210
- "slug: different-slug",
211
- "name: Demo",
212
- "description: a demo",
213
- "category: tools",
214
- "links: {}",
215
- "curation: { reviewed: false, labels: [], lenses: [] }",
216
- "scores: {}",
217
- ].join("\n"));
218
- const lenient = await validateProject(makeConfig());
219
- expect(lenient.ok).toBe(true);
220
- const strict = await validateProject(makeConfig(), { strict: true });
221
- expect(strict.ok).toBe(false);
222
- });
223
- });
224
- });
225
- describe("validateProject — decision / health cross-references", () => {
226
- it("emits unknown_decision_record when a decisions.yml references a non-existent slug", async () => {
227
- await withTmpCwd("grove-validate-xref-decision-", async (cwd) => {
228
- await mkdir(join(cwd, "data", "records"), { recursive: true });
229
- await writeFile(join(cwd, "data", "records", "real.yml"), [
230
- "kind: project",
231
- "slug: real",
232
- "name: Real",
233
- "description: real record",
234
- "category: tools",
235
- "links: {}",
236
- "curation: { reviewed: false, labels: [], lenses: [] }",
237
- "scores: {}",
238
- ].join("\n"));
239
- // decisions.yml points at "ghost" which is not in records/
240
- await writeFile(join(cwd, "data", "decisions.yml"), [
241
- "decisions:",
242
- " - id: ghost",
243
- " decision:",
244
- " visibility: hide",
245
- " reason: tested as unknown reference",
246
- ].join("\n"));
247
- const result = await validateProject(makeConfig());
248
- const e = result.errors.find((err) => err.code === "unknown_decision_record");
249
- expect(e).toBeDefined();
250
- expect(e?.message).toContain("ghost");
251
- });
252
- });
253
- it("emits missing_health when a record points at GitHub but no health.yml exists", async () => {
254
- await withTmpCwd("grove-validate-xref-health-", async (cwd) => {
255
- await mkdir(join(cwd, "data", "records"), { recursive: true });
256
- await writeFile(join(cwd, "data", "records", "needs-health.yml"), [
257
- "kind: project",
258
- "slug: needs-health",
259
- "name: Needs Health",
260
- "description: this record points at GitHub",
261
- "category: tools",
262
- "links: { github: 'https://github.com/owner/repo' }",
263
- "curation: { reviewed: false, labels: [], lenses: [] }",
264
- "scores: {}",
265
- ].join("\n"));
266
- const result = await validateProject(makeConfig());
267
- const w = result.warnings.find((warn) => warn.code === "missing_health_file");
268
- expect(w).toBeDefined();
269
- });
270
- });
271
- });
272
- //# sourceMappingURL=validate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../src/validate.test.ts"],"names":[],"mappings":"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"}