@refrakt-md/runes 0.15.0 → 0.16.1
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/aggregate-resolve.d.ts +4 -0
- package/dist/aggregate-resolve.d.ts.map +1 -0
- package/dist/aggregate-resolve.js +209 -0
- package/dist/aggregate-resolve.js.map +1 -0
- package/dist/collection-helpers.d.ts +101 -0
- package/dist/collection-helpers.d.ts.map +1 -0
- package/dist/collection-helpers.js +206 -0
- package/dist/collection-helpers.js.map +1 -0
- package/dist/collection-resolve.d.ts +5 -0
- package/dist/collection-resolve.d.ts.map +1 -0
- package/dist/collection-resolve.js +209 -0
- package/dist/collection-resolve.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +87 -5
- package/dist/config.js.map +1 -1
- package/dist/deferred-body.d.ts +19 -0
- package/dist/deferred-body.d.ts.map +1 -0
- package/dist/deferred-body.js +70 -0
- package/dist/deferred-body.js.map +1 -0
- package/dist/drawer-pipeline.d.ts +72 -1
- package/dist/drawer-pipeline.d.ts.map +1 -1
- package/dist/drawer-pipeline.js +242 -1
- package/dist/drawer-pipeline.js.map +1 -1
- package/dist/expand-pipeline.js +25 -16
- package/dist/expand-pipeline.js.map +1 -1
- package/dist/field-match.d.ts +43 -0
- package/dist/field-match.d.ts.map +1 -0
- package/dist/field-match.js +121 -0
- package/dist/field-match.js.map +1 -0
- package/dist/file-ref-resolve.d.ts +22 -0
- package/dist/file-ref-resolve.d.ts.map +1 -0
- package/dist/file-ref-resolve.js +233 -0
- package/dist/file-ref-resolve.js.map +1 -0
- package/dist/functions.d.ts +36 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +74 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts +33 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +68 -9
- package/dist/nodes.js.map +1 -1
- package/dist/outline-scope.d.ts +17 -0
- package/dist/outline-scope.d.ts.map +1 -1
- package/dist/outline-scope.js +59 -0
- package/dist/outline-scope.js.map +1 -1
- package/dist/relationships-resolve.d.ts +4 -0
- package/dist/relationships-resolve.d.ts.map +1 -0
- package/dist/relationships-resolve.js +180 -0
- package/dist/relationships-resolve.js.map +1 -0
- package/dist/snippet-pipeline.d.ts +7 -5
- package/dist/snippet-pipeline.d.ts.map +1 -1
- package/dist/snippet-pipeline.js +32 -13
- package/dist/snippet-pipeline.js.map +1 -1
- package/dist/tags/aggregate.d.ts +19 -0
- package/dist/tags/aggregate.d.ts.map +1 -0
- package/dist/tags/aggregate.js +59 -0
- package/dist/tags/aggregate.js.map +1 -0
- package/dist/tags/card.d.ts +25 -0
- package/dist/tags/card.d.ts.map +1 -0
- package/dist/tags/card.js +138 -0
- package/dist/tags/card.js.map +1 -0
- package/dist/tags/codegroup.d.ts.map +1 -1
- package/dist/tags/codegroup.js +37 -1
- package/dist/tags/codegroup.js.map +1 -1
- package/dist/tags/collection.d.ts +10 -0
- package/dist/tags/collection.d.ts.map +1 -0
- package/dist/tags/collection.js +54 -0
- package/dist/tags/collection.js.map +1 -0
- package/dist/tags/conversation.d.ts.map +1 -1
- package/dist/tags/conversation.js +26 -6
- package/dist/tags/conversation.js.map +1 -1
- package/dist/tags/diff.d.ts.map +1 -1
- package/dist/tags/diff.js +85 -18
- package/dist/tags/diff.js.map +1 -1
- package/dist/tags/drawer.d.ts.map +1 -1
- package/dist/tags/drawer.js +32 -2
- package/dist/tags/drawer.js.map +1 -1
- package/dist/tags/file-ref.d.ts +21 -0
- package/dist/tags/file-ref.d.ts.map +1 -0
- package/dist/tags/file-ref.js +88 -0
- package/dist/tags/file-ref.js.map +1 -0
- package/dist/tags/progress.d.ts +9 -0
- package/dist/tags/progress.d.ts.map +1 -0
- package/dist/tags/progress.js +96 -0
- package/dist/tags/progress.js.map +1 -0
- package/dist/tags/relationships.d.ts +12 -0
- package/dist/tags/relationships.d.ts.map +1 -0
- package/dist/tags/relationships.js +62 -0
- package/dist/tags/relationships.js.map +1 -0
- package/dist/tags/snippet.d.ts.map +1 -1
- package/dist/tags/snippet.js +10 -0
- package/dist/tags/snippet.js.map +1 -1
- package/dist/tags/xref.d.ts.map +1 -1
- package/dist/tags/xref.js +9 -0
- package/dist/tags/xref.js.map +1 -1
- package/dist/xref-preview-resolve.d.ts +35 -0
- package/dist/xref-preview-resolve.d.ts.map +1 -0
- package/dist/xref-preview-resolve.js +188 -0
- package/dist/xref-preview-resolve.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared field-match grammar (SPEC-070 canonical).
|
|
3
|
+
*
|
|
4
|
+
* One parser + matcher for the `field:value` selector used by `collection`'s
|
|
5
|
+
* `filter`, `entityRoutes`' `filter` (SPEC-069), and `backlog`.
|
|
6
|
+
*
|
|
7
|
+
* filter := clause (WS clause)*
|
|
8
|
+
* clause := field ":" value // split on the FIRST colon
|
|
9
|
+
* value := bareword | '"' .* '"' // double-quotes carry spaces
|
|
10
|
+
*
|
|
11
|
+
* Operator is selected by the value's shape:
|
|
12
|
+
* - exact (default): status:ready
|
|
13
|
+
* - glob: url:/blog/* ( * → any run of chars, anchored full-match )
|
|
14
|
+
* - regex: id:/^SPEC-\d+$/ ( wrapped in slashes + optional flags )
|
|
15
|
+
*
|
|
16
|
+
* Same field repeated → OR; different fields → AND. Matching is case-sensitive.
|
|
17
|
+
*/
|
|
18
|
+
const TOP_LEVEL_FIELDS = new Set(['id', 'type', 'sourceFile', 'sourceUrl']);
|
|
19
|
+
/** Split an expression into tokens, honoring double-quoted spans. */
|
|
20
|
+
function tokenize(expr) {
|
|
21
|
+
const tokens = [];
|
|
22
|
+
let cur = '';
|
|
23
|
+
let inQuotes = false;
|
|
24
|
+
for (const ch of expr) {
|
|
25
|
+
if (ch === '"') {
|
|
26
|
+
inQuotes = !inQuotes;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (!inQuotes && /\s/.test(ch)) {
|
|
30
|
+
if (cur) {
|
|
31
|
+
tokens.push(cur);
|
|
32
|
+
cur = '';
|
|
33
|
+
}
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
cur += ch;
|
|
37
|
+
}
|
|
38
|
+
if (cur)
|
|
39
|
+
tokens.push(cur);
|
|
40
|
+
return tokens;
|
|
41
|
+
}
|
|
42
|
+
/** Parse a filter expression into clauses, collecting warnings for malformed input. */
|
|
43
|
+
export function parseFieldMatch(expr) {
|
|
44
|
+
const warnings = [];
|
|
45
|
+
const byField = new Map();
|
|
46
|
+
if (!expr || !expr.trim())
|
|
47
|
+
return { clauses: [], warnings };
|
|
48
|
+
for (const token of tokenize(expr)) {
|
|
49
|
+
const colon = token.indexOf(':');
|
|
50
|
+
if (colon === -1) {
|
|
51
|
+
warnings.push(`Ignored filter clause "${token}": expected field:value`);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const field = token.slice(0, colon);
|
|
55
|
+
if (!field) {
|
|
56
|
+
warnings.push(`Ignored filter clause "${token}": empty field name`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const value = token.slice(colon + 1);
|
|
60
|
+
const existing = byField.get(field);
|
|
61
|
+
if (existing)
|
|
62
|
+
existing.push(value);
|
|
63
|
+
else
|
|
64
|
+
byField.set(field, [value]);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
clauses: [...byField.entries()].map(([field, values]) => ({ field, values })),
|
|
68
|
+
warnings,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Resolve a field name against an entity: top-level first, then `data`; `url` is an alias. */
|
|
72
|
+
export function resolveEntityField(entity, field) {
|
|
73
|
+
if (field === 'url')
|
|
74
|
+
return entity.sourceUrl ?? entity.data.url ?? '';
|
|
75
|
+
if (TOP_LEVEL_FIELDS.has(field))
|
|
76
|
+
return entity[field];
|
|
77
|
+
return entity.data[field];
|
|
78
|
+
}
|
|
79
|
+
function globToRegExp(value) {
|
|
80
|
+
const parts = value.split('*').map((p) => p.replace(/[.+?^${}()|[\]\\]/g, '\\$&'));
|
|
81
|
+
return new RegExp('^' + parts.join('.*') + '$');
|
|
82
|
+
}
|
|
83
|
+
const REGEX_LITERAL = /^\/(.+)\/([gimsuy]*)$/;
|
|
84
|
+
const REGEX_METACHAR = /[\\^$.+?()[\]{}|]/;
|
|
85
|
+
/** Does a single candidate string satisfy a clause value (operator chosen by value shape)? */
|
|
86
|
+
function matchValue(candidate, value) {
|
|
87
|
+
const m = value.match(REGEX_LITERAL);
|
|
88
|
+
if (m && (m[2].length > 0 || REGEX_METACHAR.test(m[1]))) {
|
|
89
|
+
try {
|
|
90
|
+
return new RegExp(m[1], m[2]).test(candidate);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return candidate === value; // malformed regex → treat literally
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (value.includes('*'))
|
|
97
|
+
return globToRegExp(value).test(candidate);
|
|
98
|
+
return candidate === value;
|
|
99
|
+
}
|
|
100
|
+
/** Normalize a resolved field value to candidate strings (arrays / comma-joined → members). */
|
|
101
|
+
function candidates(resolved) {
|
|
102
|
+
if (Array.isArray(resolved))
|
|
103
|
+
return resolved.map((v) => String(v ?? ''));
|
|
104
|
+
const s = String(resolved ?? '');
|
|
105
|
+
return s.includes(',') ? s.split(',').map((p) => p.trim()) : [s];
|
|
106
|
+
}
|
|
107
|
+
/** Test whether an entity matches all clauses (AND across fields, OR within a field). */
|
|
108
|
+
export function matchesFieldMatch(entity, parsed) {
|
|
109
|
+
for (const clause of parsed.clauses) {
|
|
110
|
+
const cands = candidates(resolveEntityField(entity, clause.field));
|
|
111
|
+
const fieldMatches = clause.values.some((value) => cands.some((c) => matchValue(c, value)));
|
|
112
|
+
if (!fieldMatches)
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
/** Convenience: parse + match in one call. */
|
|
118
|
+
export function matchesFilterExpr(entity, expr) {
|
|
119
|
+
return matchesFieldMatch(entity, parseFieldMatch(expr));
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=field-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-match.js","sourceRoot":"","sources":["../src/field-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file-ref postProcess resolver (SPEC-078, WORK-301).
|
|
3
|
+
*
|
|
4
|
+
* Walks the rendered page, finds `file-ref` sentinels, binds each inline
|
|
5
|
+
* `<a>` to the canonical GitHub URL built from the site's `repoUrl` /
|
|
6
|
+
* `repoBranch`, and (when `preview="drawer"` is set) emits a
|
|
7
|
+
* `hoist-drawer` sentinel that the drawer pipeline picks up to render a
|
|
8
|
+
* preview drawer containing the file's snippet + a "View source on
|
|
9
|
+
* GitHub →" footer link.
|
|
10
|
+
*/
|
|
11
|
+
import type { PipelineContext } from '@refrakt-md/types';
|
|
12
|
+
/**
|
|
13
|
+
* Resolve every `file-ref` sentinel on the page: bind the inline `<a>` to
|
|
14
|
+
* the GitHub URL (or in-page anchor when `preview="drawer"`), emit a
|
|
15
|
+
* sibling hoist sentinel for the drawer pipeline when previewing, and
|
|
16
|
+
* strip the file-ref metas from the rendered tree.
|
|
17
|
+
*
|
|
18
|
+
* Re-entrant per page — the "missing repoUrl" build warning fires at most
|
|
19
|
+
* once per page even when many file-refs share the gap.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveFileRefs(renderable: unknown, pageUrl: string, repoUrl: string | undefined, repoBranch: string | undefined, ctx: PipelineContext): unknown;
|
|
22
|
+
//# sourceMappingURL=file-ref-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-ref-resolve.d.ts","sourceRoot":"","sources":["../src/file-ref-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAyDzD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,eAAe,GAClB,OAAO,CA6BT"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file-ref postProcess resolver (SPEC-078, WORK-301).
|
|
3
|
+
*
|
|
4
|
+
* Walks the rendered page, finds `file-ref` sentinels, binds each inline
|
|
5
|
+
* `<a>` to the canonical GitHub URL built from the site's `repoUrl` /
|
|
6
|
+
* `repoBranch`, and (when `preview="drawer"` is set) emits a
|
|
7
|
+
* `hoist-drawer` sentinel that the drawer pipeline picks up to render a
|
|
8
|
+
* preview drawer containing the file's snippet + a "View source on
|
|
9
|
+
* GitHub →" footer link.
|
|
10
|
+
*/
|
|
11
|
+
import Markdoc from '@markdoc/markdoc';
|
|
12
|
+
import { buildGithubBlobUrl } from '@refrakt-md/transform';
|
|
13
|
+
import { HOIST_DRAWER_SENTINEL, pathToSlug, registerHoistBuilder, } from './drawer-pipeline.js';
|
|
14
|
+
import { FILE_REF_SENTINEL } from './tags/file-ref.js';
|
|
15
|
+
import { readSnippetFile, SnippetSandboxError } from './lib/read-file.js';
|
|
16
|
+
import { inferLanguage } from './lang-map.js';
|
|
17
|
+
const { Tag } = Markdoc;
|
|
18
|
+
function isTag(node) {
|
|
19
|
+
return Tag.isTag(node);
|
|
20
|
+
}
|
|
21
|
+
function metaContent(tag, field) {
|
|
22
|
+
for (const child of tag.children ?? []) {
|
|
23
|
+
if (isTag(child) && child.name === 'meta' && child.attributes['data-field'] === field) {
|
|
24
|
+
return String(child.attributes.content ?? '');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
function hasSentinel(tag) {
|
|
30
|
+
return (tag.children ?? []).some(c => isTag(c) && c.name === 'meta' && c.attributes['data-field'] === FILE_REF_SENTINEL);
|
|
31
|
+
}
|
|
32
|
+
function readQuery(tag) {
|
|
33
|
+
return {
|
|
34
|
+
path: metaContent(tag, 'file-ref-path'),
|
|
35
|
+
lines: metaContent(tag, 'file-ref-lines'),
|
|
36
|
+
label: metaContent(tag, 'file-ref-label'),
|
|
37
|
+
preview: metaContent(tag, 'file-ref-preview'),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function defaultLabel(path) {
|
|
41
|
+
if (!path)
|
|
42
|
+
return '';
|
|
43
|
+
const trimmed = path.endsWith('/') ? path.slice(0, -1) : path;
|
|
44
|
+
const slash = trimmed.lastIndexOf('/');
|
|
45
|
+
return slash >= 0 ? trimmed.slice(slash + 1) : trimmed;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve every `file-ref` sentinel on the page: bind the inline `<a>` to
|
|
49
|
+
* the GitHub URL (or in-page anchor when `preview="drawer"`), emit a
|
|
50
|
+
* sibling hoist sentinel for the drawer pipeline when previewing, and
|
|
51
|
+
* strip the file-ref metas from the rendered tree.
|
|
52
|
+
*
|
|
53
|
+
* Re-entrant per page — the "missing repoUrl" build warning fires at most
|
|
54
|
+
* once per page even when many file-refs share the gap.
|
|
55
|
+
*/
|
|
56
|
+
export function resolveFileRefs(renderable, pageUrl, repoUrl, repoBranch, ctx) {
|
|
57
|
+
// Reset the per-page "missing repoUrl" warning gate.
|
|
58
|
+
const localWarned = { value: false };
|
|
59
|
+
const walk = (node) => {
|
|
60
|
+
if (Array.isArray(node)) {
|
|
61
|
+
let mutated = false;
|
|
62
|
+
const out = node.map(c => {
|
|
63
|
+
const w = walk(c);
|
|
64
|
+
if (w !== c)
|
|
65
|
+
mutated = true;
|
|
66
|
+
return w;
|
|
67
|
+
});
|
|
68
|
+
return mutated ? out : node;
|
|
69
|
+
}
|
|
70
|
+
if (!isTag(node))
|
|
71
|
+
return node;
|
|
72
|
+
const tag = node;
|
|
73
|
+
if (tag.attributes?.['data-rune'] === 'file-ref' && hasSentinel(tag)) {
|
|
74
|
+
return resolveOne(tag, pageUrl, repoUrl, repoBranch, ctx, localWarned);
|
|
75
|
+
}
|
|
76
|
+
if (!tag.children || tag.children.length === 0)
|
|
77
|
+
return tag;
|
|
78
|
+
let mutated = false;
|
|
79
|
+
const next = tag.children.map(c => {
|
|
80
|
+
const w = walk(c);
|
|
81
|
+
if (w !== c)
|
|
82
|
+
mutated = true;
|
|
83
|
+
return w;
|
|
84
|
+
});
|
|
85
|
+
if (!mutated)
|
|
86
|
+
return tag;
|
|
87
|
+
return new Tag(tag.name, tag.attributes, next);
|
|
88
|
+
};
|
|
89
|
+
return walk(renderable);
|
|
90
|
+
}
|
|
91
|
+
function resolveOne(tag, pageUrl, repoUrl, repoBranch, ctx, localWarned) {
|
|
92
|
+
const q = readQuery(tag);
|
|
93
|
+
const label = q.label || defaultLabel(q.path) || q.path;
|
|
94
|
+
const slug = pathToSlug(q.path, q.lines);
|
|
95
|
+
const previewDrawer = q.preview === 'drawer';
|
|
96
|
+
const githubUrl = buildGithubBlobUrl(repoUrl, repoBranch, q.path, q.lines);
|
|
97
|
+
if (!githubUrl && !localWarned.value) {
|
|
98
|
+
ctx.warn(`file-ref on this page has no GitHub URL — site config is missing \`repoUrl\` (path="${q.path}"). Configure \`SiteConfig.repoUrl\` to render canonical "View source" links.`, pageUrl);
|
|
99
|
+
localWarned.value = true;
|
|
100
|
+
}
|
|
101
|
+
// Build the inline anchor. With preview, it points at the hoist anchor;
|
|
102
|
+
// without preview, it points at the GitHub URL (or has no href when
|
|
103
|
+
// repoUrl is absent).
|
|
104
|
+
const anchorAttrs = {};
|
|
105
|
+
if (previewDrawer) {
|
|
106
|
+
anchorAttrs.href = `#drawer-${slug}`;
|
|
107
|
+
anchorAttrs['aria-controls'] = `drawer-${slug}`;
|
|
108
|
+
anchorAttrs['aria-expanded'] = 'false';
|
|
109
|
+
anchorAttrs['data-target-type'] = 'drawer';
|
|
110
|
+
}
|
|
111
|
+
else if (githubUrl) {
|
|
112
|
+
anchorAttrs.href = githubUrl;
|
|
113
|
+
}
|
|
114
|
+
const anchor = new Tag('a', anchorAttrs, [label]);
|
|
115
|
+
const children = [anchor];
|
|
116
|
+
if (previewDrawer) {
|
|
117
|
+
// Emit the hoist sentinel as a sibling of the inline link. The
|
|
118
|
+
// drawer pipeline (WORK-300) picks this up, builds the drawer via
|
|
119
|
+
// the registered builder, and strips this meta from the tree.
|
|
120
|
+
const sentinel = new Tag('meta', {
|
|
121
|
+
'data-field': HOIST_DRAWER_SENTINEL,
|
|
122
|
+
'data-source': 'file-ref',
|
|
123
|
+
'data-target-id': slug,
|
|
124
|
+
'data-title': label,
|
|
125
|
+
'data-path': q.path,
|
|
126
|
+
'data-lines': q.lines,
|
|
127
|
+
'data-github-url': githubUrl ?? '',
|
|
128
|
+
});
|
|
129
|
+
children.push(sentinel);
|
|
130
|
+
}
|
|
131
|
+
// Preserve the outer span (carrying `data-rune="file-ref"`) so the
|
|
132
|
+
// engine's BEM class on it survives; replace the children with the
|
|
133
|
+
// resolved anchor + (when previewing) hoist sentinel.
|
|
134
|
+
return new Tag(tag.name, tag.attributes, children);
|
|
135
|
+
}
|
|
136
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
137
|
+
// Hoist builder — registered with the drawer pipeline so it can build
|
|
138
|
+
// preview drawers for `file-ref preview="drawer"` references.
|
|
139
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
140
|
+
function buildFileRefHoist(payload, context) {
|
|
141
|
+
const filePath = payload.path;
|
|
142
|
+
const lines = payload.lines;
|
|
143
|
+
const title = payload.title || defaultLabel(filePath);
|
|
144
|
+
const targetId = payload['target-id'];
|
|
145
|
+
const githubUrl = payload['github-url'];
|
|
146
|
+
if (!filePath || !targetId) {
|
|
147
|
+
context.ctx.warn(`file-ref hoist payload missing required path or target-id`, context.pageUrl);
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
if (!context.projectRoot) {
|
|
151
|
+
context.ctx.error(`file-ref hoist for "${filePath}" requires a project root in the pipeline; none was threaded through. Drawer body will be empty.`, context.pageUrl);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
// Read the file (same sandbox as snippet). Errors surface as build
|
|
155
|
+
// errors naming the resolved path and the referencing page.
|
|
156
|
+
let fileContent = '';
|
|
157
|
+
let lang = 'text';
|
|
158
|
+
try {
|
|
159
|
+
const result = readSnippetFile({
|
|
160
|
+
pathAttr: filePath,
|
|
161
|
+
projectRoot: context.projectRoot,
|
|
162
|
+
lines: lines || undefined,
|
|
163
|
+
referencingPage: context.pageUrl,
|
|
164
|
+
});
|
|
165
|
+
fileContent = result.content;
|
|
166
|
+
lang = inferLanguage(result.relativePath);
|
|
167
|
+
for (const w of result.warnings)
|
|
168
|
+
context.ctx.warn(`file-ref ${filePath}: ${w}`, context.pageUrl);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const msg = err instanceof SnippetSandboxError
|
|
172
|
+
? err.message
|
|
173
|
+
: `file-ref ${filePath}: ${err instanceof Error ? err.message : String(err)}`;
|
|
174
|
+
context.ctx.error(msg, context.pageUrl);
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
// Drawer body — a figure.rf-snippet wrapping a `<pre data-language>`
|
|
178
|
+
// so the existing snippet CSS + highlight transform pick it up.
|
|
179
|
+
// `data-language` lives on BOTH the <pre> (for snippet CSS hooks +
|
|
180
|
+
// the highlight transform's color-scheme stamping pass) AND on the
|
|
181
|
+
// <code> with text children — the highlight walker only highlights
|
|
182
|
+
// nodes whose children are text, so the <code> is the actual hit.
|
|
183
|
+
const codeBlock = new Tag('pre', {
|
|
184
|
+
'data-language': lang,
|
|
185
|
+
'data-codeblock': 'true',
|
|
186
|
+
}, [new Tag('code', { 'data-language': lang, 'data-codeblock': 'true' }, [fileContent])]);
|
|
187
|
+
const snippetFigure = new Tag('figure', {
|
|
188
|
+
class: 'rf-snippet',
|
|
189
|
+
'data-rune': 'snippet',
|
|
190
|
+
'data-source-path': filePath,
|
|
191
|
+
...(lines ? { 'data-lines': lines } : {}),
|
|
192
|
+
}, [codeBlock]);
|
|
193
|
+
const body = new Tag('div', { 'data-name': 'body', class: 'rf-drawer__body' }, [snippetFigure]);
|
|
194
|
+
// Header — title + close button (close hidden until the behavior
|
|
195
|
+
// layer reveals it, same as authored drawers).
|
|
196
|
+
const titleHeading = new Tag('h3', { 'data-name': 'title', class: 'rf-drawer__title' }, [title]);
|
|
197
|
+
const closeButton = new Tag('button', {
|
|
198
|
+
type: 'button',
|
|
199
|
+
'aria-label': 'Close',
|
|
200
|
+
hidden: true,
|
|
201
|
+
'data-name': 'close',
|
|
202
|
+
class: 'rf-drawer__close',
|
|
203
|
+
}, ['×']);
|
|
204
|
+
const header = new Tag('header', {
|
|
205
|
+
'data-name': 'header',
|
|
206
|
+
class: 'rf-drawer__header',
|
|
207
|
+
}, [titleHeading, closeButton]);
|
|
208
|
+
// Footer — "View source on GitHub →" link. Hides when no
|
|
209
|
+
// repoUrl is configured (githubUrl will be empty in the payload).
|
|
210
|
+
const footerChildren = [];
|
|
211
|
+
if (githubUrl) {
|
|
212
|
+
const arrow = ' →';
|
|
213
|
+
footerChildren.push(new Tag('a', { href: githubUrl, rel: 'external noopener', target: '_blank' }, [`View source on GitHub${arrow}`]));
|
|
214
|
+
}
|
|
215
|
+
const footer = footerChildren.length > 0
|
|
216
|
+
? new Tag('footer', { 'data-name': 'footer', class: 'rf-drawer__footer' }, footerChildren)
|
|
217
|
+
: null;
|
|
218
|
+
const drawerChildren = [header, body];
|
|
219
|
+
if (footer)
|
|
220
|
+
drawerChildren.push(footer);
|
|
221
|
+
const section = new Tag('section', {
|
|
222
|
+
id: `drawer-${targetId}`,
|
|
223
|
+
class: 'rf-drawer',
|
|
224
|
+
'data-rune': 'drawer',
|
|
225
|
+
'data-drawer-id': targetId,
|
|
226
|
+
'data-side': 'right',
|
|
227
|
+
'data-size': 'md',
|
|
228
|
+
}, drawerChildren);
|
|
229
|
+
return section;
|
|
230
|
+
}
|
|
231
|
+
// Register the builder when this module is imported.
|
|
232
|
+
registerHoistBuilder('file-ref', buildFileRefHoist);
|
|
233
|
+
//# sourceMappingURL=file-ref-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-ref-resolve.js","sourceRoot":"","sources":["../src/file-ref-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared markdoc formatter functions (SPEC-070 / WORK-265).
|
|
3
|
+
*
|
|
4
|
+
* Author-facing value formatters usable anywhere markdoc transforms run:
|
|
5
|
+
* collection cells/templates, `entityRoutes` render strings, ordinary content.
|
|
6
|
+
* Keeps value formatting out of `fields` projection and out of any bespoke DSL.
|
|
7
|
+
*
|
|
8
|
+
* {% currency($item.data.price, "EUR") %} → €1,234.00
|
|
9
|
+
* {% date($item.data.published) %} → Jan 15, 2024
|
|
10
|
+
* {% number($item.data.views) %} → 1,234,567
|
|
11
|
+
* {% join($item.data.tags, " · ") %} → a · b · c
|
|
12
|
+
* concat("milestone:", $item.id) → "milestone:v0.16.0"
|
|
13
|
+
*/
|
|
14
|
+
import type { ConfigFunction } from '@markdoc/markdoc';
|
|
15
|
+
export declare const currency: ConfigFunction;
|
|
16
|
+
export declare const date: ConfigFunction;
|
|
17
|
+
export declare const number: ConfigFunction;
|
|
18
|
+
export declare const join: ConfigFunction;
|
|
19
|
+
/**
|
|
20
|
+
* String concatenation of all positional arguments. Each is stringified
|
|
21
|
+
* (null/undefined → empty string) and concatenated without a separator.
|
|
22
|
+
* Fills the gap Markdoc's string-literal grammar leaves — `"foo:$bar"`
|
|
23
|
+
* doesn't interpolate, so use `concat("foo:", $bar)` to compose dynamic
|
|
24
|
+
* attribute values like `filter` / `url` from variables at transform time.
|
|
25
|
+
*/
|
|
26
|
+
export declare const concat: ConfigFunction;
|
|
27
|
+
/**
|
|
28
|
+
* Title-case a slug/enum-ish token: split camelCase, turn `-`/`_` into spaces,
|
|
29
|
+
* capitalize each word. `blocked-by` → "Blocked By", `prepTime` → "Prep Time".
|
|
30
|
+
* Shared by collection's `fields` headers and the relationships rune's kind
|
|
31
|
+
* labels, and exposed as the `humanize` markdoc function.
|
|
32
|
+
*/
|
|
33
|
+
export declare function humanize(value: string): string;
|
|
34
|
+
/** The shared formatter-function set, keyed by their markdoc name. */
|
|
35
|
+
export declare const functions: Record<string, ConfigFunction>;
|
|
36
|
+
//# sourceMappingURL=functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,eAAO,MAAM,QAAQ,EAAE,cAWtB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,cAOlB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,cAMpB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,cAOlB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,cAIpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM9C;AAQD,sEAAsE;AACtE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAkE,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const LOCALE = 'en-US';
|
|
2
|
+
export const currency = {
|
|
3
|
+
transform(parameters) {
|
|
4
|
+
const amount = Number(parameters[0]);
|
|
5
|
+
const code = String(parameters[1] ?? 'USD');
|
|
6
|
+
if (!Number.isFinite(amount))
|
|
7
|
+
return String(parameters[0] ?? '');
|
|
8
|
+
try {
|
|
9
|
+
return new Intl.NumberFormat(LOCALE, { style: 'currency', currency: code }).format(amount);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return `${code} ${amount}`;
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export const date = {
|
|
17
|
+
transform(parameters) {
|
|
18
|
+
const raw = parameters[0];
|
|
19
|
+
const d = new Date(String(raw));
|
|
20
|
+
if (Number.isNaN(d.getTime()))
|
|
21
|
+
return String(raw ?? '');
|
|
22
|
+
return new Intl.DateTimeFormat(LOCALE, { year: 'numeric', month: 'short', day: 'numeric' }).format(d);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export const number = {
|
|
26
|
+
transform(parameters) {
|
|
27
|
+
const n = Number(parameters[0]);
|
|
28
|
+
if (!Number.isFinite(n))
|
|
29
|
+
return String(parameters[0] ?? '');
|
|
30
|
+
return new Intl.NumberFormat(LOCALE).format(n);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export const join = {
|
|
34
|
+
transform(parameters) {
|
|
35
|
+
const value = parameters[0];
|
|
36
|
+
const sep = parameters[1] != null ? String(parameters[1]) : ', ';
|
|
37
|
+
if (Array.isArray(value))
|
|
38
|
+
return value.map((v) => String(v ?? '')).join(sep);
|
|
39
|
+
return String(value ?? '');
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* String concatenation of all positional arguments. Each is stringified
|
|
44
|
+
* (null/undefined → empty string) and concatenated without a separator.
|
|
45
|
+
* Fills the gap Markdoc's string-literal grammar leaves — `"foo:$bar"`
|
|
46
|
+
* doesn't interpolate, so use `concat("foo:", $bar)` to compose dynamic
|
|
47
|
+
* attribute values like `filter` / `url` from variables at transform time.
|
|
48
|
+
*/
|
|
49
|
+
export const concat = {
|
|
50
|
+
transform(parameters) {
|
|
51
|
+
return Object.values(parameters).map((v) => (v == null ? '' : String(v))).join('');
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Title-case a slug/enum-ish token: split camelCase, turn `-`/`_` into spaces,
|
|
56
|
+
* capitalize each word. `blocked-by` → "Blocked By", `prepTime` → "Prep Time".
|
|
57
|
+
* Shared by collection's `fields` headers and the relationships rune's kind
|
|
58
|
+
* labels, and exposed as the `humanize` markdoc function.
|
|
59
|
+
*/
|
|
60
|
+
export function humanize(value) {
|
|
61
|
+
return String(value ?? '')
|
|
62
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
63
|
+
.replace(/[-_]+/g, ' ')
|
|
64
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
65
|
+
.trim();
|
|
66
|
+
}
|
|
67
|
+
const humanizeFn = {
|
|
68
|
+
transform(parameters) {
|
|
69
|
+
return humanize(String(parameters[0] ?? ''));
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
/** The shared formatter-function set, keyed by their markdoc name. */
|
|
73
|
+
export const functions = { currency, date, number, join, concat, humanize: humanizeFn };
|
|
74
|
+
//# sourceMappingURL=functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { Page } from './documents/page.js';
|
|
2
2
|
import { DocPage } from './documents/doc.js';
|
|
3
|
+
import './file-ref-resolve.js';
|
|
4
|
+
import './xref-preview-resolve.js';
|
|
3
5
|
import Markdoc from '@markdoc/markdoc';
|
|
4
6
|
export * from './interfaces.js';
|
|
5
7
|
export { Rune, defineRune, runeTagMap } from './rune.js';
|
|
@@ -7,6 +9,23 @@ export { RenderableNodeCursor } from './lib/renderable.js';
|
|
|
7
9
|
export { createContentModelSchema, createComponentRenderable, asNodes, schemaContentModels, sanitizeSandboxContent } from './lib/index.js';
|
|
8
10
|
export type { DeprecationRule, ContentModelSchemaOptions } from './lib/index.js';
|
|
9
11
|
export { resolve, resolveSequence, resolveDelimited, resolveContentModel, resolveListItems, evaluateCondition, matchesType } from './lib/resolver.js';
|
|
12
|
+
export { parseFieldMatch, matchesFieldMatch, matchesFilterExpr, resolveEntityField } from './field-match.js';
|
|
13
|
+
export type { MatchableEntity, FieldMatchClause, ParsedFieldMatch } from './field-match.js';
|
|
14
|
+
export { DEFERRED_BODY_ATTR, captureDeferredBodies, readDeferredBody, transformDeferredTemplate } from './deferred-body.js';
|
|
15
|
+
export { resolveCollections } from './collection-resolve.js';
|
|
16
|
+
export { resolveRelationships } from './relationships-resolve.js';
|
|
17
|
+
export { resolveAggregates } from './aggregate-resolve.js';
|
|
18
|
+
export { resolveFileRefs } from './file-ref-resolve.js';
|
|
19
|
+
export { FILE_REF_SENTINEL } from './tags/file-ref.js';
|
|
20
|
+
export { resolveXrefPreviews } from './xref-preview-resolve.js';
|
|
21
|
+
export { RELATIONSHIPS_SENTINEL } from './tags/relationships.js';
|
|
22
|
+
export { AGGREGATE_SENTINEL } from './tags/aggregate.js';
|
|
23
|
+
export { hoistPreviewDrawers, registerHoistBuilder, getHoistBuilder, pathToSlug, HOIST_DRAWER_SENTINEL, } from './drawer-pipeline.js';
|
|
24
|
+
export type { HoistBuilder, HoistBuildContext } from './drawer-pipeline.js';
|
|
25
|
+
export { Ordering, buildOrdering, sortEntities, groupEntities, groupBy, entityUrl, entityTitle, fieldValue, titleLink, projectItem, renderItemTemplate, } from './collection-helpers.js';
|
|
26
|
+
export type { CollectionEmbedConfig } from './collection-helpers.js';
|
|
27
|
+
export { COLLECTION_SENTINEL } from './tags/collection.js';
|
|
28
|
+
export { functions, currency, date, number, join, concat, humanize } from './functions.js';
|
|
10
29
|
export { linkItem, pageSectionProperties, buildLayoutMetas, extractMediaImage, unwrapParagraphImages, name as nameHelper, description as descriptionHelper, SplitablePageSectionModel, SplitLayoutModel, splitLayoutAttributes } from './tags/common.js';
|
|
11
30
|
export type { LayoutMetas } from './tags/common.js';
|
|
12
31
|
export { extractHeadings, firstH1, headingsToList } from './util.js';
|
|
@@ -88,8 +107,20 @@ export declare const runes: {
|
|
|
88
107
|
xref: import("./rune.js").Rune;
|
|
89
108
|
expand: import("./rune.js").Rune;
|
|
90
109
|
badge: import("./rune.js").Rune;
|
|
110
|
+
collection: import("./rune.js").Rune;
|
|
111
|
+
relationships: import("./rune.js").Rune;
|
|
112
|
+
aggregate: import("./rune.js").Rune;
|
|
113
|
+
'file-ref': import("./rune.js").Rune;
|
|
114
|
+
progress: import("./rune.js").Rune;
|
|
115
|
+
card: import("./rune.js").Rune;
|
|
91
116
|
};
|
|
92
|
-
/** Markdoc-compatible tags map derived from runes + Markdoc built-in tags
|
|
117
|
+
/** Markdoc-compatible tags map derived from runes + Markdoc built-in tags.
|
|
118
|
+
*
|
|
119
|
+
* `link` is exposed as a tag in addition to its node registration (which
|
|
120
|
+
* handles `[text](url)` markdown syntax). Markdown link URLs are literal at
|
|
121
|
+
* parse-time, so they can't reference variables — `{% link href=$item.url %}`
|
|
122
|
+
* gives template authors a way to build dynamic links inside collection
|
|
123
|
+
* cells, partials, etc. */
|
|
93
124
|
export declare const tags: {
|
|
94
125
|
else: import("@markdoc/markdoc/dist/src/types.js").Schema<Readonly<Partial<{
|
|
95
126
|
nodes: Partial<Record<import("@markdoc/markdoc/dist/src/types.js").NodeType, import("@markdoc/markdoc/dist/src/types.js").Schema<Readonly<Partial<any>>, string>>>;
|
|
@@ -151,6 +182,7 @@ export declare const tags: {
|
|
|
151
182
|
environment?: string | undefined;
|
|
152
183
|
} | undefined;
|
|
153
184
|
}>>, string>;
|
|
185
|
+
link: Markdoc.Schema;
|
|
154
186
|
};
|
|
155
187
|
export declare const nodes: {
|
|
156
188
|
heading: Markdoc.Schema;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|