@grove-dev/core 0.17.0 → 0.18.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/dist/build-data.d.ts.map +1 -1
- package/dist/build-data.js +2 -0
- package/dist/build-data.js.map +1 -1
- package/dist/candidate-collector.d.ts +61 -0
- package/dist/candidate-collector.d.ts.map +1 -0
- package/dist/candidate-collector.js +545 -0
- package/dist/candidate-collector.js.map +1 -0
- package/dist/candidate-discovery.d.ts +92 -0
- package/dist/candidate-discovery.d.ts.map +1 -0
- package/dist/candidate-discovery.js +488 -0
- package/dist/candidate-discovery.js.map +1 -0
- package/dist/candidate-schema.d.ts +209 -0
- package/dist/candidate-schema.d.ts.map +1 -0
- package/dist/candidate-schema.js +84 -0
- package/dist/candidate-schema.js.map +1 -0
- package/dist/github-cache.d.ts +87 -1
- package/dist/github-cache.d.ts.map +1 -1
- package/dist/github-cache.js +19 -1
- package/dist/github-cache.js.map +1 -1
- package/dist/image-probe.d.ts +27 -0
- package/dist/image-probe.d.ts.map +1 -0
- package/dist/image-probe.js +124 -0
- package/dist/image-probe.js.map +1 -0
- package/dist/index-policy.d.ts +48 -0
- package/dist/index-policy.d.ts.map +1 -0
- package/dist/index-policy.js +58 -0
- package/dist/index-policy.js.map +1 -0
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/page-document.d.ts +48 -0
- package/dist/page-document.d.ts.map +1 -1
- package/dist/page-document.js +93 -8
- package/dist/page-document.js.map +1 -1
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js +31 -10
- package/dist/prepare.js.map +1 -1
- package/dist/record-candidates.d.ts +61 -0
- package/dist/record-candidates.d.ts.map +1 -0
- package/dist/record-candidates.js +261 -0
- package/dist/record-candidates.js.map +1 -0
- package/dist/schema.d.ts +78 -18
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +55 -2
- package/dist/schema.js.map +1 -1
- package/dist/sitemap.d.ts +3 -0
- package/dist/sitemap.d.ts.map +1 -1
- package/dist/sitemap.js +2 -0
- package/dist/sitemap.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +14 -2
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read an image's format and pixel size from the first bytes of the
|
|
3
|
+
* file, so sync can describe a logo or screenshot candidate without
|
|
4
|
+
* downloading it. Callers fetch a small byte range (see
|
|
5
|
+
* {@link IMAGE_PROBE_BYTES}) and hand it here; nothing in this module
|
|
6
|
+
* touches the network.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Bytes a range request asks for. Enough for the PNG, GIF and WebP
|
|
10
|
+
* headers and for the opening `<svg …>` tag; a JPEG's frame header
|
|
11
|
+
* usually sits past its EXIF block but inside this window.
|
|
12
|
+
*/
|
|
13
|
+
export const IMAGE_PROBE_BYTES = 16_384;
|
|
14
|
+
const EXTENSION_FORMATS = {
|
|
15
|
+
png: 'png',
|
|
16
|
+
jpg: 'jpeg',
|
|
17
|
+
jpeg: 'jpeg',
|
|
18
|
+
gif: 'gif',
|
|
19
|
+
webp: 'webp',
|
|
20
|
+
svg: 'svg',
|
|
21
|
+
ico: 'ico',
|
|
22
|
+
avif: 'avif',
|
|
23
|
+
};
|
|
24
|
+
/** Image format implied by a path or URL's extension. */
|
|
25
|
+
export function imageFormatFromPath(path) {
|
|
26
|
+
const clean = path.split(/[?#]/)[0] ?? path;
|
|
27
|
+
const ext = clean.slice(clean.lastIndexOf('.') + 1).toLowerCase();
|
|
28
|
+
return EXTENSION_FORMATS[ext];
|
|
29
|
+
}
|
|
30
|
+
function positive(n) {
|
|
31
|
+
return Number.isFinite(n) && n > 0 ? Math.round(n) : undefined;
|
|
32
|
+
}
|
|
33
|
+
function facts(format, width, height) {
|
|
34
|
+
return { format, ...(width ? { width } : {}), ...(height ? { height } : {}) };
|
|
35
|
+
}
|
|
36
|
+
function pngFacts(b) {
|
|
37
|
+
const sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
38
|
+
if (b.length < 24 || !sig.every((v, i) => b[i] === v))
|
|
39
|
+
return undefined;
|
|
40
|
+
const view = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
41
|
+
return facts('png', positive(view.getUint32(16)), positive(view.getUint32(20)));
|
|
42
|
+
}
|
|
43
|
+
function gifFacts(b) {
|
|
44
|
+
if (b.length < 10 || b[0] !== 0x47 || b[1] !== 0x49 || b[2] !== 0x46)
|
|
45
|
+
return undefined;
|
|
46
|
+
const view = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
47
|
+
return facts('gif', positive(view.getUint16(6, true)), positive(view.getUint16(8, true)));
|
|
48
|
+
}
|
|
49
|
+
function ascii(b, start, length) {
|
|
50
|
+
return String.fromCharCode(...b.subarray(start, start + length));
|
|
51
|
+
}
|
|
52
|
+
function webpFacts(b) {
|
|
53
|
+
if (b.length < 30 || ascii(b, 0, 4) !== 'RIFF' || ascii(b, 8, 4) !== 'WEBP')
|
|
54
|
+
return undefined;
|
|
55
|
+
const view = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
56
|
+
const chunk = ascii(b, 12, 4);
|
|
57
|
+
if (chunk === 'VP8X') {
|
|
58
|
+
const width = 1 + (view.getUint16(24, true) | ((b[26] ?? 0) << 16));
|
|
59
|
+
const height = 1 + (view.getUint16(27, true) | ((b[29] ?? 0) << 16));
|
|
60
|
+
return facts('webp', positive(width), positive(height));
|
|
61
|
+
}
|
|
62
|
+
if (chunk === 'VP8 ') {
|
|
63
|
+
return facts('webp', positive(view.getUint16(26, true) & 0x3fff), positive(view.getUint16(28, true) & 0x3fff));
|
|
64
|
+
}
|
|
65
|
+
if (chunk === 'VP8L') {
|
|
66
|
+
const bits = view.getUint32(21, true);
|
|
67
|
+
return facts('webp', positive((bits & 0x3fff) + 1), positive(((bits >> 14) & 0x3fff) + 1));
|
|
68
|
+
}
|
|
69
|
+
return { format: 'webp' };
|
|
70
|
+
}
|
|
71
|
+
function jpegFacts(b) {
|
|
72
|
+
if (b.length < 4 || b[0] !== 0xff || b[1] !== 0xd8)
|
|
73
|
+
return undefined;
|
|
74
|
+
const view = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
75
|
+
let i = 2;
|
|
76
|
+
while (i + 9 < b.length) {
|
|
77
|
+
if (b[i] !== 0xff)
|
|
78
|
+
return { format: 'jpeg' };
|
|
79
|
+
const marker = b[i + 1] ?? 0;
|
|
80
|
+
// SOF0–SOF15 carry the frame size, except DHT (C4), JPG (C8) and DAC (CC).
|
|
81
|
+
if (marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker)) {
|
|
82
|
+
return facts('jpeg', positive(view.getUint16(i + 7)), positive(view.getUint16(i + 5)));
|
|
83
|
+
}
|
|
84
|
+
i += 2 + view.getUint16(i + 2);
|
|
85
|
+
}
|
|
86
|
+
return { format: 'jpeg' };
|
|
87
|
+
}
|
|
88
|
+
function svgLength(value) {
|
|
89
|
+
if (!value)
|
|
90
|
+
return undefined;
|
|
91
|
+
const match = /^\s*([\d.]+)\s*(px)?\s*$/.exec(value);
|
|
92
|
+
return match ? positive(Number(match[1])) : undefined;
|
|
93
|
+
}
|
|
94
|
+
function svgFacts(b) {
|
|
95
|
+
const text = new TextDecoder('utf-8', { fatal: false }).decode(b);
|
|
96
|
+
const tag = /<svg\b[^>]*>/i.exec(text)?.[0];
|
|
97
|
+
if (!tag)
|
|
98
|
+
return undefined;
|
|
99
|
+
const attr = (name) => new RegExp(`\\s${name}\\s*=\\s*["']([^"']*)["']`, 'i').exec(tag)?.[1];
|
|
100
|
+
let width = svgLength(attr('width'));
|
|
101
|
+
let height = svgLength(attr('height'));
|
|
102
|
+
const viewBox = attr('viewBox')
|
|
103
|
+
?.trim()
|
|
104
|
+
.split(/[\s,]+/)
|
|
105
|
+
.map(Number);
|
|
106
|
+
if ((width === undefined || height === undefined) && viewBox?.length === 4) {
|
|
107
|
+
width ??= positive(viewBox[2] ?? Number.NaN);
|
|
108
|
+
height ??= positive(viewBox[3] ?? Number.NaN);
|
|
109
|
+
}
|
|
110
|
+
return facts('svg', width, height);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Format and size from the leading bytes of an image. Returns only
|
|
114
|
+
* what the bytes prove: `{}` when they match no known header.
|
|
115
|
+
*/
|
|
116
|
+
export function probeImageBytes(bytes) {
|
|
117
|
+
return (pngFacts(bytes) ??
|
|
118
|
+
gifFacts(bytes) ??
|
|
119
|
+
webpFacts(bytes) ??
|
|
120
|
+
jpegFacts(bytes) ??
|
|
121
|
+
svgFacts(bytes) ??
|
|
122
|
+
{});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=image-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-probe.js","sourceRoot":"","sources":["../src/image-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { LISTING_INDEX_POLICIES, RECORD_INDEX_POLICIES } from './schema.js';
|
|
2
|
+
/** `all`: every listed record. `editorial`: records with a written
|
|
3
|
+
* Markdown body. `editorial-and-reviewed`: a body and `curation.reviewed`. */
|
|
4
|
+
export type RecordIndexPolicy = (typeof RECORD_INDEX_POLICIES)[number];
|
|
5
|
+
/** `all`: every non-empty page. `editorial`: pages with editorial intro copy. */
|
|
6
|
+
export type ListingIndexPolicy = (typeof LISTING_INDEX_POLICIES)[number];
|
|
7
|
+
export interface IndexPolicyConfig {
|
|
8
|
+
recordIndexPolicy?: RecordIndexPolicy;
|
|
9
|
+
collectionIndexPolicy?: ListingIndexPolicy;
|
|
10
|
+
taxonomyIndexPolicy?: ListingIndexPolicy;
|
|
11
|
+
}
|
|
12
|
+
/** Robots value for a page the policy keeps out of the index. `follow`
|
|
13
|
+
* so the links on it (to indexable pages) are still crawled. */
|
|
14
|
+
export declare const NOINDEX_FOLLOW = "noindex,follow";
|
|
15
|
+
export interface RecordIndexInput {
|
|
16
|
+
/** The record has a non-empty Markdown body (see `hasEditorialBody`). */
|
|
17
|
+
hasBody: boolean;
|
|
18
|
+
/** `curation.reviewed`. */
|
|
19
|
+
reviewed?: boolean;
|
|
20
|
+
/** Effective visibility; `hide` / `remove` are never indexable. */
|
|
21
|
+
visibility?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function recordIndexable(input: RecordIndexInput, policy?: RecordIndexPolicy): boolean;
|
|
24
|
+
export interface CollectionIndexInput {
|
|
25
|
+
/** `editorial.introduction`. */
|
|
26
|
+
introduction?: string | undefined;
|
|
27
|
+
/** The collection has a Markdown `content` body. */
|
|
28
|
+
hasBody?: boolean;
|
|
29
|
+
/** `seo.index` — `false` always wins. */
|
|
30
|
+
seoIndex?: boolean | undefined;
|
|
31
|
+
/** Resolved entry count; an empty collection has nothing to rank for. */
|
|
32
|
+
entryCount: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function collectionIndexable(input: CollectionIndexInput, policy?: ListingIndexPolicy): boolean;
|
|
35
|
+
export interface TaxonomyTermIndexInput {
|
|
36
|
+
/** The term's `description` in `data/taxonomy/*.yml` — its intro copy. */
|
|
37
|
+
description?: string | undefined;
|
|
38
|
+
/** Visible records in the term; an empty term is never indexable. */
|
|
39
|
+
count: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function taxonomyTermIndexable(input: TaxonomyTermIndexInput, policy?: ListingIndexPolicy): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Whether a `content:` pointer resolves to a Markdown body with
|
|
44
|
+
* something in it besides an opening `# Title` — the same body the
|
|
45
|
+
* detail page renders as the article.
|
|
46
|
+
*/
|
|
47
|
+
export declare function hasEditorialBody(contentPath: string | undefined, candidates?: string[]): boolean;
|
|
48
|
+
//# sourceMappingURL=index-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-policy.d.ts","sourceRoot":"","sources":["../src/index-policy.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEjF;+EAC+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AACvE,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,qBAAqB,CAAC,EAAE,kBAAkB,CAAC;IAC3C,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAED;iEACiE;AACjE,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,MAAM,GAAE,iBAAyB,GAChC,OAAO,CAKT;AAED,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,GAAE,kBAA0B,GACjC,OAAO,CAIT;AAED,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,sBAAsB,EAC7B,MAAM,GAAE,kBAA0B,GACjC,OAAO,CAIT;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAKhG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index policy — which generated pages a site offers to search engines.
|
|
3
|
+
*
|
|
4
|
+
* A directory built from imported metadata can publish hundreds of
|
|
5
|
+
* pages that are template text over synced data. `seo.*IndexPolicy` in
|
|
6
|
+
* `grove.config.ts` lets a site index only the pages a person wrote or
|
|
7
|
+
* reviewed; everything else still renders (and still links onwards)
|
|
8
|
+
* but carries `noindex,follow` and stays out of the sitemap.
|
|
9
|
+
*
|
|
10
|
+
* The rules live here, as pure functions, so the page models
|
|
11
|
+
* (`@grove-dev/astro`) and the sitemap (`prepareDirectory`) decide from
|
|
12
|
+
* the same code and can never disagree — and so a consumer's own SEO
|
|
13
|
+
* gate can re-derive the expected answer for any page.
|
|
14
|
+
*
|
|
15
|
+
* Every policy defaults to `'all'`: without configuration nothing
|
|
16
|
+
* changes.
|
|
17
|
+
*/
|
|
18
|
+
import { readContentFile, stripLeadingH1 } from './content-body.js';
|
|
19
|
+
/** Robots value for a page the policy keeps out of the index. `follow`
|
|
20
|
+
* so the links on it (to indexable pages) are still crawled. */
|
|
21
|
+
export const NOINDEX_FOLLOW = 'noindex,follow';
|
|
22
|
+
export function recordIndexable(input, policy = 'all') {
|
|
23
|
+
if (input.visibility === 'hide' || input.visibility === 'remove')
|
|
24
|
+
return false;
|
|
25
|
+
if (policy === 'all')
|
|
26
|
+
return true;
|
|
27
|
+
if (!input.hasBody)
|
|
28
|
+
return false;
|
|
29
|
+
return policy === 'editorial' || input.reviewed === true;
|
|
30
|
+
}
|
|
31
|
+
export function collectionIndexable(input, policy = 'all') {
|
|
32
|
+
if (input.seoIndex === false || input.entryCount === 0)
|
|
33
|
+
return false;
|
|
34
|
+
if (policy === 'all')
|
|
35
|
+
return true;
|
|
36
|
+
return Boolean(input.introduction?.trim()) || input.hasBody === true;
|
|
37
|
+
}
|
|
38
|
+
export function taxonomyTermIndexable(input, policy = 'all') {
|
|
39
|
+
if (input.count === 0)
|
|
40
|
+
return false;
|
|
41
|
+
if (policy === 'all')
|
|
42
|
+
return true;
|
|
43
|
+
return Boolean(input.description?.trim());
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether a `content:` pointer resolves to a Markdown body with
|
|
47
|
+
* something in it besides an opening `# Title` — the same body the
|
|
48
|
+
* detail page renders as the article.
|
|
49
|
+
*/
|
|
50
|
+
export function hasEditorialBody(contentPath, candidates) {
|
|
51
|
+
if (!contentPath)
|
|
52
|
+
return false;
|
|
53
|
+
const found = readContentFile(contentPath, candidates);
|
|
54
|
+
if (!found)
|
|
55
|
+
return false;
|
|
56
|
+
return stripLeadingH1(found.body).trim().length > 0;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-policy.js","sourceRoot":"","sources":["../src/index-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAepE;iEACiE;AACjE,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAW/C,MAAM,UAAU,eAAe,CAC7B,KAAuB,EACvB,SAA4B,KAAK;IAEjC,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/E,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC3D,CAAC;AAaD,MAAM,UAAU,mBAAmB,CACjC,KAA2B,EAC3B,SAA6B,KAAK;IAElC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;AACvE,CAAC;AASD,MAAM,UAAU,qBAAqB,CACnC,KAA6B,EAC7B,SAA6B,KAAK;IAElC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA+B,EAAE,UAAqB;IACrF,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,12 @@ export type { GenerateResult, RecordsFullPayload, RecordsIndexPayload } from './
|
|
|
15
15
|
export { generate } from './build-data.js';
|
|
16
16
|
export type { CandidateEntry, CandidateLink, CandidateSource, ExtractCandidatesOptions, } from './candidate.js';
|
|
17
17
|
export { extractCandidates } from './candidate.js';
|
|
18
|
+
export type { CandidateCollectInput, CandidateCollection, CandidateCollector, CandidateCollectorOptions, } from './candidate-collector.js';
|
|
19
|
+
export { CANDIDATE_REQUESTS_PER_RECORD, createCandidateCollector, REPOLOGY_MIN_INTERVAL_MS, } from './candidate-collector.js';
|
|
20
|
+
export type { AppstreamFacts, FastlaneFiles, RepologyChannel, RepologyPackage, TreeFile, } from './candidate-discovery.js';
|
|
21
|
+
export { findAssetLogos, findFastlane, findGradleAppFiles, findMetainfoFiles, findWebManifests, installableAssets, isExcludedPath, parseAppstream, parseGradleApplicationIds, pickManifestIcon, repologyChannels, sameVersion, } from './candidate-discovery.js';
|
|
22
|
+
export type { CandidateKind, CandidateOrigin, CandidateProvenance, CandidateReview, ChannelCandidate, MediaCandidate, RecordCandidates, } from './candidate-schema.js';
|
|
23
|
+
export { candidateKindSchema, candidateOriginSchema, candidateProvenanceSchema, candidateReviewSchema, channelCandidateSchema, mediaCandidateSchema, recordCandidatesSchema, } from './candidate-schema.js';
|
|
18
24
|
export type { CollectionSourceRecord, ToCollectionEntriesOptions, } from './collection-entries.js';
|
|
19
25
|
export { toCollectionEntries } from './collection-entries.js';
|
|
20
26
|
export type { Collection, CollectionEditorial, CollectionEntry, CollectionFaqItem, CollectionKind, CollectionPick, CollectionQuery, CollectionRanking, CollectionSeo, RankingPreset, } from './collections.js';
|
|
@@ -45,7 +51,7 @@ export type { InspectRepositoriesOptions, InspectRepositoryOptions, RepositoryEv
|
|
|
45
51
|
export { canonicalRepoKey, createMemoryCache, inspectRepositories, inspectRepository, } from './evidence.js';
|
|
46
52
|
export type { GithubRepoRef } from './github.js';
|
|
47
53
|
export { buildGithubSyncPatch, fetchGithubMetadata, parseGithubRepoUrl, pruneLegacyGithubFields, } from './github.js';
|
|
48
|
-
export type { GithubCache, GithubCacheEntry, GithubCacheFailure, GithubCacheMigration, GithubCacheSource, GithubFieldSource, GithubSyncAttempt, GithubSyncFreshness, GithubSyncFreshnessOptions, ResolvedRecordGithub, } from './github-cache.js';
|
|
54
|
+
export type { GithubCache, GithubCacheEntry, GithubCacheFailure, GithubCacheFailureSource, GithubCacheMigration, GithubCacheSource, GithubFieldSource, GithubSyncAttempt, GithubSyncFreshness, GithubSyncFreshnessOptions, ResolvedRecordGithub, } from './github-cache.js';
|
|
49
55
|
export { GITHUB_CACHE_MAX_FAILURES, GITHUB_CACHE_SCHEMA_VERSION, GITHUB_SYNC_MAX_AGE_DAYS, githubCacheConflicts, githubCacheDir, githubCacheEntrySchema, githubSyncFreshness, githubSyncFreshnessOptions, loadGithubCache, migrateRecordGithub, nextGithubCacheEntry, removeTopLevelYamlKeys, resolveRecordGithub, SYNC_STALE_REASON, seedGithubCacheEntry, serializeGithubCacheEntry, writeGithubCacheEntry, } from './github-cache.js';
|
|
50
56
|
export type { GhFetchOptions } from './github-client.js';
|
|
51
57
|
export { rateLimitWaitMs, sleep } from './github-client.js';
|
|
@@ -53,7 +59,11 @@ export { classifyHealth } from './health.js';
|
|
|
53
59
|
export type { PushAgeBand, PushAgeBandId } from './health-thresholds.js';
|
|
54
60
|
export { PUSH_AGE_BANDS, pushAgeBand } from './health-thresholds.js';
|
|
55
61
|
export { hostOf } from './host.js';
|
|
62
|
+
export type { ImageFacts, ImageFormat } from './image-probe.js';
|
|
63
|
+
export { IMAGE_PROBE_BYTES, imageFormatFromPath, probeImageBytes } from './image-probe.js';
|
|
56
64
|
export { importAwesomeList, writeImportedRecords } from './importer.js';
|
|
65
|
+
export type { CollectionIndexInput, IndexPolicyConfig, ListingIndexPolicy, RecordIndexInput, RecordIndexPolicy, TaxonomyTermIndexInput, } from './index-policy.js';
|
|
66
|
+
export { collectionIndexable, hasEditorialBody, NOINDEX_FOLLOW, recordIndexable, taxonomyTermIndexable, } from './index-policy.js';
|
|
57
67
|
export { readYamlFile, writeTextFile, writeYamlFile } from './io.js';
|
|
58
68
|
export type { LlmsInput, LlmsRecordInput, LlmsResult } from './llms.js';
|
|
59
69
|
export { buildLlmsFiles, buildLlmsFullTxt, buildLlmsTxt } from './llms.js';
|
|
@@ -63,14 +73,16 @@ export type { NormalizedRecord, NormalizedRecords, RecordEntry, RecordFormat, Re
|
|
|
63
73
|
export { applyDecisionVisibility, loadNormalizedRecords, readRecordSources, } from './normalize-records.js';
|
|
64
74
|
export type { OgBuildInput, OgBuildResult, OgTemplate } from './og-image.js';
|
|
65
75
|
export { buildOgImages, renderOgPng } from './og-image.js';
|
|
66
|
-
export type { CollectionInput, ContentInput, Crumb, DocumentPageType, FaqInput, JsonLdNode, JsonLdValidationIssue, LinkedDocument, OpenGraphMetadata, PageDiscovery, PageDocument, PageIdentity, PageMetadata, RecordInput, SiteInput, TwitterMetadata, } from './page-document.js';
|
|
67
|
-
export { breadcrumbSchema, buildJsonLd, collectionSchema, contentSchema, definePageDocument, faqSchema, recordSchema, siteSchema, validateJsonLd, } from './page-document.js';
|
|
76
|
+
export type { CollectionInput, ContentInput, Crumb, DocumentPageType, FaqInput, JsonLdNode, JsonLdValidationIssue, LinkedDocument, OpenGraphMetadata, PageDiscovery, PageDocument, PageIdentity, PageMetadata, RecordInput, SiteInput, SoftwareApplicationInput, TwitterMetadata, } from './page-document.js';
|
|
77
|
+
export { breadcrumbSchema, buildJsonLd, collectionSchema, contentSchema, definePageDocument, faqSchema, recordSchema, SOFTWARE_APPLICATION_FIELDS, siteSchema, softwareApplicationSchema, validateJsonLd, } from './page-document.js';
|
|
68
78
|
export type { ParsedEntry, ParsedSection } from './parseReadme.js';
|
|
69
79
|
export { parseEntry, parseSections } from './parseReadme.js';
|
|
70
80
|
export type { PrepareDirectoryResult } from './prepare.js';
|
|
71
81
|
export { prepareDirectory } from './prepare.js';
|
|
72
82
|
export type { ReadmeHealthEntryResult, ReadmeHealthReport, ReadmeHealthSummary, RunReadmeHealthCheckOptions, } from './readme-health.js';
|
|
73
83
|
export { runReadmeHealthCheck } from './readme-health.js';
|
|
84
|
+
export type { CandidateListing, CandidateRow, CandidateStatus, ListCandidatesOptions, } from './record-candidates.js';
|
|
85
|
+
export { candidateRows, listRecordCandidates, loadCandidateReviews, mergeRecordCandidates, normalizeCandidateUrl, sortRecordCandidates, } from './record-candidates.js';
|
|
74
86
|
export type { YamlRecordToMarkdownOptions, YamlRecordToMarkdownResult, } from './record-markdown.js';
|
|
75
87
|
export { MARKDOWN_RECORD_FIELD_ORDER, yamlRecordToMarkdown } from './record-markdown.js';
|
|
76
88
|
export { findRelated } from './related.js';
|
|
@@ -79,7 +91,7 @@ export { classifyRepositoryHealth } from './repository-health.js';
|
|
|
79
91
|
export { buildRobotsTxt, isIndexableFilterPath } from './robots.js';
|
|
80
92
|
export { directoryRoute } from './routes.js';
|
|
81
93
|
export type { AppLabel, Blueprint, Decision, DecisionsFile, DecisionVisibility, EntityRecord, EntityType, GithubIntegrationFlags, GithubMetadata, GithubRepository, GroveConfig, GroveConfigInput, HealthEntry, HealthFile, HealthStatus, HealthTier, IndexEntityRecord, IndexProjectRecord, IndexRecord, IndexResourceRecord, Links, Override, OverridesFile, ProjectRecord, ProjectType, ReadmeConfig, Relation, RelationType, Resource, ResourceKind, ResourceRecord, ResourceType, Score, Subject, } from './schema.js';
|
|
82
|
-
export { appLabelSchema, auditSchema, blueprintKind, blueprintSchema, decisionSchema, decisionsFileSchema, entityRecordSchema, entityTypeSchema, githubLicenseSchema, githubMetadataSchema, githubRepositorySchema, healthBlockSchema, healthEntrySchema, healthFileSchema, healthStatusSchema, healthTierSchema, linksSchema, normalizeGithubIntegration, overrideSchema, overridesFileSchema, projectRecordSchema, projectTypeSchema, readmeConfigSchema, recordsFileSchema, recordVisibility, relationEvidenceSchema, relationSchema, relationTypeSchema, resourceKindSchema, resourceRecordSchema, resourceSchema, resourceTypeSchema, scoreSchema, stringifyRecordYaml, subjectSchema, } from './schema.js';
|
|
94
|
+
export { appLabelSchema, auditSchema, blueprintKind, blueprintSchema, decisionSchema, decisionsFileSchema, entityRecordSchema, entityTypeSchema, githubLicenseSchema, githubMetadataSchema, githubRepositorySchema, healthBlockSchema, healthEntrySchema, healthFileSchema, healthStatusSchema, healthTierSchema, LISTING_INDEX_POLICIES, linksSchema, normalizeGithubIntegration, overrideSchema, overridesFileSchema, projectRecordSchema, projectTypeSchema, RECORD_INDEX_POLICIES, readmeConfigSchema, recordsFileSchema, recordVisibility, relationEvidenceSchema, relationSchema, relationTypeSchema, resourceKindSchema, resourceRecordSchema, resourceSchema, resourceTypeSchema, scoreSchema, stringifyRecordYaml, subjectSchema, } from './schema.js';
|
|
83
95
|
export type { SiteArtifactStats, SiteArtifactsResult, } from './site-artifacts.js';
|
|
84
96
|
export { buildOgImageSvg, buildSiteArtifacts } from './site-artifacts.js';
|
|
85
97
|
export { buildSitemap, buildSitemapXml } from './sitemap.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE/F,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,9 @@ export { AWESOME_README_END, AWESOME_README_START, assertReadmeLinkConfig, build
|
|
|
19
19
|
export { generate } from './build-data.js';
|
|
20
20
|
// ── Candidate extraction (AST-based, source-preserving) ──────────────
|
|
21
21
|
export { extractCandidates } from './candidate.js';
|
|
22
|
+
export { CANDIDATE_REQUESTS_PER_RECORD, createCandidateCollector, REPOLOGY_MIN_INTERVAL_MS, } from './candidate-collector.js';
|
|
23
|
+
export { findAssetLogos, findFastlane, findGradleAppFiles, findMetainfoFiles, findWebManifests, installableAssets, isExcludedPath, parseAppstream, parseGradleApplicationIds, pickManifestIcon, repologyChannels, sameVersion, } from './candidate-discovery.js';
|
|
24
|
+
export { candidateKindSchema, candidateOriginSchema, candidateProvenanceSchema, candidateReviewSchema, channelCandidateSchema, mediaCandidateSchema, recordCandidatesSchema, } from './candidate-schema.js';
|
|
22
25
|
// ── Record → CollectionEntry projection ──────────────────────────────
|
|
23
26
|
export { toCollectionEntries } from './collection-entries.js';
|
|
24
27
|
// ── Collection engine (query, ranking, editorial) ────────────────────
|
|
@@ -78,7 +81,9 @@ export { PUSH_AGE_BANDS, pushAgeBand } from './health-thresholds.js';
|
|
|
78
81
|
// (per-page PNG cards). One implementation so the two social-card
|
|
79
82
|
// surfaces never print different hosts for the same config.
|
|
80
83
|
export { hostOf } from './host.js';
|
|
84
|
+
export { IMAGE_PROBE_BYTES, imageFormatFromPath, probeImageBytes } from './image-probe.js';
|
|
81
85
|
export { importAwesomeList, writeImportedRecords } from './importer.js';
|
|
86
|
+
export { collectionIndexable, hasEditorialBody, NOINDEX_FOLLOW, recordIndexable, taxonomyTermIndexable, } from './index-policy.js';
|
|
82
87
|
// ── IO helpers ────────────────────────────────────────────────────────
|
|
83
88
|
export { readYamlFile, writeTextFile, writeYamlFile } from './io.js';
|
|
84
89
|
// ── llms.txt ─────────────────────────────────────────────────────────
|
|
@@ -95,11 +100,12 @@ export { buildOgImages, renderOgPng } from './og-image.js';
|
|
|
95
100
|
// framework emits all SEO metadata (title, description, canonical, OG,
|
|
96
101
|
// Twitter, JSON-LD) from this single source. `validateJsonLd` is the
|
|
97
102
|
// build-time well-formedness check that runs over the node graph.
|
|
98
|
-
export { breadcrumbSchema, buildJsonLd, collectionSchema, contentSchema, definePageDocument, faqSchema, recordSchema, siteSchema, validateJsonLd, } from './page-document.js';
|
|
103
|
+
export { breadcrumbSchema, buildJsonLd, collectionSchema, contentSchema, definePageDocument, faqSchema, recordSchema, SOFTWARE_APPLICATION_FIELDS, siteSchema, softwareApplicationSchema, validateJsonLd, } from './page-document.js';
|
|
99
104
|
export { parseEntry, parseSections } from './parseReadme.js';
|
|
100
105
|
export { prepareDirectory } from './prepare.js';
|
|
101
106
|
// ── README health: batch orchestration (candidates → evidence → health) ──
|
|
102
107
|
export { runReadmeHealthCheck } from './readme-health.js';
|
|
108
|
+
export { candidateRows, listRecordCandidates, loadCandidateReviews, mergeRecordCandidates, normalizeCandidateUrl, sortRecordCandidates, } from './record-candidates.js';
|
|
103
109
|
// ── Record codemod: YAML → Markdown ──────────────────────────────────
|
|
104
110
|
// One YAML record (plus its body) as one Markdown record, as
|
|
105
111
|
// `grove migrate markdown-records` writes it.
|
|
@@ -111,7 +117,7 @@ export { classifyRepositoryHealth } from './repository-health.js';
|
|
|
111
117
|
export { buildRobotsTxt, isIndexableFilterPath } from './robots.js';
|
|
112
118
|
export { directoryRoute } from './routes.js';
|
|
113
119
|
// ── Record YAML helpers (used by `grove import` and the generator) ──
|
|
114
|
-
export { appLabelSchema, auditSchema, blueprintKind, blueprintSchema, decisionSchema, decisionsFileSchema, entityRecordSchema, entityTypeSchema, githubLicenseSchema, githubMetadataSchema, githubRepositorySchema, healthBlockSchema, healthEntrySchema, healthFileSchema, healthStatusSchema, healthTierSchema, linksSchema, normalizeGithubIntegration, overrideSchema, overridesFileSchema, projectRecordSchema, projectTypeSchema, readmeConfigSchema, recordsFileSchema, recordVisibility, relationEvidenceSchema, relationSchema, relationTypeSchema, resourceKindSchema, resourceRecordSchema, resourceSchema, resourceTypeSchema, scoreSchema, stringifyRecordYaml, subjectSchema, } from './schema.js';
|
|
120
|
+
export { appLabelSchema, auditSchema, blueprintKind, blueprintSchema, decisionSchema, decisionsFileSchema, entityRecordSchema, entityTypeSchema, githubLicenseSchema, githubMetadataSchema, githubRepositorySchema, healthBlockSchema, healthEntrySchema, healthFileSchema, healthStatusSchema, healthTierSchema, LISTING_INDEX_POLICIES, linksSchema, normalizeGithubIntegration, overrideSchema, overridesFileSchema, projectRecordSchema, projectTypeSchema, RECORD_INDEX_POLICIES, readmeConfigSchema, recordsFileSchema, recordVisibility, relationEvidenceSchema, relationSchema, relationTypeSchema, resourceKindSchema, resourceRecordSchema, resourceSchema, resourceTypeSchema, scoreSchema, stringifyRecordYaml, subjectSchema, } from './schema.js';
|
|
115
121
|
// ── Config-driven public artifacts ──────────────────────────────────
|
|
116
122
|
export { buildOgImageSvg, buildSiteArtifacts } from './site-artifacts.js';
|
|
117
123
|
// ── Sitemap ──────────────────────────────────────────────────────────
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,yEAAyE;AAYzE,OAAO,EACL,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AASpB,wEAAwE;AACxE,oEAAoE;AACpE,qEAAqE;AACrE,wEAAwE;AACxE,qEAAqE;AACrE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,wEAAwE;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAO3C,wEAAwE;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/page-document.d.ts
CHANGED
|
@@ -140,6 +140,54 @@ export interface RecordInput {
|
|
|
140
140
|
crumbs: Crumb[];
|
|
141
141
|
}
|
|
142
142
|
export declare function recordSchema(input: RecordInput): JsonLdNode[];
|
|
143
|
+
/**
|
|
144
|
+
* Every property `softwareApplicationSchema` can emit. Each one comes
|
|
145
|
+
* from the record, the page, or the GitHub API — nothing is inferred.
|
|
146
|
+
* `offers`, `aggregateRating`, `review` and `isAccessibleForFree` are
|
|
147
|
+
* deliberately absent: a directory has no verified price or rating, and
|
|
148
|
+
* open source is not the same as free in a store. Exported so a site's
|
|
149
|
+
* SEO gate can hold its pages to the same list.
|
|
150
|
+
*/
|
|
151
|
+
export declare const SOFTWARE_APPLICATION_FIELDS: readonly ["@context", "@type", "@id", "name", "description", "url", "codeRepository", "sameAs", "license", "operatingSystem", "applicationCategory", "downloadUrl", "programmingLanguage", "dateCreated", "dateModified", "author", "keywords"];
|
|
152
|
+
export interface SoftwareApplicationInput {
|
|
153
|
+
/** Canonical page URL; the node's `@id` is `<url>#record`. */
|
|
154
|
+
url: string;
|
|
155
|
+
name: string;
|
|
156
|
+
description: string;
|
|
157
|
+
/** Source repository — `codeRepository`, and first in `sameAs`. */
|
|
158
|
+
repoUrl?: string;
|
|
159
|
+
/** The project's own website — added to `sameAs`. */
|
|
160
|
+
homepageUrl?: string;
|
|
161
|
+
/** SPDX id as detected by GitHub. `NOASSERTION` / `OTHER` are dropped;
|
|
162
|
+
* an SPDX id becomes its spdx.org URL. */
|
|
163
|
+
license?: string | null;
|
|
164
|
+
/** Platform labels (e.g. "Android", "iOS") — `operatingSystem`. */
|
|
165
|
+
platforms?: string[];
|
|
166
|
+
/** Category label — `applicationCategory`. */
|
|
167
|
+
category?: string;
|
|
168
|
+
/** URLs of distribution channels a curator marked `verified: true`.
|
|
169
|
+
* Unverified channels must not be passed. */
|
|
170
|
+
downloadUrls?: string[];
|
|
171
|
+
/** Primary language as reported by GitHub. */
|
|
172
|
+
programmingLanguage?: string | null;
|
|
173
|
+
/** Repository creation / last push, from GitHub. */
|
|
174
|
+
dateCreated?: string | null;
|
|
175
|
+
dateModified?: string | null;
|
|
176
|
+
/** Repository owner. Emitted only with a type GitHub reported
|
|
177
|
+
* (`User` → Person, `Organization` → Organization). */
|
|
178
|
+
owner?: {
|
|
179
|
+
login: string;
|
|
180
|
+
type?: string | null;
|
|
181
|
+
url?: string;
|
|
182
|
+
};
|
|
183
|
+
keywords?: string[];
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* `["SoftwareApplication", "SoftwareSourceCode"]` node for an app
|
|
187
|
+
* record, limited to `SOFTWARE_APPLICATION_FIELDS`. Missing inputs are
|
|
188
|
+
* left out rather than filled with a default.
|
|
189
|
+
*/
|
|
190
|
+
export declare function softwareApplicationSchema(input: SoftwareApplicationInput): JsonLdNode;
|
|
143
191
|
export interface ContentInput {
|
|
144
192
|
url: string;
|
|
145
193
|
headline: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-document.d.ts","sourceRoot":"","sources":["../src/page-document.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"page-document.d.ts","sourceRoot":"","sources":["../src/page-document.ts"],"names":[],"mappings":"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"}
|
package/dist/page-document.js
CHANGED
|
@@ -122,18 +122,103 @@ export function faqSchema(input) {
|
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
export function recordSchema(input) {
|
|
125
|
-
const
|
|
126
|
-
|
|
125
|
+
const main = input.kind === 'application'
|
|
126
|
+
? softwareApplicationSchema({
|
|
127
|
+
url: input.url,
|
|
128
|
+
name: input.name,
|
|
129
|
+
description: input.description,
|
|
130
|
+
...(input.repoUrl ? { repoUrl: input.repoUrl } : {}),
|
|
131
|
+
...(input.license ? { license: input.license } : {}),
|
|
132
|
+
})
|
|
133
|
+
: {
|
|
134
|
+
'@context': 'https://schema.org',
|
|
135
|
+
'@type': ['CreativeWork', 'WebPage'],
|
|
136
|
+
'@id': `${input.url}#record`,
|
|
137
|
+
url: input.url,
|
|
138
|
+
name: input.name,
|
|
139
|
+
description: input.description,
|
|
140
|
+
...(input.license ? { license: input.license } : {}),
|
|
141
|
+
};
|
|
142
|
+
return [main, breadcrumbSchema(input.crumbs)];
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Every property `softwareApplicationSchema` can emit. Each one comes
|
|
146
|
+
* from the record, the page, or the GitHub API — nothing is inferred.
|
|
147
|
+
* `offers`, `aggregateRating`, `review` and `isAccessibleForFree` are
|
|
148
|
+
* deliberately absent: a directory has no verified price or rating, and
|
|
149
|
+
* open source is not the same as free in a store. Exported so a site's
|
|
150
|
+
* SEO gate can hold its pages to the same list.
|
|
151
|
+
*/
|
|
152
|
+
export const SOFTWARE_APPLICATION_FIELDS = [
|
|
153
|
+
'@context',
|
|
154
|
+
'@type',
|
|
155
|
+
'@id',
|
|
156
|
+
'name',
|
|
157
|
+
'description',
|
|
158
|
+
'url',
|
|
159
|
+
'codeRepository',
|
|
160
|
+
'sameAs',
|
|
161
|
+
'license',
|
|
162
|
+
'operatingSystem',
|
|
163
|
+
'applicationCategory',
|
|
164
|
+
'downloadUrl',
|
|
165
|
+
'programmingLanguage',
|
|
166
|
+
'dateCreated',
|
|
167
|
+
'dateModified',
|
|
168
|
+
'author',
|
|
169
|
+
'keywords',
|
|
170
|
+
];
|
|
171
|
+
/** SPDX ids GitHub reports when it cannot identify a license. */
|
|
172
|
+
const UNKNOWN_LICENSES = new Set(['NOASSERTION', 'OTHER']);
|
|
173
|
+
function licenseUrl(spdx) {
|
|
174
|
+
if (!spdx || UNKNOWN_LICENSES.has(spdx.toUpperCase()))
|
|
175
|
+
return undefined;
|
|
176
|
+
return `https://spdx.org/licenses/${spdx}.html`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* `["SoftwareApplication", "SoftwareSourceCode"]` node for an app
|
|
180
|
+
* record, limited to `SOFTWARE_APPLICATION_FIELDS`. Missing inputs are
|
|
181
|
+
* left out rather than filled with a default.
|
|
182
|
+
*/
|
|
183
|
+
export function softwareApplicationSchema(input) {
|
|
184
|
+
const sameAs = [input.repoUrl, input.homepageUrl].filter((url) => Boolean(url));
|
|
185
|
+
const downloadUrls = [...new Set(input.downloadUrls ?? [])];
|
|
186
|
+
const license = licenseUrl(input.license);
|
|
187
|
+
const authorType = input.owner?.type === 'User'
|
|
188
|
+
? 'Person'
|
|
189
|
+
: input.owner?.type === 'Organization'
|
|
190
|
+
? 'Organization'
|
|
191
|
+
: undefined;
|
|
192
|
+
const node = {
|
|
127
193
|
'@context': 'https://schema.org',
|
|
128
|
-
'@type':
|
|
194
|
+
'@type': ['SoftwareApplication', 'SoftwareSourceCode'],
|
|
129
195
|
'@id': `${input.url}#record`,
|
|
130
|
-
url: input.url,
|
|
131
196
|
name: input.name,
|
|
132
197
|
description: input.description,
|
|
133
|
-
|
|
134
|
-
...(input.
|
|
198
|
+
url: input.url,
|
|
199
|
+
...(input.repoUrl ? { codeRepository: input.repoUrl } : {}),
|
|
200
|
+
...(sameAs.length ? { sameAs } : {}),
|
|
201
|
+
...(license ? { license } : {}),
|
|
202
|
+
...(input.platforms?.length ? { operatingSystem: input.platforms.join(', ') } : {}),
|
|
203
|
+
...(input.category ? { applicationCategory: input.category } : {}),
|
|
204
|
+
...(downloadUrls.length
|
|
205
|
+
? { downloadUrl: downloadUrls.length === 1 ? downloadUrls[0] : downloadUrls }
|
|
206
|
+
: {}),
|
|
207
|
+
...(input.programmingLanguage ? { programmingLanguage: input.programmingLanguage } : {}),
|
|
208
|
+
...(input.dateCreated ? { dateCreated: input.dateCreated } : {}),
|
|
209
|
+
...(input.dateModified ? { dateModified: input.dateModified } : {}),
|
|
210
|
+
...(input.owner && authorType
|
|
211
|
+
? {
|
|
212
|
+
author: {
|
|
213
|
+
'@type': authorType,
|
|
214
|
+
name: input.owner.login,
|
|
215
|
+
url: input.owner.url ?? `https://github.com/${input.owner.login}`,
|
|
216
|
+
},
|
|
217
|
+
}
|
|
218
|
+
: {}),
|
|
219
|
+
...(input.keywords?.length ? { keywords: input.keywords.join(', ') } : {}),
|
|
135
220
|
};
|
|
136
|
-
return
|
|
221
|
+
return node;
|
|
137
222
|
}
|
|
138
223
|
export function contentSchema(input) {
|
|
139
224
|
return [
|
|
@@ -161,7 +246,7 @@ export function buildJsonLd(input) {
|
|
|
161
246
|
return contentSchema(input);
|
|
162
247
|
throw new Error('buildJsonLd: unknown schema input');
|
|
163
248
|
}
|
|
164
|
-
const URL_FIELDS = new Set(['url', 'codeRepository', 'logo', 'image', 'sameAs']);
|
|
249
|
+
const URL_FIELDS = new Set(['url', 'codeRepository', 'logo', 'image', 'sameAs', 'downloadUrl']);
|
|
165
250
|
export function validateJsonLd(nodes) {
|
|
166
251
|
const issues = [];
|
|
167
252
|
const seen = new Set();
|