@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,354 @@
|
|
|
1
|
+
// Universal Filename Encoding for c4m names.
|
|
2
|
+
const CURRENCY_SIGN = "\u00A4"; // ¤
|
|
3
|
+
const BRAILLE_BASE = 0x2800;
|
|
4
|
+
// isPrintable returns true if the codepoint is a printable character.
|
|
5
|
+
// Matches Go's unicode.IsPrint: graphic characters plus ASCII space.
|
|
6
|
+
// Excludes all C0/C1 control characters and other non-graphic codepoints.
|
|
7
|
+
function isPrintable(cp) {
|
|
8
|
+
// C0 controls (0x00-0x1F) except we never reach here for those handled by tier2
|
|
9
|
+
if (cp <= 0x1f)
|
|
10
|
+
return false;
|
|
11
|
+
// DEL
|
|
12
|
+
if (cp === 0x7f)
|
|
13
|
+
return false;
|
|
14
|
+
// C1 controls (0x80-0x9F)
|
|
15
|
+
if (cp >= 0x80 && cp <= 0x9f)
|
|
16
|
+
return false;
|
|
17
|
+
// Unicode category-based non-printable ranges
|
|
18
|
+
// Surrogates (shouldn't appear as codepoints but guard anyway)
|
|
19
|
+
if (cp >= 0xd800 && cp <= 0xdfff)
|
|
20
|
+
return false;
|
|
21
|
+
// Non-characters
|
|
22
|
+
if (cp >= 0xfdd0 && cp <= 0xfdef)
|
|
23
|
+
return false;
|
|
24
|
+
if ((cp & 0xfffe) === 0xfffe && cp <= 0x10ffff)
|
|
25
|
+
return false;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
// tier2Escape returns the escape character for a Tier 2 codepoint, or empty string.
|
|
29
|
+
function tier2Escape(cp) {
|
|
30
|
+
switch (cp) {
|
|
31
|
+
case 0x00: return "0";
|
|
32
|
+
case 0x09: return "t";
|
|
33
|
+
case 0x0a: return "n";
|
|
34
|
+
case 0x0d: return "r";
|
|
35
|
+
case 0x5c: return "\\"; // backslash
|
|
36
|
+
}
|
|
37
|
+
return "";
|
|
38
|
+
}
|
|
39
|
+
// tier2Unescape returns the byte value for a Tier 2 escape character.
|
|
40
|
+
function tier2Unescape(ch) {
|
|
41
|
+
switch (ch) {
|
|
42
|
+
case "0": return { value: 0x00, ok: true };
|
|
43
|
+
case "t": return { value: 0x09, ok: true };
|
|
44
|
+
case "n": return { value: 0x0a, ok: true };
|
|
45
|
+
case "r": return { value: 0x0d, ok: true };
|
|
46
|
+
case "\\": return { value: 0x5c, ok: true };
|
|
47
|
+
}
|
|
48
|
+
return { value: 0, ok: false };
|
|
49
|
+
}
|
|
50
|
+
// safeName encodes a raw filename using Universal Filename Encoding.
|
|
51
|
+
// Three tiers:
|
|
52
|
+
// Tier 1: printable UTF-8 passes through, except ¤ and backslash
|
|
53
|
+
// Tier 2: backslash escapes for \0, \t, \n, \r, \\
|
|
54
|
+
// Tier 3: non-printable bytes encoded as braille between ¤ delimiters
|
|
55
|
+
export function safeName(raw) {
|
|
56
|
+
const encoder = new TextEncoder();
|
|
57
|
+
const bytes = encoder.encode(raw);
|
|
58
|
+
// Fast path: check if encoding is needed.
|
|
59
|
+
let safe = true;
|
|
60
|
+
let i = 0;
|
|
61
|
+
while (i < bytes.length) {
|
|
62
|
+
const decoded = decodeUtf8(bytes, i);
|
|
63
|
+
if (decoded.error) {
|
|
64
|
+
safe = false;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
if (decoded.cp === 0xa4 || decoded.cp === 0x5c || !isPrintable(decoded.cp)) {
|
|
68
|
+
safe = false;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
i += decoded.size;
|
|
72
|
+
}
|
|
73
|
+
if (safe) {
|
|
74
|
+
return raw;
|
|
75
|
+
}
|
|
76
|
+
let result = "";
|
|
77
|
+
let pending = []; // Tier 3 byte accumulator
|
|
78
|
+
function flushPending() {
|
|
79
|
+
if (pending.length === 0)
|
|
80
|
+
return;
|
|
81
|
+
result += CURRENCY_SIGN;
|
|
82
|
+
for (const b of pending) {
|
|
83
|
+
result += String.fromCodePoint(BRAILLE_BASE + b);
|
|
84
|
+
}
|
|
85
|
+
result += CURRENCY_SIGN;
|
|
86
|
+
pending = [];
|
|
87
|
+
}
|
|
88
|
+
i = 0;
|
|
89
|
+
while (i < bytes.length) {
|
|
90
|
+
const decoded = decodeUtf8(bytes, i);
|
|
91
|
+
// Tier 1: printable UTF-8, not ¤, not backslash
|
|
92
|
+
if (!decoded.error && isPrintable(decoded.cp) && decoded.cp !== 0xa4 && decoded.cp !== 0x5c) {
|
|
93
|
+
flushPending();
|
|
94
|
+
result += String.fromCodePoint(decoded.cp);
|
|
95
|
+
i += decoded.size;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// Tier 2: backslash escapes for specific characters
|
|
99
|
+
if (!decoded.error) {
|
|
100
|
+
const esc = tier2Escape(decoded.cp);
|
|
101
|
+
if (esc !== "") {
|
|
102
|
+
flushPending();
|
|
103
|
+
result += "\\" + esc;
|
|
104
|
+
i += decoded.size;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Tier 3: accumulate bytes for braille range encoding
|
|
109
|
+
if (decoded.error) {
|
|
110
|
+
pending.push(bytes[i]);
|
|
111
|
+
i++;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
for (let j = 0; j < decoded.size; j++) {
|
|
115
|
+
pending.push(bytes[i + j]);
|
|
116
|
+
}
|
|
117
|
+
i += decoded.size;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
flushPending();
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
// unsafeName reverses safeName: decodes Tier 2 backslash escapes and
|
|
124
|
+
// Tier 3 braille patterns back to raw bytes.
|
|
125
|
+
export function unsafeName(encoded) {
|
|
126
|
+
if (!encoded.includes(CURRENCY_SIGN) && !encoded.includes("\\")) {
|
|
127
|
+
return encoded;
|
|
128
|
+
}
|
|
129
|
+
const decoder = new TextDecoder();
|
|
130
|
+
const outputBytes = [];
|
|
131
|
+
const encoder = new TextEncoder();
|
|
132
|
+
const pushStr = (s) => {
|
|
133
|
+
const bytes = encoder.encode(s);
|
|
134
|
+
for (let k = 0; k < bytes.length; k++) {
|
|
135
|
+
outputBytes.push(bytes[k]);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
let i = 0;
|
|
139
|
+
outer: while (i < encoded.length) {
|
|
140
|
+
const cp = encoded.codePointAt(i);
|
|
141
|
+
const charLen = cp > 0xffff ? 2 : 1;
|
|
142
|
+
// Tier 2: backslash escape
|
|
143
|
+
if (cp === 0x5c) { // backslash
|
|
144
|
+
if (i + charLen < encoded.length) {
|
|
145
|
+
const next = encoded[i + charLen];
|
|
146
|
+
const unesc = tier2Unescape(next);
|
|
147
|
+
if (unesc.ok) {
|
|
148
|
+
outputBytes.push(unesc.value);
|
|
149
|
+
i += charLen + 1;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Lone backslash or unknown escape: pass through
|
|
154
|
+
outputBytes.push(0x5c);
|
|
155
|
+
i += charLen;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// Tier 3: ¤...¤ braille range
|
|
159
|
+
// Matches Go behavior: braille-decoded bytes are written inline.
|
|
160
|
+
if (cp === 0xa4) { // ¤
|
|
161
|
+
let j = i + charLen;
|
|
162
|
+
let decoded = false;
|
|
163
|
+
while (j < encoded.length) {
|
|
164
|
+
const brCp = encoded.codePointAt(j);
|
|
165
|
+
const brLen = brCp > 0xffff ? 2 : 1;
|
|
166
|
+
if (brCp === 0xa4) { // closing ¤
|
|
167
|
+
if (decoded) {
|
|
168
|
+
i = j + brLen;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
pushStr(CURRENCY_SIGN);
|
|
172
|
+
i += charLen;
|
|
173
|
+
}
|
|
174
|
+
continue outer;
|
|
175
|
+
}
|
|
176
|
+
if (brCp >= 0x2800 && brCp <= 0x28ff) {
|
|
177
|
+
outputBytes.push(brCp - 0x2800);
|
|
178
|
+
decoded = true;
|
|
179
|
+
j += brLen;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
// No closing ¤ found (or non-braille interrupted): emit ¤ as literal.
|
|
185
|
+
// Any braille-decoded bytes already written are kept (matches Go).
|
|
186
|
+
pushStr(CURRENCY_SIGN);
|
|
187
|
+
i += charLen;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// Tier 1: passthrough
|
|
191
|
+
pushStr(String.fromCodePoint(cp));
|
|
192
|
+
i += charLen;
|
|
193
|
+
}
|
|
194
|
+
return decoder.decode(new Uint8Array(outputBytes));
|
|
195
|
+
}
|
|
196
|
+
// decodeUtf8 decodes a single UTF-8 codepoint from a byte array at offset.
|
|
197
|
+
function decodeUtf8(bytes, offset) {
|
|
198
|
+
if (offset >= bytes.length) {
|
|
199
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
200
|
+
}
|
|
201
|
+
const b0 = bytes[offset];
|
|
202
|
+
// Single byte (ASCII)
|
|
203
|
+
if (b0 < 0x80) {
|
|
204
|
+
return { cp: b0, size: 1, error: false };
|
|
205
|
+
}
|
|
206
|
+
// Two bytes
|
|
207
|
+
if ((b0 & 0xe0) === 0xc0) {
|
|
208
|
+
if (offset + 1 >= bytes.length)
|
|
209
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
210
|
+
const b1 = bytes[offset + 1];
|
|
211
|
+
if ((b1 & 0xc0) !== 0x80)
|
|
212
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
213
|
+
const cp = ((b0 & 0x1f) << 6) | (b1 & 0x3f);
|
|
214
|
+
if (cp < 0x80)
|
|
215
|
+
return { cp: 0xfffd, size: 1, error: true }; // overlong
|
|
216
|
+
return { cp, size: 2, error: false };
|
|
217
|
+
}
|
|
218
|
+
// Three bytes
|
|
219
|
+
if ((b0 & 0xf0) === 0xe0) {
|
|
220
|
+
if (offset + 2 >= bytes.length)
|
|
221
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
222
|
+
const b1 = bytes[offset + 1];
|
|
223
|
+
const b2 = bytes[offset + 2];
|
|
224
|
+
if ((b1 & 0xc0) !== 0x80 || (b2 & 0xc0) !== 0x80)
|
|
225
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
226
|
+
const cp = ((b0 & 0x0f) << 12) | ((b1 & 0x3f) << 6) | (b2 & 0x3f);
|
|
227
|
+
if (cp < 0x800)
|
|
228
|
+
return { cp: 0xfffd, size: 1, error: true }; // overlong
|
|
229
|
+
return { cp, size: 3, error: false };
|
|
230
|
+
}
|
|
231
|
+
// Four bytes
|
|
232
|
+
if ((b0 & 0xf8) === 0xf0) {
|
|
233
|
+
if (offset + 3 >= bytes.length)
|
|
234
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
235
|
+
const b1 = bytes[offset + 1];
|
|
236
|
+
const b2 = bytes[offset + 2];
|
|
237
|
+
const b3 = bytes[offset + 3];
|
|
238
|
+
if ((b1 & 0xc0) !== 0x80 || (b2 & 0xc0) !== 0x80 || (b3 & 0xc0) !== 0x80) {
|
|
239
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
240
|
+
}
|
|
241
|
+
const cp = ((b0 & 0x07) << 18) | ((b1 & 0x3f) << 12) | ((b2 & 0x3f) << 6) | (b3 & 0x3f);
|
|
242
|
+
if (cp < 0x10000 || cp > 0x10ffff)
|
|
243
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
244
|
+
return { cp, size: 4, error: false };
|
|
245
|
+
}
|
|
246
|
+
// Invalid leading byte
|
|
247
|
+
return { cp: 0xfffd, size: 1, error: true };
|
|
248
|
+
}
|
|
249
|
+
// escapeC4MName backslash-escapes c4m field-boundary characters:
|
|
250
|
+
// space, double-quote, and (for non-sequence names) brackets.
|
|
251
|
+
export function escapeC4MName(s, isSequence) {
|
|
252
|
+
let needsEscape = false;
|
|
253
|
+
for (const ch of s) {
|
|
254
|
+
if (ch === " " || ch === '"') {
|
|
255
|
+
needsEscape = true;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
if (!isSequence && (ch === "[" || ch === "]")) {
|
|
259
|
+
needsEscape = true;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (!needsEscape) {
|
|
264
|
+
return s;
|
|
265
|
+
}
|
|
266
|
+
let result = "";
|
|
267
|
+
for (const ch of s) {
|
|
268
|
+
switch (ch) {
|
|
269
|
+
case " ":
|
|
270
|
+
result += "\\ ";
|
|
271
|
+
break;
|
|
272
|
+
case '"':
|
|
273
|
+
result += '\\"';
|
|
274
|
+
break;
|
|
275
|
+
case "[":
|
|
276
|
+
if (!isSequence) {
|
|
277
|
+
result += "\\[";
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
result += ch;
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
case "]":
|
|
284
|
+
if (!isSequence) {
|
|
285
|
+
result += "\\]";
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
result += ch;
|
|
289
|
+
}
|
|
290
|
+
break;
|
|
291
|
+
default:
|
|
292
|
+
result += ch;
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
// unescapeC4MName reverses escapeC4MName: removes backslash escapes
|
|
299
|
+
// for spaces, double-quotes, and brackets.
|
|
300
|
+
export function unescapeC4MName(s) {
|
|
301
|
+
if (!s.includes("\\")) {
|
|
302
|
+
return s;
|
|
303
|
+
}
|
|
304
|
+
let result = "";
|
|
305
|
+
let i = 0;
|
|
306
|
+
while (i < s.length) {
|
|
307
|
+
if (s[i] === "\\" && i + 1 < s.length) {
|
|
308
|
+
const next = s[i + 1];
|
|
309
|
+
if (next === " " || next === '"' || next === "[" || next === "]" || next === "\\") {
|
|
310
|
+
result += next;
|
|
311
|
+
i += 2;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
result += s[i];
|
|
316
|
+
i++;
|
|
317
|
+
}
|
|
318
|
+
return result;
|
|
319
|
+
}
|
|
320
|
+
// formatName applies safeName encoding and then c4m field-boundary escaping.
|
|
321
|
+
// For directory names (ending in /): escape the base, keep trailing /.
|
|
322
|
+
// For files: escape the full name.
|
|
323
|
+
export function formatName(name, isSequence) {
|
|
324
|
+
const safe = safeName(name);
|
|
325
|
+
if (safe.endsWith("/")) {
|
|
326
|
+
const base = safe.slice(0, -1);
|
|
327
|
+
return escapeC4MName(base, isSequence) + "/";
|
|
328
|
+
}
|
|
329
|
+
return escapeC4MName(safe, isSequence);
|
|
330
|
+
}
|
|
331
|
+
// formatTarget applies safeName encoding and escapes only spaces and
|
|
332
|
+
// double-quotes (no bracket escaping).
|
|
333
|
+
export function formatTarget(target) {
|
|
334
|
+
const safe = safeName(target);
|
|
335
|
+
if (!safe.includes(" ") && !safe.includes('"')) {
|
|
336
|
+
return safe;
|
|
337
|
+
}
|
|
338
|
+
let result = "";
|
|
339
|
+
for (const ch of safe) {
|
|
340
|
+
switch (ch) {
|
|
341
|
+
case " ":
|
|
342
|
+
result += "\\ ";
|
|
343
|
+
break;
|
|
344
|
+
case '"':
|
|
345
|
+
result += '\\"';
|
|
346
|
+
break;
|
|
347
|
+
default:
|
|
348
|
+
result += ch;
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=safename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safename.js","sourceRoot":"","sources":["../../../../../core/src/safename.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FileSystem } from './filesystem.js';
|
|
2
|
+
import type { Store } from './store.js';
|
|
3
|
+
import { Manifest } from './manifest.js';
|
|
4
|
+
/** Options for the scan function. */
|
|
5
|
+
export interface ScanOptions {
|
|
6
|
+
/** Store content during scan for a single-pass ingest. */
|
|
7
|
+
store?: Store;
|
|
8
|
+
/** Compute C4 IDs for file content. Default true. */
|
|
9
|
+
computeIds?: boolean;
|
|
10
|
+
/** Follow symbolic links. Default false. */
|
|
11
|
+
followSymlinks?: boolean;
|
|
12
|
+
/** Skip hidden directories (names starting with '.'). Default true. */
|
|
13
|
+
skipHidden?: boolean;
|
|
14
|
+
/** Progress callback invoked for each file processed. */
|
|
15
|
+
progress?: (path: string, filesProcessed: number) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Scan a filesystem directory into a Manifest.
|
|
19
|
+
*
|
|
20
|
+
* Walks the directory tree rooted at rootPath, reads each file,
|
|
21
|
+
* computes its C4 ID, and builds a sorted Manifest with proper
|
|
22
|
+
* directory metadata propagated bottom-up.
|
|
23
|
+
*/
|
|
24
|
+
export declare function scan(fs: FileSystem, rootPath: string, options?: ScanOptions): Promise<Manifest>;
|
|
25
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../../../core/src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAKxC,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1D;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,CACxB,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,QAAQ,CAAC,CAuBnB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Manifest } from './manifest.js';
|
|
2
|
+
import { createEntry } from './entry.js';
|
|
3
|
+
import { identifyContent } from './identify-content.js';
|
|
4
|
+
import { streamToBytes, joinPath } from './filesystem.js';
|
|
5
|
+
/**
|
|
6
|
+
* Scan a filesystem directory into a Manifest.
|
|
7
|
+
*
|
|
8
|
+
* Walks the directory tree rooted at rootPath, reads each file,
|
|
9
|
+
* computes its C4 ID, and builds a sorted Manifest with proper
|
|
10
|
+
* directory metadata propagated bottom-up.
|
|
11
|
+
*/
|
|
12
|
+
export async function scan(fs, rootPath, options) {
|
|
13
|
+
const computeIds = options?.computeIds ?? true;
|
|
14
|
+
const skipHidden = options?.skipHidden ?? true;
|
|
15
|
+
const followSymlinks = options?.followSymlinks ?? false;
|
|
16
|
+
const manifest = Manifest.create();
|
|
17
|
+
await walkDir(fs, rootPath, '', 0, manifest, {
|
|
18
|
+
computeIds,
|
|
19
|
+
skipHidden,
|
|
20
|
+
followSymlinks,
|
|
21
|
+
store: options?.store,
|
|
22
|
+
progress: options?.progress,
|
|
23
|
+
counter: { value: 0 },
|
|
24
|
+
});
|
|
25
|
+
// Propagate directory sizes and timestamps bottom-up.
|
|
26
|
+
manifest.canonicalize();
|
|
27
|
+
// Sort entries (files before dirs, natural sort).
|
|
28
|
+
manifest.sortEntries();
|
|
29
|
+
return manifest;
|
|
30
|
+
}
|
|
31
|
+
/** Recursively walk a directory, adding entries to the manifest. */
|
|
32
|
+
async function walkDir(fs, rootPath, relDir, depth, manifest, state) {
|
|
33
|
+
const absDir = relDir ? joinPath(rootPath, relDir) : rootPath;
|
|
34
|
+
// Collect dir entries so we can process files first, then recurse.
|
|
35
|
+
const files = [];
|
|
36
|
+
const dirs = [];
|
|
37
|
+
for await (const dirEntry of fs.readDir(absDir)) {
|
|
38
|
+
if (state.skipHidden && dirEntry.name.startsWith('.'))
|
|
39
|
+
continue;
|
|
40
|
+
if (dirEntry.isSymlink && !state.followSymlinks)
|
|
41
|
+
continue;
|
|
42
|
+
const relPath = relDir ? relDir + dirEntry.name : dirEntry.name;
|
|
43
|
+
if (dirEntry.isDirectory) {
|
|
44
|
+
dirs.push({ name: dirEntry.name, relPath });
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
files.push({ name: dirEntry.name, relPath });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Process files.
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
const fullPath = joinPath(rootPath, file.relPath);
|
|
53
|
+
const stat = await fs.stat(fullPath);
|
|
54
|
+
const modeType = stat.isSymlink ? 'l' : '-';
|
|
55
|
+
const mode = stat.mode & 0o7777;
|
|
56
|
+
let c4id = null;
|
|
57
|
+
if (state.computeIds) {
|
|
58
|
+
const stream = await fs.readFile(fullPath);
|
|
59
|
+
const bytes = await streamToBytes(stream);
|
|
60
|
+
c4id = await identifyContent(bytes);
|
|
61
|
+
if (state.store) {
|
|
62
|
+
await state.store.put(bytes);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const entry = createEntry({
|
|
66
|
+
mode,
|
|
67
|
+
modeType,
|
|
68
|
+
timestamp: stat.mtime,
|
|
69
|
+
size: stat.size,
|
|
70
|
+
name: file.name,
|
|
71
|
+
c4id,
|
|
72
|
+
depth,
|
|
73
|
+
});
|
|
74
|
+
manifest.addEntry(entry);
|
|
75
|
+
state.counter.value++;
|
|
76
|
+
state.progress?.(file.relPath, state.counter.value);
|
|
77
|
+
}
|
|
78
|
+
// Recurse into subdirectories.
|
|
79
|
+
for (const dir of dirs) {
|
|
80
|
+
const fullPath = joinPath(rootPath, dir.relPath);
|
|
81
|
+
const stat = await fs.stat(fullPath);
|
|
82
|
+
const mode = stat.mode & 0o7777;
|
|
83
|
+
const dirName = dir.name.endsWith('/') ? dir.name : dir.name + '/';
|
|
84
|
+
// Directory entry — size and timestamp will be propagated later.
|
|
85
|
+
const entry = createEntry({
|
|
86
|
+
mode,
|
|
87
|
+
modeType: 'd',
|
|
88
|
+
timestamp: new Date(0),
|
|
89
|
+
size: -1,
|
|
90
|
+
name: dirName,
|
|
91
|
+
depth,
|
|
92
|
+
});
|
|
93
|
+
manifest.addEntry(entry);
|
|
94
|
+
await walkDir(fs, rootPath, dir.relPath + '/', depth + 1, manifest, state);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../../../core/src/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { C4ID } from './id.js';
|
|
2
|
+
/**
|
|
3
|
+
* Content-addressed blob storage. Any object is retrievable by its C4 ID.
|
|
4
|
+
*
|
|
5
|
+
* Implementations:
|
|
6
|
+
* - MemoryStore (core) — in-memory, for tests and small operations
|
|
7
|
+
* - IndexedDBStore (core/browser) — persistent browser storage
|
|
8
|
+
* - TreeStore (c4-node) — filesystem trie, compatible with Go/Python stores
|
|
9
|
+
*/
|
|
10
|
+
export interface Store {
|
|
11
|
+
/** Check if content exists for the given ID. */
|
|
12
|
+
has(id: C4ID): Promise<boolean>;
|
|
13
|
+
/** Retrieve content as a ReadableStream. Throws if not found. */
|
|
14
|
+
get(id: C4ID): Promise<ReadableStream<Uint8Array>>;
|
|
15
|
+
/** Store content, returning its C4 ID. Idempotent: same content = same ID, no duplicate. */
|
|
16
|
+
put(data: ReadableStream<Uint8Array> | Uint8Array): Promise<C4ID>;
|
|
17
|
+
/** Remove content by ID. Optional — not all stores support deletion. */
|
|
18
|
+
remove?(id: C4ID): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/** Error thrown when content is not found in a store. */
|
|
21
|
+
export declare class ContentNotFoundError extends Error {
|
|
22
|
+
readonly c4id: string;
|
|
23
|
+
constructor(id: C4ID);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A store that reads from multiple backends and writes to one.
|
|
27
|
+
* Reads try each store in order; the first hit wins.
|
|
28
|
+
* Writes go to the primary store only.
|
|
29
|
+
*/
|
|
30
|
+
export declare class CompositeStore implements Store {
|
|
31
|
+
private readonly primary;
|
|
32
|
+
private readonly secondaries;
|
|
33
|
+
constructor(primary: Store, ...secondaries: Store[]);
|
|
34
|
+
has(id: C4ID): Promise<boolean>;
|
|
35
|
+
get(id: C4ID): Promise<ReadableStream<Uint8Array>>;
|
|
36
|
+
put(data: ReadableStream<Uint8Array> | Uint8Array): Promise<C4ID>;
|
|
37
|
+
remove(id: C4ID): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../core/src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAEnC;;;;;;;GAOG;AACH,MAAM,WAAW,KAAK;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE/B,iEAAiE;IACjE,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;IAElD,4FAA4F;IAC5F,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjE,wEAAwE;IACxE,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjC;AAED,yDAAyD;AACzD,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBACT,EAAE,EAAE,IAAI;CAKrB;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,KAAK;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAO;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE;IAK7C,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/B,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAgBlD,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,MAAM,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Error thrown when content is not found in a store. */
|
|
2
|
+
export class ContentNotFoundError extends Error {
|
|
3
|
+
constructor(id) {
|
|
4
|
+
super(`content not found: ${id}`);
|
|
5
|
+
this.name = 'ContentNotFoundError';
|
|
6
|
+
this.c4id = id.toString();
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A store that reads from multiple backends and writes to one.
|
|
11
|
+
* Reads try each store in order; the first hit wins.
|
|
12
|
+
* Writes go to the primary store only.
|
|
13
|
+
*/
|
|
14
|
+
export class CompositeStore {
|
|
15
|
+
constructor(primary, ...secondaries) {
|
|
16
|
+
this.primary = primary;
|
|
17
|
+
this.secondaries = secondaries;
|
|
18
|
+
}
|
|
19
|
+
async has(id) {
|
|
20
|
+
if (await this.primary.has(id))
|
|
21
|
+
return true;
|
|
22
|
+
for (const s of this.secondaries) {
|
|
23
|
+
if (await s.has(id))
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
async get(id) {
|
|
29
|
+
// Try primary first
|
|
30
|
+
try {
|
|
31
|
+
if (await this.primary.has(id))
|
|
32
|
+
return this.primary.get(id);
|
|
33
|
+
}
|
|
34
|
+
catch { /* fall through */ }
|
|
35
|
+
// Try secondaries
|
|
36
|
+
for (const s of this.secondaries) {
|
|
37
|
+
try {
|
|
38
|
+
if (await s.has(id))
|
|
39
|
+
return s.get(id);
|
|
40
|
+
}
|
|
41
|
+
catch { /* fall through */ }
|
|
42
|
+
}
|
|
43
|
+
throw new ContentNotFoundError(id);
|
|
44
|
+
}
|
|
45
|
+
async put(data) {
|
|
46
|
+
return this.primary.put(data);
|
|
47
|
+
}
|
|
48
|
+
async remove(id) {
|
|
49
|
+
if (this.primary.remove)
|
|
50
|
+
await this.primary.remove(id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../core/src/store.ts"],"names":[],"mappings":"AAwBA,yDAAyD;AACzD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE7C,YAAY,EAAQ;QAClB,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAIzB,YAAY,OAAc,EAAE,GAAG,WAAoB;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAQ;QAChB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAA;QAClC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAQ;QAChB,oBAAoB;QACpB,IAAI,CAAC;YACH,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7D,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAE9B,kBAAkB;QAClB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAA6C;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAQ;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { C4ID } from "./id.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compute the tree (Merkle) ID for a set of C4IDs.
|
|
4
|
+
*
|
|
5
|
+
* Algorithm:
|
|
6
|
+
* 1. Sort IDs by digest bytes (big-endian).
|
|
7
|
+
* 2. Deduplicate adjacent equal IDs.
|
|
8
|
+
* 3. Build a Merkle tree bottom-up:
|
|
9
|
+
* - Pair adjacent IDs and sum each pair (order-independent via C4ID.sum).
|
|
10
|
+
* - An odd trailing ID promotes unchanged to the next level.
|
|
11
|
+
* - Repeat until a single root remains.
|
|
12
|
+
* 4. Empty input returns the nil ID.
|
|
13
|
+
* 5. Single element returns itself.
|
|
14
|
+
*/
|
|
15
|
+
export declare function treeId(ids: C4ID[]): Promise<C4ID>;
|
|
16
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../../../core/src/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BvD"}
|