@grove-dev/core 0.6.1 → 0.8.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.
- package/README.md +100 -23
- package/dist/audit.d.ts +8 -3
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +29 -8
- package/dist/audit.js.map +1 -1
- package/dist/awesome-readme.d.ts.map +1 -1
- package/dist/awesome-readme.js +31 -31
- package/dist/awesome-readme.js.map +1 -1
- package/dist/build-data.d.ts +1 -1
- package/dist/build-data.d.ts.map +1 -1
- package/dist/build-data.js +132 -74
- package/dist/build-data.js.map +1 -1
- package/dist/collections-io.d.ts +1 -1
- package/dist/collections-io.js +8 -8
- package/dist/collections-io.js.map +1 -1
- package/dist/collections.d.ts +2 -2
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js +8 -9
- package/dist/collections.js.map +1 -1
- package/dist/collector.d.ts +1 -1
- package/dist/collector.d.ts.map +1 -1
- package/dist/collector.js +2 -2
- package/dist/collector.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/content-body.d.ts.map +1 -1
- package/dist/content-body.js +22 -22
- package/dist/content-body.js.map +1 -1
- package/dist/contributors.d.ts.map +1 -1
- package/dist/contributors.js +22 -23
- package/dist/contributors.js.map +1 -1
- package/dist/decisions.d.ts +1 -1
- package/dist/decisions.d.ts.map +1 -1
- package/dist/decisions.js +18 -20
- package/dist/decisions.js.map +1 -1
- package/dist/directory-client.d.ts +6 -4
- package/dist/directory-client.d.ts.map +1 -1
- package/dist/directory-client.js +9 -4
- package/dist/directory-client.js.map +1 -1
- package/dist/directory-facets.d.ts +1 -1
- package/dist/directory-facets.d.ts.map +1 -1
- package/dist/directory-facets.js +35 -17
- package/dist/directory-facets.js.map +1 -1
- package/dist/directory-filter-keys.d.ts +53 -0
- package/dist/directory-filter-keys.d.ts.map +1 -0
- package/dist/directory-filter-keys.js +66 -0
- package/dist/directory-filter-keys.js.map +1 -0
- package/dist/directory-format.d.ts.map +1 -1
- package/dist/directory-format.js +15 -15
- package/dist/directory-format.js.map +1 -1
- package/dist/directory-lenses.d.ts +1 -1
- package/dist/directory-lenses.d.ts.map +1 -1
- package/dist/directory-lenses.js +66 -61
- package/dist/directory-lenses.js.map +1 -1
- package/dist/directory-repo.js +2 -2
- package/dist/directory-scores.d.ts.map +1 -1
- package/dist/directory-scores.js +25 -25
- package/dist/directory-scores.js.map +1 -1
- package/dist/directory-search.d.ts +4 -4
- package/dist/directory-search.d.ts.map +1 -1
- package/dist/directory-search.js +99 -107
- package/dist/directory-search.js.map +1 -1
- package/dist/directory-taxonomy.d.ts +1 -1
- package/dist/directory-taxonomy.d.ts.map +1 -1
- package/dist/directory-taxonomy.js +2 -2
- package/dist/directory-taxonomy.js.map +1 -1
- package/dist/enrich.d.ts.map +1 -1
- package/dist/enrich.js +15 -12
- package/dist/enrich.js.map +1 -1
- package/dist/github-client.js +6 -6
- package/dist/github.d.ts +9 -1
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +26 -14
- package/dist/github.js.map +1 -1
- package/dist/health.d.ts +1 -1
- package/dist/health.js +44 -44
- package/dist/host.js +2 -2
- package/dist/importer.d.ts +2 -2
- package/dist/importer.d.ts.map +1 -1
- package/dist/importer.js +1 -1
- package/dist/importer.js.map +1 -1
- package/dist/index.d.ts +66 -63
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -75
- package/dist/index.js.map +1 -1
- package/dist/io.js +8 -8
- package/dist/llms.d.ts +1 -1
- package/dist/llms.d.ts.map +1 -1
- package/dist/llms.js +69 -65
- package/dist/llms.js.map +1 -1
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js.map +1 -1
- package/dist/og-image.d.ts +8 -8
- package/dist/og-image.d.ts.map +1 -1
- package/dist/og-image.js +91 -84
- package/dist/og-image.js.map +1 -1
- package/dist/page-document.d.ts +8 -8
- package/dist/page-document.d.ts.map +1 -1
- package/dist/page-document.js +48 -54
- package/dist/page-document.js.map +1 -1
- package/dist/parseReadme.d.ts.map +1 -1
- package/dist/parseReadme.js +9 -11
- package/dist/parseReadme.js.map +1 -1
- package/dist/prepare.d.ts +5 -5
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js +46 -35
- package/dist/prepare.js.map +1 -1
- package/dist/related.d.ts +1 -1
- package/dist/schema.d.ts +21 -21
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +134 -141
- package/dist/schema.js.map +1 -1
- package/dist/site-artifacts.js +1 -1
- package/dist/sitemap.d.ts +2 -2
- package/dist/sitemap.d.ts.map +1 -1
- package/dist/sitemap.js +39 -39
- package/dist/sitemap.js.map +1 -1
- package/dist/slug.js +4 -4
- package/dist/sync-icons.js +15 -15
- package/dist/taxonomy-inference.d.ts +27 -0
- package/dist/taxonomy-inference.d.ts.map +1 -0
- package/dist/taxonomy-inference.js +38 -0
- package/dist/taxonomy-inference.js.map +1 -0
- package/dist/validate.d.ts +3 -3
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +56 -58
- package/dist/validate.js.map +1 -1
- package/dist/yaml.d.ts +47 -0
- package/dist/yaml.d.ts.map +1 -0
- package/dist/yaml.js +56 -0
- package/dist/yaml.js.map +1 -0
- package/package.json +1 -1
package/dist/schema.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from 'zod';
|
|
2
2
|
/**
|
|
3
3
|
* A blueprint defines the shape and behavior of a Grove site.
|
|
4
4
|
*
|
|
@@ -1842,7 +1842,7 @@ export interface IndexBase {
|
|
|
1842
1842
|
* can write their own `summary` without overwriting it. */
|
|
1843
1843
|
sourceDescription?: string | undefined;
|
|
1844
1844
|
content?: string | undefined;
|
|
1845
|
-
curation: ProjectRecord[
|
|
1845
|
+
curation: ProjectRecord['curation'];
|
|
1846
1846
|
licenses: string[];
|
|
1847
1847
|
}
|
|
1848
1848
|
export interface IndexGithubSummary {
|
|
@@ -1857,45 +1857,45 @@ export interface IndexGithubSummary {
|
|
|
1857
1857
|
topics: string[];
|
|
1858
1858
|
}
|
|
1859
1859
|
export interface IndexProjectRecord extends IndexBase {
|
|
1860
|
-
kind:
|
|
1860
|
+
kind: 'project';
|
|
1861
1861
|
name: string;
|
|
1862
|
-
stack: ProjectRecord[
|
|
1862
|
+
stack: ProjectRecord['stack'];
|
|
1863
1863
|
stacks: string[];
|
|
1864
1864
|
platforms: string[];
|
|
1865
1865
|
licenses: string[];
|
|
1866
|
-
projectType: ProjectRecord[
|
|
1867
|
-
repoUrl: ProjectRecord[
|
|
1868
|
-
logoUrl: ProjectRecord[
|
|
1869
|
-
screenshots: ProjectRecord[
|
|
1870
|
-
difficulty: ProjectRecord[
|
|
1871
|
-
codebaseSize: ProjectRecord[
|
|
1866
|
+
projectType: ProjectRecord['projectType'];
|
|
1867
|
+
repoUrl: ProjectRecord['repoUrl'];
|
|
1868
|
+
logoUrl: ProjectRecord['logoUrl'];
|
|
1869
|
+
screenshots: ProjectRecord['screenshots'];
|
|
1870
|
+
difficulty: ProjectRecord['difficulty'];
|
|
1871
|
+
codebaseSize: ProjectRecord['codebaseSize'];
|
|
1872
1872
|
bestFor: string[];
|
|
1873
1873
|
whyListed: string[];
|
|
1874
1874
|
caveats: string[];
|
|
1875
|
-
health: ProjectRecord[
|
|
1875
|
+
health: ProjectRecord['health'];
|
|
1876
1876
|
/** Effective visibility — decisions.yml overrides win over health. */
|
|
1877
1877
|
visibility: DecisionVisibility;
|
|
1878
1878
|
github: IndexGithubSummary | undefined;
|
|
1879
1879
|
}
|
|
1880
1880
|
export interface IndexResourceRecord extends IndexBase {
|
|
1881
|
-
kind:
|
|
1881
|
+
kind: 'resource';
|
|
1882
1882
|
title: string;
|
|
1883
|
-
type: ResourceRecord[
|
|
1883
|
+
type: ResourceRecord['type'];
|
|
1884
1884
|
topic: string;
|
|
1885
1885
|
related: string[];
|
|
1886
|
-
publishedAt: ResourceRecord[
|
|
1887
|
-
author: ResourceRecord[
|
|
1886
|
+
publishedAt: ResourceRecord['publishedAt'];
|
|
1887
|
+
author: ResourceRecord['author'];
|
|
1888
1888
|
/** Effective visibility — decisions.yml overrides win over the record default. */
|
|
1889
1889
|
visibility: DecisionVisibility;
|
|
1890
1890
|
}
|
|
1891
1891
|
export interface IndexEntityRecord extends IndexBase {
|
|
1892
|
-
kind:
|
|
1892
|
+
kind: 'entity';
|
|
1893
1893
|
name: string;
|
|
1894
|
-
type: EntityRecord[
|
|
1895
|
-
founded: EntityRecord[
|
|
1896
|
-
location: EntityRecord[
|
|
1897
|
-
members: EntityRecord[
|
|
1898
|
-
parent: EntityRecord[
|
|
1894
|
+
type: EntityRecord['type'];
|
|
1895
|
+
founded: EntityRecord['founded'];
|
|
1896
|
+
location: EntityRecord['location'];
|
|
1897
|
+
members: EntityRecord['members'];
|
|
1898
|
+
parent: EntityRecord['parent'];
|
|
1899
1899
|
/** Effective visibility — decisions.yml overrides win over the record default. */
|
|
1900
1900
|
visibility: DecisionVisibility;
|
|
1901
1901
|
}
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { DEFAULT_FACETS, FACET_IDS } from
|
|
1
|
+
import { parse, stringify } from 'yaml';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { DEFAULT_FACETS, FACET_IDS } from './directory-facets.js';
|
|
4
4
|
// ──────────────────────────────────────────────────────────────────────
|
|
5
5
|
// Blueprints and kinds
|
|
6
6
|
// ──────────────────────────────────────────────────────────────────────
|
|
@@ -10,91 +10,82 @@ import { DEFAULT_FACETS, FACET_IDS } from "./directory-facets.js";
|
|
|
10
10
|
* V1 ships three fixed blueprints. They are not extensible — no custom
|
|
11
11
|
* blueprint API in V1.
|
|
12
12
|
*/
|
|
13
|
-
export const blueprintSchema = z.enum([
|
|
14
|
-
"project-directory",
|
|
15
|
-
"resource-hub",
|
|
16
|
-
"ecosystem-map",
|
|
17
|
-
]);
|
|
13
|
+
export const blueprintSchema = z.enum(['project-directory', 'resource-hub', 'ecosystem-map']);
|
|
18
14
|
/**
|
|
19
15
|
* Each blueprint is bound to a single resource kind. Records are
|
|
20
16
|
* discriminated by `kind`, which must match the blueprint of the site
|
|
21
17
|
* that owns them.
|
|
22
18
|
*/
|
|
23
|
-
export const resourceKindSchema = z.enum([
|
|
19
|
+
export const resourceKindSchema = z.enum(['project', 'resource', 'entity']);
|
|
24
20
|
export const blueprintKind = {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
'project-directory': 'project',
|
|
22
|
+
'resource-hub': 'resource',
|
|
23
|
+
'ecosystem-map': 'entity',
|
|
28
24
|
};
|
|
29
25
|
// ──────────────────────────────────────────────────────────────────────
|
|
30
26
|
// Health & decision labels
|
|
31
27
|
// ──────────────────────────────────────────────────────────────────────
|
|
32
28
|
export const healthStatusSchema = z.enum([
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
'active',
|
|
30
|
+
'mature',
|
|
31
|
+
'stale',
|
|
32
|
+
'inactive',
|
|
33
|
+
'archived',
|
|
34
|
+
'unknown',
|
|
35
|
+
'historical',
|
|
36
|
+
'needs_review',
|
|
37
|
+
'quiet',
|
|
38
|
+
'unavailable',
|
|
43
39
|
]);
|
|
44
40
|
export const decisionVisibilitySchema = z.enum([
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
]);
|
|
52
|
-
export const healthTierSchema = z.enum([
|
|
53
|
-
"curated",
|
|
54
|
-
"listed",
|
|
55
|
-
"experimental",
|
|
56
|
-
"hidden",
|
|
41
|
+
'highlight',
|
|
42
|
+
'keep',
|
|
43
|
+
'needs_review',
|
|
44
|
+
'hide',
|
|
45
|
+
'remove',
|
|
46
|
+
'historical',
|
|
57
47
|
]);
|
|
48
|
+
export const healthTierSchema = z.enum(['curated', 'listed', 'experimental', 'hidden']);
|
|
58
49
|
// ──────────────────────────────────────────────────────────────────────
|
|
59
50
|
// Curation enums (shared)
|
|
60
51
|
// ──────────────────────────────────────────────────────────────────────
|
|
61
52
|
export const projectTypeSchema = z.enum([
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
53
|
+
'real-app',
|
|
54
|
+
'production',
|
|
55
|
+
'reference',
|
|
56
|
+
'library',
|
|
57
|
+
'tool',
|
|
58
|
+
'demo',
|
|
59
|
+
'template',
|
|
60
|
+
'historical',
|
|
70
61
|
]);
|
|
71
62
|
export const resourceTypeSchema = z.enum([
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
63
|
+
'guide',
|
|
64
|
+
'comparison',
|
|
65
|
+
'link',
|
|
66
|
+
'explainer',
|
|
67
|
+
'tool',
|
|
68
|
+
'video',
|
|
69
|
+
'article',
|
|
70
|
+
'course',
|
|
71
|
+
'book',
|
|
72
|
+
'podcast',
|
|
73
|
+
'other',
|
|
83
74
|
]);
|
|
84
75
|
export const entityTypeSchema = z.enum([
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
76
|
+
'company',
|
|
77
|
+
'organization',
|
|
78
|
+
'community',
|
|
79
|
+
'school',
|
|
80
|
+
'university',
|
|
81
|
+
'research-lab',
|
|
82
|
+
'agency',
|
|
83
|
+
'service',
|
|
84
|
+
'product',
|
|
85
|
+
'person',
|
|
86
|
+
'other',
|
|
96
87
|
]);
|
|
97
|
-
export const appLabelSchema = z.enum([
|
|
88
|
+
export const appLabelSchema = z.enum(['new', 'hot', 'mature', 'featured']);
|
|
98
89
|
export const scoreSchema = z.object({
|
|
99
90
|
activity: z.number().min(0).max(100).optional(),
|
|
100
91
|
maturity: z.number().min(0).max(100).optional(),
|
|
@@ -189,20 +180,17 @@ export const githubMetadataSchema = z.object({
|
|
|
189
180
|
size: z.number().int().nonnegative().optional(),
|
|
190
181
|
files: z.record(z.string(), z.boolean()).optional(),
|
|
191
182
|
monthlyCommits: z
|
|
192
|
-
.array(z.union([
|
|
193
|
-
z.number(),
|
|
194
|
-
z.object({ month: z.string(), commits: z.number() }),
|
|
195
|
-
]))
|
|
183
|
+
.array(z.union([z.number(), z.object({ month: z.string(), commits: z.number() })]))
|
|
196
184
|
.optional(),
|
|
197
185
|
});
|
|
198
186
|
export const healthBlockSchema = z.object({
|
|
199
|
-
status: healthStatusSchema.default(
|
|
200
|
-
maturity: z.enum([
|
|
201
|
-
tier: healthTierSchema.default(
|
|
202
|
-
visibility: decisionVisibilitySchema.default(
|
|
187
|
+
status: healthStatusSchema.default('unknown'),
|
|
188
|
+
maturity: z.enum(['experimental', 'useful', 'mature', 'unknown']).default('unknown'),
|
|
189
|
+
tier: healthTierSchema.default('experimental'),
|
|
190
|
+
visibility: decisionVisibilitySchema.default('keep'),
|
|
203
191
|
cleanupCandidate: z.boolean().default(false),
|
|
204
192
|
staleReason: z.string().nullable().optional(),
|
|
205
|
-
confidence: z.enum([
|
|
193
|
+
confidence: z.enum(['low', 'medium', 'high']).default('medium'),
|
|
206
194
|
reasons: z.array(z.string()).default([]),
|
|
207
195
|
});
|
|
208
196
|
export const healthEntrySchema = z.object({
|
|
@@ -259,7 +247,7 @@ const curationBlockSchema = z
|
|
|
259
247
|
// ──────────────────────────────────────────────────────────────────────
|
|
260
248
|
const resourceBaseSchema = z.object({
|
|
261
249
|
slug: z.string().min(1),
|
|
262
|
-
description: z.string().default(
|
|
250
|
+
description: z.string().default(''),
|
|
263
251
|
/**
|
|
264
252
|
* Open Apps-written summary, surfaced as the lead paragraph on the
|
|
265
253
|
* detail page above the original (GitHub-sourced) description.
|
|
@@ -275,21 +263,22 @@ const resourceBaseSchema = z.object({
|
|
|
275
263
|
* overwriting what GitHub says the project is.
|
|
276
264
|
*/
|
|
277
265
|
sourceDescription: z.string().optional(),
|
|
278
|
-
category: z.string().min(1).default(
|
|
266
|
+
category: z.string().min(1).default('uncategorized'),
|
|
279
267
|
tags: z.array(z.string()).default([]),
|
|
280
268
|
links: linksSchema,
|
|
281
269
|
content: z.string().optional(), // path to markdown body under content/records/
|
|
282
270
|
source: z
|
|
283
271
|
.object({
|
|
284
|
-
type: z
|
|
285
|
-
.
|
|
272
|
+
type: z
|
|
273
|
+
.enum(['manual', 'github-topic', 'awesome-list', 'submit', 'import'])
|
|
274
|
+
.default('manual'),
|
|
286
275
|
file: z.string().optional(),
|
|
287
276
|
url: z.string().optional(),
|
|
288
277
|
provider: z.string().optional(),
|
|
289
278
|
owner: z.string().optional(),
|
|
290
279
|
repo: z.string().optional(),
|
|
291
280
|
})
|
|
292
|
-
.default({ type:
|
|
281
|
+
.default({ type: 'manual' }),
|
|
293
282
|
curation: curationBlockSchema,
|
|
294
283
|
scores: scoreSchema.default({}),
|
|
295
284
|
/**
|
|
@@ -300,13 +289,13 @@ const resourceBaseSchema = z.object({
|
|
|
300
289
|
* Defaults to "keep" so existing YAML files without the field
|
|
301
290
|
* continue to validate.
|
|
302
291
|
*/
|
|
303
|
-
visibility: decisionVisibilitySchema.default(
|
|
292
|
+
visibility: decisionVisibilitySchema.default('keep'),
|
|
304
293
|
});
|
|
305
294
|
// ──────────────────────────────────────────────────────────────────────
|
|
306
295
|
// Blueprint: project-directory — kind: project
|
|
307
296
|
// ──────────────────────────────────────────────────────────────────────
|
|
308
297
|
export const projectRecordSchema = resourceBaseSchema.extend({
|
|
309
|
-
kind: z.literal(
|
|
298
|
+
kind: z.literal('project'),
|
|
310
299
|
name: z.string().min(1),
|
|
311
300
|
projectType: projectTypeSchema.optional(),
|
|
312
301
|
stack: z.string().optional(),
|
|
@@ -316,8 +305,8 @@ export const projectRecordSchema = resourceBaseSchema.extend({
|
|
|
316
305
|
// authored when a record is curated; otherwise derived from the
|
|
317
306
|
// GitHub sync's `license.spdx_id` field at build time.
|
|
318
307
|
licenses: z.array(z.string()).default([]),
|
|
319
|
-
difficulty: z.enum([
|
|
320
|
-
codebaseSize: z.enum([
|
|
308
|
+
difficulty: z.enum(['beginner', 'intermediate', 'advanced']).optional(),
|
|
309
|
+
codebaseSize: z.enum(['small', 'medium', 'large', 'huge']).optional(),
|
|
321
310
|
// Canonical repo URL. Distinct from `links.github`, which is the
|
|
322
311
|
// human-facing link on the page; `repoUrl` is the single source
|
|
323
312
|
// for owner/repo extraction, avatar fallback, and "view repo" CTAs.
|
|
@@ -379,7 +368,7 @@ export const projectRecordSchema = resourceBaseSchema.extend({
|
|
|
379
368
|
// Blueprint: resource-hub — kind: resource
|
|
380
369
|
// ──────────────────────────────────────────────────────────────────────
|
|
381
370
|
export const resourceRecordSchema = resourceBaseSchema.extend({
|
|
382
|
-
kind: z.literal(
|
|
371
|
+
kind: z.literal('resource'),
|
|
383
372
|
title: z.string().min(1),
|
|
384
373
|
type: resourceTypeSchema,
|
|
385
374
|
topic: z.string().min(1),
|
|
@@ -391,7 +380,7 @@ export const resourceRecordSchema = resourceBaseSchema.extend({
|
|
|
391
380
|
// Blueprint: ecosystem-map — kind: entity
|
|
392
381
|
// ──────────────────────────────────────────────────────────────────────
|
|
393
382
|
export const entityRecordSchema = resourceBaseSchema.extend({
|
|
394
|
-
kind: z.literal(
|
|
383
|
+
kind: z.literal('entity'),
|
|
395
384
|
name: z.string().min(1),
|
|
396
385
|
type: entityTypeSchema,
|
|
397
386
|
founded: z.string().optional(),
|
|
@@ -402,7 +391,7 @@ export const entityRecordSchema = resourceBaseSchema.extend({
|
|
|
402
391
|
// ──────────────────────────────────────────────────────────────────────
|
|
403
392
|
// Discriminated union: Resource
|
|
404
393
|
// ──────────────────────────────────────────────────────────────────────
|
|
405
|
-
export const resourceSchema = z.discriminatedUnion(
|
|
394
|
+
export const resourceSchema = z.discriminatedUnion('kind', [
|
|
406
395
|
projectRecordSchema,
|
|
407
396
|
resourceRecordSchema,
|
|
408
397
|
entityRecordSchema,
|
|
@@ -472,7 +461,7 @@ export const githubIntegrationSchema = z.union([
|
|
|
472
461
|
* callers (`grove sync`, CI workflows) can gate each feature.
|
|
473
462
|
*/
|
|
474
463
|
export function normalizeGithubIntegration(value) {
|
|
475
|
-
if (typeof value ===
|
|
464
|
+
if (typeof value === 'boolean') {
|
|
476
465
|
return { metadata: value, contributors: value, health: value };
|
|
477
466
|
}
|
|
478
467
|
return {
|
|
@@ -489,28 +478,32 @@ export const themeSchema = z.object({
|
|
|
489
478
|
*/
|
|
490
479
|
primaryColor: z
|
|
491
480
|
.string()
|
|
492
|
-
.regex(/^#[0-9a-fA-F]{3,8}$/,
|
|
481
|
+
.regex(/^#[0-9a-fA-F]{3,8}$/, 'theme.primaryColor must be a hex color such as #4f46e5')
|
|
493
482
|
.optional(),
|
|
494
|
-
radius: z.enum([
|
|
495
|
-
density: z.enum([
|
|
496
|
-
containerWidth: z.string().default(
|
|
483
|
+
radius: z.enum(['none', 'soft', 'round']).default('soft'),
|
|
484
|
+
density: z.enum(['compact', 'comfortable', 'spacious']).default('comfortable'),
|
|
485
|
+
containerWidth: z.string().default('72rem'),
|
|
497
486
|
});
|
|
498
487
|
// ──────────────────────────────────────────────────────────────────────
|
|
499
488
|
// Audit manifest (consumed by `grove audit`)
|
|
500
489
|
// ──────────────────────────────────────────────────────────────────────
|
|
501
490
|
const auditPageTypeSchema = z.enum([
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
491
|
+
'home',
|
|
492
|
+
'directory',
|
|
493
|
+
'collection',
|
|
494
|
+
'record',
|
|
495
|
+
'content',
|
|
496
|
+
'empty',
|
|
497
|
+
'404',
|
|
509
498
|
]);
|
|
510
499
|
const auditPageManifestEntrySchema = z.object({
|
|
511
500
|
path: z.string().min(1),
|
|
512
501
|
type: auditPageTypeSchema,
|
|
513
502
|
label: z.string().min(1),
|
|
503
|
+
/**
|
|
504
|
+
* @deprecated No-op — nothing reads this. Retained so an existing
|
|
505
|
+
* grove.config.ts keeps type-checking; removed in the next major.
|
|
506
|
+
*/
|
|
514
507
|
sample: z.record(z.string(), z.string()).optional(),
|
|
515
508
|
});
|
|
516
509
|
export const auditSchema = z.object({
|
|
@@ -538,10 +531,10 @@ export const readmeConfigSchema = z.object({
|
|
|
538
531
|
showBrowseLink: z.boolean().default(true),
|
|
539
532
|
});
|
|
540
533
|
export const groveConfigSchema = z.object({
|
|
541
|
-
blueprint: blueprintSchema.default(
|
|
534
|
+
blueprint: blueprintSchema.default('project-directory'),
|
|
542
535
|
site: z.object({
|
|
543
536
|
name: z.string().min(1),
|
|
544
|
-
tagline: z.string().default(
|
|
537
|
+
tagline: z.string().default('A growing community knowledge site.'),
|
|
545
538
|
description: z.string().optional(),
|
|
546
539
|
url: z.string().url().optional(),
|
|
547
540
|
repoUrl: z.string().url().optional(),
|
|
@@ -561,7 +554,7 @@ export const groveConfigSchema = z.object({
|
|
|
561
554
|
* BCP-47 language tag for the published site. Drives `<html lang>`,
|
|
562
555
|
* `og:locale`, and JSON-LD `inLanguage`.
|
|
563
556
|
*/
|
|
564
|
-
locale: z.string().default(
|
|
557
|
+
locale: z.string().default('en'),
|
|
565
558
|
/**
|
|
566
559
|
* Twitter/X handle for the site (e.g. `@grove`). Emitted as
|
|
567
560
|
* `twitter:site` on every page when set.
|
|
@@ -572,7 +565,7 @@ export const groveConfigSchema = z.object({
|
|
|
572
565
|
.object({
|
|
573
566
|
googleAnalyticsId: z
|
|
574
567
|
.string()
|
|
575
|
-
.regex(/^G-[A-Z0-9]+$/,
|
|
568
|
+
.regex(/^G-[A-Z0-9]+$/, 'Expected a GA4 measurement ID such as G-XXXXXX')
|
|
576
569
|
.optional(),
|
|
577
570
|
})
|
|
578
571
|
.default({}),
|
|
@@ -618,7 +611,7 @@ export const groveConfigSchema = z.object({
|
|
|
618
611
|
facets: z
|
|
619
612
|
.array(z.enum(FACET_IDS))
|
|
620
613
|
.refine((facets) => new Set(facets).size === facets.length, {
|
|
621
|
-
message:
|
|
614
|
+
message: 'browse.facets contains duplicate entries',
|
|
622
615
|
})
|
|
623
616
|
.default([...DEFAULT_FACETS]),
|
|
624
617
|
})
|
|
@@ -634,8 +627,8 @@ export const groveConfigSchema = z.object({
|
|
|
634
627
|
.unknown()
|
|
635
628
|
.optional()
|
|
636
629
|
.refine((value) => value === undefined, {
|
|
637
|
-
message:
|
|
638
|
-
`Supported ids: ${FACET_IDS.join(
|
|
630
|
+
message: '`facets` moved to `browse.facets` in grove.config.ts. ' +
|
|
631
|
+
`Supported ids: ${FACET_IDS.join(', ')} (canonical spellings only).`,
|
|
639
632
|
}),
|
|
640
633
|
integrations: z
|
|
641
634
|
.object({
|
|
@@ -674,30 +667,30 @@ export const groveConfigSchema = z.object({
|
|
|
674
667
|
readme: readmeConfigSchema.optional(),
|
|
675
668
|
paths: z
|
|
676
669
|
.object({
|
|
677
|
-
dataDir: z.string().default(
|
|
678
|
-
contentDir: z.string().default(
|
|
679
|
-
recordsDir: z.string().default(
|
|
680
|
-
pagesDir: z.string().default(
|
|
681
|
-
bodiesDir: z.string().default(
|
|
682
|
-
publicDir: z.string().default(
|
|
683
|
-
taxonomyDir: z.string().default(
|
|
684
|
-
generatedDir: z.string().default(
|
|
685
|
-
health: z.string().default(
|
|
686
|
-
decisions: z.string().default(
|
|
687
|
-
overrides: z.string().default(
|
|
670
|
+
dataDir: z.string().default('data'),
|
|
671
|
+
contentDir: z.string().default('content'),
|
|
672
|
+
recordsDir: z.string().default('data/records'),
|
|
673
|
+
pagesDir: z.string().default('content/pages'),
|
|
674
|
+
bodiesDir: z.string().default('content/records'),
|
|
675
|
+
publicDir: z.string().default('public'),
|
|
676
|
+
taxonomyDir: z.string().default('data/taxonomy'),
|
|
677
|
+
generatedDir: z.string().default('data/generated'),
|
|
678
|
+
health: z.string().default('data/health.yml'),
|
|
679
|
+
decisions: z.string().default('data/decisions.yml'),
|
|
680
|
+
overrides: z.string().default('data/overrides.yml'),
|
|
688
681
|
})
|
|
689
682
|
.default({
|
|
690
|
-
dataDir:
|
|
691
|
-
contentDir:
|
|
692
|
-
recordsDir:
|
|
693
|
-
pagesDir:
|
|
694
|
-
bodiesDir:
|
|
695
|
-
publicDir:
|
|
696
|
-
taxonomyDir:
|
|
697
|
-
generatedDir:
|
|
698
|
-
health:
|
|
699
|
-
decisions:
|
|
700
|
-
overrides:
|
|
683
|
+
dataDir: 'data',
|
|
684
|
+
contentDir: 'content',
|
|
685
|
+
recordsDir: 'data/records',
|
|
686
|
+
pagesDir: 'content/pages',
|
|
687
|
+
bodiesDir: 'content/records',
|
|
688
|
+
publicDir: 'public',
|
|
689
|
+
taxonomyDir: 'data/taxonomy',
|
|
690
|
+
generatedDir: 'data/generated',
|
|
691
|
+
health: 'data/health.yml',
|
|
692
|
+
decisions: 'data/decisions.yml',
|
|
693
|
+
overrides: 'data/overrides.yml',
|
|
701
694
|
}),
|
|
702
695
|
});
|
|
703
696
|
// ──────────────────────────────────────────────────────────────────────
|
|
@@ -721,8 +714,8 @@ export function parseRecordYaml(text, fileSlug) {
|
|
|
721
714
|
// record file cannot smuggle `!!binary` / `!!js/function` / etc.
|
|
722
715
|
// into host objects. The default schema would interpret them.
|
|
723
716
|
// (Implementation-checklist.md #27.)
|
|
724
|
-
const raw = parse(text, { schema:
|
|
725
|
-
if (typeof raw !==
|
|
717
|
+
const raw = parse(text, { schema: 'core' }) ?? {};
|
|
718
|
+
if (typeof raw !== 'object' || Array.isArray(raw)) {
|
|
726
719
|
throw new Error(`${fileSlug}: record file must contain a YAML mapping`);
|
|
727
720
|
}
|
|
728
721
|
return raw;
|
|
@@ -731,7 +724,7 @@ export function stringifyRecordYaml(record) {
|
|
|
731
724
|
return stringify(record, {
|
|
732
725
|
lineWidth: 100,
|
|
733
726
|
singleQuote: false,
|
|
734
|
-
defaultStringType:
|
|
727
|
+
defaultStringType: 'PLAIN',
|
|
735
728
|
});
|
|
736
729
|
}
|
|
737
730
|
export function getOwnerRepoFromUrl(repoUrl) {
|
|
@@ -744,16 +737,16 @@ export function getOwnerRepoFromUrl(repoUrl) {
|
|
|
744
737
|
const repo = m[2];
|
|
745
738
|
if (!owner || !repo)
|
|
746
739
|
return null;
|
|
747
|
-
return { owner, repo: repo.replace(/\.git$/,
|
|
740
|
+
return { owner, repo: repo.replace(/\.git$/, '') };
|
|
748
741
|
}
|
|
749
742
|
export function isIndexProject(r) {
|
|
750
|
-
return r.kind ===
|
|
743
|
+
return r.kind === 'project';
|
|
751
744
|
}
|
|
752
745
|
export function isIndexResource(r) {
|
|
753
|
-
return r.kind ===
|
|
746
|
+
return r.kind === 'resource';
|
|
754
747
|
}
|
|
755
748
|
export function isIndexEntity(r) {
|
|
756
|
-
return r.kind ===
|
|
749
|
+
return r.kind === 'entity';
|
|
757
750
|
}
|
|
758
751
|
/**
|
|
759
752
|
* Project a Resource to a stable, search-index-friendly summary
|
|
@@ -777,15 +770,15 @@ export function toIndexRecord(record) {
|
|
|
777
770
|
description: record.description,
|
|
778
771
|
content: record.content,
|
|
779
772
|
curation: record.curation,
|
|
780
|
-
licenses: record.kind ===
|
|
773
|
+
licenses: record.kind === 'project' ? (record.licenses ?? []) : [],
|
|
781
774
|
summary: record.summary,
|
|
782
775
|
sourceDescription: record.sourceDescription,
|
|
783
776
|
};
|
|
784
|
-
if (record.kind ===
|
|
777
|
+
if (record.kind === 'project') {
|
|
785
778
|
const r = record;
|
|
786
779
|
return {
|
|
787
780
|
...base,
|
|
788
|
-
kind:
|
|
781
|
+
kind: 'project',
|
|
789
782
|
name: r.name,
|
|
790
783
|
stack: r.stack,
|
|
791
784
|
stacks: r.stacks ?? [],
|
|
@@ -806,7 +799,7 @@ export function toIndexRecord(record) {
|
|
|
806
799
|
// from signals) or the curation override (`decisions.yml`).
|
|
807
800
|
// The generate step folds the latter in before serialising,
|
|
808
801
|
// so this is a best-effort projection of the current state.
|
|
809
|
-
visibility: r.health?.visibility ??
|
|
802
|
+
visibility: r.health?.visibility ?? 'keep',
|
|
810
803
|
github: r.github?.repository
|
|
811
804
|
? {
|
|
812
805
|
fullName: r.github.repository.full_name,
|
|
@@ -822,11 +815,11 @@ export function toIndexRecord(record) {
|
|
|
822
815
|
: undefined,
|
|
823
816
|
};
|
|
824
817
|
}
|
|
825
|
-
if (record.kind ===
|
|
818
|
+
if (record.kind === 'resource') {
|
|
826
819
|
const r = record;
|
|
827
820
|
return {
|
|
828
821
|
...base,
|
|
829
|
-
kind:
|
|
822
|
+
kind: 'resource',
|
|
830
823
|
title: r.title,
|
|
831
824
|
type: r.type,
|
|
832
825
|
topic: r.topic,
|
|
@@ -844,7 +837,7 @@ export function toIndexRecord(record) {
|
|
|
844
837
|
const e = record;
|
|
845
838
|
return {
|
|
846
839
|
...base,
|
|
847
|
-
kind:
|
|
840
|
+
kind: 'entity',
|
|
848
841
|
name: e.name,
|
|
849
842
|
type: e.type,
|
|
850
843
|
founded: e.founded,
|