@refrakt-md/content 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyze.d.ts +3 -3
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +2 -2
- package/dist/analyze.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +40 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +98 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/registry.d.ts +24 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +62 -0
- package/dist/registry.js.map +1 -0
- package/dist/site.d.ts +13 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +20 -5
- package/dist/site.js.map +1 -1
- package/package.json +3 -3
package/dist/analyze.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { RenderableTreeNodes } from '@markdoc/markdoc';
|
|
2
2
|
import type { SitePage } from './site.js';
|
|
3
3
|
export interface RuneUsageReport {
|
|
4
|
-
/** All unique
|
|
4
|
+
/** All unique data-rune values found across all pages */
|
|
5
5
|
allTypes: Set<string>;
|
|
6
|
-
/** Per-page breakdown: route URL → set of
|
|
6
|
+
/** Per-page breakdown: route URL → set of data-rune values */
|
|
7
7
|
perPage: Map<string, Set<string>>;
|
|
8
8
|
}
|
|
9
|
-
/** Walk a renderable tree and collect all
|
|
9
|
+
/** Walk a renderable tree and collect all data-rune attribute values. */
|
|
10
10
|
export declare function collectRuneTypes(node: RenderableTreeNodes): Set<string>;
|
|
11
11
|
/** Analyze all pages in a site for rune usage. */
|
|
12
12
|
export declare function analyzeRuneUsage(pages: SitePage[]): RuneUsageReport;
|
package/dist/analyze.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,8DAA8D;IAC9D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACnC;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG,CAAC,MAAM,CAAC,CAqBvE;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAqBnE"}
|
package/dist/analyze.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import Markdoc from '@markdoc/markdoc';
|
|
2
2
|
const { Tag } = Markdoc;
|
|
3
|
-
/** Walk a renderable tree and collect all
|
|
3
|
+
/** Walk a renderable tree and collect all data-rune attribute values. */
|
|
4
4
|
export function collectRuneTypes(node) {
|
|
5
5
|
const types = new Set();
|
|
6
6
|
function walk(n) {
|
|
7
7
|
if (n == null)
|
|
8
8
|
return;
|
|
9
9
|
if (Tag.isTag(n)) {
|
|
10
|
-
const t = n.attributes?.
|
|
10
|
+
const t = n.attributes?.['data-rune'];
|
|
11
11
|
if (typeof t === 'string')
|
|
12
12
|
types.add(t);
|
|
13
13
|
for (const child of n.children)
|
package/dist/analyze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAIvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AASxB,
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAIvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AASxB,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,SAAS,IAAI,CAAC,CAAqB;QACjC,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO;QACtB,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,MAAM,KAAK,IAAI,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,CAAuB,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAA0B,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpD,kEAAkE;QAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC7C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,6 @@ export { buildNavigation, type NavTree, type NavGroup, type NavItem } from './na
|
|
|
6
6
|
export { loadContent, type Site, type SitePage } from './site.js';
|
|
7
7
|
export { generateSitemap, type SitemapEntry } from './sitemap.js';
|
|
8
8
|
export { collectRuneTypes, analyzeRuneUsage, type RuneUsageReport } from './analyze.js';
|
|
9
|
+
export { EntityRegistryImpl } from './registry.js';
|
|
10
|
+
export { runPipeline, type HookSet, type PipelineResult, type PipelineStats } from './pipeline.js';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,4 +6,6 @@ export { buildNavigation } from './navigation.js';
|
|
|
6
6
|
export { loadContent } from './site.js';
|
|
7
7
|
export { generateSitemap } from './sitemap.js';
|
|
8
8
|
export { collectRuneTypes, analyzeRuneUsage } from './analyze.js';
|
|
9
|
+
export { EntityRegistryImpl } from './registry.js';
|
|
10
|
+
export { runPipeline } from './pipeline.js';
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6D,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAoC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAA6C,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAA4B,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAqB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6D,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAoC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAA6C,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAA4B,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAqB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAyD,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PackagePipelineHooks, AggregatedData, PipelineWarning } from '@refrakt-md/types';
|
|
2
|
+
import type { SitePage } from './site.js';
|
|
3
|
+
/** A package and its pipeline hooks, ready to run */
|
|
4
|
+
export interface HookSet {
|
|
5
|
+
packageName: string;
|
|
6
|
+
hooks: PackagePipelineHooks;
|
|
7
|
+
}
|
|
8
|
+
/** Build-phase statistics from the pipeline run */
|
|
9
|
+
export interface PipelineStats {
|
|
10
|
+
/** Total pages processed */
|
|
11
|
+
pageCount: number;
|
|
12
|
+
/** Total entities registered across all packages */
|
|
13
|
+
entityCount: number;
|
|
14
|
+
/** Number of packages that ran at least one hook */
|
|
15
|
+
packageCount: number;
|
|
16
|
+
}
|
|
17
|
+
/** Result of running the cross-page pipeline */
|
|
18
|
+
export interface PipelineResult {
|
|
19
|
+
/** Pages with renderables updated by any postProcess hooks */
|
|
20
|
+
pages: SitePage[];
|
|
21
|
+
/** Cross-page data produced by all aggregate hooks, keyed by package name */
|
|
22
|
+
aggregated: AggregatedData;
|
|
23
|
+
/** Diagnostics collected across all phases */
|
|
24
|
+
warnings: PipelineWarning[];
|
|
25
|
+
/** Counts for build summary output */
|
|
26
|
+
stats: PipelineStats;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Run phases 2–4 of the cross-page pipeline against a loaded page array.
|
|
30
|
+
*
|
|
31
|
+
* Phase 2 — Register: each hookSet scans all pages, registers named entities
|
|
32
|
+
* Phase 3 — Aggregate: each hookSet builds cross-page indexes from the full registry
|
|
33
|
+
* Phase 4 — Post-process: each hookSet enriches pages using aggregated data
|
|
34
|
+
*
|
|
35
|
+
* Hook execution is ordered: hookSets run in the order they appear in the array.
|
|
36
|
+
* Errors in individual hooks are caught, converted to PipelineWarning entries,
|
|
37
|
+
* and the pipeline continues with the next hook / page.
|
|
38
|
+
*/
|
|
39
|
+
export declare function runPipeline(pages: SitePage[], hookSets: HookSet[]): Promise<PipelineResult>;
|
|
40
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EAGpB,cAAc,EACd,eAAe,EAEf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,qDAAqD;AACrD,MAAM,WAAW,OAAO;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,oBAAoB,CAAC;CAC5B;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC7B,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC9B,8DAA8D;IAC9D,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,6EAA6E;IAC7E,UAAU,EAAE,cAAc,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,sCAAsC;IACtC,KAAK,EAAE,aAAa,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAChC,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,cAAc,CAAC,CAqEzB"}
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { EntityRegistryImpl } from './registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run phases 2–4 of the cross-page pipeline against a loaded page array.
|
|
4
|
+
*
|
|
5
|
+
* Phase 2 — Register: each hookSet scans all pages, registers named entities
|
|
6
|
+
* Phase 3 — Aggregate: each hookSet builds cross-page indexes from the full registry
|
|
7
|
+
* Phase 4 — Post-process: each hookSet enriches pages using aggregated data
|
|
8
|
+
*
|
|
9
|
+
* Hook execution is ordered: hookSets run in the order they appear in the array.
|
|
10
|
+
* Errors in individual hooks are caught, converted to PipelineWarning entries,
|
|
11
|
+
* and the pipeline continues with the next hook / page.
|
|
12
|
+
*/
|
|
13
|
+
export async function runPipeline(pages, hookSets) {
|
|
14
|
+
const warnings = [];
|
|
15
|
+
const registry = new EntityRegistryImpl();
|
|
16
|
+
// Convert SitePage[] → TransformedPage[] (lightweight view, no deep copy)
|
|
17
|
+
const transformedPages = pages.map(pageToTransformed);
|
|
18
|
+
// ─── Phase 2: Register ───
|
|
19
|
+
for (const { packageName, hooks } of hookSets) {
|
|
20
|
+
if (!hooks.register)
|
|
21
|
+
continue;
|
|
22
|
+
const ctx = makeContext(warnings, 'register', packageName);
|
|
23
|
+
try {
|
|
24
|
+
hooks.register(transformedPages, registry, ctx);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
ctx.error(err.message);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ─── Phase 3: Aggregate ───
|
|
31
|
+
const aggregated = {};
|
|
32
|
+
const frozenRegistry = registry;
|
|
33
|
+
for (const { packageName, hooks } of hookSets) {
|
|
34
|
+
if (!hooks.aggregate)
|
|
35
|
+
continue;
|
|
36
|
+
const ctx = makeContext(warnings, 'aggregate', packageName);
|
|
37
|
+
try {
|
|
38
|
+
aggregated[packageName] = hooks.aggregate(frozenRegistry, ctx);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
ctx.error(err.message);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// ─── Phase 4: Post-process ───
|
|
45
|
+
let working = [...transformedPages];
|
|
46
|
+
for (const { packageName, hooks } of hookSets) {
|
|
47
|
+
if (!hooks.postProcess)
|
|
48
|
+
continue;
|
|
49
|
+
working = working.map((page, i) => {
|
|
50
|
+
const ctx = makeContext(warnings, 'postProcess', packageName, page.url);
|
|
51
|
+
try {
|
|
52
|
+
return hooks.postProcess(page, aggregated, ctx);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
ctx.error(err.message);
|
|
56
|
+
return page; // return original on error
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Merge post-processed renderables back into the original SitePage objects.
|
|
61
|
+
// Cast from unknown back to RenderableTreeNodes — postProcess hooks are responsible
|
|
62
|
+
// for returning the same AST node type they received.
|
|
63
|
+
const resultPages = pages.map((page, i) => ({
|
|
64
|
+
...page,
|
|
65
|
+
renderable: working[i].renderable,
|
|
66
|
+
}));
|
|
67
|
+
// Tally entity count across all registered types
|
|
68
|
+
const entityCount = registry.getTypes().reduce((sum, type) => sum + registry.getAll(type).length, 0);
|
|
69
|
+
const stats = {
|
|
70
|
+
pageCount: pages.length,
|
|
71
|
+
entityCount,
|
|
72
|
+
packageCount: hookSets.filter(hs => hs.hooks.register || hs.hooks.aggregate || hs.hooks.postProcess).length,
|
|
73
|
+
};
|
|
74
|
+
return { pages: resultPages, aggregated, warnings, stats };
|
|
75
|
+
}
|
|
76
|
+
function pageToTransformed(page) {
|
|
77
|
+
return {
|
|
78
|
+
url: page.route.url,
|
|
79
|
+
title: page.frontmatter.title ?? '',
|
|
80
|
+
headings: page.headings,
|
|
81
|
+
frontmatter: page.frontmatter,
|
|
82
|
+
renderable: page.renderable,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function makeContext(warnings, phase, packageName, url) {
|
|
86
|
+
return {
|
|
87
|
+
info(message, infoUrl) {
|
|
88
|
+
warnings.push({ severity: 'info', phase, packageName, url: infoUrl ?? url, message });
|
|
89
|
+
},
|
|
90
|
+
warn(message, warnUrl) {
|
|
91
|
+
warnings.push({ severity: 'warning', phase, packageName, url: warnUrl ?? url, message });
|
|
92
|
+
},
|
|
93
|
+
error(message, errUrl) {
|
|
94
|
+
warnings.push({ severity: 'error', phase, packageName, url: errUrl ?? url, message });
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { EntityRegistration, EntityRegistry } from '@refrakt-md/types';
|
|
2
|
+
/**
|
|
3
|
+
* Concrete implementation of the cross-page entity registry.
|
|
4
|
+
*
|
|
5
|
+
* Maintains two indexes for efficient lookup:
|
|
6
|
+
* - byTypeAndId: primary index for getAll() and getById()
|
|
7
|
+
* - byTypeAndUrl: secondary index for getByUrl()
|
|
8
|
+
*
|
|
9
|
+
* On collision (same type + id registered twice), the last registration wins.
|
|
10
|
+
*/
|
|
11
|
+
export declare class EntityRegistryImpl implements EntityRegistry {
|
|
12
|
+
private byTypeAndId;
|
|
13
|
+
private byTypeAndUrl;
|
|
14
|
+
register(entry: EntityRegistration): void;
|
|
15
|
+
/** All entities of a given type, in registration order */
|
|
16
|
+
getAll(type: string): EntityRegistration[];
|
|
17
|
+
/** All entities of a given type registered from a specific page URL */
|
|
18
|
+
getByUrl(type: string, url: string): EntityRegistration[];
|
|
19
|
+
/** Find a specific entity by type and id */
|
|
20
|
+
getById(type: string, id: string): EntityRegistration | undefined;
|
|
21
|
+
/** All registered entity type names */
|
|
22
|
+
getTypes(): string[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACxD,OAAO,CAAC,WAAW,CAAsD;IACzE,OAAO,CAAC,YAAY,CAAwD;IAE5E,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IA6BzC,0DAA0D;IAC1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAM1C,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAIzD,4CAA4C;IAC5C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIjE,uCAAuC;IACvC,QAAQ,IAAI,MAAM,EAAE;CAGpB"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concrete implementation of the cross-page entity registry.
|
|
3
|
+
*
|
|
4
|
+
* Maintains two indexes for efficient lookup:
|
|
5
|
+
* - byTypeAndId: primary index for getAll() and getById()
|
|
6
|
+
* - byTypeAndUrl: secondary index for getByUrl()
|
|
7
|
+
*
|
|
8
|
+
* On collision (same type + id registered twice), the last registration wins.
|
|
9
|
+
*/
|
|
10
|
+
export class EntityRegistryImpl {
|
|
11
|
+
byTypeAndId = new Map();
|
|
12
|
+
byTypeAndUrl = new Map();
|
|
13
|
+
register(entry) {
|
|
14
|
+
// Primary index
|
|
15
|
+
let typeMap = this.byTypeAndId.get(entry.type);
|
|
16
|
+
if (!typeMap) {
|
|
17
|
+
typeMap = new Map();
|
|
18
|
+
this.byTypeAndId.set(entry.type, typeMap);
|
|
19
|
+
}
|
|
20
|
+
typeMap.set(entry.id, entry);
|
|
21
|
+
// Secondary index
|
|
22
|
+
let urlMap = this.byTypeAndUrl.get(entry.type);
|
|
23
|
+
if (!urlMap) {
|
|
24
|
+
urlMap = new Map();
|
|
25
|
+
this.byTypeAndUrl.set(entry.type, urlMap);
|
|
26
|
+
}
|
|
27
|
+
const urlList = urlMap.get(entry.sourceUrl);
|
|
28
|
+
if (urlList) {
|
|
29
|
+
// Replace existing entry with same id, or append
|
|
30
|
+
const idx = urlList.findIndex(e => e.id === entry.id);
|
|
31
|
+
if (idx >= 0) {
|
|
32
|
+
urlList[idx] = entry;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
urlList.push(entry);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
urlMap.set(entry.sourceUrl, [entry]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** All entities of a given type, in registration order */
|
|
43
|
+
getAll(type) {
|
|
44
|
+
const typeMap = this.byTypeAndId.get(type);
|
|
45
|
+
if (!typeMap)
|
|
46
|
+
return [];
|
|
47
|
+
return [...typeMap.values()];
|
|
48
|
+
}
|
|
49
|
+
/** All entities of a given type registered from a specific page URL */
|
|
50
|
+
getByUrl(type, url) {
|
|
51
|
+
return this.byTypeAndUrl.get(type)?.get(url) ?? [];
|
|
52
|
+
}
|
|
53
|
+
/** Find a specific entity by type and id */
|
|
54
|
+
getById(type, id) {
|
|
55
|
+
return this.byTypeAndId.get(type)?.get(id);
|
|
56
|
+
}
|
|
57
|
+
/** All registered entity type names */
|
|
58
|
+
getTypes() {
|
|
59
|
+
return [...this.byTypeAndId.keys()];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAkB;IACtB,WAAW,GAAG,IAAI,GAAG,EAA2C,CAAC;IACjE,YAAY,GAAG,IAAI,GAAG,EAA6C,CAAC;IAE5E,QAAQ,CAAC,KAAyB;QACjC,gBAAgB;QAChB,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAE7B,kBAAkB;QAClB,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACb,iDAAiD;YACjD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;YACtD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,IAAY;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,uEAAuE;IACvE,QAAQ,CAAC,IAAY,EAAE,GAAW;QACjC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,4CAA4C;IAC5C,OAAO,CAAC,IAAY,EAAE,EAAU;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,uCAAuC;IACvC,QAAQ;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;CACD"}
|
package/dist/site.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { RenderableTreeNodes, Schema } from '@markdoc/markdoc';
|
|
2
2
|
import type { PageSeo, HeadingInfo } from '@refrakt-md/runes';
|
|
3
|
+
import type { RunePackage, PipelineWarning, AggregatedData } from '@refrakt-md/types';
|
|
4
|
+
import type { PipelineStats } from './pipeline.js';
|
|
3
5
|
import { ContentTree } from './content-tree.js';
|
|
4
6
|
import { Frontmatter } from './frontmatter.js';
|
|
5
7
|
import { Route } from './router.js';
|
|
@@ -12,6 +14,12 @@ export interface Site {
|
|
|
12
14
|
pages: SitePage[];
|
|
13
15
|
/** Navigation trees found in layouts */
|
|
14
16
|
navigation: NavTree[];
|
|
17
|
+
/** Diagnostics from the cross-page pipeline (empty when no pipeline hooks ran) */
|
|
18
|
+
pipelineWarnings: PipelineWarning[];
|
|
19
|
+
/** Build-phase statistics from the pipeline run */
|
|
20
|
+
pipelineStats: PipelineStats;
|
|
21
|
+
/** Cross-page data produced by all aggregate hooks, keyed by package name */
|
|
22
|
+
aggregated: AggregatedData;
|
|
15
23
|
}
|
|
16
24
|
export interface SitePage {
|
|
17
25
|
route: Route;
|
|
@@ -24,6 +32,10 @@ export interface SitePage {
|
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
26
34
|
* Load a content directory and resolve all pages, routes, layouts, and navigation.
|
|
35
|
+
*
|
|
36
|
+
* When `packages` are provided, the cross-page pipeline runs after loading:
|
|
37
|
+
* core hooks + package hooks register entities, aggregate cross-page data,
|
|
38
|
+
* and post-process pages before returning.
|
|
27
39
|
*/
|
|
28
|
-
export declare function loadContent(dirPath: string, basePath?: string, icons?: Record<string, Record<string, string>>, additionalTags?: Record<string, Schema
|
|
40
|
+
export declare function loadContent(dirPath: string, basePath?: string, icons?: Record<string, Record<string, string>>, additionalTags?: Record<string, Schema>, packages?: RunePackage[]): Promise<Site>;
|
|
29
41
|
//# sourceMappingURL=site.d.ts.map
|
package/dist/site.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAU,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAU,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,MAAM,WAAW,IAAI;IACnB,uBAAuB;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,wCAAwC;IACxC,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,kFAAkF;IAClF,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,mDAAmD;IACnD,aAAa,EAAE,aAAa,CAAC;IAC7B,6EAA6E;IAC7E,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;CACd;AAkBD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAY,EACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,QAAQ,CAAC,EAAE,WAAW,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
package/dist/site.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import Markdoc from '@markdoc/markdoc';
|
|
2
|
-
import { tags, nodes, extractHeadings,
|
|
2
|
+
import { tags, nodes, extractHeadings, extractSeo, corePipelineHooks } from '@refrakt-md/runes';
|
|
3
3
|
import { ContentTree } from './content-tree.js';
|
|
4
4
|
import { parseFrontmatter } from './frontmatter.js';
|
|
5
5
|
import { Router } from './router.js';
|
|
6
6
|
import { resolveLayouts } from './layout.js';
|
|
7
|
-
|
|
7
|
+
import { runPipeline } from './pipeline.js';
|
|
8
8
|
function transformContent(content, path, icons, additionalTags) {
|
|
9
9
|
const ast = Markdoc.parse(content);
|
|
10
10
|
const headings = extractHeadings(ast);
|
|
@@ -17,8 +17,12 @@ function transformContent(content, path, icons, additionalTags) {
|
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Load a content directory and resolve all pages, routes, layouts, and navigation.
|
|
20
|
+
*
|
|
21
|
+
* When `packages` are provided, the cross-page pipeline runs after loading:
|
|
22
|
+
* core hooks + package hooks register entities, aggregate cross-page data,
|
|
23
|
+
* and post-process pages before returning.
|
|
20
24
|
*/
|
|
21
|
-
export async function loadContent(dirPath, basePath = '/', icons, additionalTags) {
|
|
25
|
+
export async function loadContent(dirPath, basePath = '/', icons, additionalTags, packages) {
|
|
22
26
|
const tree = await ContentTree.fromDirectory(dirPath);
|
|
23
27
|
const router = new Router(basePath);
|
|
24
28
|
const pages = [];
|
|
@@ -27,13 +31,24 @@ export async function loadContent(dirPath, basePath = '/', icons, additionalTags
|
|
|
27
31
|
const route = router.resolve(page.relativePath, frontmatter);
|
|
28
32
|
const layout = resolveLayouts(page, tree.root, icons);
|
|
29
33
|
const { renderable, headings } = transformContent(content, route.url, icons, additionalTags);
|
|
30
|
-
const seo = extractSeo(renderable,
|
|
34
|
+
const seo = extractSeo(renderable, frontmatter, route.url);
|
|
31
35
|
pages.push({ route, frontmatter, content, renderable, headings, layout, seo });
|
|
32
36
|
}
|
|
37
|
+
// Build hook sets: core always runs first, then community packages in config order
|
|
38
|
+
const hookSets = [{ packageName: '__core__', hooks: corePipelineHooks }];
|
|
39
|
+
for (const pkg of packages ?? []) {
|
|
40
|
+
if (pkg.pipeline) {
|
|
41
|
+
hookSets.push({ packageName: pkg.name, hooks: pkg.pipeline });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const { pages: enrichedPages, warnings, stats, aggregated } = await runPipeline(pages, hookSets);
|
|
33
45
|
return {
|
|
34
46
|
tree,
|
|
35
|
-
pages,
|
|
47
|
+
pages: enrichedPages,
|
|
36
48
|
navigation: [], // TODO: Extract from resolved layouts
|
|
49
|
+
pipelineWarnings: warnings,
|
|
50
|
+
pipelineStats: stats,
|
|
51
|
+
aggregated,
|
|
37
52
|
};
|
|
38
53
|
}
|
|
39
54
|
//# sourceMappingURL=site.js.map
|
package/dist/site.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refrakt-md/content",
|
|
3
3
|
"description": "Content loading and transformation pipeline",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"build": "tsc"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@refrakt-md/runes": "0.
|
|
27
|
-
"@refrakt-md/types": "0.
|
|
26
|
+
"@refrakt-md/runes": "0.8.0",
|
|
27
|
+
"@refrakt-md/types": "0.8.0",
|
|
28
28
|
"@markdoc/markdoc": "0.4.0",
|
|
29
29
|
"yaml": "^2.4.0"
|
|
30
30
|
}
|