@grove-dev/core 0.2.16 → 0.2.19
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 +2 -2
- package/dist/build-data.d.ts.map +1 -1
- package/dist/build-data.js +19 -12
- package/dist/build-data.js.map +1 -1
- package/dist/build-data.test.d.ts +2 -0
- package/dist/build-data.test.d.ts.map +1 -0
- package/dist/build-data.test.js +171 -0
- package/dist/build-data.test.js.map +1 -0
- package/dist/decisions.test.d.ts +2 -0
- package/dist/decisions.test.d.ts.map +1 -0
- package/dist/decisions.test.js +205 -0
- package/dist/decisions.test.js.map +1 -0
- package/dist/enrich.test.d.ts +2 -0
- package/dist/enrich.test.d.ts.map +1 -0
- package/dist/enrich.test.js +105 -0
- package/dist/enrich.test.js.map +1 -0
- package/dist/github-client.d.ts.map +1 -1
- package/dist/github-client.js +4 -1
- package/dist/github-client.js.map +1 -1
- package/dist/github-client.test.d.ts +2 -0
- package/dist/github-client.test.d.ts.map +1 -0
- package/dist/github-client.test.js +176 -0
- package/dist/github-client.test.js.map +1 -0
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +6 -2
- package/dist/github.js.map +1 -1
- package/dist/github.test.d.ts +2 -0
- package/dist/github.test.d.ts.map +1 -0
- package/dist/github.test.js +73 -0
- package/dist/github.test.js.map +1 -0
- package/dist/health.test.d.ts +2 -0
- package/dist/health.test.d.ts.map +1 -0
- package/dist/health.test.js +183 -0
- package/dist/health.test.js.map +1 -0
- package/dist/importer.test.d.ts +2 -0
- package/dist/importer.test.d.ts.map +1 -0
- package/dist/importer.test.js +173 -0
- package/dist/importer.test.js.map +1 -0
- package/dist/index.d.ts +36 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -16
- package/dist/index.js.map +1 -1
- package/dist/llms.d.ts.map +1 -1
- package/dist/llms.js +6 -4
- package/dist/llms.js.map +1 -1
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +16 -10
- package/dist/markdown.js.map +1 -1
- package/dist/parseReadme.d.ts.map +1 -1
- package/dist/parseReadme.js +5 -1
- package/dist/parseReadme.js.map +1 -1
- package/dist/schema.d.ts +1 -14
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +14 -60
- package/dist/schema.js.map +1 -1
- package/dist/slug.d.ts +10 -0
- package/dist/slug.d.ts.map +1 -1
- package/dist/slug.js +10 -0
- package/dist/slug.js.map +1 -1
- package/dist/slug.test.d.ts +2 -0
- package/dist/slug.test.d.ts.map +1 -0
- package/dist/slug.test.js +101 -0
- package/dist/slug.test.js.map +1 -0
- package/dist/validate.test.d.ts +2 -0
- package/dist/validate.test.d.ts.map +1 -0
- package/dist/validate.test.js +249 -0
- package/dist/validate.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @grove-dev/core — health classification unit tests.
|
|
3
|
+
*
|
|
4
|
+
* Pins the boundary cases around the threshold ladder in
|
|
5
|
+
* `classifyHealth`. The thresholds are not a parameter — they're
|
|
6
|
+
* burned into the function — so the only thing these tests can do
|
|
7
|
+
* is pin them. A future PR that bumps any threshold will need to
|
|
8
|
+
* update at least one test name, which is exactly the intent:
|
|
9
|
+
* "the day someone raises the inactive cutoff from 730 to 800 days,
|
|
10
|
+
* the build breaks at the test name so a deliberate decision is
|
|
11
|
+
* made."
|
|
12
|
+
*
|
|
13
|
+
* The function also has a "fabricate" path — calling it with no
|
|
14
|
+
* `github` arg returns the canonical unknown health block. This
|
|
15
|
+
* shape is the V1 single source of truth that `applyDecision` in
|
|
16
|
+
* `build-data.ts` reuses for its no-health-block merge, so pinning
|
|
17
|
+
* it here means downstream code can't drift.
|
|
18
|
+
*/
|
|
19
|
+
import { describe, it, expect } from "vitest";
|
|
20
|
+
import { classifyHealth } from "./health.js";
|
|
21
|
+
function makeGithub(overrides = {}) {
|
|
22
|
+
return {
|
|
23
|
+
fullName: "owner/repo",
|
|
24
|
+
stars: 10,
|
|
25
|
+
forks: 0,
|
|
26
|
+
openIssues: 0,
|
|
27
|
+
archived: false,
|
|
28
|
+
disabled: false,
|
|
29
|
+
pushedAt: null,
|
|
30
|
+
updatedAt: null,
|
|
31
|
+
latestReleaseAt: null,
|
|
32
|
+
license: null,
|
|
33
|
+
topics: [],
|
|
34
|
+
language: null,
|
|
35
|
+
defaultBranch: "main",
|
|
36
|
+
...overrides,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
describe("classifyHealth — fabrication path (no GitHub metadata)", () => {
|
|
40
|
+
it("returns the canonical unknown health block when no github is supplied", () => {
|
|
41
|
+
// The shape is the V1 single source of truth — applyDecision in
|
|
42
|
+
// build-data.ts calls classifyHealth(slug) without github to
|
|
43
|
+
// fabricate a default health block. Pin every field.
|
|
44
|
+
const result = classifyHealth("my-slug");
|
|
45
|
+
expect(result).toEqual({
|
|
46
|
+
id: "my-slug",
|
|
47
|
+
health: {
|
|
48
|
+
status: "unknown",
|
|
49
|
+
maturity: "unknown",
|
|
50
|
+
tier: "experimental",
|
|
51
|
+
visibility: "keep",
|
|
52
|
+
cleanupCandidate: false,
|
|
53
|
+
staleReason: null,
|
|
54
|
+
confidence: "low",
|
|
55
|
+
reasons: ["No GitHub metadata available"],
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
it("the unknown block is what applyDecision fabricates — verify the visibility override path", () => {
|
|
60
|
+
// Without this test, a future refactor could change the
|
|
61
|
+
// unknown shape (e.g. tier: "hidden") and silently break the
|
|
62
|
+
// applyDecision merge in build-data.ts. The unknown block MUST
|
|
63
|
+
// have visibility: "keep" so the override is a meaningful
|
|
64
|
+
// *change*, not a no-op.
|
|
65
|
+
const { health } = classifyHealth("x");
|
|
66
|
+
expect(health.visibility).toBe("keep");
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("classifyHealth — status thresholds (pushedAt)", () => {
|
|
70
|
+
const NOW = Date.now();
|
|
71
|
+
const daysAgo = (n) => new Date(NOW - n * 86_400_000).toISOString();
|
|
72
|
+
it("active: pushed within 6 months (≤ 183 days)", () => {
|
|
73
|
+
const result = classifyHealth("a", makeGithub({ pushedAt: daysAgo(0) }));
|
|
74
|
+
expect(result.health.status).toBe("active");
|
|
75
|
+
});
|
|
76
|
+
it("active boundary: 180 days is well inside the active window", () => {
|
|
77
|
+
// Pin the boundary just below 183 so the test is stable across
|
|
78
|
+
// floating-point rounding of `Date.now() - N*86_400_000`. The
|
|
79
|
+
// exact-183-day edge case is `183.0000000347` days, which the
|
|
80
|
+
// `<= 183` check rejects — testing 180 instead makes the
|
|
81
|
+
// intent (active window is ~6 months) obvious without
|
|
82
|
+
// coupling to the float math.
|
|
83
|
+
const result = classifyHealth("a", makeGithub({ pushedAt: daysAgo(180) }));
|
|
84
|
+
expect(result.health.status).toBe("active");
|
|
85
|
+
});
|
|
86
|
+
it("stale boundary: 184 days is the first day a record becomes stale", () => {
|
|
87
|
+
// 184 days is the first value that reliably falls on the
|
|
88
|
+
// "stale" side of the 183-day cutoff. The 183-day mark itself
|
|
89
|
+
// is load-bearing in production (a record turns 6 months old
|
|
90
|
+
// on this exact day) but is sensitive to ms rounding — pin
|
|
91
|
+
// 184 here so a future threshold bump is visible immediately
|
|
92
|
+
// and the test does not flake.
|
|
93
|
+
const result = classifyHealth("a", makeGithub({ pushedAt: daysAgo(184) }));
|
|
94
|
+
expect(result.health.status).toBe("stale");
|
|
95
|
+
});
|
|
96
|
+
it("stale: pushed between 184 and 548 days (6-18 months)", () => {
|
|
97
|
+
const result = classifyHealth("a", makeGithub({ pushedAt: daysAgo(400) }));
|
|
98
|
+
expect(result.health.status).toBe("stale");
|
|
99
|
+
});
|
|
100
|
+
it("needs_review: pushed between 548 and 730 days (18-24 months)", () => {
|
|
101
|
+
const result = classifyHealth("a", makeGithub({ pushedAt: daysAgo(600) }));
|
|
102
|
+
expect(result.health.status).toBe("needs_review");
|
|
103
|
+
});
|
|
104
|
+
it("inactive: pushed > 730 days (2+ years)", () => {
|
|
105
|
+
const result = classifyHealth("a", makeGithub({ pushedAt: daysAgo(800) }));
|
|
106
|
+
expect(result.health.status).toBe("inactive");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("classifyHealth — maturity ladder", () => {
|
|
110
|
+
it("archived overrides everything: status='archived', tier='hidden'", () => {
|
|
111
|
+
const result = classifyHealth("a", makeGithub({ archived: true, stars: 5000 }));
|
|
112
|
+
expect(result.health.status).toBe("archived");
|
|
113
|
+
expect(result.health.tier).toBe("hidden");
|
|
114
|
+
expect(result.health.cleanupCandidate).toBe(true);
|
|
115
|
+
expect(result.health.staleReason).toBe("github_archived");
|
|
116
|
+
});
|
|
117
|
+
it("popular + active → maturity='mature' and status gets promoted to 'mature'", () => {
|
|
118
|
+
// 500+ stars AND active + maintained → the function promotes
|
|
119
|
+
// status from 'active' to 'mature'. This is the threshold
|
|
120
|
+
// where the "Recently active" filter would no longer match a
|
|
121
|
+
// project even though it's actively maintained — pin it.
|
|
122
|
+
const result = classifyHealth("a", makeGithub({
|
|
123
|
+
stars: 600,
|
|
124
|
+
pushedAt: new Date(Date.now() - 30 * 86_400_000).toISOString(),
|
|
125
|
+
license: "MIT",
|
|
126
|
+
}));
|
|
127
|
+
expect(result.health.maturity).toBe("mature");
|
|
128
|
+
expect(result.health.status).toBe("mature");
|
|
129
|
+
});
|
|
130
|
+
it("popular but no maintenance signals → maturity='useful' (NOT mature)", () => {
|
|
131
|
+
// 500+ stars but no recent release/license — popular but the
|
|
132
|
+
// maintenance boost does not apply. Maturity caps at 'useful'.
|
|
133
|
+
const result = classifyHealth("a", makeGithub({
|
|
134
|
+
stars: 600,
|
|
135
|
+
pushedAt: new Date(Date.now() - 30 * 86_400_000).toISOString(),
|
|
136
|
+
license: null,
|
|
137
|
+
latestReleaseAt: null,
|
|
138
|
+
}));
|
|
139
|
+
expect(result.health.maturity).toBe("useful");
|
|
140
|
+
});
|
|
141
|
+
it("mid stars (50-499) + maintained → 'useful'", () => {
|
|
142
|
+
const result = classifyHealth("a", makeGithub({
|
|
143
|
+
stars: 100,
|
|
144
|
+
pushedAt: new Date(Date.now() - 30 * 86_400_000).toISOString(),
|
|
145
|
+
license: "MIT",
|
|
146
|
+
}));
|
|
147
|
+
expect(result.health.maturity).toBe("useful");
|
|
148
|
+
});
|
|
149
|
+
it("low stars and no signals → 'experimental'", () => {
|
|
150
|
+
const result = classifyHealth("a", makeGithub({
|
|
151
|
+
stars: 5,
|
|
152
|
+
pushedAt: new Date(Date.now() - 30 * 86_400_000).toISOString(),
|
|
153
|
+
license: null,
|
|
154
|
+
latestReleaseAt: null,
|
|
155
|
+
}));
|
|
156
|
+
expect(result.health.maturity).toBe("experimental");
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe("classifyHealth — tier ladder", () => {
|
|
160
|
+
const pushed = new Date(Date.now() - 30 * 86_400_000).toISOString();
|
|
161
|
+
it("hidden when status is archived", () => {
|
|
162
|
+
const r = classifyHealth("a", makeGithub({ archived: true }));
|
|
163
|
+
expect(r.health.tier).toBe("hidden");
|
|
164
|
+
expect(r.health.visibility).toBe("hide");
|
|
165
|
+
});
|
|
166
|
+
it("hidden when status is inactive", () => {
|
|
167
|
+
const r = classifyHealth("a", makeGithub({ pushedAt: new Date(Date.now() - 800 * 86_400_000).toISOString() }));
|
|
168
|
+
expect(r.health.tier).toBe("hidden");
|
|
169
|
+
});
|
|
170
|
+
it("curated when stars >= 500", () => {
|
|
171
|
+
const r = classifyHealth("a", makeGithub({ stars: 500, pushedAt: pushed }));
|
|
172
|
+
expect(r.health.tier).toBe("curated");
|
|
173
|
+
});
|
|
174
|
+
it("listed when stars >= 50 (but < 500)", () => {
|
|
175
|
+
const r = classifyHealth("a", makeGithub({ stars: 50, pushedAt: pushed }));
|
|
176
|
+
expect(r.health.tier).toBe("listed");
|
|
177
|
+
});
|
|
178
|
+
it("experimental when stars < 50", () => {
|
|
179
|
+
const r = classifyHealth("a", makeGithub({ stars: 49, pushedAt: pushed }));
|
|
180
|
+
expect(r.health.tier).toBe("experimental");
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=health.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.test.js","sourceRoot":"","sources":["../src/health.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importer.test.d.ts","sourceRoot":"","sources":["../src/importer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @grove-dev/core — markdown.ts importer unit tests.
|
|
3
|
+
*
|
|
4
|
+
* The `markdown.ts` module houses `parseAwesomeMarkdown`,
|
|
5
|
+
* `detectGithubRepo`, `importAwesomeList`, and
|
|
6
|
+
* `writeImportedRecords`. `importer.ts` re-exports the last two.
|
|
7
|
+
*
|
|
8
|
+
* Tests cover:
|
|
9
|
+
* - detectGithubRepo: URL + slug derivation, edge cases
|
|
10
|
+
* - parseAwesomeMarkdown: section grouping, link extraction,
|
|
11
|
+
* dedup, empty input
|
|
12
|
+
* - writeImportedRecords: real tmpdir round-trip
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
15
|
+
import { mkdtemp, writeFile, readFile, rm } from "node:fs/promises";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { detectGithubRepo, parseAwesomeMarkdown, importAwesomeList, writeImportedRecords, } from "./markdown.js";
|
|
19
|
+
describe("detectGithubRepo", () => {
|
|
20
|
+
it("returns the canonical GitHub URL for a github.com URL", () => {
|
|
21
|
+
expect(detectGithubRepo("https://github.com/owner/repo")).toBe("https://github.com/owner/repo");
|
|
22
|
+
});
|
|
23
|
+
it("strips a trailing .git from the repo name", () => {
|
|
24
|
+
expect(detectGithubRepo("https://github.com/owner/repo.git")).toBe("https://github.com/owner/repo");
|
|
25
|
+
});
|
|
26
|
+
it("returns undefined for an empty / non-URL string", () => {
|
|
27
|
+
expect(detectGithubRepo("")).toBeUndefined();
|
|
28
|
+
expect(detectGithubRepo("No link here.")).toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
it("returns undefined for a non-github URL (e.g. gitlab)", () => {
|
|
31
|
+
expect(detectGithubRepo("https://gitlab.com/owner/repo")).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
it("returns undefined for reserved GitHub paths (issues, pulls, etc.)", () => {
|
|
34
|
+
// `https://github.com/owner/issues` is a tab on the repo page,
|
|
35
|
+
// not a repo. detectGithubRepo must return undefined for
|
|
36
|
+
// these so they don't get imported as a record.
|
|
37
|
+
expect(detectGithubRepo("https://github.com/owner/issues")).toBeUndefined();
|
|
38
|
+
expect(detectGithubRepo("https://github.com/owner/pulls")).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("parseAwesomeMarkdown", () => {
|
|
42
|
+
it("returns an empty result for empty input", () => {
|
|
43
|
+
const r = parseAwesomeMarkdown("");
|
|
44
|
+
expect(r.records).toEqual([]);
|
|
45
|
+
expect(r.report.imported).toBe(0);
|
|
46
|
+
expect(r.report.skipped).toBe(0);
|
|
47
|
+
});
|
|
48
|
+
it("groups links by section heading and extracts name + url", () => {
|
|
49
|
+
const md = [
|
|
50
|
+
"# Awesome",
|
|
51
|
+
"",
|
|
52
|
+
"## Tools",
|
|
53
|
+
"",
|
|
54
|
+
"- [Repo One](https://github.com/owner/one) - A great tool",
|
|
55
|
+
"- [Repo Two](https://github.com/owner/two)",
|
|
56
|
+
"",
|
|
57
|
+
"## Libraries",
|
|
58
|
+
"",
|
|
59
|
+
"- [Repo Three](https://github.com/owner/three) - A nice library",
|
|
60
|
+
].join("\n");
|
|
61
|
+
const r = parseAwesomeMarkdown(md);
|
|
62
|
+
expect(r.report.imported).toBe(3);
|
|
63
|
+
expect(r.records.map((rec) => rec.name)).toEqual([
|
|
64
|
+
"Repo One",
|
|
65
|
+
"Repo Two",
|
|
66
|
+
"Repo Three",
|
|
67
|
+
]);
|
|
68
|
+
// Category comes from the section heading.
|
|
69
|
+
expect(r.records[0]?.category).toBe("Tools");
|
|
70
|
+
expect(r.records[2]?.category).toBe("Libraries");
|
|
71
|
+
});
|
|
72
|
+
it("dedupes repeated names (same label slug → -2, -3, ...)", () => {
|
|
73
|
+
// The parser's collision counter is NAME-based (via
|
|
74
|
+
// `uniqueSlug`), not URL-based. Two lines with different
|
|
75
|
+
// names both pointing at the same URL produce two records;
|
|
76
|
+
// two lines with the same name produce the second with a
|
|
77
|
+
// -2 suffix. Pinning the actual behaviour so a future
|
|
78
|
+
// switch to URL-based dedup is visible.
|
|
79
|
+
const md = [
|
|
80
|
+
"## Tools",
|
|
81
|
+
"",
|
|
82
|
+
"- [A](https://github.com/owner/repo) - first",
|
|
83
|
+
"- [A](https://github.com/owner/other) - second",
|
|
84
|
+
].join("\n");
|
|
85
|
+
const r = parseAwesomeMarkdown(md);
|
|
86
|
+
expect(r.report.imported).toBe(2);
|
|
87
|
+
expect(r.records.map((rec) => rec.slug)).toEqual(["a", "a-2"]);
|
|
88
|
+
});
|
|
89
|
+
it("skips lines that are not list items (text between sections)", () => {
|
|
90
|
+
const md = [
|
|
91
|
+
"## Tools",
|
|
92
|
+
"",
|
|
93
|
+
"Some prose describing the section.",
|
|
94
|
+
"",
|
|
95
|
+
"- [Real](https://github.com/owner/real) - A real repo",
|
|
96
|
+
].join("\n");
|
|
97
|
+
const r = parseAwesomeMarkdown(md);
|
|
98
|
+
expect(r.records).toHaveLength(1);
|
|
99
|
+
expect(r.records[0]?.name).toBe("Real");
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("writeImportedRecords — filesystem round-trip", () => {
|
|
103
|
+
let cwd;
|
|
104
|
+
beforeEach(async () => {
|
|
105
|
+
cwd = await mkdtemp(join(tmpdir(), "grove-importer-test-"));
|
|
106
|
+
});
|
|
107
|
+
afterEach(async () => {
|
|
108
|
+
await rm(cwd, { recursive: true, force: true });
|
|
109
|
+
});
|
|
110
|
+
it("writes one YAML file per record to the target directory", async () => {
|
|
111
|
+
const result = {
|
|
112
|
+
records: [
|
|
113
|
+
{
|
|
114
|
+
name: "First",
|
|
115
|
+
slug: "first",
|
|
116
|
+
description: "first record",
|
|
117
|
+
category: "tools",
|
|
118
|
+
links: { github: "https://github.com/owner/first" },
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "Second",
|
|
122
|
+
slug: "second",
|
|
123
|
+
description: "second record",
|
|
124
|
+
category: "tools",
|
|
125
|
+
links: { github: "https://github.com/owner/second" },
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
report: { imported: 2, skipped: 0, categories: [], duplicateSlugs: 0, tocSkipped: 0, anchorLinksSkipped: 0 },
|
|
129
|
+
};
|
|
130
|
+
const { written, dir } = await writeImportedRecords(result, cwd, "project-directory");
|
|
131
|
+
expect(written).toBe(2);
|
|
132
|
+
expect(dir).toContain("data/records");
|
|
133
|
+
const first = await readFile(join(dir, "first.yml"), "utf8");
|
|
134
|
+
expect(first).toContain("name: First");
|
|
135
|
+
expect(first).toContain("kind: project");
|
|
136
|
+
expect(first).toContain("slug: first");
|
|
137
|
+
});
|
|
138
|
+
it("returns 0 and writes nothing for an empty input list", async () => {
|
|
139
|
+
const result = {
|
|
140
|
+
records: [],
|
|
141
|
+
report: { imported: 0, skipped: 0, categories: [], duplicateSlugs: 0, tocSkipped: 0, anchorLinksSkipped: 0 },
|
|
142
|
+
};
|
|
143
|
+
const { written } = await writeImportedRecords(result, cwd, "project-directory");
|
|
144
|
+
expect(written).toBe(0);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe("importAwesomeList — end-to-end on a local README.md", () => {
|
|
148
|
+
let cwd;
|
|
149
|
+
beforeEach(async () => {
|
|
150
|
+
cwd = await mkdtemp(join(tmpdir(), "grove-import-test-"));
|
|
151
|
+
});
|
|
152
|
+
afterEach(async () => {
|
|
153
|
+
await rm(cwd, { recursive: true, force: true });
|
|
154
|
+
});
|
|
155
|
+
it("parses a local markdown file and returns ImportedRecord[]", async () => {
|
|
156
|
+
const md = [
|
|
157
|
+
"# Awesome Stuff",
|
|
158
|
+
"",
|
|
159
|
+
"## Frameworks",
|
|
160
|
+
"",
|
|
161
|
+
"- [Framework A](https://github.com/owner/framework-a) - A nice framework",
|
|
162
|
+
"- [Framework B](https://github.com/owner/framework-b)",
|
|
163
|
+
].join("\n");
|
|
164
|
+
const readme = join(cwd, "README.md");
|
|
165
|
+
await writeFile(readme, md);
|
|
166
|
+
const result = await importAwesomeList(readme);
|
|
167
|
+
expect(result.report.imported).toBe(2);
|
|
168
|
+
expect(result.records).toHaveLength(2);
|
|
169
|
+
expect(result.records[0]?.name).toBe("Framework A");
|
|
170
|
+
expect(result.records[0]?.category).toBe("Frameworks");
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=importer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importer.test.js","sourceRoot":"","sources":["../src/importer.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export
|
|
16
|
-
export
|
|
1
|
+
/**
|
|
2
|
+
* @grove-dev/core — headless engine for Grove.
|
|
3
|
+
*
|
|
4
|
+
* V1 public surface (locked). The list below is the complete set of
|
|
5
|
+
* symbols exported by this package — every other symbol is internal
|
|
6
|
+
* and may change without notice.
|
|
7
|
+
*
|
|
8
|
+
* To audit: `grep -E '^export ' src/index.ts | sort`
|
|
9
|
+
*/
|
|
10
|
+
export { defineConfig, loadConfig } from "./config.js";
|
|
11
|
+
export type { GroveConfig } from "./schema.js";
|
|
12
|
+
export { blueprintSchema, resourceKindSchema, healthStatusSchema, healthTierSchema, healthBlockSchema, healthEntrySchema, healthFileSchema, decisionSchema, decisionsFileSchema, overrideSchema, overridesFileSchema, projectRecordSchema, resourceRecordSchema, entityRecordSchema, projectTypeSchema, resourceTypeSchema, entityTypeSchema, appLabelSchema, scoreSchema, linksSchema, githubRepositorySchema, githubMetadataSchema, githubLicenseSchema, blueprintKind, } from "./schema.js";
|
|
13
|
+
export type { Blueprint, ResourceKind, DecisionVisibility, Resource, ProjectRecord, ResourceRecord, EntityRecord, IndexRecord, IndexProjectRecord, IndexResourceRecord, IndexEntityRecord, HealthStatus, HealthTier, HealthEntry, HealthFile, Decision, DecisionsFile, Override, OverridesFile, ProjectType, ResourceType, EntityType, AppLabel, Score, Links, GithubMetadata, GithubRepository, } from "./schema.js";
|
|
14
|
+
export { generate } from "./build-data.js";
|
|
15
|
+
export type { GenerateResult, RecordsFullPayload, RecordsIndexPayload } from "./build-data.js";
|
|
16
|
+
export { stringifyRecordYaml } from "./schema.js";
|
|
17
|
+
export { buildSitemap, buildSitemapXml } from "./sitemap.js";
|
|
18
|
+
export { buildLlmsTxt, buildLlmsFullTxt, buildLlmsFiles } from "./llms.js";
|
|
19
|
+
export type { LlmsInput, LlmsRecordInput, LlmsResult } from "./llms.js";
|
|
20
|
+
export { pickCleanupCandidates, cleanupStale } from "./decisions.js";
|
|
21
|
+
export type { CleanupCandidate, CleanupReport } from "./decisions.js";
|
|
22
|
+
export { parseGithubRepoUrl, fetchGithubMetadata } from "./github.js";
|
|
23
|
+
export type { GithubRepoRef } from "./github.js";
|
|
24
|
+
export { enrichFromGithubHtml } from "./enrich.js";
|
|
25
|
+
export type { EnrichedFields, EnrichResult } from "./enrich.js";
|
|
26
|
+
export { rateLimitWaitMs, sleep } from "./github-client.js";
|
|
27
|
+
export type { GhFetchOptions } from "./github-client.js";
|
|
28
|
+
export { classifyHealth } from "./health.js";
|
|
29
|
+
export { detectGithubRepo, parseAwesomeMarkdown, } from "./markdown.js";
|
|
30
|
+
export type { ImportedRecord, ImportSummary, ImportResult, } from "./markdown.js";
|
|
31
|
+
export { importAwesomeList, writeImportedRecords } from "./importer.js";
|
|
32
|
+
export { parseEntry, parseSections } from "./parseReadme.js";
|
|
33
|
+
export type { ParsedEntry, ParsedSection } from "./parseReadme.js";
|
|
34
|
+
export { readYamlFile, writeYamlFile, writeTextFile } from "./io.js";
|
|
35
|
+
export { validateProject } from "./validate.js";
|
|
36
|
+
export type { ValidationResult, ValidationIssue, ValidationSeverity } from "./validate.js";
|
|
17
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,KAAK,EACL,KAAK,EACL,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGxE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGtE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,17 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
export
|
|
16
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @grove-dev/core — headless engine for Grove.
|
|
3
|
+
*
|
|
4
|
+
* V1 public surface (locked). The list below is the complete set of
|
|
5
|
+
* symbols exported by this package — every other symbol is internal
|
|
6
|
+
* and may change without notice.
|
|
7
|
+
*
|
|
8
|
+
* To audit: `grep -E '^export ' src/index.ts | sort`
|
|
9
|
+
*/
|
|
10
|
+
// ── Config ────────────────────────────────────────────────────────────
|
|
11
|
+
export { defineConfig, loadConfig } from "./config.js";
|
|
12
|
+
// ── Schemas (Zod) ─────────────────────────────────────────────────────
|
|
13
|
+
export { blueprintSchema, resourceKindSchema, healthStatusSchema, healthTierSchema, healthBlockSchema, healthEntrySchema, healthFileSchema, decisionSchema, decisionsFileSchema, overrideSchema, overridesFileSchema, projectRecordSchema, resourceRecordSchema, entityRecordSchema, projectTypeSchema, resourceTypeSchema, entityTypeSchema, appLabelSchema, scoreSchema, linksSchema, githubRepositorySchema, githubMetadataSchema, githubLicenseSchema, blueprintKind, } from "./schema.js";
|
|
14
|
+
// ── Build pipeline (library form of `grove generate`) ────────────────
|
|
15
|
+
export { generate } from "./build-data.js";
|
|
16
|
+
// ── Record YAML helpers (used by `grove import` and the generator) ──
|
|
17
|
+
export { stringifyRecordYaml } from "./schema.js";
|
|
18
|
+
// ── Sitemap (library form of `grove sitemap`) ────────────────────────
|
|
19
|
+
export { buildSitemap, buildSitemapXml } from "./sitemap.js";
|
|
20
|
+
// ── llms.txt (library form of `grove llms`) ───────────────────────────
|
|
21
|
+
export { buildLlmsTxt, buildLlmsFullTxt, buildLlmsFiles } from "./llms.js";
|
|
22
|
+
// ── Cleanup (library form of `grove cleanup stale`) ──────────────────
|
|
23
|
+
export { pickCleanupCandidates, cleanupStale } from "./decisions.js";
|
|
24
|
+
// ── GitHub: parsing + REST metadata ──────────────────────────────────
|
|
25
|
+
export { parseGithubRepoUrl, fetchGithubMetadata } from "./github.js";
|
|
26
|
+
// ── GitHub: HTML enrichment (token-free fallback) ────────────────────
|
|
27
|
+
export { enrichFromGithubHtml } from "./enrich.js";
|
|
28
|
+
// ── GitHub: client helpers (V1 public subset) ────────────────────────
|
|
29
|
+
export { rateLimitWaitMs, sleep } from "./github-client.js";
|
|
30
|
+
// ── Health: classification ────────────────────────────────────────────
|
|
31
|
+
export { classifyHealth } from "./health.js";
|
|
32
|
+
// ── Importers / parsers ──────────────────────────────────────────────
|
|
33
|
+
export { detectGithubRepo, parseAwesomeMarkdown, } from "./markdown.js";
|
|
34
|
+
export { importAwesomeList, writeImportedRecords } from "./importer.js";
|
|
35
|
+
export { parseEntry, parseSections } from "./parseReadme.js";
|
|
36
|
+
// ── IO helpers ────────────────────────────────────────────────────────
|
|
37
|
+
export { readYamlFile, writeYamlFile, writeTextFile } from "./io.js";
|
|
38
|
+
// ── Validation ────────────────────────────────────────────────────────
|
|
39
|
+
// `validateProject` is the library form of `grove validate`. It is
|
|
40
|
+
// kept in the V1 surface because the CLI's `validate` command needs
|
|
41
|
+
// the structured issue output (codes + messages) that `generate`'s
|
|
42
|
+
// throw path does not produce. This is the only V0-era name that
|
|
43
|
+
// survives — every other removed name from V0 is gone.
|
|
44
|
+
export { validateProject } from "./validate.js";
|
|
17
45
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,yEAAyE;AACzE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGvD,yEAAyE;AACzE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AAiCrB,wEAAwE;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,uEAAuE;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wEAAwE;AACxE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7D,yEAAyE;AACzE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3E,wEAAwE;AACxE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGrE,wEAAwE;AACxE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGtE,wEAAwE;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,wEAAwE;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG5D,yEAAyE;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,wEAAwE;AACxE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG7D,yEAAyE;AACzE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErE,yEAAyE;AACzE,mEAAmE;AACnE,oEAAoE;AACpE,mEAAmE;AACnE,iEAAiE;AACjE,uDAAuD;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/llms.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms.d.ts","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"llms.d.ts","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AA6DD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAkB1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CA4B9E;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,GAAG,SAAgB,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAerB"}
|
package/dist/llms.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
3
|
import { loadConfig } from "./config.js";
|
|
4
|
+
import { slugify } from "./slug.js";
|
|
4
5
|
const BLUEPRINT_INDEX = {
|
|
5
6
|
"project-directory": "projects",
|
|
6
7
|
"resource-hub": "resources",
|
|
@@ -12,10 +13,11 @@ const BLUEPRINT_PLURAL = {
|
|
|
12
13
|
"ecosystem-map": "Entities",
|
|
13
14
|
};
|
|
14
15
|
function slug(value) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
// Delegate to the package's single public slugifier. llms.txt anchor
|
|
17
|
+
// links only need the base form (no collision counter), and the
|
|
18
|
+
// public `slugify` matches the GitHub-flavored anchor format the
|
|
19
|
+
// downstream Markdown renderer expects.
|
|
20
|
+
return slugify(String(value));
|
|
19
21
|
}
|
|
20
22
|
function truncate(value, max) {
|
|
21
23
|
return value.replace(/\s+/g, " ").slice(0, max);
|
package/dist/llms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms.js","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAoB,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"llms.js","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,SAAS,EAAsB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,SAAS,EAAsB,MAAM,aAAa,CAAC;AAGhF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;CACvB;AA0BD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAShE;AA2CD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,YAAY,CAyGd;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuB5E;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,GAAG,SAAgB,EACnB,SAAS,GAAE,SAA+B,GACzC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B3C"}
|