@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.
- package/dist/packages/core/src/base58.d.ts +5 -0
- package/dist/packages/core/src/base58.d.ts.map +1 -0
- package/dist/packages/core/src/base58.js +42 -0
- package/dist/packages/core/src/base58.js.map +1 -0
- package/dist/packages/core/src/browser/filesystem.d.ts +34 -0
- package/dist/packages/core/src/browser/filesystem.d.ts.map +1 -0
- package/dist/packages/core/src/browser/filesystem.js +169 -0
- package/dist/packages/core/src/browser/filesystem.js.map +1 -0
- package/dist/packages/core/src/browser/index.d.ts +4 -0
- package/dist/packages/core/src/browser/index.d.ts.map +1 -0
- package/dist/packages/core/src/browser/index.js +6 -0
- package/dist/packages/core/src/browser/index.js.map +1 -0
- package/dist/packages/core/src/browser/store.d.ts +28 -0
- package/dist/packages/core/src/browser/store.d.ts.map +1 -0
- package/dist/packages/core/src/browser/store.js +142 -0
- package/dist/packages/core/src/browser/store.js.map +1 -0
- package/dist/packages/core/src/browser/worker.d.ts +34 -0
- package/dist/packages/core/src/browser/worker.d.ts.map +1 -0
- package/dist/packages/core/src/browser/worker.js +96 -0
- package/dist/packages/core/src/browser/worker.js.map +1 -0
- package/dist/packages/core/src/decoder.d.ts +23 -0
- package/dist/packages/core/src/decoder.d.ts.map +1 -0
- package/dist/packages/core/src/decoder.js +431 -0
- package/dist/packages/core/src/decoder.js.map +1 -0
- package/dist/packages/core/src/diff.d.ts +48 -0
- package/dist/packages/core/src/diff.d.ts.map +1 -0
- package/dist/packages/core/src/diff.js +169 -0
- package/dist/packages/core/src/diff.js.map +1 -0
- package/dist/packages/core/src/encoder.d.ts +13 -0
- package/dist/packages/core/src/encoder.d.ts.map +1 -0
- package/dist/packages/core/src/encoder.js +125 -0
- package/dist/packages/core/src/encoder.js.map +1 -0
- package/dist/packages/core/src/entry.d.ts +59 -0
- package/dist/packages/core/src/entry.d.ts.map +1 -0
- package/dist/packages/core/src/entry.js +266 -0
- package/dist/packages/core/src/entry.js.map +1 -0
- package/dist/packages/core/src/errors.d.ts +29 -0
- package/dist/packages/core/src/errors.d.ts.map +1 -0
- package/dist/packages/core/src/errors.js +56 -0
- package/dist/packages/core/src/errors.js.map +1 -0
- package/dist/packages/core/src/filesystem.d.ts +68 -0
- package/dist/packages/core/src/filesystem.d.ts.map +1 -0
- package/dist/packages/core/src/filesystem.js +62 -0
- package/dist/packages/core/src/filesystem.js.map +1 -0
- package/dist/packages/core/src/id.d.ts +33 -0
- package/dist/packages/core/src/id.d.ts.map +1 -0
- package/dist/packages/core/src/id.js +126 -0
- package/dist/packages/core/src/id.js.map +1 -0
- package/dist/packages/core/src/identify-content.d.ts +17 -0
- package/dist/packages/core/src/identify-content.d.ts.map +1 -0
- package/dist/packages/core/src/identify-content.js +70 -0
- package/dist/packages/core/src/identify-content.js.map +1 -0
- package/dist/packages/core/src/index.d.ts +23 -0
- package/dist/packages/core/src/index.d.ts.map +1 -0
- package/dist/packages/core/src/index.js +41 -0
- package/dist/packages/core/src/index.js.map +1 -0
- package/dist/packages/core/src/manifest.d.ts +68 -0
- package/dist/packages/core/src/manifest.d.ts.map +1 -0
- package/dist/packages/core/src/manifest.js +463 -0
- package/dist/packages/core/src/manifest.js.map +1 -0
- package/dist/packages/core/src/memory-fs.d.ts +33 -0
- package/dist/packages/core/src/memory-fs.d.ts.map +1 -0
- package/dist/packages/core/src/memory-fs.js +187 -0
- package/dist/packages/core/src/memory-fs.js.map +1 -0
- package/dist/packages/core/src/memory-store.d.ts +21 -0
- package/dist/packages/core/src/memory-store.d.ts.map +1 -0
- package/dist/packages/core/src/memory-store.js +57 -0
- package/dist/packages/core/src/memory-store.js.map +1 -0
- package/dist/packages/core/src/naturalsort.d.ts +2 -0
- package/dist/packages/core/src/naturalsort.d.ts.map +1 -0
- package/dist/packages/core/src/naturalsort.js +88 -0
- package/dist/packages/core/src/naturalsort.js.map +1 -0
- package/dist/packages/core/src/observable.d.ts +54 -0
- package/dist/packages/core/src/observable.d.ts.map +1 -0
- package/dist/packages/core/src/observable.js +150 -0
- package/dist/packages/core/src/observable.js.map +1 -0
- package/dist/packages/core/src/pool.d.ts +38 -0
- package/dist/packages/core/src/pool.d.ts.map +1 -0
- package/dist/packages/core/src/pool.js +113 -0
- package/dist/packages/core/src/pool.js.map +1 -0
- package/dist/packages/core/src/reconcile.d.ts +43 -0
- package/dist/packages/core/src/reconcile.d.ts.map +1 -0
- package/dist/packages/core/src/reconcile.js +172 -0
- package/dist/packages/core/src/reconcile.js.map +1 -0
- package/dist/packages/core/src/resolver.d.ts +67 -0
- package/dist/packages/core/src/resolver.d.ts.map +1 -0
- package/dist/packages/core/src/resolver.js +110 -0
- package/dist/packages/core/src/resolver.js.map +1 -0
- package/dist/packages/core/src/safename.d.ts +7 -0
- package/dist/packages/core/src/safename.d.ts.map +1 -0
- package/dist/packages/core/src/safename.js +354 -0
- package/dist/packages/core/src/safename.js.map +1 -0
- package/dist/packages/core/src/scanner.d.ts +25 -0
- package/dist/packages/core/src/scanner.d.ts.map +1 -0
- package/dist/packages/core/src/scanner.js +97 -0
- package/dist/packages/core/src/scanner.js.map +1 -0
- package/dist/packages/core/src/store.d.ts +39 -0
- package/dist/packages/core/src/store.d.ts.map +1 -0
- package/dist/packages/core/src/store.js +53 -0
- package/dist/packages/core/src/store.js.map +1 -0
- package/dist/packages/core/src/tree.d.ts +16 -0
- package/dist/packages/core/src/tree.d.ts.map +1 -0
- package/dist/packages/core/src/tree.js +45 -0
- package/dist/packages/core/src/tree.js.map +1 -0
- package/dist/packages/core/src/verify.d.ts +29 -0
- package/dist/packages/core/src/verify.d.ts.map +1 -0
- package/dist/packages/core/src/verify.js +85 -0
- package/dist/packages/core/src/verify.js.map +1 -0
- package/dist/packages/core/src/workspace.d.ts +72 -0
- package/dist/packages/core/src/workspace.d.ts.map +1 -0
- package/dist/packages/core/src/workspace.js +135 -0
- package/dist/packages/core/src/workspace.js.map +1 -0
- package/dist/packages/node/src/index.d.ts +4 -0
- package/dist/packages/node/src/index.d.ts.map +1 -0
- package/dist/packages/node/src/index.js +6 -0
- package/dist/packages/node/src/index.js.map +1 -0
- package/dist/packages/node/src/node-fs.d.ts +24 -0
- package/dist/packages/node/src/node-fs.d.ts.map +1 -0
- package/dist/packages/node/src/node-fs.js +84 -0
- package/dist/packages/node/src/node-fs.js.map +1 -0
- package/dist/packages/node/src/tree-store.d.ts +22 -0
- package/dist/packages/node/src/tree-store.d.ts.map +1 -0
- package/dist/packages/node/src/tree-store.js +77 -0
- package/dist/packages/node/src/tree-store.js.map +1 -0
- 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
|