@grimoire-rs/indexer 0.1.5 → 0.1.7
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 +10 -0
- package/dist/cli/enrich.d.ts +6 -0
- package/dist/cli/enrich.d.ts.map +1 -0
- package/dist/cli/enrich.js +33 -0
- package/dist/cli/enrich.js.map +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +9 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/data/index.d.ts +8 -0
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +14 -5
- package/dist/data/index.js.map +1 -1
- package/dist/enrich/index.d.ts +17 -0
- package/dist/enrich/index.d.ts.map +1 -0
- package/dist/enrich/index.js +168 -0
- package/dist/enrich/index.js.map +1 -0
- package/package.json +1 -1
- package/templates/reusable/gitlab-index-ci.yml +59 -0
package/README.md
CHANGED
|
@@ -8,10 +8,19 @@ servers, and bundles available in one or more OCI registries.
|
|
|
8
8
|
|
|
9
9
|
- `grim-indexer init` — scaffold a new index repo (`index/**` content
|
|
10
10
|
tree, Astro site config, CI workflow).
|
|
11
|
+
- `grim-indexer enrich` — refresh `enrich/**` from the registry: READMEs,
|
|
12
|
+
changelogs, logos, versions and tag lists. The only step that goes
|
|
13
|
+
online, and the only one that needs `grim` on `PATH`.
|
|
11
14
|
- `grim-indexer build` — render `index/**` into a static site.
|
|
12
15
|
- `grim-indexer validate` — CI gate for contribution PRs/MRs against an
|
|
13
16
|
index repo.
|
|
14
17
|
|
|
18
|
+
An index stores nothing but pointers — a ref and who owns it. Everything a
|
|
19
|
+
reader looks at lives in the registry, so an index that never runs `enrich`
|
|
20
|
+
renders a catalogue of names with *No README available* on every page. The
|
|
21
|
+
scaffolded CI runs it before each build; set `enrich: false` (GitHub) or
|
|
22
|
+
`GRIM_INDEXER_ENRICH: "false"` (GitLab) for a pointers-only site.
|
|
23
|
+
|
|
15
24
|
## Install
|
|
16
25
|
|
|
17
26
|
```sh
|
|
@@ -22,6 +31,7 @@ npm install --save-dev @grimoire-rs/indexer
|
|
|
22
31
|
|
|
23
32
|
```sh
|
|
24
33
|
npx @grimoire-rs/indexer init
|
|
34
|
+
npx @grimoire-rs/indexer enrich # needs `grim` on PATH
|
|
25
35
|
npx @grimoire-rs/indexer build
|
|
26
36
|
npx @grimoire-rs/indexer validate
|
|
27
37
|
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/cli/enrich.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4BhF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2026 The Grimoire Authors
|
|
3
|
+
// `grim-indexer enrich` — the one online step. Everything else in this CLI
|
|
4
|
+
// reads the checkout and nothing else.
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { CliError, EXIT } from "./exit.js";
|
|
7
|
+
export async function enrich(root, flags) {
|
|
8
|
+
const rootDir = path.resolve(root);
|
|
9
|
+
const { enrichIndex, spawnGrim } = await import("../enrich/index.js");
|
|
10
|
+
const bin = flags.grim ?? "grim";
|
|
11
|
+
let result;
|
|
12
|
+
try {
|
|
13
|
+
result = await enrichIndex({ root: rootDir, run: spawnGrim(bin) });
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
// A missing binary fails on the very first package, so it surfaces as a
|
|
17
|
+
// per-package failure rather than here — but keep the mapping honest for
|
|
18
|
+
// anything that escapes the loop.
|
|
19
|
+
throw new CliError(err instanceof Error ? err.message : String(err), EXIT.unavailable);
|
|
20
|
+
}
|
|
21
|
+
for (const failure of result.failures)
|
|
22
|
+
console.error(`warn: ${failure}`);
|
|
23
|
+
console.log(`enriched ${result.enriched}/${result.total} package(s)`);
|
|
24
|
+
if (result.total === 0)
|
|
25
|
+
return EXIT.ok;
|
|
26
|
+
if (result.failures.length * 2 > result.total) {
|
|
27
|
+
// A majority failing is a registry outage or a missing `grim`, not one bad
|
|
28
|
+
// package. Fail loudly; the sidecars already on disk are left alone.
|
|
29
|
+
throw new CliError(`${result.failures.length}/${result.total} package(s) failed — is \`${bin}\` installed and the registry reachable?`, EXIT.unavailable);
|
|
30
|
+
}
|
|
31
|
+
return EXIT.ok;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/cli/enrich.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,sCAAsC;AAEtC,2EAA2E;AAC3E,uCAAuC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAiB,MAAM,WAAW,CAAC;AAM1D,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,KAAkB;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEtE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC;IACjC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wEAAwE;QACxE,yEAAyE;QACzE,kCAAkC;QAClC,MAAM,IAAI,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACzF,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,KAAK,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,aAAa,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9C,2EAA2E;QAC3E,qEAAqE;QACrE,MAAM,IAAI,QAAQ,CAChB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,6BAA6B,GAAG,0CAA0C,EACnH,IAAI,CAAC,WAAW,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC"}
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAyEA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoFzD"}
|
package/dist/cli/main.js
CHANGED
|
@@ -6,6 +6,7 @@ import fs from "node:fs";
|
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { Command, CommanderError, Option } from "commander";
|
|
8
8
|
import { build } from "./build.js";
|
|
9
|
+
import { enrich } from "./enrich.js";
|
|
9
10
|
import { CliError, EXIT } from "./exit.js";
|
|
10
11
|
import { init } from "./init.js";
|
|
11
12
|
import { validate } from "./validate.js";
|
|
@@ -84,6 +85,14 @@ export async function run(argv) {
|
|
|
84
85
|
.action(async (root, opts) => {
|
|
85
86
|
code = await build(root, { outDir: opts.outDir });
|
|
86
87
|
});
|
|
88
|
+
program
|
|
89
|
+
.command("enrich")
|
|
90
|
+
.argument("[root]", "index repo root", ".")
|
|
91
|
+
.description("refresh enrich/ sidecars (README, logo, versions) from the registry")
|
|
92
|
+
.option("--grim <path>", "grim binary to read the registry with", "grim")
|
|
93
|
+
.action(async (root, opts) => {
|
|
94
|
+
code = await enrich(root, opts);
|
|
95
|
+
});
|
|
87
96
|
program
|
|
88
97
|
.command("validate")
|
|
89
98
|
.argument("[files...]", "changed index/** paths from the PR/MR diff")
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
package/dist/data/index.d.ts
CHANGED
|
@@ -36,5 +36,13 @@ export interface CompileResult {
|
|
|
36
36
|
export declare class IndexValidationError extends Error {
|
|
37
37
|
constructor(message: string);
|
|
38
38
|
}
|
|
39
|
+
export declare function findMetadataFiles(indexDir: string): string[];
|
|
40
|
+
/**
|
|
41
|
+
* Namespace of a `metadata.json`, derived from its path under `index/` —
|
|
42
|
+
* `index/github.com/acme/foo/metadata.json` -> `github.com/acme`. The single
|
|
43
|
+
* definition: `enrich` writes sidecars keyed on it and the compiler reads them
|
|
44
|
+
* back, so a second derivation is a silent mismatch waiting to happen.
|
|
45
|
+
*/
|
|
46
|
+
export declare function namespaceOf(indexDir: string, file: string): string;
|
|
39
47
|
export declare function compileIndex(opts: CompileOptions): Promise<CompileResult>;
|
|
40
48
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/data/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,gFAAgF;AAChF,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,gFAAgF;AAChF,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAsCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAU5D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA8C/E"}
|
package/dist/data/index.js
CHANGED
|
@@ -46,7 +46,7 @@ function validate(root, file, meta) {
|
|
|
46
46
|
fail(root, file, `owner must be an object with 'id' and 'github' or 'login'`);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
function findMetadataFiles(indexDir) {
|
|
49
|
+
export function findMetadataFiles(indexDir) {
|
|
50
50
|
if (!fs.existsSync(indexDir))
|
|
51
51
|
return [];
|
|
52
52
|
const entries = fs.readdirSync(indexDir, { recursive: true, withFileTypes: true });
|
|
@@ -58,6 +58,18 @@ function findMetadataFiles(indexDir) {
|
|
|
58
58
|
}
|
|
59
59
|
return files.sort();
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Namespace of a `metadata.json`, derived from its path under `index/` —
|
|
63
|
+
* `index/github.com/acme/foo/metadata.json` -> `github.com/acme`. The single
|
|
64
|
+
* definition: `enrich` writes sidecars keyed on it and the compiler reads them
|
|
65
|
+
* back, so a second derivation is a silent mismatch waiting to happen.
|
|
66
|
+
*/
|
|
67
|
+
export function namespaceOf(indexDir, file) {
|
|
68
|
+
return path
|
|
69
|
+
.relative(indexDir, path.dirname(path.dirname(file)))
|
|
70
|
+
.split(path.sep)
|
|
71
|
+
.join("/");
|
|
72
|
+
}
|
|
61
73
|
export async function compileIndex(opts) {
|
|
62
74
|
const { root, outDir } = opts;
|
|
63
75
|
const indexDir = path.join(root, "index");
|
|
@@ -67,10 +79,7 @@ export async function compileIndex(opts) {
|
|
|
67
79
|
for (const file of findMetadataFiles(indexDir)) {
|
|
68
80
|
const meta = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
69
81
|
validate(root, file, meta);
|
|
70
|
-
const ns =
|
|
71
|
-
.relative(indexDir, path.dirname(path.dirname(file)))
|
|
72
|
-
.split(path.sep)
|
|
73
|
-
.join("/");
|
|
82
|
+
const ns = namespaceOf(indexDir, file);
|
|
74
83
|
const withNamespace = { ...meta, namespace: ns };
|
|
75
84
|
const dataPath = path.join(enrichDir, ns, meta.name, "data.json");
|
|
76
85
|
let record = withNamespace;
|
package/dist/data/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Runs one `grim` subcommand and parses its JSON. Injected so tests need no binary. */
|
|
2
|
+
export type GrimRunner = (args: string[]) => Promise<unknown>;
|
|
3
|
+
export interface EnrichOptions {
|
|
4
|
+
/** Index repo root — holds `index/`, gains `enrich/`. */
|
|
5
|
+
root: string;
|
|
6
|
+
/** Defaults to spawning `grim` from `PATH`. */
|
|
7
|
+
run?: GrimRunner;
|
|
8
|
+
}
|
|
9
|
+
export interface EnrichResult {
|
|
10
|
+
total: number;
|
|
11
|
+
enriched: number;
|
|
12
|
+
/** One `"<ref>: <reason>"` per package whose refresh failed. */
|
|
13
|
+
failures: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function spawnGrim(bin?: string): GrimRunner;
|
|
16
|
+
export declare function enrichIndex(opts: EnrichOptions): Promise<EnrichResult>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrich/index.ts"],"names":[],"mappings":"AAuCA,wFAAwF;AACxF,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD,wBAAgB,SAAS,CAAC,GAAG,SAAS,GAAG,UAAU,CASlD;AAqHD,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAsB5E"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2026 The Grimoire Authors
|
|
3
|
+
/**
|
|
4
|
+
* Refresh `enrich/<namespace>/<name>/` sidecars from the live registry.
|
|
5
|
+
*
|
|
6
|
+
* The index itself stores only pointers — `metadata.json` carries the ref and
|
|
7
|
+
* who owns it, nothing a reader wants to look at. Title, summary, version,
|
|
8
|
+
* license, keywords, the tag list, the README, the CHANGELOG and the logo all
|
|
9
|
+
* live in the registry. This is the one part of the toolchain that goes and
|
|
10
|
+
* gets them, so the site build stays a pure function of the checkout.
|
|
11
|
+
*
|
|
12
|
+
* Work is skipped by digest: `describe` is cheap and runs every time, while
|
|
13
|
+
* the description companion (README/CHANGELOG/logo) is probed with
|
|
14
|
+
* `--digest-only` and only downloaded when that digest moved.
|
|
15
|
+
*
|
|
16
|
+
* A per-package failure keeps the existing sidecar — stale beats empty — and
|
|
17
|
+
* only a majority failure is reported as an outage.
|
|
18
|
+
*/
|
|
19
|
+
import { execFile } from "node:child_process";
|
|
20
|
+
import fs from "node:fs";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import { promisify } from "node:util";
|
|
23
|
+
import { findMetadataFiles, namespaceOf } from "../data/index.js";
|
|
24
|
+
const execFileAsync = promisify(execFile);
|
|
25
|
+
/** Per-`grim`-call ceiling. A description companion is text plus one logo. */
|
|
26
|
+
const TIMEOUT_MS = 60_000;
|
|
27
|
+
const MAX_OUTPUT_BYTES = 16 * 1024 * 1024;
|
|
28
|
+
/**
|
|
29
|
+
* A logo filename comes from the registry, which is not ours. Only an
|
|
30
|
+
* alphanumeric extension is ever joined onto a path — `logo.a/b` or
|
|
31
|
+
* `logo.` + traversal must not reach `writeFileSync`.
|
|
32
|
+
*/
|
|
33
|
+
const LOGO_EXT = /^[A-Za-z0-9]{1,8}$/;
|
|
34
|
+
export function spawnGrim(bin = "grim") {
|
|
35
|
+
return async (args) => {
|
|
36
|
+
const { stdout } = await execFileAsync(bin, [...args, "--format", "json"], {
|
|
37
|
+
timeout: TIMEOUT_MS,
|
|
38
|
+
maxBuffer: MAX_OUTPUT_BYTES,
|
|
39
|
+
encoding: "utf8",
|
|
40
|
+
});
|
|
41
|
+
return JSON.parse(stdout);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* grim's snake_case `describe` payload -> the camelCase fields the renderer
|
|
46
|
+
* reads. Key insertion order is the on-disk order, and these sidecars are
|
|
47
|
+
* committed — keep it stable so a refresh that changed nothing diffs as
|
|
48
|
+
* nothing.
|
|
49
|
+
*/
|
|
50
|
+
function mapMeta(desc) {
|
|
51
|
+
const data = {};
|
|
52
|
+
for (const key of ["title", "summary", "version", "license", "created"]) {
|
|
53
|
+
if (desc[key] != null)
|
|
54
|
+
data[key] = desc[key];
|
|
55
|
+
}
|
|
56
|
+
data.keywords = desc.keywords ?? [];
|
|
57
|
+
data.tags = desc.tags ?? [];
|
|
58
|
+
data.deprecated = desc.deprecated ?? null; // string | null, always present
|
|
59
|
+
if (desc.replaced_by)
|
|
60
|
+
data.replacedBy = desc.replaced_by;
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
function decode(member) {
|
|
64
|
+
return member.encoding === "base64"
|
|
65
|
+
? Buffer.from(member.content, "base64")
|
|
66
|
+
: Buffer.from(member.content, "utf8");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Drop companion files before rewriting them. Without this, content deleted
|
|
70
|
+
* upstream would render forever — the detail page globs the directory, it does
|
|
71
|
+
* not consult a flag in `data.json`.
|
|
72
|
+
*/
|
|
73
|
+
function clearCompanions(dir) {
|
|
74
|
+
if (!fs.existsSync(dir))
|
|
75
|
+
return;
|
|
76
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
77
|
+
const low = entry.toLowerCase();
|
|
78
|
+
if (low === "readme.md" || low === "changelog.md" || low.startsWith("logo.")) {
|
|
79
|
+
fs.rmSync(path.join(dir, entry), { force: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Writes the companion members we render, ignoring anything else in the tree. */
|
|
84
|
+
function writeCompanions(dir, namespace, name, files) {
|
|
85
|
+
let hasReadme = false;
|
|
86
|
+
let hasChangelog = false;
|
|
87
|
+
let logo;
|
|
88
|
+
for (const member of files) {
|
|
89
|
+
const low = member.path.toLowerCase();
|
|
90
|
+
if (low === "readme.md") {
|
|
91
|
+
fs.writeFileSync(path.join(dir, "readme.md"), decode(member));
|
|
92
|
+
hasReadme = true;
|
|
93
|
+
}
|
|
94
|
+
else if (low === "changelog.md") {
|
|
95
|
+
fs.writeFileSync(path.join(dir, "changelog.md"), decode(member));
|
|
96
|
+
hasChangelog = true;
|
|
97
|
+
}
|
|
98
|
+
else if (low.startsWith("logo.")) {
|
|
99
|
+
const ext = member.path.slice(member.path.lastIndexOf(".") + 1);
|
|
100
|
+
if (!LOGO_EXT.test(ext))
|
|
101
|
+
continue;
|
|
102
|
+
fs.writeFileSync(path.join(dir, `logo.${ext}`), decode(member));
|
|
103
|
+
logo = `/logos/${namespace}/${name}.${ext}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { hasReadme, hasChangelog, logo };
|
|
107
|
+
}
|
|
108
|
+
async function enrichOne(run, enrichDir, ref, namespace, name) {
|
|
109
|
+
const out = path.join(enrichDir, namespace, name);
|
|
110
|
+
const dataFile = path.join(out, "data.json");
|
|
111
|
+
const existing = fs.existsSync(dataFile)
|
|
112
|
+
? JSON.parse(fs.readFileSync(dataFile, "utf8"))
|
|
113
|
+
: {};
|
|
114
|
+
const desc = (await run(["describe", ref]));
|
|
115
|
+
const data = mapMeta(desc);
|
|
116
|
+
if (desc.has_description) {
|
|
117
|
+
const probe = (await run(["fetch", ref, "--description", "--digest-only"]));
|
|
118
|
+
if (probe.digest === existing.descDigest) {
|
|
119
|
+
// Unchanged: carry the cached companion state forward, download nothing.
|
|
120
|
+
data.descDigest = probe.digest;
|
|
121
|
+
data.hasReadme = existing.hasReadme ?? false;
|
|
122
|
+
data.hasChangelog = existing.hasChangelog ?? false;
|
|
123
|
+
if (existing.logo)
|
|
124
|
+
data.logo = existing.logo;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
fs.mkdirSync(out, { recursive: true });
|
|
128
|
+
const fetched = (await run(["fetch", ref, "--description"]));
|
|
129
|
+
clearCompanions(out);
|
|
130
|
+
const written = writeCompanions(out, namespace, name, fetched.files);
|
|
131
|
+
data.descDigest = probe.digest;
|
|
132
|
+
data.hasReadme = written.hasReadme;
|
|
133
|
+
data.hasChangelog = written.hasChangelog;
|
|
134
|
+
if (written.logo)
|
|
135
|
+
data.logo = written.logo;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// The companion is gone entirely; clear what it left behind.
|
|
140
|
+
clearCompanions(out);
|
|
141
|
+
data.hasReadme = false;
|
|
142
|
+
data.hasChangelog = false;
|
|
143
|
+
}
|
|
144
|
+
fs.mkdirSync(out, { recursive: true });
|
|
145
|
+
fs.writeFileSync(dataFile, JSON.stringify(data, null, 1) + "\n");
|
|
146
|
+
}
|
|
147
|
+
export async function enrichIndex(opts) {
|
|
148
|
+
const { root } = opts;
|
|
149
|
+
const run = opts.run ?? spawnGrim();
|
|
150
|
+
const indexDir = path.join(root, "index");
|
|
151
|
+
const enrichDir = path.join(root, "enrich");
|
|
152
|
+
const failures = [];
|
|
153
|
+
const files = findMetadataFiles(indexDir);
|
|
154
|
+
// ponytail: sequential, like the Python it replaces. Each package is a
|
|
155
|
+
// couple of round trips and the digest probe skips almost all of them;
|
|
156
|
+
// batch with a worker pool if an index ever grows into the hundreds.
|
|
157
|
+
for (const file of files) {
|
|
158
|
+
const meta = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
159
|
+
try {
|
|
160
|
+
await enrichOne(run, enrichDir, meta.ref, namespaceOf(indexDir, file), meta.name);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
failures.push(`${meta.ref}: ${err instanceof Error ? err.message : String(err)}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return { total: files.length, enriched: files.length - failures.length, failures };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrich/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -13,6 +13,12 @@ variables:
|
|
|
13
13
|
GRIM_INDEXER_VERSION: "latest"
|
|
14
14
|
GRIM_INDEXER_NODE_IMAGE: "node:22-alpine"
|
|
15
15
|
GRIM_INDEXER_OUT_DIR: "public"
|
|
16
|
+
# Refresh READMEs, changelogs, logos and version lists from the registry
|
|
17
|
+
# before building. Set to "false" for a pointers-only site that never
|
|
18
|
+
# leaves the runner.
|
|
19
|
+
GRIM_INDEXER_ENRICH: "true"
|
|
20
|
+
# grim release the enrichment step reads the registry with: "latest" or a tag.
|
|
21
|
+
GRIM_VERSION: "latest"
|
|
16
22
|
|
|
17
23
|
stages:
|
|
18
24
|
- test
|
|
@@ -39,6 +45,29 @@ grim-indexer:validate:
|
|
|
39
45
|
GIT_DEPTH: 0
|
|
40
46
|
rules:
|
|
41
47
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
48
|
+
# The job image is picked for `npx`, and `node:*-alpine` ships no git —
|
|
49
|
+
# but this job diffs the merge request against its target branch, so git
|
|
50
|
+
# is not optional. GitLab's runner clones with a separate helper image, so
|
|
51
|
+
# nothing else puts git in here. Install it for whichever package manager
|
|
52
|
+
# the (overridable) image has.
|
|
53
|
+
#
|
|
54
|
+
# The trailing check is the load-bearing part: the gate's contract is
|
|
55
|
+
# "exit 0 = eligible for auto-merge", so a missing or failed-to-install
|
|
56
|
+
# tool must fail the job, never silently skip validation.
|
|
57
|
+
before_script:
|
|
58
|
+
- |
|
|
59
|
+
set -eu
|
|
60
|
+
if ! command -v git >/dev/null 2>&1; then
|
|
61
|
+
if command -v apk >/dev/null 2>&1; then
|
|
62
|
+
apk add --no-cache git
|
|
63
|
+
elif command -v apt-get >/dev/null 2>&1; then
|
|
64
|
+
apt-get update -qq && apt-get install -y -qq --no-install-recommends git
|
|
65
|
+
fi
|
|
66
|
+
fi
|
|
67
|
+
command -v git >/dev/null 2>&1 || {
|
|
68
|
+
echo "grim-indexer: the gate needs git, and ${GRIM_INDEXER_NODE_IMAGE} has none" >&2
|
|
69
|
+
exit 1
|
|
70
|
+
}
|
|
42
71
|
script:
|
|
43
72
|
- |
|
|
44
73
|
set -eu
|
|
@@ -54,7 +83,37 @@ pages:
|
|
|
54
83
|
image: $GRIM_INDEXER_NODE_IMAGE
|
|
55
84
|
rules:
|
|
56
85
|
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
86
|
+
# The index stores pointers; README, changelog, logo and version list all
|
|
87
|
+
# live in the registry, and grim is what reads a registry. Best-effort by
|
|
88
|
+
# design — a registry outage degrades the site to pointers-only rather than
|
|
89
|
+
# blocking a deploy, so the failure is logged and the build continues.
|
|
90
|
+
#
|
|
91
|
+
# Nothing is committed and no token is involved: the sidecars live only in
|
|
92
|
+
# this job's workspace, which is why this needs no CI variables at all.
|
|
57
93
|
script:
|
|
94
|
+
- |
|
|
95
|
+
set -eu
|
|
96
|
+
if [ "$GRIM_INDEXER_ENRICH" = "true" ]; then
|
|
97
|
+
if command -v apk >/dev/null 2>&1; then
|
|
98
|
+
apk add --no-cache curl tar
|
|
99
|
+
elif command -v apt-get >/dev/null 2>&1; then
|
|
100
|
+
apt-get update -qq && apt-get install -y -qq --no-install-recommends curl tar ca-certificates
|
|
101
|
+
fi
|
|
102
|
+
# Alpine is musl; everything else here is glibc.
|
|
103
|
+
if [ -f /etc/alpine-release ]; then libc=musl; else libc=gnu; fi
|
|
104
|
+
case "$GRIM_VERSION" in
|
|
105
|
+
latest) base=https://github.com/grimoire-rs/grimoire/releases/latest/download ;;
|
|
106
|
+
*) base="https://github.com/grimoire-rs/grimoire/releases/download/$GRIM_VERSION" ;;
|
|
107
|
+
esac
|
|
108
|
+
tarball="grimoire-$(uname -m)-unknown-linux-$libc.tar.gz"
|
|
109
|
+
tmp="$(mktemp -d)"
|
|
110
|
+
( cd "$tmp" \
|
|
111
|
+
&& curl -fsSL --proto '=https' --tlsv1.2 -O "$base/$tarball" -O "$base/$tarball.sha256" \
|
|
112
|
+
&& sha256sum -c "$tarball.sha256" \
|
|
113
|
+
&& tar -xzf "$tarball" -C /usr/local/bin --strip-components=1 "${tarball%.tar.gz}/grim" ) \
|
|
114
|
+
&& npx --yes "@grimoire-rs/indexer@$GRIM_INDEXER_VERSION" enrich \
|
|
115
|
+
|| echo "warning: enrich failed — building without READMEs, logos and version lists"
|
|
116
|
+
fi
|
|
58
117
|
- npx --yes "@grimoire-rs/indexer@$GRIM_INDEXER_VERSION" build --out-dir "$GRIM_INDEXER_OUT_DIR"
|
|
59
118
|
artifacts:
|
|
60
119
|
paths:
|