@dogsbay/format-topicmap 0.2.0-beta.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/edit-source.d.ts +29 -0
- package/dist/edit-source.d.ts.map +1 -0
- package/dist/edit-source.js +196 -0
- package/dist/edit-source.js.map +1 -0
- package/dist/edit.d.ts +95 -0
- package/dist/edit.d.ts.map +1 -0
- package/dist/edit.js +295 -0
- package/dist/edit.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/nav-file.d.ts +23 -0
- package/dist/nav-file.d.ts.map +1 -0
- package/dist/nav-file.js +48 -0
- package/dist/nav-file.js.map +1 -0
- package/dist/nav.d.ts +8 -0
- package/dist/nav.d.ts.map +1 -0
- package/dist/nav.js +37 -0
- package/dist/nav.js.map +1 -0
- package/dist/parse.d.ts +12 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +143 -0
- package/dist/parse.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +55 -0
- package/dist/paths.js.map +1 -0
- package/dist/resolve.d.ts +13 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +140 -0
- package/dist/resolve.js.map +1 -0
- package/dist/serialize.d.ts +3 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +28 -0
- package/dist/serialize.js.map +1 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
package/dist/edit.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure structural transforms over a parsed TopicMap — the ONE edit path
|
|
3
|
+
* shared by the agent's `map-*` verbs (@dogsbay/commands) and the IDE's
|
|
4
|
+
* Structure panel (plans/topicmap-editor.md: "agent edits are validated
|
|
5
|
+
* identically to human edits and never touch YAML bytes directly").
|
|
6
|
+
*
|
|
7
|
+
* No I/O: the caller loads/serializes. Existence of a local href target is
|
|
8
|
+
* checked through an injected `exists` predicate (a workspace storage, the
|
|
9
|
+
* IDE's file index); when none is given the check is skipped and the
|
|
10
|
+
* caller owns the diagnostic.
|
|
11
|
+
*
|
|
12
|
+
* Entries are addressed by POINTER — a dotted index path like `0.2.1`
|
|
13
|
+
* (`""` is the root) — or, where unambiguous, by `href`/`navtitle`
|
|
14
|
+
* (`@x` forces name matching for a title that looks like a pointer).
|
|
15
|
+
*
|
|
16
|
+
* Every transform MUTATES the given map in place (callers hold a fresh
|
|
17
|
+
* parse) and returns `{ ok: true, … }` or `{ ok: false, code, message }` —
|
|
18
|
+
* a refusal leaves the map untouched.
|
|
19
|
+
*/
|
|
20
|
+
import { dirname, isExternalHref, joinPath, normalizePath } from "./paths.js";
|
|
21
|
+
import { isTopicMapPath } from "./types.js";
|
|
22
|
+
const refuse = (code, message, extra) => ({
|
|
23
|
+
ok: false,
|
|
24
|
+
code,
|
|
25
|
+
message,
|
|
26
|
+
...(extra ? { extra } : {}),
|
|
27
|
+
});
|
|
28
|
+
export const parsePointer = (pointer) => {
|
|
29
|
+
const p = pointer.trim();
|
|
30
|
+
if (p === "" || p === "/")
|
|
31
|
+
return [];
|
|
32
|
+
if (!/^\d+(\.\d+)*$/.test(p))
|
|
33
|
+
return undefined;
|
|
34
|
+
return p.split(".").map(Number);
|
|
35
|
+
};
|
|
36
|
+
export const pointerOf = (path) => path.join(".");
|
|
37
|
+
/** The `topics` array a pointer's PARENT owns, plus the index. Read-only: never creates arrays. */
|
|
38
|
+
export const locate = (map, path) => {
|
|
39
|
+
if (path.length === 0)
|
|
40
|
+
return undefined;
|
|
41
|
+
let siblings = map.topics;
|
|
42
|
+
for (let depth = 0; depth < path.length - 1; depth++) {
|
|
43
|
+
const e = siblings[path[depth]];
|
|
44
|
+
if (!e?.topics)
|
|
45
|
+
return undefined;
|
|
46
|
+
siblings = e.topics;
|
|
47
|
+
}
|
|
48
|
+
const index = path[path.length - 1];
|
|
49
|
+
const entry = siblings[index];
|
|
50
|
+
return entry ? { siblings, index, entry } : undefined;
|
|
51
|
+
};
|
|
52
|
+
/** The container to insert INTO (root or an entry's topics, created on demand for the write path). */
|
|
53
|
+
export const containerOf = (map, path) => {
|
|
54
|
+
if (path.length === 0)
|
|
55
|
+
return map.topics;
|
|
56
|
+
const found = locate(map, path);
|
|
57
|
+
if (!found)
|
|
58
|
+
return undefined;
|
|
59
|
+
found.entry.topics ??= [];
|
|
60
|
+
return found.entry.topics;
|
|
61
|
+
};
|
|
62
|
+
/** Pointer of an entry by IDENTITY (after a splice, indices may have shifted). */
|
|
63
|
+
export const pathOfEntry = (map, target) => {
|
|
64
|
+
const walk = (entries, prefix) => {
|
|
65
|
+
for (let i = 0; i < entries.length; i++) {
|
|
66
|
+
const e = entries[i];
|
|
67
|
+
if (e === target)
|
|
68
|
+
return [...prefix, i];
|
|
69
|
+
if (e.topics) {
|
|
70
|
+
const hit = walk(e.topics, [...prefix, i]);
|
|
71
|
+
if (hit)
|
|
72
|
+
return hit;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
};
|
|
77
|
+
return walk(map.topics, []);
|
|
78
|
+
};
|
|
79
|
+
/** Workspace path an href points at (undefined for external / fragment-only). */
|
|
80
|
+
export const hrefTarget = (mapFile, href) => {
|
|
81
|
+
if (isExternalHref(href) || href.startsWith("#"))
|
|
82
|
+
return undefined;
|
|
83
|
+
const bare = href.split("#")[0].trim();
|
|
84
|
+
// an empty href is not a file (it would "resolve" to the map's directory, which exists)
|
|
85
|
+
if (!bare)
|
|
86
|
+
return undefined;
|
|
87
|
+
if (bare.startsWith("/"))
|
|
88
|
+
return normalizePath(bare.slice(1));
|
|
89
|
+
return normalizePath(joinPath(dirname(mapFile), bare));
|
|
90
|
+
};
|
|
91
|
+
/** A local href that resolves to the map itself is a self-include, whatever the format flag says. */
|
|
92
|
+
export const isSelfInclude = (mapFile, href) => hrefTarget(mapFile, href) === mapFile;
|
|
93
|
+
/** All entries matching an href or navtitle. */
|
|
94
|
+
export const findByHref = (map, href) => {
|
|
95
|
+
const hits = [];
|
|
96
|
+
const walk = (entries, prefix) => {
|
|
97
|
+
entries.forEach((e, i) => {
|
|
98
|
+
const path = [...prefix, i];
|
|
99
|
+
if (e.href === href || e.navtitle === href)
|
|
100
|
+
hits.push(path);
|
|
101
|
+
if (e.topics)
|
|
102
|
+
walk(e.topics, path);
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
walk(map.topics, []);
|
|
106
|
+
return hits;
|
|
107
|
+
};
|
|
108
|
+
/** Pointer, or unique href/navtitle (`@x` forces name matching), to a path. */
|
|
109
|
+
export const resolveAddress = (map, at) => {
|
|
110
|
+
const byName = (name) => {
|
|
111
|
+
const hits = findByHref(map, name);
|
|
112
|
+
if (hits.length === 1)
|
|
113
|
+
return { ok: true, path: hits[0] };
|
|
114
|
+
if (hits.length === 0)
|
|
115
|
+
return refuse("map-entry-not-found", `no entry with href or navtitle "${name}"`);
|
|
116
|
+
return refuse("map-entry-ambiguous", `"${name}" matches ${hits.length} entries: ${hits.map(pointerOf).join(", ")}; use a pointer`);
|
|
117
|
+
};
|
|
118
|
+
if (at.startsWith("@"))
|
|
119
|
+
return byName(at.slice(1));
|
|
120
|
+
const asPointer = parsePointer(at);
|
|
121
|
+
if (asPointer !== undefined) {
|
|
122
|
+
if (asPointer.length && !locate(map, asPointer))
|
|
123
|
+
return refuse("map-pointer-missing", `no entry at pointer "${at}"`);
|
|
124
|
+
return { ok: true, path: asPointer };
|
|
125
|
+
}
|
|
126
|
+
return byName(at);
|
|
127
|
+
};
|
|
128
|
+
export const flattenTopicMap = (map) => {
|
|
129
|
+
const out = [];
|
|
130
|
+
const walk = (entries, prefix, depth) => {
|
|
131
|
+
entries.forEach((e, i) => {
|
|
132
|
+
const path = [...prefix, i];
|
|
133
|
+
out.push({
|
|
134
|
+
pointer: pointerOf(path),
|
|
135
|
+
depth,
|
|
136
|
+
...(e.navtitle !== undefined ? { navtitle: e.navtitle } : {}),
|
|
137
|
+
...(e.href !== undefined ? { href: e.href } : {}),
|
|
138
|
+
...(e.format !== undefined ? { format: e.format } : {}),
|
|
139
|
+
...(e.toc !== undefined ? { toc: e.toc } : {}),
|
|
140
|
+
...(e.singlePage !== undefined ? { singlePage: e.singlePage } : {}),
|
|
141
|
+
children: e.topics?.length ?? 0,
|
|
142
|
+
});
|
|
143
|
+
if (e.topics)
|
|
144
|
+
walk(e.topics, path, depth + 1);
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
walk(map.topics, [], 0);
|
|
148
|
+
return out;
|
|
149
|
+
};
|
|
150
|
+
/** Refuse a self-include or (when `exists` is given) a dangling local href. */
|
|
151
|
+
const checkHref = (mapFile, href, exists) => {
|
|
152
|
+
const target = hrefTarget(mapFile, href);
|
|
153
|
+
if (target === undefined)
|
|
154
|
+
return undefined;
|
|
155
|
+
if (isSelfInclude(mapFile, href))
|
|
156
|
+
return refuse("map-self-include", "a map cannot include itself");
|
|
157
|
+
if (exists && !exists(target))
|
|
158
|
+
return refuse("map-href-dangling", `${href} does not resolve to a workspace file (${target})`, { target });
|
|
159
|
+
return undefined;
|
|
160
|
+
};
|
|
161
|
+
export const addRef = (map, mapFile, input, exists) => {
|
|
162
|
+
const parent = resolveAddress(map, input.parent ?? "");
|
|
163
|
+
if (!parent.ok)
|
|
164
|
+
return parent;
|
|
165
|
+
const href = input.href?.trim() || undefined;
|
|
166
|
+
const navtitle = input.navtitle?.trim() || undefined;
|
|
167
|
+
if (!href && !navtitle)
|
|
168
|
+
return refuse("map-entry-empty", "an entry needs an href or a navtitle");
|
|
169
|
+
if (href) {
|
|
170
|
+
const bad = checkHref(mapFile, href, exists);
|
|
171
|
+
if (bad)
|
|
172
|
+
return bad;
|
|
173
|
+
}
|
|
174
|
+
const entry = {
|
|
175
|
+
...(navtitle !== undefined ? { navtitle } : {}),
|
|
176
|
+
...(href !== undefined ? { href } : {}),
|
|
177
|
+
...(input.format !== undefined ? { format: input.format } : {}),
|
|
178
|
+
...(input.toc !== undefined ? { toc: input.toc } : {}),
|
|
179
|
+
...(input.singlePage !== undefined ? { singlePage: input.singlePage } : {}),
|
|
180
|
+
};
|
|
181
|
+
if (input.format === undefined && href && isTopicMapPath(href))
|
|
182
|
+
entry.format = "topicmap";
|
|
183
|
+
const container = containerOf(map, parent.path);
|
|
184
|
+
const index = input.index === undefined ? container.length : Math.min(input.index, container.length);
|
|
185
|
+
container.splice(index, 0, entry);
|
|
186
|
+
const target = href ? hrefTarget(mapFile, href) : undefined;
|
|
187
|
+
return { ok: true, pointer: pointerOf([...parent.path, index]), entry, ...(target !== undefined ? { target } : {}) };
|
|
188
|
+
};
|
|
189
|
+
export const moveRef = (map, input) => {
|
|
190
|
+
const from = resolveAddress(map, input.from);
|
|
191
|
+
if (!from.ok)
|
|
192
|
+
return from;
|
|
193
|
+
if (from.path.length === 0)
|
|
194
|
+
return refuse("map-move-root", "the root is not an entry");
|
|
195
|
+
const to = input.toParent === undefined ? { ok: true, path: from.path.slice(0, -1) } : resolveAddress(map, input.toParent);
|
|
196
|
+
if (!to.ok)
|
|
197
|
+
return to;
|
|
198
|
+
const fromKey = pointerOf(from.path);
|
|
199
|
+
const toKey = pointerOf(to.path);
|
|
200
|
+
if (toKey === fromKey || toKey.startsWith(fromKey + "."))
|
|
201
|
+
return refuse("map-move-into-self", "cannot move an entry into its own subtree");
|
|
202
|
+
// Resolve BOTH containers by object identity BEFORE the splice: pointers
|
|
203
|
+
// are positions, and removing the source shifts every later sibling.
|
|
204
|
+
const src = locate(map, from.path);
|
|
205
|
+
const dest = containerOf(map, to.path);
|
|
206
|
+
const [entry] = src.siblings.splice(src.index, 1);
|
|
207
|
+
const index = input.index === undefined ? dest.length : Math.min(input.index, dest.length);
|
|
208
|
+
dest.splice(index, 0, entry);
|
|
209
|
+
const newPath = pathOfEntry(map, entry) ?? [...to.path, index];
|
|
210
|
+
return { ok: true, from: fromKey, to: pointerOf(newPath), entry: entry };
|
|
211
|
+
};
|
|
212
|
+
export const removeRef = (map, input) => {
|
|
213
|
+
const at = resolveAddress(map, input.at);
|
|
214
|
+
if (!at.ok)
|
|
215
|
+
return at;
|
|
216
|
+
if (at.path.length === 0)
|
|
217
|
+
return refuse("map-remove-root", "the root is not an entry");
|
|
218
|
+
const found = locate(map, at.path);
|
|
219
|
+
const removedChildren = found.entry.topics?.length ?? 0;
|
|
220
|
+
const hoisted = input.keepChildren ? (found.entry.topics ?? []) : [];
|
|
221
|
+
found.siblings.splice(found.index, 1, ...hoisted);
|
|
222
|
+
return {
|
|
223
|
+
ok: true,
|
|
224
|
+
pointer: pointerOf(at.path),
|
|
225
|
+
entry: found.entry,
|
|
226
|
+
childrenRemoved: input.keepChildren ? 0 : removedChildren,
|
|
227
|
+
childrenHoisted: hoisted.length,
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
export const setProps = (map, mapFile, input, exists) => {
|
|
231
|
+
const at = resolveAddress(map, input.at);
|
|
232
|
+
if (!at.ok)
|
|
233
|
+
return at;
|
|
234
|
+
if (at.path.length === 0)
|
|
235
|
+
return refuse("map-root-not-entry", "the root is not an entry; set the map title by editing the file");
|
|
236
|
+
const { entry } = locate(map, at.path);
|
|
237
|
+
// validate everything BEFORE mutating, so a refusal leaves the map untouched:
|
|
238
|
+
// judge the POST-state (both fields may change in one call)
|
|
239
|
+
const hrefAfter = input.href === undefined ? entry.href : input.href?.trim() || null;
|
|
240
|
+
const titleAfter = input.navtitle === undefined ? entry.navtitle : input.navtitle?.trim() || null;
|
|
241
|
+
if (!hrefAfter && !titleAfter)
|
|
242
|
+
return refuse("map-entry-empty", "an entry needs an href or a navtitle");
|
|
243
|
+
if (typeof input.href === "string" && !input.href.trim())
|
|
244
|
+
return refuse("map-entry-empty", "href must not be empty (use null to unset)");
|
|
245
|
+
if (typeof input.navtitle === "string" && !input.navtitle.trim())
|
|
246
|
+
return refuse("map-entry-empty", "navtitle must not be empty (use null to unset)");
|
|
247
|
+
if (typeof input.href === "string") {
|
|
248
|
+
const bad = checkHref(mapFile, input.href.trim(), exists);
|
|
249
|
+
if (bad)
|
|
250
|
+
return bad;
|
|
251
|
+
}
|
|
252
|
+
const changed = [];
|
|
253
|
+
if (input.href !== undefined) {
|
|
254
|
+
if (input.href === null) {
|
|
255
|
+
delete entry.href;
|
|
256
|
+
// a title-only entry cannot be a map include
|
|
257
|
+
if (input.format === undefined && entry.format === "topicmap")
|
|
258
|
+
delete entry.format;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
entry.href = input.href.trim();
|
|
262
|
+
// keep `format` honest when the caller did not say: a map path is a
|
|
263
|
+
// map, a non-map path is not (a stale `format: topicmap` would make
|
|
264
|
+
// the build parse a .md as YAML)
|
|
265
|
+
if (input.format === undefined) {
|
|
266
|
+
if (isTopicMapPath(entry.href))
|
|
267
|
+
entry.format = "topicmap";
|
|
268
|
+
else if (entry.format === "topicmap")
|
|
269
|
+
delete entry.format;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
changed.push("href");
|
|
273
|
+
}
|
|
274
|
+
if (input.navtitle !== undefined) {
|
|
275
|
+
if (input.navtitle === null)
|
|
276
|
+
delete entry.navtitle;
|
|
277
|
+
else
|
|
278
|
+
entry.navtitle = input.navtitle.trim();
|
|
279
|
+
changed.push("navtitle");
|
|
280
|
+
}
|
|
281
|
+
for (const key of ["format", "toc", "singlePage"]) {
|
|
282
|
+
const value = input[key];
|
|
283
|
+
if (value === undefined)
|
|
284
|
+
continue;
|
|
285
|
+
if (value === null)
|
|
286
|
+
delete entry[key];
|
|
287
|
+
else
|
|
288
|
+
entry[key] = value;
|
|
289
|
+
changed.push(key);
|
|
290
|
+
}
|
|
291
|
+
if (!changed.length)
|
|
292
|
+
return refuse("map-props-noop", "nothing to set");
|
|
293
|
+
return { ok: true, pointer: pointerOf(at.path), changed, entry };
|
|
294
|
+
};
|
|
295
|
+
//# sourceMappingURL=edit.js.map
|
package/dist/edit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../src/edit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dogsbay/format-topicmap
|
|
3
|
+
*
|
|
4
|
+
* Recursive YAML topic maps (`*.topicmap.yml`) — the DITA-map-equivalent
|
|
5
|
+
* authored structure format. Topic maps are the source of truth for site
|
|
6
|
+
* structure; NavItem[]/nav.json are build outputs.
|
|
7
|
+
*
|
|
8
|
+
* Spec background: the ide-claude repo's
|
|
9
|
+
* plans/markdown-dita-replacement/01-modular-content-model.md §1.2.
|
|
10
|
+
*/
|
|
11
|
+
export { isTopicMapPath, TOPICMAP_EXTENSIONS, type TopicMap, type TopicMapEntry, type TopicMapError, type TopicMapLoader, type ResolveOptions, type ResolvedTopicMap, } from "./types.js";
|
|
12
|
+
export { parseTopicMap } from "./parse.js";
|
|
13
|
+
export { serializeTopicMap } from "./serialize.js";
|
|
14
|
+
export { resolveTopicMap } from "./resolve.js";
|
|
15
|
+
export { topicMapToNav } from "./nav.js";
|
|
16
|
+
export { topicMapToNavFile, type NavFileEntry } from "./nav-file.js";
|
|
17
|
+
export { normalizePath, dirname, joinPath, resolveHref, isExternalHref } from "./paths.js";
|
|
18
|
+
export { parsePointer, pointerOf, locate, containerOf, pathOfEntry, hrefTarget, isSelfInclude, findByHref, resolveAddress, flattenTopicMap, addRef, moveRef, removeRef, setProps, type EditResult, type EditRefusal, type ExistsFn, type FlatEntry, type AddRefInput, type MoveRefInput, type SetPropsInput, } from "./edit.js";
|
|
19
|
+
export { applyMapEdit, type MapEditOp, type SourceEditResult } from "./edit-source.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EACL,YAAY,EACZ,SAAS,EACT,MAAM,EACN,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,eAAe,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dogsbay/format-topicmap
|
|
3
|
+
*
|
|
4
|
+
* Recursive YAML topic maps (`*.topicmap.yml`) — the DITA-map-equivalent
|
|
5
|
+
* authored structure format. Topic maps are the source of truth for site
|
|
6
|
+
* structure; NavItem[]/nav.json are build outputs.
|
|
7
|
+
*
|
|
8
|
+
* Spec background: the ide-claude repo's
|
|
9
|
+
* plans/markdown-dita-replacement/01-modular-content-model.md §1.2.
|
|
10
|
+
*/
|
|
11
|
+
export { isTopicMapPath, TOPICMAP_EXTENSIONS, } from "./types.js";
|
|
12
|
+
export { parseTopicMap } from "./parse.js";
|
|
13
|
+
export { serializeTopicMap } from "./serialize.js";
|
|
14
|
+
export { resolveTopicMap } from "./resolve.js";
|
|
15
|
+
export { topicMapToNav } from "./nav.js";
|
|
16
|
+
export { topicMapToNavFile } from "./nav-file.js";
|
|
17
|
+
export { normalizePath, dirname, joinPath, resolveHref, isExternalHref } from "./paths.js";
|
|
18
|
+
export { parsePointer, pointerOf, locate, containerOf, pathOfEntry, hrefTarget, isSelfInclude, findByHref, resolveAddress, flattenTopicMap, addRef, moveRef, removeRef, setProps, } from "./edit.js";
|
|
19
|
+
export { applyMapEdit } from "./edit-source.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,cAAc,EACd,mBAAmB,GAOpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAqB,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EACL,YAAY,EACZ,SAAS,EACT,MAAM,EACN,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,eAAe,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,QAAQ,GAQT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAyC,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { TopicMap } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Nav-file entry shape understood by the site pipeline's explicit nav
|
|
4
|
+
* loader (`format-dogsbay-md`'s `loadNavFile`): `label` + `file` for
|
|
5
|
+
* content-relative paths (gets existence checks and href prefixing) or
|
|
6
|
+
* `href` for external/absolute targets.
|
|
7
|
+
*/
|
|
8
|
+
export interface NavFileEntry {
|
|
9
|
+
label: string;
|
|
10
|
+
file?: string;
|
|
11
|
+
href?: string;
|
|
12
|
+
singlePage?: "yes" | "no" | "children";
|
|
13
|
+
children?: NavFileEntry[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Emit a *resolved* topic map as nav-file JSON entries — the bridge that
|
|
17
|
+
* lets today's `nav:` config option consume topic maps: resolve the map,
|
|
18
|
+
* write the result as nav.json, point `nav:` at it. Relative hrefs become
|
|
19
|
+
* `file:` references (existence-checked and prefixed by the nav loader);
|
|
20
|
+
* external/absolute hrefs pass through as `href`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const topicMapToNavFile: (map: TopicMap) => NavFileEntry[];
|
|
23
|
+
//# sourceMappingURL=nav-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-file.d.ts","sourceRoot":"","sources":["../src/nav-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAG1D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,UAAU,CAAC;IACvC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AA2CD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,QAAQ,KAAG,YAAY,EACwB,CAAC"}
|
package/dist/nav-file.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isExternalHref } from "./paths.js";
|
|
2
|
+
// Any scheme-prefixed URL (https, mailto, tel, …) or root-absolute path is a
|
|
3
|
+
// pass-through href; only relative paths become existence-checked file: refs
|
|
4
|
+
const isExternal = (href) => href.startsWith("/") || isExternalHref(href);
|
|
5
|
+
const labelFromHref = (href) => {
|
|
6
|
+
const base = href.split("/").pop() ?? href;
|
|
7
|
+
const stem = base.replace(/\.[^.]+$/, "");
|
|
8
|
+
const words = stem.replace(/[-_]+/g, " ").trim();
|
|
9
|
+
return words.length > 0 ? words[0].toUpperCase() + words.slice(1) : href;
|
|
10
|
+
};
|
|
11
|
+
const entryToNavFile = (entry) => {
|
|
12
|
+
if (entry.toc === false)
|
|
13
|
+
return null;
|
|
14
|
+
const label = entry.navtitle ?? (entry.href ? labelFromHref(entry.href) : undefined);
|
|
15
|
+
if (label === undefined)
|
|
16
|
+
return null;
|
|
17
|
+
const item = { label };
|
|
18
|
+
if (entry.href !== undefined) {
|
|
19
|
+
if (isExternal(entry.href)) {
|
|
20
|
+
item.href = entry.href;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
item.file = entry.href;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (entry.singlePage !== undefined)
|
|
27
|
+
item.singlePage = entry.singlePage;
|
|
28
|
+
if (entry.topics && entry.topics.length > 0) {
|
|
29
|
+
const children = entry.topics
|
|
30
|
+
.map(entryToNavFile)
|
|
31
|
+
.filter((child) => child !== null);
|
|
32
|
+
if (children.length > 0)
|
|
33
|
+
item.children = children;
|
|
34
|
+
}
|
|
35
|
+
if (item.file === undefined && item.href === undefined && item.children === undefined) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return item;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Emit a *resolved* topic map as nav-file JSON entries — the bridge that
|
|
42
|
+
* lets today's `nav:` config option consume topic maps: resolve the map,
|
|
43
|
+
* write the result as nav.json, point `nav:` at it. Relative hrefs become
|
|
44
|
+
* `file:` references (existence-checked and prefixed by the nav loader);
|
|
45
|
+
* external/absolute hrefs pass through as `href`.
|
|
46
|
+
*/
|
|
47
|
+
export const topicMapToNavFile = (map) => map.topics.map(entryToNavFile).filter((item) => item !== null);
|
|
48
|
+
//# sourceMappingURL=nav-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-file.js","sourceRoot":"","sources":["../src/nav-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgB5C,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,UAAU,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AAE3F,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAoB,EAAuB,EAAE;IACnE,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,IAAI,GAAiB,EAAE,KAAK,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEvE,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM;aAC1B,GAAG,CAAC,cAAc,CAAC;aACnB,MAAM,CAAC,CAAC,KAAK,EAAyB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QAC5D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAa,EAAkB,EAAE,CACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAwB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC"}
|
package/dist/nav.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NavItem } from "@dogsbay/types";
|
|
2
|
+
import type { TopicMap } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emit the navigation tree for a *resolved* topic map (run resolveTopicMap
|
|
5
|
+
* first — `format: topicmap` entries are not expanded here).
|
|
6
|
+
*/
|
|
7
|
+
export declare const topicMapToNav: (map: TopicMap) => NavItem[];
|
|
8
|
+
//# sourceMappingURL=nav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAkC1D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,QAAQ,KAAG,OAAO,EACwB,CAAC"}
|
package/dist/nav.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** "getting-started/quick-install.md" → "Quick install" */
|
|
2
|
+
const labelFromHref = (href) => {
|
|
3
|
+
const base = href.split("/").pop() ?? href;
|
|
4
|
+
const stem = base.replace(/\.[^.]+$/, "");
|
|
5
|
+
const words = stem.replace(/[-_]+/g, " ").trim();
|
|
6
|
+
return words.length > 0 ? words[0].toUpperCase() + words.slice(1) : href;
|
|
7
|
+
};
|
|
8
|
+
const entryToNav = (entry) => {
|
|
9
|
+
// toc: false → addressable but not in navigation
|
|
10
|
+
if (entry.toc === false)
|
|
11
|
+
return null;
|
|
12
|
+
const label = entry.navtitle ?? (entry.href ? labelFromHref(entry.href) : undefined);
|
|
13
|
+
if (label === undefined)
|
|
14
|
+
return null;
|
|
15
|
+
const item = { label };
|
|
16
|
+
if (entry.href !== undefined)
|
|
17
|
+
item.href = entry.href;
|
|
18
|
+
if (entry.singlePage !== undefined)
|
|
19
|
+
item.singlePage = entry.singlePage;
|
|
20
|
+
if (entry.topics && entry.topics.length > 0) {
|
|
21
|
+
const children = entry.topics
|
|
22
|
+
.map(entryToNav)
|
|
23
|
+
.filter((child) => child !== null);
|
|
24
|
+
if (children.length > 0)
|
|
25
|
+
item.children = children;
|
|
26
|
+
}
|
|
27
|
+
// A label-only entry whose children were all excluded carries no navigation value
|
|
28
|
+
if (item.href === undefined && item.children === undefined)
|
|
29
|
+
return null;
|
|
30
|
+
return item;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Emit the navigation tree for a *resolved* topic map (run resolveTopicMap
|
|
34
|
+
* first — `format: topicmap` entries are not expanded here).
|
|
35
|
+
*/
|
|
36
|
+
export const topicMapToNav = (map) => map.topics.map(entryToNav).filter((item) => item !== null);
|
|
37
|
+
//# sourceMappingURL=nav.js.map
|
package/dist/nav.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav.js","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAGA,2DAA2D;AAC3D,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAkB,EAAE;IAC1D,iDAAiD;IACjD,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,IAAI,GAAY,EAAE,KAAK,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACrD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEvE,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM;aAC1B,GAAG,CAAC,UAAU,CAAC;aACf,MAAM,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACvD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpD,CAAC;IAED,kFAAkF;IAClF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAExE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAa,EAAa,EAAE,CACxD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAmB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TopicMap, TopicMapError } from "./types.js";
|
|
2
|
+
interface ParseResult {
|
|
3
|
+
map: TopicMap | null;
|
|
4
|
+
errors: TopicMapError[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Parse a topic map YAML source. Never throws — problems are collected as
|
|
8
|
+
* structured errors so builds can report all of them at once.
|
|
9
|
+
*/
|
|
10
|
+
export declare const parseTopicMap: (source: string, mapPath?: string) => ParseResult;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzE,UAAU,WAAW;IACnB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAgHD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,gBAAY,KAAG,WA0C5D,CAAC"}
|