okf-core 0.0.0-bootstrap → 1.0.0-rc.2

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.
Files changed (63) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +40 -4
  3. package/dist/analyze.d.ts +6 -0
  4. package/dist/analyze.d.ts.map +1 -0
  5. package/dist/analyze.js +225 -0
  6. package/dist/analyze.js.map +1 -0
  7. package/dist/changes.d.ts +6 -0
  8. package/dist/changes.d.ts.map +1 -0
  9. package/dist/changes.js +81 -0
  10. package/dist/changes.js.map +1 -0
  11. package/dist/conformance.d.ts +5 -0
  12. package/dist/conformance.d.ts.map +1 -0
  13. package/dist/conformance.js +103 -0
  14. package/dist/conformance.js.map +1 -0
  15. package/dist/derive.d.ts +14 -0
  16. package/dist/derive.d.ts.map +1 -0
  17. package/dist/derive.js +356 -0
  18. package/dist/derive.js.map +1 -0
  19. package/dist/diagnostics.d.ts +4 -0
  20. package/dist/diagnostics.d.ts.map +1 -0
  21. package/dist/diagnostics.js +19 -0
  22. package/dist/diagnostics.js.map +1 -0
  23. package/dist/diff.d.ts +2 -0
  24. package/dist/diff.d.ts.map +1 -0
  25. package/dist/diff.js +76 -0
  26. package/dist/diff.js.map +1 -0
  27. package/dist/frontmatter.d.ts +12 -0
  28. package/dist/frontmatter.d.ts.map +1 -0
  29. package/dist/frontmatter.js +110 -0
  30. package/dist/frontmatter.js.map +1 -0
  31. package/dist/graph.d.ts +3 -0
  32. package/dist/graph.d.ts.map +1 -0
  33. package/dist/graph.js +42 -0
  34. package/dist/graph.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +10 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/links.d.ts +10 -0
  40. package/dist/links.d.ts.map +1 -0
  41. package/dist/links.js +104 -0
  42. package/dist/links.js.map +1 -0
  43. package/dist/listing.d.ts +15 -0
  44. package/dist/listing.d.ts.map +1 -0
  45. package/dist/listing.js +38 -0
  46. package/dist/listing.js.map +1 -0
  47. package/dist/markdown.d.ts +18 -0
  48. package/dist/markdown.d.ts.map +1 -0
  49. package/dist/markdown.js +22 -0
  50. package/dist/markdown.js.map +1 -0
  51. package/dist/paths.d.ts +35 -0
  52. package/dist/paths.d.ts.map +1 -0
  53. package/dist/paths.js +103 -0
  54. package/dist/paths.js.map +1 -0
  55. package/dist/search.d.ts +5 -0
  56. package/dist/search.d.ts.map +1 -0
  57. package/dist/search.js +122 -0
  58. package/dist/search.js.map +1 -0
  59. package/dist/types.d.ts +54 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +31 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FrontmatterSnapshot } from "okf-contracts";
2
+ export interface FrontmatterParseResult {
3
+ readonly snapshot: FrontmatterSnapshot | null;
4
+ readonly body: string;
5
+ readonly bodyStartLine: number;
6
+ readonly error: string | null;
7
+ readonly errorKind: "yaml" | "json" | null;
8
+ readonly hadFrontmatter: boolean;
9
+ }
10
+ /** Parse YAML 1.2 while retaining exact source bytes for lossless round-tripping. */
11
+ export declare function parseFrontmatter(content: string): FrontmatterParseResult;
12
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAyB,MAAM,eAAe,CAAC;AAIhF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AA0CD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAyExE"}
@@ -0,0 +1,110 @@
1
+ import { parseDocument } from "yaml";
2
+ const FRONTMATTER = /^\uFEFF?---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/;
3
+ function plainMapping(value) {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
+ }
6
+ function jsonSafe(value, ancestors = new Set()) {
7
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
8
+ return value;
9
+ }
10
+ if (typeof value === "number") {
11
+ if (!Number.isFinite(value)) {
12
+ throw new Error("frontmatter numbers must be finite");
13
+ }
14
+ return value;
15
+ }
16
+ if (typeof value !== "object") {
17
+ throw new Error(`frontmatter value is not JSON-safe: ${typeof value}`);
18
+ }
19
+ if (ancestors.has(value)) {
20
+ throw new Error("frontmatter contains a cyclic YAML alias");
21
+ }
22
+ ancestors.add(value);
23
+ try {
24
+ if (Array.isArray(value)) {
25
+ return value.map((entry) => jsonSafe(entry, ancestors));
26
+ }
27
+ const prototype = Object.getPrototypeOf(value);
28
+ if (prototype !== Object.prototype && prototype !== null) {
29
+ throw new Error("frontmatter contains a non-JSON YAML value");
30
+ }
31
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, jsonSafe(entry, ancestors)]));
32
+ }
33
+ finally {
34
+ ancestors.delete(value);
35
+ }
36
+ }
37
+ /** Parse YAML 1.2 while retaining exact source bytes for lossless round-tripping. */
38
+ export function parseFrontmatter(content) {
39
+ const match = FRONTMATTER.exec(content);
40
+ if (!match) {
41
+ return {
42
+ snapshot: null,
43
+ body: content,
44
+ bodyStartLine: 1,
45
+ error: null,
46
+ errorKind: null,
47
+ hadFrontmatter: false,
48
+ };
49
+ }
50
+ const raw = match[0];
51
+ const yaml = match[1] ?? "";
52
+ const parsed = parseDocument(yaml, { keepSourceTokens: true, prettyErrors: false });
53
+ if (parsed.errors.length > 0) {
54
+ return {
55
+ snapshot: null,
56
+ body: content.slice(raw.length),
57
+ bodyStartLine: 1 + (raw.match(/\n/g)?.length ?? 0),
58
+ error: parsed.errors.map((error) => error.message).join("; "),
59
+ errorKind: "yaml",
60
+ hadFrontmatter: true,
61
+ };
62
+ }
63
+ let value;
64
+ try {
65
+ value = parsed.toJS({ maxAliasCount: 100 });
66
+ }
67
+ catch (error) {
68
+ return {
69
+ snapshot: null,
70
+ body: content.slice(raw.length),
71
+ bodyStartLine: 1 + (raw.match(/\n/g)?.length ?? 0),
72
+ error: error instanceof Error ? error.message : "YAML conversion failed",
73
+ errorKind: "yaml",
74
+ hadFrontmatter: true,
75
+ };
76
+ }
77
+ if (!plainMapping(value)) {
78
+ return {
79
+ snapshot: null,
80
+ body: content.slice(raw.length),
81
+ bodyStartLine: 1 + (raw.match(/\n/g)?.length ?? 0),
82
+ error: "frontmatter must be a YAML mapping",
83
+ errorKind: "yaml",
84
+ hadFrontmatter: true,
85
+ };
86
+ }
87
+ let metadata;
88
+ try {
89
+ metadata = jsonSafe(value);
90
+ }
91
+ catch (error) {
92
+ return {
93
+ snapshot: null,
94
+ body: content.slice(raw.length),
95
+ bodyStartLine: 1 + (raw.match(/\n/g)?.length ?? 0),
96
+ error: error instanceof Error ? error.message : "frontmatter is not JSON-safe",
97
+ errorKind: "json",
98
+ hadFrontmatter: true,
99
+ };
100
+ }
101
+ return {
102
+ snapshot: { raw, yaml, metadata },
103
+ body: content.slice(raw.length),
104
+ bodyStartLine: 1 + (raw.match(/\n/g)?.length ?? 0),
105
+ error: null,
106
+ errorKind: null,
107
+ hadFrontmatter: true,
108
+ };
109
+ }
110
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAIrC,MAAM,WAAW,GAAG,2DAA2D,CAAC;AAWhF,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAID,SAAS,QAAQ,CAAC,KAAc,EAAE,SAAS,GAAG,IAAI,GAAG,EAAU;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAC/E,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO;YACb,aAAa,EAAE,CAAC;YAChB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAClD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAClD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;YACxE,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAClD,KAAK,EAAE,oCAAoC;YAC3C,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,QAAoB,CAAC;IACzB,IAAI,CAAC;QACH,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAClD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B;YAC9E,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;QACjC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAC/B,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAClD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AnalyzedDocument, BundleGraph } from "okf-contracts";
2
+ export declare function buildGraph(documents: readonly AnalyzedDocument[]): BundleGraph;
3
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EAGZ,MAAM,eAAe,CAAC;AAIvB,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,GAAG,WAAW,CA4C9E"}
package/dist/graph.js ADDED
@@ -0,0 +1,42 @@
1
+ import { byCodePoint } from "./paths.js";
2
+ export function buildGraph(documents) {
3
+ const concepts = documents
4
+ .filter((document) => document.kind === "concept")
5
+ .sort((left, right) => byCodePoint(left.path, right.path));
6
+ const known = new Set(concepts.map((document) => document.path));
7
+ const nodes = concepts.map((document) => ({
8
+ id: document.path,
9
+ path: document.path,
10
+ title: document.derived.title,
11
+ type: document.derived.type ?? "Concept",
12
+ description: document.derived.description,
13
+ status: document.derived.status,
14
+ trustTier: document.derived.trustTier,
15
+ stale: document.derived.stale,
16
+ tags: document.derived.tags,
17
+ }));
18
+ const relations = new Map();
19
+ for (const document of concepts) {
20
+ for (const link of document.links) {
21
+ if (link.kind !== "internal" || link.resolvedPath === null || !known.has(link.resolvedPath)) {
22
+ continue;
23
+ }
24
+ const key = `${document.path}\u0000${link.resolvedPath}\u0000link`;
25
+ relations.set(key, { source: document.path, target: link.resolvedPath, relation: "link" });
26
+ }
27
+ for (const source of document.derived.sources) {
28
+ if (source.resolvedPath === null || !known.has(source.resolvedPath)) {
29
+ continue;
30
+ }
31
+ const key = `${document.path}\u0000${source.resolvedPath}\u0000source`;
32
+ relations.set(key, { source: document.path, target: source.resolvedPath, relation: "source" });
33
+ }
34
+ }
35
+ const edges = [...relations.values()]
36
+ .sort((left, right) => byCodePoint(left.source, right.source) ||
37
+ byCodePoint(left.target, right.target) ||
38
+ byCodePoint(left.relation, right.relation))
39
+ .map((edge, index) => ({ id: `e${index}`, ...edge }));
40
+ return { nodes, edges };
41
+ }
42
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { analyzeBundle, parseBundleDocument } from "./analyze.js";
2
+ export { canonicalChangeJson, parseChange } from "./changes.js";
3
+ export { documentExtensions } from "./derive.js";
4
+ export { buildGraph } from "./graph.js";
5
+ export { extractMarkdownLinks } from "./links.js";
6
+ export type { ExtractLinksOptions } from "./links.js";
7
+ export { listBundleEntries } from "./listing.js";
8
+ export type { BundleListingEntry, BundleListingEntryType } from "./listing.js";
9
+ export { byCodePoint, canonicalizeBundlePath, canonicalizeOperationPath, InvalidBundlePathError, resolveWithinBundle, validateBundlePath, } from "./paths.js";
10
+ export type { PathResolution } from "./paths.js";
11
+ export { queryTerms, searchBundle } from "./search.js";
12
+ export { unifiedDiff } from "./diff.js";
13
+ export type { AnalyzeBundleOptions, ParsedDocumentResult, ParseDocumentOptions, ProfileDiagnostic, SearchPassage, SearchResult, ValidationProfile, ValidationProfileContext, } from "./types.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { analyzeBundle, parseBundleDocument } from "./analyze.js";
2
+ export { canonicalChangeJson, parseChange } from "./changes.js";
3
+ export { documentExtensions } from "./derive.js";
4
+ export { buildGraph } from "./graph.js";
5
+ export { extractMarkdownLinks } from "./links.js";
6
+ export { listBundleEntries } from "./listing.js";
7
+ export { byCodePoint, canonicalizeBundlePath, canonicalizeOperationPath, InvalidBundlePathError, resolveWithinBundle, validateBundlePath, } from "./paths.js";
8
+ export { queryTerms, searchBundle } from "./search.js";
9
+ export { unifiedDiff } from "./diff.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AnalyzedLink } from "okf-contracts";
2
+ export interface ExtractLinksOptions {
3
+ readonly sourcePath: string;
4
+ readonly knownPaths?: ReadonlySet<string>;
5
+ readonly lineOffset?: number;
6
+ readonly offsetOffset?: number;
7
+ }
8
+ /** Extract CommonMark links, including reference links, from the Markdown AST. */
9
+ export declare function extractMarkdownLinks(markdown: string, options: ExtractLinksOptions): readonly AnalyzedLink[];
10
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,eAAe,CAAC;AAoB/D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AA2CD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,SAAS,YAAY,EAAE,CAgEzB"}
package/dist/links.js ADDED
@@ -0,0 +1,104 @@
1
+ import { fromMarkdown } from "mdast-util-from-markdown";
2
+ import { resolveWithinBundle } from "./paths.js";
3
+ function normalizeIdentifier(value) {
4
+ return value.trim().replace(/\s+/g, " ").toLowerCase();
5
+ }
6
+ function textOf(node) {
7
+ if (node.type === "text" || node.type === "inlineCode") {
8
+ return node.value ?? "";
9
+ }
10
+ if (node.type === "image") {
11
+ return node.alt ?? "";
12
+ }
13
+ return (node.children ?? []).map(textOf).join("");
14
+ }
15
+ function rangeOf(node, lineOffset, offsetOffset) {
16
+ const start = node.position?.start;
17
+ const end = node.position?.end;
18
+ if (start?.line === undefined ||
19
+ start.column === undefined ||
20
+ start.offset === undefined ||
21
+ end?.line === undefined ||
22
+ end.column === undefined ||
23
+ end.offset === undefined) {
24
+ return null;
25
+ }
26
+ return {
27
+ start: {
28
+ line: start.line + lineOffset,
29
+ column: start.column,
30
+ offset: start.offset + offsetOffset,
31
+ },
32
+ end: {
33
+ line: end.line + lineOffset,
34
+ column: end.column,
35
+ offset: end.offset + offsetOffset,
36
+ },
37
+ };
38
+ }
39
+ /** Extract CommonMark links, including reference links, from the Markdown AST. */
40
+ export function extractMarkdownLinks(markdown, options) {
41
+ const root = fromMarkdown(markdown);
42
+ const definitions = new Map();
43
+ const collectDefinitions = (node) => {
44
+ if (node.type === "definition" && node.identifier && typeof node.url === "string") {
45
+ definitions.set(normalizeIdentifier(node.identifier), node.url);
46
+ }
47
+ for (const child of node.children ?? []) {
48
+ collectDefinitions(child);
49
+ }
50
+ };
51
+ collectDefinitions(root);
52
+ const result = [];
53
+ const visit = (node) => {
54
+ let href = null;
55
+ if (node.type === "link" && typeof node.url === "string") {
56
+ href = node.url;
57
+ }
58
+ else if (node.type === "linkReference" && node.identifier) {
59
+ href = definitions.get(normalizeIdentifier(node.identifier)) ?? null;
60
+ }
61
+ if (href !== null) {
62
+ const resolution = resolveWithinBundle(options.sourcePath, href);
63
+ const base = {
64
+ href,
65
+ text: textOf(node),
66
+ range: rangeOf(node, options.lineOffset ?? 0, options.offsetOffset ?? 0),
67
+ };
68
+ if (resolution.kind === "internal") {
69
+ result.push({
70
+ ...base,
71
+ kind: "internal",
72
+ resolvedPath: resolution.path,
73
+ fragment: resolution.fragment,
74
+ exists: options.knownPaths?.has(resolution.path) ?? null,
75
+ });
76
+ }
77
+ else if (resolution.kind === "fragment") {
78
+ result.push({
79
+ ...base,
80
+ kind: "fragment",
81
+ resolvedPath: options.sourcePath,
82
+ fragment: resolution.fragment,
83
+ exists: true,
84
+ });
85
+ }
86
+ else {
87
+ result.push({
88
+ ...base,
89
+ kind: resolution.kind,
90
+ resolvedPath: null,
91
+ fragment: null,
92
+ exists: null,
93
+ });
94
+ }
95
+ return;
96
+ }
97
+ for (const child of node.children ?? []) {
98
+ visit(child);
99
+ }
100
+ };
101
+ visit(root);
102
+ return result;
103
+ }
104
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAyBjD,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,MAAM,CAAC,IAAe;IAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,IAAe,EAAE,UAAkB,EAAE,YAAoB;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;IAC/B,IACE,KAAK,EAAE,IAAI,KAAK,SAAS;QACzB,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,GAAG,EAAE,IAAI,KAAK,SAAS;QACvB,GAAG,CAAC,MAAM,KAAK,SAAS;QACxB,GAAG,CAAC,MAAM,KAAK,SAAS,EACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,YAAY;SACpC;QACD,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,UAAU;YAC3B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,YAAY;SAClC;KACF,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,OAA4B;IAE5B,MAAM,IAAI,GAAc,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,MAAM,kBAAkB,GAAG,CAAC,IAAe,EAAQ,EAAE;QACnD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAClF,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACxC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IACF,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,IAAe,EAAQ,EAAE;QACtC,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACzD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5D,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC;QACvE,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG;gBACX,IAAI;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;aACzE,CAAC;YACF,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,IAAI;oBACP,IAAI,EAAE,UAAU;oBAChB,YAAY,EAAE,UAAU,CAAC,IAAI;oBAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI;iBACzD,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,IAAI;oBACP,IAAI,EAAE,UAAU;oBAChB,YAAY,EAAE,OAAO,CAAC,UAAU;oBAChC,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,IAAI;oBACP,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type BundleListingEntryType = "directory" | "markdown";
2
+ export interface BundleListingEntry {
3
+ readonly path: string;
4
+ readonly type: BundleListingEntryType;
5
+ }
6
+ /**
7
+ * Fold a bundle's document paths into the entries one `list` call returns.
8
+ *
9
+ * Every adapter answers `list` from the paths it already knows, so the depth and prefix
10
+ * policy lives here rather than in each adapter: R2 and the filesystem must not disagree
11
+ * about what `depth: 2` means. `requested` is `.` for the bundle root, otherwise a confined
12
+ * bundle-relative directory path.
13
+ */
14
+ export declare function listBundleEntries(documentPaths: readonly string[], requested: string, depth: number): BundleListingEntry[];
15
+ //# sourceMappingURL=listing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listing.d.ts","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,kBAAkB,EAAE,CAwBtB"}
@@ -0,0 +1,38 @@
1
+ import { byCodePoint, InvalidBundlePathError, validateBundlePath } from "./paths.js";
2
+ /**
3
+ * Fold a bundle's document paths into the entries one `list` call returns.
4
+ *
5
+ * Every adapter answers `list` from the paths it already knows, so the depth and prefix
6
+ * policy lives here rather than in each adapter: R2 and the filesystem must not disagree
7
+ * about what `depth: 2` means. `requested` is `.` for the bundle root, otherwise a confined
8
+ * bundle-relative directory path.
9
+ */
10
+ export function listBundleEntries(documentPaths, requested, depth) {
11
+ let confined = "";
12
+ if (requested !== ".") {
13
+ try {
14
+ confined = validateBundlePath(requested);
15
+ }
16
+ catch {
17
+ throw new InvalidBundlePathError(`list path is not confined: ${requested}`);
18
+ }
19
+ }
20
+ const prefix = confined ? `${confined}/` : "";
21
+ const entries = new Map();
22
+ for (const documentPath of documentPaths) {
23
+ if (!documentPath.startsWith(prefix))
24
+ continue;
25
+ const relative = documentPath.slice(prefix.length);
26
+ const parts = relative.split("/");
27
+ if (parts.length - 1 <= depth)
28
+ entries.set(documentPath, "markdown");
29
+ const directories = parts.slice(0, -1);
30
+ for (let index = 0; index < Math.min(directories.length, depth); index += 1) {
31
+ entries.set(`${prefix}${directories.slice(0, index + 1).join("/")}`, "directory");
32
+ }
33
+ }
34
+ return [...entries]
35
+ .map(([path, type]) => ({ path, type }))
36
+ .sort((left, right) => byCodePoint(left.path, right.path));
37
+ }
38
+ //# sourceMappingURL=listing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listing.js","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AASrF;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,aAAgC,EAChC,SAAiB,EACjB,KAAa;IAEb,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,sBAAsB,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface MarkdownHeading {
2
+ readonly depth: number;
3
+ readonly text: string;
4
+ }
5
+ export type MarkdownBlock = {
6
+ readonly type: "heading";
7
+ readonly depth: number;
8
+ readonly text: string;
9
+ } | {
10
+ readonly type: "list";
11
+ } | {
12
+ readonly type: "other";
13
+ };
14
+ /** Return actual top-level CommonMark blocks, excluding syntax nested in code. */
15
+ export declare function markdownBlocks(markdown: string): readonly MarkdownBlock[];
16
+ /** Return actual CommonMark heading blocks, excluding fenced and indented code. */
17
+ export declare function markdownHeadings(markdown: string): readonly MarkdownHeading[];
18
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAS/B,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAQzE;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,CAE7E"}
@@ -0,0 +1,22 @@
1
+ import { fromMarkdown } from "mdast-util-from-markdown";
2
+ function nodeText(node) {
3
+ if (node.type === "text" || node.type === "inlineCode") {
4
+ return node.value ?? "";
5
+ }
6
+ return (node.children ?? []).map(nodeText).join("");
7
+ }
8
+ /** Return actual top-level CommonMark blocks, excluding syntax nested in code. */
9
+ export function markdownBlocks(markdown) {
10
+ const root = fromMarkdown(markdown);
11
+ return (root.children ?? []).map((node) => {
12
+ if (node.type === "heading" && typeof node.depth === "number") {
13
+ return { type: "heading", depth: node.depth, text: nodeText(node) };
14
+ }
15
+ return node.type === "list" ? { type: "list" } : { type: "other" };
16
+ });
17
+ }
18
+ /** Return actual CommonMark heading blocks, excluding fenced and indented code. */
19
+ export function markdownHeadings(markdown) {
20
+ return markdownBlocks(markdown).flatMap((block) => block.type === "heading" ? [block] : []);
21
+ }
22
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAmBxD,SAAS,QAAQ,CAAC,IAAe;IAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAc,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAiB,EAAE;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,35 @@
1
+ export declare class InvalidBundlePathError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export type PathResolution = {
5
+ readonly kind: "fragment";
6
+ readonly fragment: string;
7
+ } | {
8
+ readonly kind: "external";
9
+ } | {
10
+ readonly kind: "escape";
11
+ } | {
12
+ readonly kind: "invalid";
13
+ } | {
14
+ readonly kind: "internal";
15
+ readonly path: string;
16
+ readonly fragment: string | null;
17
+ };
18
+ /** Code-point ordering is stable across runtimes and locales. */
19
+ export declare function byCodePoint(left: string, right: string): number;
20
+ /**
21
+ * Validate one confined Bundle-relative path and return its exact authored bytes.
22
+ *
23
+ * Unicode and whitespace are storage-key data, so this function never trims or
24
+ * normalizes them. Storage adapters decide separately whether a particular
25
+ * operation requires a `.md` suffix.
26
+ */
27
+ export declare function validateBundlePath(value: string): string;
28
+ /** Alias that emphasizes that the validated storage key is the canonical value. */
29
+ export declare function canonicalizeBundlePath(value: string): string;
30
+ /** Validate a change target, preserving its exact key and requiring the OKF suffix. */
31
+ export declare function canonicalizeOperationPath(value: string): string;
32
+ export declare function isSafeMarkdownPath(path: string): boolean;
33
+ /** Resolve an authored Markdown destination without ever addressing outside one bundle. */
34
+ export declare function resolveWithinBundle(source: string, href: string): PathResolution;
35
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3F,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAexD;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,uFAAuF;AACvF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CA8ChF"}
package/dist/paths.js ADDED
@@ -0,0 +1,103 @@
1
+ const SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*:/;
2
+ const WINDOWS_ABSOLUTE = /^[A-Za-z]:\//;
3
+ export class InvalidBundlePathError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "InvalidBundlePathError";
7
+ }
8
+ }
9
+ /** Code-point ordering is stable across runtimes and locales. */
10
+ export function byCodePoint(left, right) {
11
+ return left < right ? -1 : left > right ? 1 : 0;
12
+ }
13
+ /**
14
+ * Validate one confined Bundle-relative path and return its exact authored bytes.
15
+ *
16
+ * Unicode and whitespace are storage-key data, so this function never trims or
17
+ * normalizes them. Storage adapters decide separately whether a particular
18
+ * operation requires a `.md` suffix.
19
+ */
20
+ export function validateBundlePath(value) {
21
+ if (typeof value !== "string" || value.length === 0) {
22
+ throw new InvalidBundlePathError("bundle path must not be empty");
23
+ }
24
+ if (value.includes("\0") || value.includes("\\")) {
25
+ throw new InvalidBundlePathError(`unsafe bundle path: ${value}`);
26
+ }
27
+ if (value.startsWith("/") || WINDOWS_ABSOLUTE.test(value)) {
28
+ throw new InvalidBundlePathError(`bundle path must be relative: ${value}`);
29
+ }
30
+ const segments = value.split("/");
31
+ if (segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
32
+ throw new InvalidBundlePathError(`unsafe bundle path: ${value}`);
33
+ }
34
+ return value;
35
+ }
36
+ /** Alias that emphasizes that the validated storage key is the canonical value. */
37
+ export function canonicalizeBundlePath(value) {
38
+ return validateBundlePath(value);
39
+ }
40
+ /** Validate a change target, preserving its exact key and requiring the OKF suffix. */
41
+ export function canonicalizeOperationPath(value) {
42
+ const path = validateBundlePath(value);
43
+ if (!path.endsWith(".md")) {
44
+ throw new InvalidBundlePathError(`OKF operation path must end in .md: ${path}`);
45
+ }
46
+ return path;
47
+ }
48
+ export function isSafeMarkdownPath(path) {
49
+ try {
50
+ return canonicalizeOperationPath(path) === path;
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ /** Resolve an authored Markdown destination without ever addressing outside one bundle. */
57
+ export function resolveWithinBundle(source, href) {
58
+ let value = href.trim();
59
+ if (!value) {
60
+ return { kind: "invalid" };
61
+ }
62
+ try {
63
+ value = decodeURIComponent(value);
64
+ }
65
+ catch {
66
+ return { kind: "invalid" };
67
+ }
68
+ if (value.startsWith("#")) {
69
+ return { kind: "fragment", fragment: value.slice(1) };
70
+ }
71
+ if (SCHEME.test(value) || value.startsWith("//")) {
72
+ return { kind: "external" };
73
+ }
74
+ const hash = value.indexOf("#");
75
+ const query = value.indexOf("?");
76
+ const end = [hash, query].filter((index) => index >= 0).reduce((a, b) => Math.min(a, b), value.length);
77
+ const clean = value.slice(0, end);
78
+ const fragment = hash >= 0 ? value.slice(hash + 1) : null;
79
+ if (!clean) {
80
+ return fragment === null ? { kind: "invalid" } : { kind: "fragment", fragment };
81
+ }
82
+ const base = clean.startsWith("/") ? [] : source.split("/").slice(0, -1);
83
+ const resolved = [];
84
+ for (const segment of [...base, ...clean.replace(/^\/+/, "").split("/")]) {
85
+ if (!segment || segment === ".") {
86
+ continue;
87
+ }
88
+ if (segment === "..") {
89
+ if (resolved.length === 0) {
90
+ return { kind: "escape" };
91
+ }
92
+ resolved.pop();
93
+ continue;
94
+ }
95
+ if (segment.includes("\\")) {
96
+ return { kind: "invalid" };
97
+ }
98
+ resolved.push(segment);
99
+ }
100
+ const path = resolved.join("/");
101
+ return path ? { kind: "internal", path, fragment } : { kind: "invalid" };
102
+ }
103
+ //# sourceMappingURL=paths.js.map