@grove-dev/core 0.1.4 → 0.2.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.
package/dist/llms.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { type CuratedConfig } from "./config.js";
2
- export interface LlmsAppInput {
1
+ import { type GroveConfig } from "./config.js";
2
+ export interface LlmsRecordInput {
3
3
  slug: string;
4
4
  name: string;
5
5
  description?: string;
@@ -7,7 +7,6 @@ export interface LlmsAppInput {
7
7
  stack?: string;
8
8
  stars?: number;
9
9
  visibility?: string;
10
- /** Detail page body — markdown. Used for llms-full.txt sections. */
11
10
  detail?: string;
12
11
  homepageUrl?: string;
13
12
  repoUrl?: string;
@@ -18,17 +17,14 @@ export interface LlmsAppInput {
18
17
  export interface LlmsInput {
19
18
  siteUrl?: string;
20
19
  generatedAt: string;
21
- apps: LlmsAppInput[];
20
+ records: LlmsRecordInput[];
22
21
  }
23
22
  export interface LlmsResult {
24
23
  txtPath: string;
25
24
  fullPath: string;
26
25
  indexed: number;
27
26
  }
28
- /** Build the llms.txt string — short pointer to llms-full.txt. */
29
- export declare function buildLlmsTxt(input: LlmsInput, config: CuratedConfig): string;
30
- /** Build the llms-full.txt string — index + per-app sections. */
31
- export declare function buildLlmsFullTxt(input: LlmsInput, config: CuratedConfig): string;
32
- /** Write public/llms.txt and public/llms-full.txt. */
33
- export declare function buildLlmsFiles(input: LlmsInput, cwd?: string, config?: CuratedConfig): Promise<LlmsResult>;
27
+ export declare function buildLlmsTxt(input: LlmsInput, config: GroveConfig): string;
28
+ export declare function buildLlmsFullTxt(input: LlmsInput, config: GroveConfig): string;
29
+ export declare function buildLlmsFiles(input: LlmsInput, cwd?: string, config?: GroveConfig): Promise<LlmsResult>;
34
30
  //# sourceMappingURL=llms.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llms.d.ts","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,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,oEAAoE;IACpE,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,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAyCD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAgB5E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAyBhF;AAED,sDAAsD;AACtD,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,GAAG,SAAgB,EACnB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAarB"}
1
+ {"version":3,"file":"llms.d.ts","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,aAAa,CAAC;AAE3D,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;AA4DD,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,90 +1,101 @@
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
+ const BLUEPRINT_INDEX = {
5
+ "project-directory": "projects",
6
+ "resource-hub": "resources",
7
+ "ecosystem-map": "entities",
8
+ };
9
+ const BLUEPRINT_PLURAL = {
10
+ "project-directory": "Projects",
11
+ "resource-hub": "Resources",
12
+ "ecosystem-map": "Entities",
13
+ };
4
14
  function slug(value) {
5
- return String(value).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
15
+ return String(value)
16
+ .toLowerCase()
17
+ .replace(/[^a-z0-9]+/g, "-")
18
+ .replace(/^-+|-+$/g, "");
6
19
  }
7
20
  function truncate(value, max) {
8
21
  return value.replace(/\s+/g, " ").slice(0, max);
9
22
  }
10
- function buildIndexLine(app) {
11
- const desc = truncate(app.description ?? "", 120);
12
- const cat = app.category ?? "—";
13
- const stack = app.stack ?? "—";
14
- const stars = app.stars ?? 0;
15
- return `- [${app.name}](#${slug(app.slug)}) — ${cat} · ${stack} · ${stars}★ — ${desc}`;
23
+ function buildIndexLine(record) {
24
+ const desc = truncate(record.description ?? "", 120);
25
+ const cat = record.category ?? "—";
26
+ const stack = record.stack ?? "—";
27
+ const stars = record.stars ?? 0;
28
+ return `- [${record.name}](#${slug(record.slug)}) — ${cat} · ${stack} · ${stars}★ — ${desc}`;
16
29
  }
17
- function buildDetailSection(app, siteUrl, indexSlug) {
30
+ function buildDetailSection(record, siteUrl, indexSlug) {
18
31
  const lines = [
19
- `### ${app.name}`,
32
+ `### ${record.name}`,
20
33
  "",
21
- app.description ? `${app.description}` : "",
34
+ record.description ? `${record.description}` : "",
22
35
  "",
23
- `- slug: ${app.slug}`,
24
- `- category: ${app.category ?? "—"}`,
25
- `- stack: ${app.stack ?? "—"}`,
26
- `- stars: ${app.stars ?? 0}`,
27
- app.license ? `- license: ${app.license}` : "",
28
- app.repoUrl ? `- repo: ${app.repoUrl}` : "",
29
- app.homepageUrl ? `- homepage: ${app.homepageUrl}` : "",
30
- `- url: ${siteUrl}/${indexSlug}/${app.slug}`,
31
- app.lastCommitAt ? `- lastCommit: ${app.lastCommitAt.slice(0, 10)}` : "",
32
- app.addedAt ? `- added: ${app.addedAt.slice(0, 10)}` : "",
36
+ `- slug: ${record.slug}`,
37
+ `- category: ${record.category ?? "—"}`,
38
+ `- stack: ${record.stack ?? "—"}`,
39
+ `- stars: ${record.stars ?? 0}`,
40
+ record.license ? `- license: ${record.license}` : "",
41
+ record.repoUrl ? `- repo: ${record.repoUrl}` : "",
42
+ record.homepageUrl ? `- homepage: ${record.homepageUrl}` : "",
43
+ `- url: ${siteUrl}/${indexSlug}/${record.slug}`,
44
+ record.lastCommitAt ? `- lastCommit: ${record.lastCommitAt.slice(0, 10)}` : "",
45
+ record.addedAt ? `- added: ${record.addedAt.slice(0, 10)}` : "",
33
46
  ].filter(Boolean);
34
- if (app.detail) {
35
- lines.push("", "#### Detail", "", app.detail);
47
+ if (record.detail) {
48
+ lines.push("", "#### Detail", "", record.detail);
36
49
  }
37
50
  return lines.join("\n");
38
51
  }
39
- /** Build the llms.txt string — short pointer to llms-full.txt. */
40
52
  export function buildLlmsTxt(input, config) {
41
- const siteUrl = (input.siteUrl ?? config.siteUrl ?? "").replace(/\/$/, "");
42
- const visible = input.apps.filter((a) => a.visibility !== "hide" && a.visibility !== "remove");
43
- const indexSlug = config.itemLabel === "app" ? "apps" : "projects";
44
- return `# ${config.name}
53
+ const siteUrl = (input.siteUrl ?? config.site.url ?? "").replace(/\/$/, "");
54
+ const indexSlug = BLUEPRINT_INDEX[config.blueprint] ?? "items";
55
+ const visible = input.records.filter((r) => r.visibility !== "hide" && r.visibility !== "remove");
56
+ return `# ${config.site.name}
45
57
 
46
- ${config.description ?? config.tagline}
58
+ ${config.site.description ?? config.site.tagline}
47
59
 
48
60
  Directory: ${siteUrl}/${indexSlug}
49
- Projects indexed: ${visible.length}
50
- Categories: ${new Set(visible.map((a) => a.category).filter(Boolean)).size}
61
+ Records indexed: ${visible.length}
62
+ Categories: ${new Set(visible.map((r) => r.category).filter(Boolean)).size}
51
63
 
52
64
  ## Usage
53
65
 
54
- Use /llms-full.txt for project-level details. Prefer project detail pages for citations.
66
+ Use /llms-full.txt for record-level details. Prefer detail pages for citations.
55
67
  `;
56
68
  }
57
- /** Build the llms-full.txt string — index + per-app sections. */
58
69
  export function buildLlmsFullTxt(input, config) {
59
- const siteUrl = (input.siteUrl ?? config.siteUrl ?? "").replace(/\/$/, "");
60
- const indexSlug = config.itemLabel === "app" ? "apps" : "projects";
61
- const visible = input.apps.filter((a) => a.visibility !== "hide" && a.visibility !== "remove");
70
+ const siteUrl = (input.siteUrl ?? config.site.url ?? "").replace(/\/$/, "");
71
+ const indexSlug = BLUEPRINT_INDEX[config.blueprint] ?? "items";
72
+ const visible = input.records.filter((r) => r.visibility !== "hide" && r.visibility !== "remove");
73
+ const plural = BLUEPRINT_PLURAL[config.blueprint] ?? "Items";
62
74
  const index = visible.map(buildIndexLine).join("\n");
63
75
  const sections = visible
64
- .map((app) => buildDetailSection(app, siteUrl, indexSlug))
76
+ .map((record) => buildDetailSection(record, siteUrl, indexSlug))
65
77
  .join("\n\n");
66
78
  return [
67
- `# ${config.name} — full directory`,
79
+ `# ${config.site.name} — full directory`,
68
80
  "",
69
- `> Generated ${input.generatedAt} from ${input.apps.length} app records.`,
70
- `> Source: ${siteUrl}/${indexSlug} · Regenerate with \`grove build-llms-full\`.`,
81
+ `> Generated ${input.generatedAt} from ${input.records.length} records.`,
82
+ `> Source: ${siteUrl}/${indexSlug} · Regenerate with \`grove generate\`.`,
71
83
  "",
72
- "Each section below mirrors one app detail page.",
84
+ "Each section below mirrors one record detail page.",
73
85
  "",
74
86
  "## Index",
75
87
  "",
76
88
  index,
77
89
  "",
78
- sections ? "## Projects" : "",
90
+ sections ? `## ${plural}` : "",
79
91
  "",
80
92
  sections,
81
93
  "",
82
94
  ].join("\n");
83
95
  }
84
- /** Write public/llms.txt and public/llms-full.txt. */
85
96
  export async function buildLlmsFiles(input, cwd = process.cwd(), config) {
86
97
  const cfg = config ?? (await loadConfig(cwd));
87
- const publicDir = resolve(cwd, "public");
98
+ const publicDir = resolve(cwd, cfg.paths.publicDir);
88
99
  await mkdir(publicDir, { recursive: true });
89
100
  const txtPath = join(publicDir, "llms.txt");
90
101
  const fullPath = join(publicDir, "llms-full.txt");
@@ -93,7 +104,7 @@ export async function buildLlmsFiles(input, cwd = process.cwd(), config) {
93
104
  return {
94
105
  txtPath,
95
106
  fullPath,
96
- indexed: input.apps.filter((a) => a.visibility !== "hide" && a.visibility !== "remove").length,
107
+ indexed: input.records.filter((r) => r.visibility !== "hide" && r.visibility !== "remove").length,
97
108
  };
98
109
  }
99
110
  //# sourceMappingURL=llms.js.map
package/dist/llms.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"llms.js","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llms.js","sourceRoot":"","sources":["../src/llms.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,40 @@
1
- import type { CuratedItem } from "./schema.js";
2
- export interface ImportResult {
3
- items: CuratedItem[];
4
- report: {
5
- imported: number;
6
- skipped: number;
7
- categories: string[];
8
- duplicateSlugs: number;
9
- tocSkipped: number;
10
- anchorLinksSkipped: number;
1
+ import { type Blueprint } from "./schema.js";
2
+ export interface ImportedRecord {
3
+ slug: string;
4
+ name: string;
5
+ description: string;
6
+ category: string;
7
+ links: {
8
+ github?: string;
9
+ website?: string;
10
+ source?: string;
11
11
  };
12
12
  }
13
+ export interface ImportSummary {
14
+ imported: number;
15
+ skipped: number;
16
+ categories: string[];
17
+ duplicateSlugs: number;
18
+ tocSkipped: number;
19
+ anchorLinksSkipped: number;
20
+ }
21
+ export interface ImportResult {
22
+ records: ImportedRecord[];
23
+ report: ImportSummary;
24
+ }
13
25
  export declare function detectGithubRepo(url: string): string | undefined;
14
26
  export declare function parseAwesomeMarkdown(text: string, options?: {
15
27
  file?: string;
16
28
  sourceUrl?: string;
17
29
  }): ImportResult;
30
+ export declare function importAwesomeList(input: string): Promise<ImportResult>;
31
+ /**
32
+ * Write imported records out as `data/records/<slug>.yml`, one per
33
+ * record. Each file is shaped for the `project-directory` blueprint
34
+ * (kind: project). Other blueprints should use a separate importer.
35
+ */
36
+ export declare function writeImportedRecords(result: ImportResult, cwd?: string, blueprint?: Blueprint): Promise<{
37
+ written: number;
38
+ dir: string;
39
+ }>;
18
40
  //# sourceMappingURL=markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAsBD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMhE;AA4BD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAiJpH"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,SAAS,EAAsB,MAAM,aAAa,CAAC;AAEhF,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,CAMhE;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"}
package/dist/markdown.js CHANGED
@@ -1,4 +1,7 @@
1
- import { uniqueSlug } from "./slug.js";
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { basename, join, resolve } from "node:path";
3
+ import { stringify as stringifyYaml } from "yaml";
4
+ import { blueprintKind } from "./schema.js";
2
5
  const markdownLinkPattern = /\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
3
6
  const TOC_TITLES = new Set([
4
7
  "contents",
@@ -8,20 +11,22 @@ const TOC_TITLES = new Set([
8
11
  "license",
9
12
  "contributors",
10
13
  ]);
14
+ const EMOJIS = /[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}]/gu;
11
15
  function stripAnchor(name) {
12
16
  return name
13
17
  .replace(/<a\s+name="[^"]+"><\/a>/gi, "")
14
18
  .replace(/🔗/g, "")
15
- .replace(/🚀|🎨|📐|👨‍💻|🤖|🖥️|💬|🗣️|🔑|👤|🗄️|📊|💻|🔒|🧮|📟|🎓|🛒|🌳|📂|💰|🎮|🏠|🧠|⚖️|🗺️|🎯|📋|🏠|🔬|🔎|🌐|🔮|🏃|🎧|🌎|🎙️|🚆|🔄|🏢|🛠️/g, "")
19
+ .replace(EMOJIS, "")
16
20
  .replace(/\s+/g, " ")
17
21
  .trim();
18
22
  }
23
+ const REPO_RESERVED = new Set(["issues", "pulls", "stargazers", "network"]);
19
24
  export function detectGithubRepo(url) {
20
25
  const match = url.match(/^https?:\/\/github\.com\/([^/\s]+)\/([^/#?\s]+)(?:[/?#].*)?$/i);
21
26
  if (!match)
22
27
  return undefined;
23
28
  const repo = match[2].replace(/\.git$/, "");
24
- if (!repo || ["issues", "pulls", "stargazers", "network"].includes(repo))
29
+ if (!repo || REPO_RESERVED.has(repo))
25
30
  return undefined;
26
31
  return `https://github.com/${match[1]}/${repo}`;
27
32
  }
@@ -46,19 +51,30 @@ function headingDepth(line) {
46
51
  function headingText(line) {
47
52
  return stripAnchor(line.match(/^#{2,6}\s+(.+?)\s*$/)?.[1]?.trim() ?? "");
48
53
  }
54
+ function slugify(label, seen) {
55
+ const base = label.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80) ||
56
+ "item";
57
+ const existing = seen.get(base) ?? 0;
58
+ seen.set(base, existing + 1);
59
+ return existing === 0 ? base : `${base}-${existing}`;
60
+ }
61
+ function githubReadmeUrl(input) {
62
+ const match = input.match(/^https?:\/\/github\.com\/([^/\s]+)\/([^/#?\s]+)\/?$/i);
63
+ if (!match)
64
+ return undefined;
65
+ return `https://raw.githubusercontent.com/${match[1]}/${match[2]}/HEAD/README.md`;
66
+ }
49
67
  export function parseAwesomeMarkdown(text, options = {}) {
50
68
  const lines = text.split(/\r?\n/);
51
69
  const seen = new Map();
52
70
  const categories = new Set();
53
- const items = [];
71
+ const records = [];
54
72
  let currentCategory = "uncategorized";
55
- let categoryDepth = 2;
56
73
  let skipped = 0;
57
74
  let duplicateSlugs = 0;
58
75
  let tocSkipped = 0;
59
76
  let anchorLinksSkipped = 0;
60
77
  let inTocBlock = false;
61
- let consecutiveBlankLines = 0;
62
78
  for (let index = 0; index < lines.length; index++) {
63
79
  const line = lines[index] ?? "";
64
80
  const depth = headingDepth(line);
@@ -67,31 +83,21 @@ export function parseAwesomeMarkdown(text, options = {}) {
67
83
  inTocBlock = TOC_TITLES.has(title.toLowerCase());
68
84
  if (title && !inTocBlock) {
69
85
  currentCategory = title;
70
- categoryDepth = depth;
71
86
  categories.add(currentCategory);
72
87
  }
73
- consecutiveBlankLines = 0;
74
88
  continue;
75
89
  }
76
90
  if (inTocBlock) {
77
- // TOC blocks: skip list items entirely. Exit when we see a non-list, non-blank line.
78
- if (!line.trim()) {
79
- consecutiveBlankLines++;
91
+ if (!line.trim())
80
92
  continue;
81
- }
82
93
  if (/^\s*[-*+]\s+/.test(line) || /^\s*\d+\.\s+/.test(line)) {
83
94
  tocSkipped++;
84
- consecutiveBlankLines = 0;
85
95
  continue;
86
96
  }
87
- // First non-list, non-blank line ends the TOC block.
88
97
  inTocBlock = false;
89
98
  }
90
- if (!/^\s*[-*+]\s+/.test(line)) {
91
- consecutiveBlankLines = line.trim() ? 0 : consecutiveBlankLines + 1;
99
+ if (!/^\s*[-*+]\s+/.test(line))
92
100
  continue;
93
- }
94
- consecutiveBlankLines = 0;
95
101
  const body = line.replace(/^\s*[-*+]\s+/, "").trim();
96
102
  const parsedLinks = [...body.matchAll(markdownLinkPattern)].map((match) => ({
97
103
  label: match[1].trim(),
@@ -101,7 +107,6 @@ export function parseAwesomeMarkdown(text, options = {}) {
101
107
  skipped++;
102
108
  continue;
103
109
  }
104
- // Filter out items whose primary link is an in-page anchor (TOC-style leftover).
105
110
  const primary = parsedLinks[0];
106
111
  if (!primary) {
107
112
  skipped++;
@@ -111,66 +116,45 @@ export function parseAwesomeMarkdown(text, options = {}) {
111
116
  anchorLinksSkipped++;
112
117
  continue;
113
118
  }
114
- // Only keep items that have at least one external URL (HTTP/HTTPS or protocol-relative).
115
- // Project directories need a real link, not just text + bare words.
116
119
  const hasExternal = parsedLinks.some((link) => isExternalUrl(link.url) && !isAnchorLink(link.url));
117
120
  if (!hasExternal) {
118
121
  skipped++;
119
122
  continue;
120
123
  }
121
- // Prefer the first external link as the primary, ignoring any leading anchor links.
122
124
  const primaryExternal = parsedLinks.find((link) => isExternalUrl(link.url) && !isAnchorLink(link.url));
123
125
  if (!primaryExternal) {
124
126
  skipped++;
125
127
  continue;
126
128
  }
127
- const github = parsedLinks.map((link) => detectGithubRepo(link.url)).find(Boolean);
128
- const id = uniqueSlug(primaryExternal.label, seen);
129
- if (id !==
130
- (primaryExternal.label.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80) || "item")) {
129
+ const github = parsedLinks
130
+ .map((link) => detectGithubRepo(link.url))
131
+ .find((u) => Boolean(u));
132
+ const id = slugify(primaryExternal.label, seen);
133
+ const lowerSlug = primaryExternal.label
134
+ .toLowerCase()
135
+ .replace(/[^a-z0-9]+/g, "-")
136
+ .replace(/^-+|-+$/g, "")
137
+ .slice(0, 80) || "item";
138
+ if (id !== lowerSlug)
131
139
  duplicateSlugs++;
132
- }
133
140
  const description = extractDescription(body);
134
141
  const links = {
135
142
  ...(github ? { github } : {}),
136
143
  ...(!github ? { website: primaryExternal.url } : {}),
137
144
  ...(options.sourceUrl ? { source: options.sourceUrl } : {}),
138
145
  };
139
- items.push({
140
- id,
146
+ records.push({
147
+ slug: id,
141
148
  name: primaryExternal.label,
142
149
  description: description || primaryExternal.label,
150
+ category: currentCategory,
143
151
  links,
144
- source: {
145
- type: "markdown",
146
- file: options.file,
147
- line: index + 1,
148
- url: options.sourceUrl,
149
- },
150
- taxonomy: {
151
- category: currentCategory,
152
- tags: [],
153
- stacks: [],
154
- platforms: [],
155
- },
156
- labels: [],
157
- lenses: [],
158
- distribution: {
159
- channels: [],
160
- },
161
- curation: {
162
- bestFor: [],
163
- whyListed: [],
164
- caveats: [],
165
- launchAsk: [],
166
- scores: {},
167
- },
168
152
  });
169
153
  }
170
154
  return {
171
- items,
155
+ records,
172
156
  report: {
173
- imported: items.length,
157
+ imported: records.length,
174
158
  skipped,
175
159
  categories: [...categories].filter((c) => c && c !== "uncategorized"),
176
160
  duplicateSlugs,
@@ -179,4 +163,60 @@ export function parseAwesomeMarkdown(text, options = {}) {
179
163
  },
180
164
  };
181
165
  }
166
+ export async function importAwesomeList(input) {
167
+ const remote = githubReadmeUrl(input) ?? (/^https?:\/\//.test(input) ? input : undefined);
168
+ let text;
169
+ let file;
170
+ let sourceUrl;
171
+ if (remote) {
172
+ const response = await fetch(remote);
173
+ if (!response.ok) {
174
+ throw new Error(`Could not fetch ${remote}: ${response.status} ${response.statusText}`);
175
+ }
176
+ text = await response.text();
177
+ file = "sources/README.md";
178
+ sourceUrl = input;
179
+ }
180
+ else {
181
+ const path = resolve(input);
182
+ const { readFile } = await import("node:fs/promises");
183
+ text = await readFile(path, "utf8");
184
+ file = basename(path);
185
+ }
186
+ return parseAwesomeMarkdown(text, { file, sourceUrl });
187
+ }
188
+ /**
189
+ * Write imported records out as `data/records/<slug>.yml`, one per
190
+ * record. Each file is shaped for the `project-directory` blueprint
191
+ * (kind: project). Other blueprints should use a separate importer.
192
+ */
193
+ export async function writeImportedRecords(result, cwd = process.cwd(), blueprint = "project-directory") {
194
+ const expectedKind = blueprintKind[blueprint];
195
+ const dir = resolve(cwd, "data", "records");
196
+ await mkdir(dir, { recursive: true });
197
+ let written = 0;
198
+ for (const record of result.records) {
199
+ let yamlObj;
200
+ if (expectedKind === "project") {
201
+ const project = {
202
+ kind: "project",
203
+ slug: record.slug,
204
+ name: record.name,
205
+ description: record.description,
206
+ category: record.category,
207
+ tags: [],
208
+ links: record.links,
209
+ source: { type: "import" },
210
+ };
211
+ yamlObj = project;
212
+ }
213
+ else {
214
+ yamlObj = { ...record, kind: expectedKind };
215
+ }
216
+ const path = join(dir, `${record.slug}.yml`);
217
+ await writeFile(path, stringifyYaml(yamlObj, { lineWidth: 100 }), "utf8");
218
+ written++;
219
+ }
220
+ return { written, dir };
221
+ }
182
222
  //# sourceMappingURL=markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}