@refrakt-md/content 0.8.5 → 0.9.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/content-tree.d.ts +11 -0
- package/dist/content-tree.d.ts.map +1 -1
- package/dist/content-tree.js +36 -2
- package/dist/content-tree.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/site.d.ts +7 -2
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +58 -5
- package/dist/site.js.map +1 -1
- package/package.json +3 -3
package/dist/content-tree.d.ts
CHANGED
|
@@ -6,6 +6,14 @@ export interface ContentPage {
|
|
|
6
6
|
/** Raw file content */
|
|
7
7
|
raw: string;
|
|
8
8
|
}
|
|
9
|
+
export interface PartialFile {
|
|
10
|
+
/** Key used in Markdoc config.partials (e.g., "cta.md" or "shared/cta.md") */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Absolute file path */
|
|
13
|
+
filePath: string;
|
|
14
|
+
/** Raw markdown content */
|
|
15
|
+
raw: string;
|
|
16
|
+
}
|
|
9
17
|
export interface ContentDirectory {
|
|
10
18
|
/** Directory name */
|
|
11
19
|
name: string;
|
|
@@ -24,6 +32,7 @@ export interface ContentNode {
|
|
|
24
32
|
}
|
|
25
33
|
export declare class ContentTree {
|
|
26
34
|
readonly root: ContentDirectory;
|
|
35
|
+
private _partials;
|
|
27
36
|
constructor(root: ContentDirectory);
|
|
28
37
|
/** Recursively walk a content directory and build the tree */
|
|
29
38
|
static fromDirectory(dirPath: string): Promise<ContentTree>;
|
|
@@ -31,5 +40,7 @@ export declare class ContentTree {
|
|
|
31
40
|
pages(): Generator<ContentPage>;
|
|
32
41
|
/** All layout files in the tree (depth-first) */
|
|
33
42
|
layouts(): Generator<ContentPage>;
|
|
43
|
+
/** All partial files from the _partials/ directory at content root */
|
|
44
|
+
partials(): Map<string, PartialFile>;
|
|
34
45
|
}
|
|
35
46
|
//# sourceMappingURL=content-tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-tree.d.ts","sourceRoot":"","sources":["../src/content-tree.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,wBAAwB;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,qBAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"content-tree.d.ts","sourceRoot":"","sources":["../src/content-tree.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,wBAAwB;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,qBAAa,WAAW;aAGM,IAAI,EAAE,gBAAgB;IAFlD,OAAO,CAAC,SAAS,CAAuC;gBAE5B,IAAI,EAAE,gBAAgB;IAElD,8DAA8D;WACjD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOjE,0CAA0C;IACzC,KAAK,IAAI,SAAS,CAAC,WAAW,CAAC;IAIhC,iDAAiD;IAChD,OAAO,IAAI,SAAS,CAAC,WAAW,CAAC;IAIlC,sEAAsE;IACtE,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;CAGrC"}
|
package/dist/content-tree.js
CHANGED
|
@@ -2,13 +2,16 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
export class ContentTree {
|
|
4
4
|
root;
|
|
5
|
+
_partials;
|
|
5
6
|
constructor(root) {
|
|
6
7
|
this.root = root;
|
|
7
8
|
}
|
|
8
9
|
/** Recursively walk a content directory and build the tree */
|
|
9
10
|
static async fromDirectory(dirPath) {
|
|
10
11
|
const root = await readDirectory(dirPath, dirPath);
|
|
11
|
-
|
|
12
|
+
const tree = new ContentTree(root);
|
|
13
|
+
tree._partials = await readPartials(dirPath);
|
|
14
|
+
return tree;
|
|
12
15
|
}
|
|
13
16
|
/** All pages in the tree (depth-first) */
|
|
14
17
|
*pages() {
|
|
@@ -18,6 +21,10 @@ export class ContentTree {
|
|
|
18
21
|
*layouts() {
|
|
19
22
|
yield* walkLayouts(this.root);
|
|
20
23
|
}
|
|
24
|
+
/** All partial files from the _partials/ directory at content root */
|
|
25
|
+
partials() {
|
|
26
|
+
return this._partials ?? new Map();
|
|
27
|
+
}
|
|
21
28
|
}
|
|
22
29
|
async function readDirectory(dirPath, rootPath) {
|
|
23
30
|
const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
|
|
@@ -29,7 +36,7 @@ async function readDirectory(dirPath, rootPath) {
|
|
|
29
36
|
};
|
|
30
37
|
for (const entry of entries) {
|
|
31
38
|
const fullPath = path.join(dirPath, entry.name);
|
|
32
|
-
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
39
|
+
if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== '_partials') {
|
|
33
40
|
dir.children.push(await readDirectory(fullPath, rootPath));
|
|
34
41
|
}
|
|
35
42
|
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
@@ -68,4 +75,31 @@ function* walkLayouts(dir) {
|
|
|
68
75
|
yield* walkLayouts(child);
|
|
69
76
|
}
|
|
70
77
|
}
|
|
78
|
+
/** Read all .md files in _partials/ at the content root (recursively). */
|
|
79
|
+
async function readPartials(rootPath) {
|
|
80
|
+
const partialsDir = path.join(rootPath, '_partials');
|
|
81
|
+
const map = new Map();
|
|
82
|
+
try {
|
|
83
|
+
await fs.promises.access(partialsDir);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return map; // No _partials/ directory — that's fine
|
|
87
|
+
}
|
|
88
|
+
await scanPartials(partialsDir, partialsDir, map);
|
|
89
|
+
return map;
|
|
90
|
+
}
|
|
91
|
+
async function scanPartials(dirPath, partialsRoot, map) {
|
|
92
|
+
const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
95
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
96
|
+
await scanPartials(fullPath, partialsRoot, map);
|
|
97
|
+
}
|
|
98
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
99
|
+
const raw = await fs.promises.readFile(fullPath, 'utf-8');
|
|
100
|
+
const name = path.relative(partialsRoot, fullPath);
|
|
101
|
+
map.set(name, { name, filePath: fullPath, raw });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
71
105
|
//# sourceMappingURL=content-tree.js.map
|
package/dist/content-tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-tree.js","sourceRoot":"","sources":["../src/content-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"content-tree.js","sourceRoot":"","sources":["../src/content-tree.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ContentTree, type ContentNode, type ContentPage, type ContentDirectory } from './content-tree.js';
|
|
1
|
+
export { ContentTree, type ContentNode, type ContentPage, type ContentDirectory, type PartialFile } from './content-tree.js';
|
|
2
2
|
export { parseFrontmatter, serializeFrontmatter, type Frontmatter } from './frontmatter.js';
|
|
3
3
|
export { Router, type Route } from './router.js';
|
|
4
4
|
export { resolveLayouts, type ResolvedLayout, type Region } from './layout.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,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,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,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7H,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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+E,MAAM,mBAAmB,CAAC;AAC7H,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"}
|
package/dist/site.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { RenderableTreeNodes, Schema } from '@markdoc/markdoc';
|
|
|
2
2
|
import type { PageSeo, HeadingInfo } from '@refrakt-md/runes';
|
|
3
3
|
import type { RunePackage, PipelineWarning, AggregatedData } from '@refrakt-md/types';
|
|
4
4
|
import type { PipelineStats } from './pipeline.js';
|
|
5
|
-
import { ContentTree } from './content-tree.js';
|
|
5
|
+
import { ContentTree, type PartialFile } from './content-tree.js';
|
|
6
6
|
import { Frontmatter } from './frontmatter.js';
|
|
7
7
|
import { Route } from './router.js';
|
|
8
8
|
import { ResolvedLayout } from './layout.js';
|
|
@@ -20,6 +20,8 @@ export interface Site {
|
|
|
20
20
|
pipelineStats: PipelineStats;
|
|
21
21
|
/** Cross-page data produced by all aggregate hooks, keyed by package name */
|
|
22
22
|
aggregated: AggregatedData;
|
|
23
|
+
/** Partial files from _partials/ directory, keyed by relative name */
|
|
24
|
+
partials: Map<string, PartialFile>;
|
|
23
25
|
}
|
|
24
26
|
export interface SitePage {
|
|
25
27
|
route: Route;
|
|
@@ -36,6 +38,9 @@ export interface SitePage {
|
|
|
36
38
|
* When `packages` are provided, the cross-page pipeline runs after loading:
|
|
37
39
|
* core hooks + package hooks register entities, aggregate cross-page data,
|
|
38
40
|
* and post-process pages before returning.
|
|
41
|
+
*
|
|
42
|
+
* When `sandboxExamplesDir` is provided, sandbox runes with `src` attributes
|
|
43
|
+
* can load code from external files in that directory.
|
|
39
44
|
*/
|
|
40
|
-
export declare function loadContent(dirPath: string, basePath?: string, icons?: Record<string, Record<string, string>>, additionalTags?: Record<string, Schema>, packages?: RunePackage[]): Promise<Site>;
|
|
45
|
+
export declare function loadContent(dirPath: string, basePath?: string, icons?: Record<string, Record<string, string>>, additionalTags?: Record<string, Schema>, packages?: RunePackage[], sandboxExamplesDir?: string): Promise<Site>;
|
|
41
46
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,mBAAmB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1E,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,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,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;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACpC;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;AA0CD;;;;;;;;;GASG;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,EACxB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyDf"}
|
package/dist/site.js
CHANGED
|
@@ -1,12 +1,41 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
1
3
|
import Markdoc from '@markdoc/markdoc';
|
|
2
|
-
import { tags, nodes, extractHeadings, extractSeo, corePipelineHooks } from '@refrakt-md/runes';
|
|
4
|
+
import { tags, nodes, extractHeadings, extractSeo, corePipelineHooks, escapeFenceTags } from '@refrakt-md/runes';
|
|
3
5
|
import { ContentTree } from './content-tree.js';
|
|
4
6
|
import { parseFrontmatter } from './frontmatter.js';
|
|
5
7
|
import { Router } from './router.js';
|
|
6
8
|
import { resolveLayouts } from './layout.js';
|
|
7
9
|
import { runPipeline } from './pipeline.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
/** Synchronous file reader that returns null on failure. */
|
|
11
|
+
function sandboxReadFile(p) {
|
|
12
|
+
try {
|
|
13
|
+
return readFileSync(p, 'utf-8');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Synchronous directory listing that returns empty array on failure. */
|
|
20
|
+
function sandboxListDir(p) {
|
|
21
|
+
try {
|
|
22
|
+
return readdirSync(p);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Check if a path is an existing directory. */
|
|
29
|
+
function sandboxDirExists(p) {
|
|
30
|
+
try {
|
|
31
|
+
return statSync(p).isDirectory();
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function transformContent(content, path, icons, additionalTags, contentVariables, partials) {
|
|
38
|
+
const ast = Markdoc.parse(escapeFenceTags(content));
|
|
10
39
|
const headings = extractHeadings(ast);
|
|
11
40
|
const mergedTags = additionalTags ? { ...tags, ...additionalTags } : tags;
|
|
12
41
|
const config = { tags: mergedTags, nodes, variables: {
|
|
@@ -14,6 +43,9 @@ function transformContent(content, path, icons, additionalTags, contentVariables
|
|
|
14
43
|
...(icons ? { __icons: icons } : {}),
|
|
15
44
|
...contentVariables,
|
|
16
45
|
} };
|
|
46
|
+
if (partials) {
|
|
47
|
+
config.partials = partials;
|
|
48
|
+
}
|
|
17
49
|
return { renderable: Markdoc.transform(ast, config), headings };
|
|
18
50
|
}
|
|
19
51
|
/**
|
|
@@ -22,11 +54,27 @@ function transformContent(content, path, icons, additionalTags, contentVariables
|
|
|
22
54
|
* When `packages` are provided, the cross-page pipeline runs after loading:
|
|
23
55
|
* core hooks + package hooks register entities, aggregate cross-page data,
|
|
24
56
|
* and post-process pages before returning.
|
|
57
|
+
*
|
|
58
|
+
* When `sandboxExamplesDir` is provided, sandbox runes with `src` attributes
|
|
59
|
+
* can load code from external files in that directory.
|
|
25
60
|
*/
|
|
26
|
-
export async function loadContent(dirPath, basePath = '/', icons, additionalTags, packages) {
|
|
61
|
+
export async function loadContent(dirPath, basePath = '/', icons, additionalTags, packages, sandboxExamplesDir) {
|
|
27
62
|
const tree = await ContentTree.fromDirectory(dirPath);
|
|
28
63
|
const router = new Router(basePath);
|
|
29
64
|
const pages = [];
|
|
65
|
+
// Resolve examples directory for sandbox src support
|
|
66
|
+
const resolvedExamplesDir = sandboxExamplesDir
|
|
67
|
+
? resolve(sandboxExamplesDir)
|
|
68
|
+
: resolve(dirPath, '..', 'examples');
|
|
69
|
+
// Pre-parse partials into Markdoc ASTs for the transform config
|
|
70
|
+
const partialFiles = tree.partials();
|
|
71
|
+
let parsedPartials;
|
|
72
|
+
if (partialFiles.size > 0) {
|
|
73
|
+
parsedPartials = {};
|
|
74
|
+
for (const [name, partial] of partialFiles) {
|
|
75
|
+
parsedPartials[name] = Markdoc.parse(escapeFenceTags(partial.raw));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
30
78
|
for (const page of tree.pages()) {
|
|
31
79
|
const { frontmatter, content } = parseFrontmatter(page.raw);
|
|
32
80
|
const route = router.resolve(page.relativePath, frontmatter);
|
|
@@ -34,8 +82,12 @@ export async function loadContent(dirPath, basePath = '/', icons, additionalTags
|
|
|
34
82
|
const contentVariables = {
|
|
35
83
|
frontmatter,
|
|
36
84
|
page: { url: route.url, filePath: route.filePath, draft: route.draft },
|
|
85
|
+
__sandboxReadFile: sandboxReadFile,
|
|
86
|
+
__sandboxListDir: sandboxListDir,
|
|
87
|
+
__sandboxDirExists: sandboxDirExists,
|
|
88
|
+
__sandboxExamplesDir: resolvedExamplesDir,
|
|
37
89
|
};
|
|
38
|
-
const { renderable, headings } = transformContent(content, route.url, icons, additionalTags, contentVariables);
|
|
90
|
+
const { renderable, headings } = transformContent(content, route.url, icons, additionalTags, contentVariables, parsedPartials);
|
|
39
91
|
const seo = extractSeo(renderable, frontmatter, route.url);
|
|
40
92
|
pages.push({ route, frontmatter, content, renderable, headings, layout, seo });
|
|
41
93
|
}
|
|
@@ -54,6 +106,7 @@ export async function loadContent(dirPath, basePath = '/', icons, additionalTags
|
|
|
54
106
|
pipelineWarnings: warnings,
|
|
55
107
|
pipelineStats: stats,
|
|
56
108
|
aggregated,
|
|
109
|
+
partials: partialFiles,
|
|
57
110
|
};
|
|
58
111
|
}
|
|
59
112
|
//# 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,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
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.9.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.9.0",
|
|
27
|
+
"@refrakt-md/types": "0.9.0",
|
|
28
28
|
"@markdoc/markdoc": "0.4.0",
|
|
29
29
|
"yaml": "^2.4.0"
|
|
30
30
|
}
|