@avalanche-io/c4-node 1.0.10

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 (125) hide show
  1. package/dist/packages/core/src/base58.d.ts +5 -0
  2. package/dist/packages/core/src/base58.d.ts.map +1 -0
  3. package/dist/packages/core/src/base58.js +42 -0
  4. package/dist/packages/core/src/base58.js.map +1 -0
  5. package/dist/packages/core/src/browser/filesystem.d.ts +34 -0
  6. package/dist/packages/core/src/browser/filesystem.d.ts.map +1 -0
  7. package/dist/packages/core/src/browser/filesystem.js +169 -0
  8. package/dist/packages/core/src/browser/filesystem.js.map +1 -0
  9. package/dist/packages/core/src/browser/index.d.ts +4 -0
  10. package/dist/packages/core/src/browser/index.d.ts.map +1 -0
  11. package/dist/packages/core/src/browser/index.js +6 -0
  12. package/dist/packages/core/src/browser/index.js.map +1 -0
  13. package/dist/packages/core/src/browser/store.d.ts +28 -0
  14. package/dist/packages/core/src/browser/store.d.ts.map +1 -0
  15. package/dist/packages/core/src/browser/store.js +142 -0
  16. package/dist/packages/core/src/browser/store.js.map +1 -0
  17. package/dist/packages/core/src/browser/worker.d.ts +34 -0
  18. package/dist/packages/core/src/browser/worker.d.ts.map +1 -0
  19. package/dist/packages/core/src/browser/worker.js +96 -0
  20. package/dist/packages/core/src/browser/worker.js.map +1 -0
  21. package/dist/packages/core/src/decoder.d.ts +23 -0
  22. package/dist/packages/core/src/decoder.d.ts.map +1 -0
  23. package/dist/packages/core/src/decoder.js +431 -0
  24. package/dist/packages/core/src/decoder.js.map +1 -0
  25. package/dist/packages/core/src/diff.d.ts +48 -0
  26. package/dist/packages/core/src/diff.d.ts.map +1 -0
  27. package/dist/packages/core/src/diff.js +169 -0
  28. package/dist/packages/core/src/diff.js.map +1 -0
  29. package/dist/packages/core/src/encoder.d.ts +13 -0
  30. package/dist/packages/core/src/encoder.d.ts.map +1 -0
  31. package/dist/packages/core/src/encoder.js +125 -0
  32. package/dist/packages/core/src/encoder.js.map +1 -0
  33. package/dist/packages/core/src/entry.d.ts +59 -0
  34. package/dist/packages/core/src/entry.d.ts.map +1 -0
  35. package/dist/packages/core/src/entry.js +266 -0
  36. package/dist/packages/core/src/entry.js.map +1 -0
  37. package/dist/packages/core/src/errors.d.ts +29 -0
  38. package/dist/packages/core/src/errors.d.ts.map +1 -0
  39. package/dist/packages/core/src/errors.js +56 -0
  40. package/dist/packages/core/src/errors.js.map +1 -0
  41. package/dist/packages/core/src/filesystem.d.ts +68 -0
  42. package/dist/packages/core/src/filesystem.d.ts.map +1 -0
  43. package/dist/packages/core/src/filesystem.js +62 -0
  44. package/dist/packages/core/src/filesystem.js.map +1 -0
  45. package/dist/packages/core/src/id.d.ts +33 -0
  46. package/dist/packages/core/src/id.d.ts.map +1 -0
  47. package/dist/packages/core/src/id.js +126 -0
  48. package/dist/packages/core/src/id.js.map +1 -0
  49. package/dist/packages/core/src/identify-content.d.ts +17 -0
  50. package/dist/packages/core/src/identify-content.d.ts.map +1 -0
  51. package/dist/packages/core/src/identify-content.js +70 -0
  52. package/dist/packages/core/src/identify-content.js.map +1 -0
  53. package/dist/packages/core/src/index.d.ts +23 -0
  54. package/dist/packages/core/src/index.d.ts.map +1 -0
  55. package/dist/packages/core/src/index.js +41 -0
  56. package/dist/packages/core/src/index.js.map +1 -0
  57. package/dist/packages/core/src/manifest.d.ts +68 -0
  58. package/dist/packages/core/src/manifest.d.ts.map +1 -0
  59. package/dist/packages/core/src/manifest.js +463 -0
  60. package/dist/packages/core/src/manifest.js.map +1 -0
  61. package/dist/packages/core/src/memory-fs.d.ts +33 -0
  62. package/dist/packages/core/src/memory-fs.d.ts.map +1 -0
  63. package/dist/packages/core/src/memory-fs.js +187 -0
  64. package/dist/packages/core/src/memory-fs.js.map +1 -0
  65. package/dist/packages/core/src/memory-store.d.ts +21 -0
  66. package/dist/packages/core/src/memory-store.d.ts.map +1 -0
  67. package/dist/packages/core/src/memory-store.js +57 -0
  68. package/dist/packages/core/src/memory-store.js.map +1 -0
  69. package/dist/packages/core/src/naturalsort.d.ts +2 -0
  70. package/dist/packages/core/src/naturalsort.d.ts.map +1 -0
  71. package/dist/packages/core/src/naturalsort.js +88 -0
  72. package/dist/packages/core/src/naturalsort.js.map +1 -0
  73. package/dist/packages/core/src/observable.d.ts +54 -0
  74. package/dist/packages/core/src/observable.d.ts.map +1 -0
  75. package/dist/packages/core/src/observable.js +150 -0
  76. package/dist/packages/core/src/observable.js.map +1 -0
  77. package/dist/packages/core/src/pool.d.ts +38 -0
  78. package/dist/packages/core/src/pool.d.ts.map +1 -0
  79. package/dist/packages/core/src/pool.js +113 -0
  80. package/dist/packages/core/src/pool.js.map +1 -0
  81. package/dist/packages/core/src/reconcile.d.ts +43 -0
  82. package/dist/packages/core/src/reconcile.d.ts.map +1 -0
  83. package/dist/packages/core/src/reconcile.js +172 -0
  84. package/dist/packages/core/src/reconcile.js.map +1 -0
  85. package/dist/packages/core/src/resolver.d.ts +67 -0
  86. package/dist/packages/core/src/resolver.d.ts.map +1 -0
  87. package/dist/packages/core/src/resolver.js +110 -0
  88. package/dist/packages/core/src/resolver.js.map +1 -0
  89. package/dist/packages/core/src/safename.d.ts +7 -0
  90. package/dist/packages/core/src/safename.d.ts.map +1 -0
  91. package/dist/packages/core/src/safename.js +354 -0
  92. package/dist/packages/core/src/safename.js.map +1 -0
  93. package/dist/packages/core/src/scanner.d.ts +25 -0
  94. package/dist/packages/core/src/scanner.d.ts.map +1 -0
  95. package/dist/packages/core/src/scanner.js +97 -0
  96. package/dist/packages/core/src/scanner.js.map +1 -0
  97. package/dist/packages/core/src/store.d.ts +39 -0
  98. package/dist/packages/core/src/store.d.ts.map +1 -0
  99. package/dist/packages/core/src/store.js +53 -0
  100. package/dist/packages/core/src/store.js.map +1 -0
  101. package/dist/packages/core/src/tree.d.ts +16 -0
  102. package/dist/packages/core/src/tree.d.ts.map +1 -0
  103. package/dist/packages/core/src/tree.js +45 -0
  104. package/dist/packages/core/src/tree.js.map +1 -0
  105. package/dist/packages/core/src/verify.d.ts +29 -0
  106. package/dist/packages/core/src/verify.d.ts.map +1 -0
  107. package/dist/packages/core/src/verify.js +85 -0
  108. package/dist/packages/core/src/verify.js.map +1 -0
  109. package/dist/packages/core/src/workspace.d.ts +72 -0
  110. package/dist/packages/core/src/workspace.d.ts.map +1 -0
  111. package/dist/packages/core/src/workspace.js +135 -0
  112. package/dist/packages/core/src/workspace.js.map +1 -0
  113. package/dist/packages/node/src/index.d.ts +4 -0
  114. package/dist/packages/node/src/index.d.ts.map +1 -0
  115. package/dist/packages/node/src/index.js +6 -0
  116. package/dist/packages/node/src/index.js.map +1 -0
  117. package/dist/packages/node/src/node-fs.d.ts +24 -0
  118. package/dist/packages/node/src/node-fs.d.ts.map +1 -0
  119. package/dist/packages/node/src/node-fs.js +84 -0
  120. package/dist/packages/node/src/node-fs.js.map +1 -0
  121. package/dist/packages/node/src/tree-store.d.ts +22 -0
  122. package/dist/packages/node/src/tree-store.d.ts.map +1 -0
  123. package/dist/packages/node/src/tree-store.js +77 -0
  124. package/dist/packages/node/src/tree-store.js.map +1 -0
  125. package/package.json +44 -0
@@ -0,0 +1,169 @@
1
+ import { canonicalEntry } from './entry.js';
2
+ import { Manifest } from './manifest.js';
3
+ /** Compute the diff between two manifests. */
4
+ export function diff(oldManifest, newManifest) {
5
+ const result = { added: [], removed: [], modified: [] };
6
+ // Build path maps
7
+ const oldPaths = new Map();
8
+ for (const [path, entry] of oldManifest) {
9
+ oldPaths.set(path, entry);
10
+ }
11
+ const newPaths = new Map();
12
+ for (const [path, entry] of newManifest) {
13
+ newPaths.set(path, entry);
14
+ }
15
+ // Find removed and modified
16
+ for (const [path, oldEntry] of oldPaths) {
17
+ const newEntry = newPaths.get(path);
18
+ if (!newEntry) {
19
+ result.removed.push({ path, entry: oldEntry });
20
+ }
21
+ else if (!entriesEqual(oldEntry, newEntry)) {
22
+ result.modified.push({ path, oldEntry, newEntry });
23
+ }
24
+ }
25
+ // Find added
26
+ for (const [path, newEntry] of newPaths) {
27
+ if (!oldPaths.has(path)) {
28
+ result.added.push({ path, entry: newEntry });
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ /** Check if two entries are identical (all fields match). */
34
+ function entriesEqual(a, b) {
35
+ return canonicalEntry(a) === canonicalEntry(b);
36
+ }
37
+ /** Three-way merge of manifests. */
38
+ export function merge(base, local, remote) {
39
+ const localDiff = diff(base, local);
40
+ const remoteDiff = diff(base, remote);
41
+ const merged = base.copy();
42
+ const conflicts = [];
43
+ // Build sets of changed paths
44
+ const localChanges = new Map();
45
+ for (const { path, entry } of localDiff.added)
46
+ localChanges.set(path, entry);
47
+ for (const { path, newEntry } of localDiff.modified)
48
+ localChanges.set(path, newEntry);
49
+ const localRemoved = new Set(localDiff.removed.map(r => r.path));
50
+ const remoteChanges = new Map();
51
+ for (const { path, entry } of remoteDiff.added)
52
+ remoteChanges.set(path, entry);
53
+ for (const { path, newEntry } of remoteDiff.modified)
54
+ remoteChanges.set(path, newEntry);
55
+ const remoteRemoved = new Set(remoteDiff.removed.map(r => r.path));
56
+ // Apply non-conflicting changes
57
+ const allPaths = new Set([...localChanges.keys(), ...localRemoved, ...remoteChanges.keys(), ...remoteRemoved]);
58
+ for (const path of allPaths) {
59
+ const inLocal = localChanges.has(path) || localRemoved.has(path);
60
+ const inRemote = remoteChanges.has(path) || remoteRemoved.has(path);
61
+ if (inLocal && !inRemote) {
62
+ // Only local changed
63
+ if (localRemoved.has(path)) {
64
+ const entry = merged.get(path);
65
+ if (entry)
66
+ merged.removeEntry(entry);
67
+ }
68
+ else {
69
+ applyChange(merged, path, localChanges.get(path));
70
+ }
71
+ }
72
+ else if (!inLocal && inRemote) {
73
+ // Only remote changed
74
+ if (remoteRemoved.has(path)) {
75
+ const entry = merged.get(path);
76
+ if (entry)
77
+ merged.removeEntry(entry);
78
+ }
79
+ else {
80
+ applyChange(merged, path, remoteChanges.get(path));
81
+ }
82
+ }
83
+ else {
84
+ // Both changed — check if they agree
85
+ const localEntry = localChanges.get(path);
86
+ const remoteEntry = remoteChanges.get(path);
87
+ const localDel = localRemoved.has(path);
88
+ const remoteDel = remoteRemoved.has(path);
89
+ if (localDel && remoteDel) {
90
+ // Both deleted — no conflict
91
+ const entry = merged.get(path);
92
+ if (entry)
93
+ merged.removeEntry(entry);
94
+ }
95
+ else if (localEntry && remoteEntry && entriesEqual(localEntry, remoteEntry)) {
96
+ // Same change — no conflict
97
+ applyChange(merged, path, localEntry);
98
+ }
99
+ else {
100
+ // Conflict
101
+ conflicts.push({
102
+ path,
103
+ base: merged.get(path),
104
+ local: localEntry ?? merged.get(path),
105
+ remote: remoteEntry ?? merged.get(path),
106
+ });
107
+ }
108
+ }
109
+ }
110
+ return { merged, conflicts };
111
+ }
112
+ function applyChange(m, path, entry) {
113
+ const existing = m.get(path);
114
+ if (existing) {
115
+ Object.assign(existing, entry);
116
+ }
117
+ else {
118
+ m.addEntry({ ...entry });
119
+ }
120
+ }
121
+ /** Apply a patch manifest to a base manifest.
122
+ * Patch semantics:
123
+ * - Entry exists only in patch: addition
124
+ * - Entry exists in both, any field differs: modification (patch replaces)
125
+ * - Entry exists in both, all fields identical: removal
126
+ */
127
+ export function applyPatch(base, patch) {
128
+ const result = base.copy();
129
+ for (const patchEntry of patch.entries) {
130
+ // Find matching entry in result by name and depth
131
+ let found = false;
132
+ for (let i = 0; i < result.entries.length; i++) {
133
+ const existing = result.entries[i];
134
+ if (existing.name === patchEntry.name && existing.depth === patchEntry.depth) {
135
+ if (entriesEqual(existing, patchEntry)) {
136
+ // Identical = removal
137
+ result.entries.splice(i, 1);
138
+ }
139
+ else {
140
+ // Different = modification
141
+ result.entries[i] = { ...patchEntry };
142
+ }
143
+ found = true;
144
+ break;
145
+ }
146
+ }
147
+ if (!found) {
148
+ // Addition
149
+ result.entries.push({ ...patchEntry });
150
+ }
151
+ }
152
+ result.sortEntries();
153
+ return result;
154
+ }
155
+ export async function patchDiff(oldManifest, newManifest) {
156
+ const d = diff(oldManifest, newManifest);
157
+ const patch = Manifest.create();
158
+ // Additions and modifications — use new entries
159
+ for (const { entry } of d.added)
160
+ patch.addEntry({ ...entry });
161
+ for (const { newEntry } of d.modified)
162
+ patch.addEntry({ ...newEntry });
163
+ // Removals — restate original entry exactly
164
+ for (const { entry } of d.removed)
165
+ patch.addEntry({ ...entry });
166
+ const oldID = await oldManifest.computeC4ID();
167
+ return { oldID: oldID.toString(), patch };
168
+ }
169
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../../core/src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Manifest } from './manifest.js';
2
+ /** Encoder options. */
3
+ export interface EncoderOptions {
4
+ pretty?: boolean;
5
+ indentWidth?: number;
6
+ }
7
+ /** Encode a manifest to c4m text. */
8
+ export declare function encode(m: Manifest, options?: EncoderOptions): string;
9
+ /** Encode a manifest in canonical form (convenience). */
10
+ export declare function dumps(m: Manifest, options?: {
11
+ pretty?: boolean;
12
+ }): string;
13
+ //# sourceMappingURL=encoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../../../core/src/encoder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAW7C,uBAAuB;AACvB,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAiGD,qCAAqC;AACrC,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAkCxE;AAED,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAEzE"}
@@ -0,0 +1,125 @@
1
+ import { formatMode, formatSizeWithCommas, formatEntry, flowOperator, } from './entry.js';
2
+ import { formatName, formatTarget } from './safename.js';
3
+ /** Format a timestamp in human-readable local time. */
4
+ function formatTimestampPretty(d) {
5
+ if (d.getTime() === 0)
6
+ return '- ';
7
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
8
+ const month = months[d.getMonth()];
9
+ const day = d.getDate().toString().padStart(2, ' ');
10
+ const h = d.getHours().toString().padStart(2, '0');
11
+ const m = d.getMinutes().toString().padStart(2, '0');
12
+ const s = d.getSeconds().toString().padStart(2, '0');
13
+ const year = d.getFullYear();
14
+ // Get timezone abbreviation
15
+ const tzMatch = d.toTimeString().match(/\(([^)]+)\)/);
16
+ const tz = tzMatch ? tzMatch[1].split(' ').map(w => w[0]).join('') : 'UTC';
17
+ return `${month} ${day} ${h}:${m}:${s} ${year} ${tz}`;
18
+ }
19
+ /** Calculate the C4 ID column position for pretty printing. */
20
+ function calculateC4IDColumn(entries, indentWidth) {
21
+ let maxSize = 0;
22
+ for (const entry of entries) {
23
+ if (entry.size > maxSize)
24
+ maxSize = entry.size;
25
+ }
26
+ const maxSizeWidth = formatSizeWithCommas(maxSize).length;
27
+ let maxLen = 0;
28
+ for (const entry of entries) {
29
+ const indent = ' '.repeat(entry.depth * indentWidth);
30
+ const modeStr = entry.mode === 0 && entry.modeType === '-'
31
+ ? '----------'
32
+ : formatMode(entry.modeType, entry.mode);
33
+ const timeStr = formatTimestampPretty(entry.timestamp);
34
+ const nameStr = formatName(entry.name, entry.isSequence);
35
+ let lineLen = indent.length + modeStr.length + 1 + timeStr.length + 1 + maxSizeWidth + 1 + nameStr.length;
36
+ if (entry.target !== '') {
37
+ lineLen += 4 + entry.target.length;
38
+ }
39
+ else if (entry.flowDirection !== 0 /* FlowDirection.None */) {
40
+ lineLen += 1 + flowOperator(entry.flowDirection).length + 1 + entry.flowTarget.length;
41
+ }
42
+ if (lineLen > maxLen)
43
+ maxLen = lineLen;
44
+ }
45
+ const minSpacing = 10;
46
+ let column = 80;
47
+ while (maxLen + minSpacing > column)
48
+ column += 10;
49
+ return column;
50
+ }
51
+ /** Format an entry with pretty printing. */
52
+ function formatEntryPretty(entry, maxSize, c4IDColumn, indentWidth) {
53
+ const indent = ' '.repeat(entry.depth * indentWidth);
54
+ const modeStr = entry.mode === 0 && entry.modeType === '-'
55
+ ? '----------'
56
+ : formatMode(entry.modeType, entry.mode);
57
+ const timeStr = entry.timestamp.getTime() === 0
58
+ ? '- '
59
+ : formatTimestampPretty(entry.timestamp);
60
+ let sizeStr;
61
+ if (entry.size < 0) {
62
+ const maxSizeStr = formatSizeWithCommas(maxSize);
63
+ sizeStr = ' '.repeat(maxSizeStr.length - 1) + '-';
64
+ }
65
+ else {
66
+ const sizeWithCommas = formatSizeWithCommas(entry.size);
67
+ const maxSizeStr = formatSizeWithCommas(maxSize);
68
+ sizeStr = ' '.repeat(maxSizeStr.length - sizeWithCommas.length) + sizeWithCommas;
69
+ }
70
+ const nameStr = formatName(entry.name, entry.isSequence);
71
+ const parts = [indent + modeStr, timeStr, sizeStr, nameStr];
72
+ if (entry.target !== '') {
73
+ parts.push('->', formatTarget(entry.target));
74
+ }
75
+ else if (entry.hardLink !== 0) {
76
+ parts.push(entry.hardLink < 0 ? '->' : `->${entry.hardLink}`);
77
+ }
78
+ else if (entry.flowDirection !== 0 /* FlowDirection.None */) {
79
+ parts.push(flowOperator(entry.flowDirection), entry.flowTarget);
80
+ }
81
+ const baseLine = parts.join(' ');
82
+ let padding = c4IDColumn - baseLine.length;
83
+ if (padding < 10)
84
+ padding = 10;
85
+ const idStr = entry.c4id && !entry.c4id.isNil() ? entry.c4id.toString() : '-';
86
+ return baseLine + ' '.repeat(padding) + idStr;
87
+ }
88
+ /** Encode a manifest to c4m text. */
89
+ export function encode(m, options = {}) {
90
+ const pretty = options.pretty ?? false;
91
+ const indentWidth = options.indentWidth ?? 2;
92
+ // Sort a copy
93
+ const sorted = m.copy();
94
+ sorted.sortEntries();
95
+ const lines = [];
96
+ if (pretty) {
97
+ let maxSize = 0;
98
+ for (const entry of sorted.entries) {
99
+ if (entry.size > maxSize)
100
+ maxSize = entry.size;
101
+ }
102
+ const c4IDColumn = calculateC4IDColumn(sorted.entries, indentWidth);
103
+ for (const entry of sorted.entries) {
104
+ lines.push(formatEntryPretty(entry, maxSize, c4IDColumn, indentWidth));
105
+ }
106
+ }
107
+ else {
108
+ for (const entry of sorted.entries) {
109
+ lines.push(formatEntry(entry, indentWidth, false));
110
+ }
111
+ }
112
+ // Inline range data
113
+ if (sorted.rangeData.size > 0) {
114
+ const keys = [...sorted.rangeData.keys()].sort();
115
+ for (const key of keys) {
116
+ lines.push(sorted.rangeData.get(key));
117
+ }
118
+ }
119
+ return lines.map(l => l + '\n').join('');
120
+ }
121
+ /** Encode a manifest in canonical form (convenience). */
122
+ export function dumps(m, options) {
123
+ return encode(m, options);
124
+ }
125
+ //# sourceMappingURL=encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../../../core/src/encoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { C4ID } from './id.js';
2
+ /** Flow link direction for cross-location data relationships. */
3
+ export declare const enum FlowDirection {
4
+ None = 0,
5
+ Outbound = 1,// -> content here propagates there
6
+ Inbound = 2,// <- content there propagates here
7
+ Bidirectional = 3
8
+ }
9
+ /** Canonical timestamp format (RFC 3339, UTC). */
10
+ export declare const TIMESTAMP_FORMAT = "YYYY-MM-DDTHH:MM:SSZ";
11
+ /** Unix epoch — the sentinel for null/unspecified timestamps. */
12
+ export declare const NULL_TIMESTAMP: Date;
13
+ /** Sentinel for null/unspecified size. */
14
+ export declare const NULL_SIZE = -1;
15
+ /** A single file or directory entry in a c4m manifest. */
16
+ export interface Entry {
17
+ mode: number;
18
+ modeType: string;
19
+ timestamp: Date;
20
+ size: number;
21
+ name: string;
22
+ target: string;
23
+ c4id: C4ID | null;
24
+ depth: number;
25
+ hardLink: number;
26
+ flowDirection: FlowDirection;
27
+ flowTarget: string;
28
+ isSequence: boolean;
29
+ pattern: string;
30
+ }
31
+ /** Create a new Entry with defaults. */
32
+ export declare function createEntry(partial?: Partial<Entry>): Entry;
33
+ /** Returns true if the entry represents a directory. */
34
+ export declare function isDir(e: Entry): boolean;
35
+ /** Returns true if the entry represents a symbolic link. */
36
+ export declare function isSymlink(e: Entry): boolean;
37
+ /** Returns true if the entry has a flow link declaration. */
38
+ export declare function isFlowLinked(e: Entry): boolean;
39
+ /** Returns the string representation of the flow direction. */
40
+ export declare function flowOperator(dir: FlowDirection): string;
41
+ /** Returns true if entry has any null metadata values. */
42
+ export declare function hasNullValues(e: Entry): boolean;
43
+ /** Returns list of fields that have null values. */
44
+ export declare function getNullFields(e: Entry): string[];
45
+ /** Convert numeric mode + type char to Unix mode string (e.g. "-rw-r--r--"). */
46
+ export declare function formatMode(modeType: string, mode: number): string;
47
+ /** Parse a 10-char Unix mode string to [modeType, permBits]. */
48
+ export declare function parseMode(s: string): [string, number];
49
+ /** Format a Date as canonical c4m timestamp: YYYY-MM-DDTHH:MM:SSZ */
50
+ export declare function formatTimestamp(d: Date): string;
51
+ /** Parse a timestamp string to Date. Accepts canonical and ergonomic forms. */
52
+ export declare function parseTimestamp(s: string): Date;
53
+ /** Format size with comma separators (e.g. 1,234,567). */
54
+ export declare function formatSizeWithCommas(size: number): string;
55
+ /** Format an entry as a c4m line with indentation. */
56
+ export declare function formatEntry(e: Entry, indentWidth: number, displayFormat: boolean): string;
57
+ /** Format an entry in canonical form (no indentation, null mode as "-"). */
58
+ export declare function canonicalEntry(e: Entry): string;
59
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../../../../core/src/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAGnC,iEAAiE;AACjE,0BAAkB,aAAa;IAC7B,IAAI,IAAI;IACR,QAAQ,IAAI,CAAI,mCAAmC;IACnD,OAAO,IAAI,CAAK,mCAAmC;IACnD,aAAa,IAAI;CAClB;AAED,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,yBAAyB,CAAA;AAEtD,iEAAiE;AACjE,eAAO,MAAM,cAAc,MAAc,CAAA;AAEzC,0CAA0C;AAC1C,eAAO,MAAM,SAAS,KAAK,CAAA;AAE3B,0DAA0D;AAC1D,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,IAAI,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,aAAa,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,GAAE,OAAO,CAAC,KAAK,CAAM,GAAG,KAAK,CAiB/D;AAED,wDAAwD;AACxD,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAEvC;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAE3C;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAE9C;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAOvD;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAK/C;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,CAMhD;AAID,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBjE;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBrD;AAID,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAQ/C;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAM9C;AAID,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUzD;AAID,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM,CAqDzF;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CA6C/C"}
@@ -0,0 +1,266 @@
1
+ import { formatName, formatTarget } from './safename.js';
2
+ /** Canonical timestamp format (RFC 3339, UTC). */
3
+ export const TIMESTAMP_FORMAT = 'YYYY-MM-DDTHH:MM:SSZ';
4
+ /** Unix epoch — the sentinel for null/unspecified timestamps. */
5
+ export const NULL_TIMESTAMP = new Date(0);
6
+ /** Sentinel for null/unspecified size. */
7
+ export const NULL_SIZE = -1;
8
+ /** Create a new Entry with defaults. */
9
+ export function createEntry(partial = {}) {
10
+ return {
11
+ mode: 0,
12
+ modeType: '-',
13
+ timestamp: NULL_TIMESTAMP,
14
+ size: NULL_SIZE,
15
+ name: '',
16
+ target: '',
17
+ c4id: null,
18
+ depth: 0,
19
+ hardLink: 0,
20
+ flowDirection: 0 /* FlowDirection.None */,
21
+ flowTarget: '',
22
+ isSequence: false,
23
+ pattern: '',
24
+ ...partial,
25
+ };
26
+ }
27
+ /** Returns true if the entry represents a directory. */
28
+ export function isDir(e) {
29
+ return e.modeType === 'd' || e.name.endsWith('/');
30
+ }
31
+ /** Returns true if the entry represents a symbolic link. */
32
+ export function isSymlink(e) {
33
+ return e.modeType === 'l';
34
+ }
35
+ /** Returns true if the entry has a flow link declaration. */
36
+ export function isFlowLinked(e) {
37
+ return e.flowDirection !== 0 /* FlowDirection.None */;
38
+ }
39
+ /** Returns the string representation of the flow direction. */
40
+ export function flowOperator(dir) {
41
+ switch (dir) {
42
+ case 1 /* FlowDirection.Outbound */: return '->';
43
+ case 2 /* FlowDirection.Inbound */: return '<-';
44
+ case 3 /* FlowDirection.Bidirectional */: return '<>';
45
+ default: return '';
46
+ }
47
+ }
48
+ /** Returns true if entry has any null metadata values. */
49
+ export function hasNullValues(e) {
50
+ const hasNullMode = e.mode === 0 && e.modeType === '-';
51
+ const hasNullTimestamp = e.timestamp.getTime() === 0;
52
+ const hasNullSize = e.size < 0;
53
+ return hasNullMode || hasNullTimestamp || hasNullSize;
54
+ }
55
+ /** Returns list of fields that have null values. */
56
+ export function getNullFields(e) {
57
+ const fields = [];
58
+ if (e.mode === 0 && e.modeType === '-')
59
+ fields.push('Mode');
60
+ if (e.timestamp.getTime() === 0)
61
+ fields.push('Timestamp');
62
+ if (e.size < 0)
63
+ fields.push('Size');
64
+ return fields;
65
+ }
66
+ // ---- Mode formatting/parsing ----
67
+ /** Convert numeric mode + type char to Unix mode string (e.g. "-rw-r--r--"). */
68
+ export function formatMode(modeType, mode) {
69
+ const buf = [modeType];
70
+ const rwx = 'rwxrwxrwx';
71
+ for (let i = 0; i < 9; i++) {
72
+ if (mode & (1 << (8 - i))) {
73
+ buf.push(rwx[i]);
74
+ }
75
+ else {
76
+ buf.push('-');
77
+ }
78
+ }
79
+ // Special bits (setuid, setgid, sticky)
80
+ if (mode & 0o4000) { // setuid
81
+ buf[3] = buf[3] === 'x' ? 's' : 'S';
82
+ }
83
+ if (mode & 0o2000) { // setgid
84
+ buf[6] = buf[6] === 'x' ? 's' : 'S';
85
+ }
86
+ if (mode & 0o1000) { // sticky
87
+ buf[9] = buf[9] === 'x' ? 't' : 'T';
88
+ }
89
+ return buf.join('');
90
+ }
91
+ /** Parse a 10-char Unix mode string to [modeType, permBits]. */
92
+ export function parseMode(s) {
93
+ if (s.length !== 10) {
94
+ throw new Error(`mode must be 10 characters, got ${s.length}`);
95
+ }
96
+ const modeType = s[0];
97
+ let perm = 0;
98
+ // Permission bits
99
+ if (s[1] === 'r')
100
+ perm |= 0o400;
101
+ if (s[2] === 'w')
102
+ perm |= 0o200;
103
+ if (s[3] === 'x' || s[3] === 's')
104
+ perm |= 0o100;
105
+ if (s[4] === 'r')
106
+ perm |= 0o040;
107
+ if (s[5] === 'w')
108
+ perm |= 0o020;
109
+ if (s[6] === 'x' || s[6] === 's')
110
+ perm |= 0o010;
111
+ if (s[7] === 'r')
112
+ perm |= 0o004;
113
+ if (s[8] === 'w')
114
+ perm |= 0o002;
115
+ if (s[9] === 'x' || s[9] === 't')
116
+ perm |= 0o001;
117
+ // Special bits
118
+ if (s[3] === 's' || s[3] === 'S')
119
+ perm |= 0o4000;
120
+ if (s[6] === 's' || s[6] === 'S')
121
+ perm |= 0o2000;
122
+ if (s[9] === 't' || s[9] === 'T')
123
+ perm |= 0o1000;
124
+ return [modeType, perm];
125
+ }
126
+ // ---- Timestamp formatting/parsing ----
127
+ /** Format a Date as canonical c4m timestamp: YYYY-MM-DDTHH:MM:SSZ */
128
+ export function formatTimestamp(d) {
129
+ const y = d.getUTCFullYear().toString().padStart(4, '0');
130
+ const m = (d.getUTCMonth() + 1).toString().padStart(2, '0');
131
+ const day = d.getUTCDate().toString().padStart(2, '0');
132
+ const h = d.getUTCHours().toString().padStart(2, '0');
133
+ const min = d.getUTCMinutes().toString().padStart(2, '0');
134
+ const sec = d.getUTCSeconds().toString().padStart(2, '0');
135
+ return `${y}-${m}-${day}T${h}:${min}:${sec}Z`;
136
+ }
137
+ /** Parse a timestamp string to Date. Accepts canonical and ergonomic forms. */
138
+ export function parseTimestamp(s) {
139
+ if (s === '-' || s === '0')
140
+ return new Date(0);
141
+ // Try ISO 8601 / RFC 3339 (handles both Z and offset)
142
+ const d = new Date(s);
143
+ if (!isNaN(d.getTime()))
144
+ return d;
145
+ throw new Error(`cannot parse timestamp "${s}"`);
146
+ }
147
+ // ---- Size formatting ----
148
+ /** Format size with comma separators (e.g. 1,234,567). */
149
+ export function formatSizeWithCommas(size) {
150
+ if (size < 0)
151
+ return '-';
152
+ const s = size.toString();
153
+ if (s.length <= 3)
154
+ return s;
155
+ const parts = [];
156
+ for (let i = s.length - 1, count = 0; i >= 0; i--, count++) {
157
+ if (count > 0 && count % 3 === 0)
158
+ parts.push(',');
159
+ parts.push(s[i]);
160
+ }
161
+ return parts.reverse().join('');
162
+ }
163
+ // ---- Entry formatting ----
164
+ /** Format an entry as a c4m line with indentation. */
165
+ export function formatEntry(e, indentWidth, displayFormat) {
166
+ const indent = ' '.repeat(e.depth * indentWidth);
167
+ // Mode
168
+ let modeStr;
169
+ if (e.mode === 0 && e.modeType === '-') {
170
+ modeStr = displayFormat ? '----------' : '-';
171
+ }
172
+ else {
173
+ modeStr = formatMode(e.modeType, e.mode);
174
+ }
175
+ // Timestamp
176
+ let timeStr;
177
+ if (e.timestamp.getTime() === 0) {
178
+ timeStr = '-';
179
+ }
180
+ else {
181
+ timeStr = formatTimestamp(e.timestamp);
182
+ }
183
+ // Size
184
+ let sizeStr;
185
+ if (e.size < 0) {
186
+ sizeStr = '-';
187
+ }
188
+ else {
189
+ sizeStr = displayFormat ? formatSizeWithCommas(e.size) : e.size.toString();
190
+ }
191
+ // Name
192
+ const nameStr = formatName(e.name, e.isSequence);
193
+ const parts = [indent + modeStr, timeStr, sizeStr, nameStr];
194
+ // Link operators
195
+ if (e.target !== '') {
196
+ parts.push('->', formatTarget(e.target));
197
+ }
198
+ else if (e.hardLink !== 0) {
199
+ if (e.hardLink < 0) {
200
+ parts.push('->');
201
+ }
202
+ else {
203
+ parts.push(`->${e.hardLink}`);
204
+ }
205
+ }
206
+ else if (e.flowDirection !== 0 /* FlowDirection.None */) {
207
+ parts.push(flowOperator(e.flowDirection), e.flowTarget);
208
+ }
209
+ // C4 ID
210
+ if (e.c4id && !e.c4id.isNil()) {
211
+ parts.push(e.c4id.toString());
212
+ }
213
+ else {
214
+ parts.push('-');
215
+ }
216
+ return parts.join(' ');
217
+ }
218
+ /** Format an entry in canonical form (no indentation, null mode as "-"). */
219
+ export function canonicalEntry(e) {
220
+ // No indentation
221
+ let modeStr;
222
+ if (e.mode === 0 && e.modeType === '-') {
223
+ modeStr = '-';
224
+ }
225
+ else {
226
+ modeStr = formatMode(e.modeType, e.mode);
227
+ }
228
+ let timeStr;
229
+ if (e.timestamp.getTime() === 0) {
230
+ timeStr = '-';
231
+ }
232
+ else {
233
+ timeStr = formatTimestamp(e.timestamp);
234
+ }
235
+ let sizeStr;
236
+ if (e.size < 0) {
237
+ sizeStr = '-';
238
+ }
239
+ else {
240
+ sizeStr = e.size.toString();
241
+ }
242
+ const nameStr = formatName(e.name, e.isSequence);
243
+ const parts = [modeStr, timeStr, sizeStr, nameStr];
244
+ if (e.target !== '') {
245
+ parts.push('->', formatTarget(e.target));
246
+ }
247
+ else if (e.hardLink !== 0) {
248
+ if (e.hardLink < 0) {
249
+ parts.push('->');
250
+ }
251
+ else {
252
+ parts.push(`->${e.hardLink}`);
253
+ }
254
+ }
255
+ else if (e.flowDirection !== 0 /* FlowDirection.None */) {
256
+ parts.push(flowOperator(e.flowDirection), e.flowTarget);
257
+ }
258
+ if (e.c4id && !e.c4id.isNil()) {
259
+ parts.push(e.c4id.toString());
260
+ }
261
+ else {
262
+ parts.push('-');
263
+ }
264
+ return parts.join(' ');
265
+ }
266
+ //# sourceMappingURL=entry.js.map