shell-dsl 0.0.32 → 0.0.33

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 (49) hide show
  1. package/README.md +109 -0
  2. package/dist/cjs/package.json +1 -1
  3. package/dist/cjs/src/index.cjs +3 -1
  4. package/dist/cjs/src/index.cjs.map +3 -3
  5. package/dist/cjs/src/vcs/diff.cjs +102 -0
  6. package/dist/cjs/src/vcs/diff.cjs.map +10 -0
  7. package/dist/cjs/src/vcs/index.cjs +47 -0
  8. package/dist/cjs/src/vcs/index.cjs.map +10 -0
  9. package/dist/cjs/src/vcs/match.cjs +106 -0
  10. package/dist/cjs/src/vcs/match.cjs.map +10 -0
  11. package/dist/cjs/src/vcs/snapshot.cjs +112 -0
  12. package/dist/cjs/src/vcs/snapshot.cjs.map +10 -0
  13. package/dist/cjs/src/vcs/storage.cjs +120 -0
  14. package/dist/cjs/src/vcs/storage.cjs.map +10 -0
  15. package/dist/cjs/src/vcs/types.cjs +30 -0
  16. package/dist/cjs/src/vcs/types.cjs.map +9 -0
  17. package/dist/cjs/src/vcs/vcs.cjs +305 -0
  18. package/dist/cjs/src/vcs/vcs.cjs.map +10 -0
  19. package/dist/cjs/src/vcs/walk.cjs +83 -0
  20. package/dist/cjs/src/vcs/walk.cjs.map +10 -0
  21. package/dist/mjs/package.json +1 -1
  22. package/dist/mjs/src/index.mjs +3 -1
  23. package/dist/mjs/src/index.mjs.map +3 -3
  24. package/dist/mjs/src/vcs/diff.mjs +62 -0
  25. package/dist/mjs/src/vcs/diff.mjs.map +10 -0
  26. package/dist/mjs/src/vcs/index.mjs +7 -0
  27. package/dist/mjs/src/vcs/index.mjs.map +10 -0
  28. package/dist/mjs/src/vcs/match.mjs +66 -0
  29. package/dist/mjs/src/vcs/match.mjs.map +10 -0
  30. package/dist/mjs/src/vcs/snapshot.mjs +72 -0
  31. package/dist/mjs/src/vcs/snapshot.mjs.map +10 -0
  32. package/dist/mjs/src/vcs/storage.mjs +79 -0
  33. package/dist/mjs/src/vcs/storage.mjs.map +10 -0
  34. package/dist/mjs/src/vcs/types.mjs +2 -0
  35. package/dist/mjs/src/vcs/types.mjs.map +9 -0
  36. package/dist/mjs/src/vcs/vcs.mjs +265 -0
  37. package/dist/mjs/src/vcs/vcs.mjs.map +10 -0
  38. package/dist/mjs/src/vcs/walk.mjs +43 -0
  39. package/dist/mjs/src/vcs/walk.mjs.map +10 -0
  40. package/dist/types/src/index.d.ts +2 -0
  41. package/dist/types/src/vcs/diff.d.ts +10 -0
  42. package/dist/types/src/vcs/index.d.ts +2 -0
  43. package/dist/types/src/vcs/match.d.ts +5 -0
  44. package/dist/types/src/vcs/snapshot.d.ts +20 -0
  45. package/dist/types/src/vcs/storage.d.ts +22 -0
  46. package/dist/types/src/vcs/types.d.ts +74 -0
  47. package/dist/types/src/vcs/vcs.d.ts +35 -0
  48. package/dist/types/src/vcs/walk.d.ts +7 -0
  49. package/package.json +1 -1
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts"],
4
4
  "sourcesContent": [
5
- "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.mjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.mjs\";\n\n// Types\nexport type {\n VirtualFS,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.mjs\";\nexport { isRawValue } from \"./types.mjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.mjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.mjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.mjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.mjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n LiteralNode,\n VariableNode,\n SubstitutionNode,\n GlobNode,\n ConcatNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n ArithmeticNode,\n} from \"./parser/index.mjs\";\nexport {\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isLiteralNode,\n isVariableNode,\n isSubstitutionNode,\n isGlobNode,\n isConcatNode,\n isIfNode,\n isForNode,\n isWhileNode,\n isUntilNode,\n isCaseNode,\n isArithmeticNode,\n} from \"./parser/index.mjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.mjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.mjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n WebFileSystem,\n createWebUnderlyingFS,\n type PathOps,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.mjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.mjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.mjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation, globVirtualFS } from \"./utils/index.mjs\";\nexport type { GlobVirtualFS, GlobOptions } from \"./utils/index.mjs\";\n"
5
+ "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.mjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.mjs\";\n\n// Types\nexport type {\n VirtualFS,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.mjs\";\nexport { isRawValue } from \"./types.mjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.mjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.mjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.mjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.mjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n LiteralNode,\n VariableNode,\n SubstitutionNode,\n GlobNode,\n ConcatNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n ArithmeticNode,\n} from \"./parser/index.mjs\";\nexport {\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isLiteralNode,\n isVariableNode,\n isSubstitutionNode,\n isGlobNode,\n isConcatNode,\n isIfNode,\n isForNode,\n isWhileNode,\n isUntilNode,\n isCaseNode,\n isArithmeticNode,\n} from \"./parser/index.mjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.mjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.mjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n WebFileSystem,\n createWebUnderlyingFS,\n type PathOps,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.mjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.mjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.mjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation, globVirtualFS } from \"./utils/index.mjs\";\nexport type { GlobVirtualFS, GlobOptions } from \"./utils/index.mjs\";\n\n// Version Control\nexport { VersionControlSystem } from \"./vcs/index.mjs\";\nexport type {\n VCSConfig,\n Revision,\n DiffEntry,\n TreeManifest,\n FileEntry,\n CommitOptions,\n CheckoutOptions,\n LogOptions,\n LogEntry,\n BranchInfo,\n} from \"./vcs/index.mjs\";\n"
6
6
  ],
7
- "mappings": ";AACA;AACA;AAgBA;AAGA;AAGA;AAIA;AAsBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AACA;AAGA;",
8
- "debugId": "6B9F05D80609142564756E2164756E21",
7
+ "mappings": ";AACA;AACA;AAgBA;AAGA;AAGA;AAIA;AAsBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AACA;AAGA;AAIA;",
8
+ "debugId": "A64F16175D95758364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,62 @@
1
+ // src/vcs/diff.ts
2
+ import { walkTree } from "./walk.mjs";
3
+ function diffManifests(before, after) {
4
+ const entries = [];
5
+ const allPaths = new Set([...Object.keys(before), ...Object.keys(after)]);
6
+ for (const path of allPaths) {
7
+ const prev = before[path];
8
+ const curr = after[path];
9
+ if (!prev && curr) {
10
+ entries.push({ type: "add", path, content: curr.content });
11
+ } else if (prev && !curr) {
12
+ entries.push({ type: "delete", path, previousContent: prev.content });
13
+ } else if (prev && curr && prev.content !== curr.content) {
14
+ entries.push({
15
+ type: "modify",
16
+ path,
17
+ content: curr.content,
18
+ previousContent: prev.content
19
+ });
20
+ }
21
+ }
22
+ return entries.sort((a, b) => a.path.localeCompare(b.path));
23
+ }
24
+ async function diffWorkingTree(fs, rootPath, manifest, exclude = []) {
25
+ const entries = [];
26
+ const workingFiles = await walkTree(fs, rootPath, exclude);
27
+ const manifestPaths = new Set(Object.keys(manifest));
28
+ const seenPaths = new Set;
29
+ for (const relPath of workingFiles) {
30
+ seenPaths.add(relPath);
31
+ const fullPath = fs.resolve(rootPath, relPath);
32
+ const content = await fs.readFile(fullPath);
33
+ const b64 = Buffer.from(content).toString("base64");
34
+ const prev = manifest[relPath];
35
+ if (!prev) {
36
+ entries.push({ type: "add", path: relPath, content: b64 });
37
+ } else if (prev.content !== b64) {
38
+ entries.push({
39
+ type: "modify",
40
+ path: relPath,
41
+ content: b64,
42
+ previousContent: prev.content
43
+ });
44
+ }
45
+ }
46
+ for (const manifestPath of manifestPaths) {
47
+ if (!seenPaths.has(manifestPath)) {
48
+ entries.push({
49
+ type: "delete",
50
+ path: manifestPath,
51
+ previousContent: manifest[manifestPath].content
52
+ });
53
+ }
54
+ }
55
+ return entries.sort((a, b) => a.path.localeCompare(b.path));
56
+ }
57
+ export {
58
+ diffWorkingTree,
59
+ diffManifests
60
+ };
61
+
62
+ //# debugId=3823A2A2CE383E1E64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/vcs/diff.ts"],
4
+ "sourcesContent": [
5
+ "import type { VirtualFS } from \"../types.mjs\";\nimport type { TreeManifest, DiffEntry } from \"./types.mjs\";\nimport { walkTree } from \"./walk.mjs\";\n\n/**\n * Compute diff entries between two tree manifests.\n */\nexport function diffManifests(\n before: TreeManifest,\n after: TreeManifest,\n): DiffEntry[] {\n const entries: DiffEntry[] = [];\n const allPaths = new Set([...Object.keys(before), ...Object.keys(after)]);\n\n for (const path of allPaths) {\n const prev = before[path];\n const curr = after[path];\n\n if (!prev && curr) {\n entries.push({ type: \"add\", path, content: curr.content });\n } else if (prev && !curr) {\n entries.push({ type: \"delete\", path, previousContent: prev.content });\n } else if (prev && curr && prev.content !== curr.content) {\n entries.push({\n type: \"modify\",\n path,\n content: curr.content,\n previousContent: prev.content,\n });\n }\n }\n\n return entries.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/**\n * Compute diff between a tree manifest and the current working tree.\n */\nexport async function diffWorkingTree(\n fs: VirtualFS,\n rootPath: string,\n manifest: TreeManifest,\n exclude: string[] = [],\n): Promise<DiffEntry[]> {\n const entries: DiffEntry[] = [];\n const workingFiles = await walkTree(fs, rootPath, exclude);\n const manifestPaths = new Set(Object.keys(manifest));\n const seenPaths = new Set<string>();\n\n for (const relPath of workingFiles) {\n seenPaths.add(relPath);\n const fullPath = fs.resolve(rootPath, relPath);\n const content = await fs.readFile(fullPath);\n const b64 = Buffer.from(content).toString(\"base64\");\n\n const prev = manifest[relPath];\n if (!prev) {\n entries.push({ type: \"add\", path: relPath, content: b64 });\n } else if (prev.content !== b64) {\n entries.push({\n type: \"modify\",\n path: relPath,\n content: b64,\n previousContent: prev.content,\n });\n }\n }\n\n for (const manifestPath of manifestPaths) {\n if (!seenPaths.has(manifestPath)) {\n entries.push({\n type: \"delete\",\n path: manifestPath,\n previousContent: manifest[manifestPath]!.content,\n });\n }\n }\n\n return entries.sort((a, b) => a.path.localeCompare(b.path));\n}\n"
6
+ ],
7
+ "mappings": ";AAEA;AAKO,SAAS,aAAa,CAC3B,QACA,OACa;AAAA,EACb,MAAM,UAAuB,CAAC;AAAA,EAC9B,MAAM,WAAW,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EAExE,WAAW,QAAQ,UAAU;AAAA,IAC3B,MAAM,OAAO,OAAO;AAAA,IACpB,MAAM,OAAO,MAAM;AAAA,IAEnB,IAAI,CAAC,QAAQ,MAAM;AAAA,MACjB,QAAQ,KAAK,EAAE,MAAM,OAAO,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,IAC3D,EAAO,SAAI,QAAQ,CAAC,MAAM;AAAA,MACxB,QAAQ,KAAK,EAAE,MAAM,UAAU,MAAM,iBAAiB,KAAK,QAAQ,CAAC;AAAA,IACtE,EAAO,SAAI,QAAQ,QAAQ,KAAK,YAAY,KAAK,SAAS;AAAA,MACxD,QAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,SAAS,KAAK;AAAA,QACd,iBAAiB,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA;AAM5D,eAAsB,eAAe,CACnC,IACA,UACA,UACA,UAAoB,CAAC,GACC;AAAA,EACtB,MAAM,UAAuB,CAAC;AAAA,EAC9B,MAAM,eAAe,MAAM,SAAS,IAAI,UAAU,OAAO;AAAA,EACzD,MAAM,gBAAgB,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AAAA,EACnD,MAAM,YAAY,IAAI;AAAA,EAEtB,WAAW,WAAW,cAAc;AAAA,IAClC,UAAU,IAAI,OAAO;AAAA,IACrB,MAAM,WAAW,GAAG,QAAQ,UAAU,OAAO;AAAA,IAC7C,MAAM,UAAU,MAAM,GAAG,SAAS,QAAQ;AAAA,IAC1C,MAAM,MAAM,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AAAA,IAElD,MAAM,OAAO,SAAS;AAAA,IACtB,IAAI,CAAC,MAAM;AAAA,MACT,QAAQ,KAAK,EAAE,MAAM,OAAO,MAAM,SAAS,SAAS,IAAI,CAAC;AAAA,IAC3D,EAAO,SAAI,KAAK,YAAY,KAAK;AAAA,MAC/B,QAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,iBAAiB,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WAAW,gBAAgB,eAAe;AAAA,IACxC,IAAI,CAAC,UAAU,IAAI,YAAY,GAAG;AAAA,MAChC,QAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,iBAAiB,SAAS,cAAe;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA;",
8
+ "debugId": "3823A2A2CE383E1E64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,7 @@
1
+ // src/vcs/index.ts
2
+ import { VersionControlSystem } from "./vcs.mjs";
3
+ export {
4
+ VersionControlSystem
5
+ };
6
+
7
+ //# debugId=D3267E53BCD7103264756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/vcs/index.ts"],
4
+ "sourcesContent": [
5
+ "export { VersionControlSystem } from \"./vcs.mjs\";\nexport type {\n VCSConfig,\n Revision,\n DiffEntry,\n TreeManifest,\n FileEntry,\n CommitOptions,\n CheckoutOptions,\n LogOptions,\n LogEntry,\n BranchInfo,\n} from \"./types.mjs\";\n"
6
+ ],
7
+ "mappings": ";AAAA;",
8
+ "debugId": "D3267E53BCD7103264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,66 @@
1
+ // src/vcs/match.ts
2
+ function matchGlobPath(pattern, filePath) {
3
+ const p = pattern.startsWith("/") ? pattern.slice(1) : pattern;
4
+ const f = filePath.startsWith("/") ? filePath.slice(1) : filePath;
5
+ const patternParts = p.split("/");
6
+ const pathParts = f.split("/");
7
+ return matchParts(patternParts, pathParts, 0, 0);
8
+ }
9
+ function matchParts(pattern, path, pi, fi) {
10
+ while (pi < pattern.length && fi < path.length) {
11
+ const seg = pattern[pi];
12
+ if (seg === "**") {
13
+ for (let i = fi;i <= path.length; i++) {
14
+ if (matchParts(pattern, path, pi + 1, i))
15
+ return true;
16
+ }
17
+ return false;
18
+ }
19
+ if (!matchSegment(seg, path[fi]))
20
+ return false;
21
+ pi++;
22
+ fi++;
23
+ }
24
+ while (pi < pattern.length && pattern[pi] === "**")
25
+ pi++;
26
+ return pi === pattern.length && fi === path.length;
27
+ }
28
+ function matchSegment(pattern, segment) {
29
+ let regex = "^";
30
+ for (let i = 0;i < pattern.length; i++) {
31
+ const c = pattern[i];
32
+ switch (c) {
33
+ case "*":
34
+ regex += "[^/]*";
35
+ break;
36
+ case "?":
37
+ regex += "[^/]";
38
+ break;
39
+ case ".":
40
+ case "^":
41
+ case "$":
42
+ case "+":
43
+ case "{":
44
+ case "}":
45
+ case "(":
46
+ case ")":
47
+ case "|":
48
+ case "\\":
49
+ regex += "\\" + c;
50
+ break;
51
+ default:
52
+ regex += c;
53
+ }
54
+ }
55
+ regex += "$";
56
+ try {
57
+ return new RegExp(regex).test(segment);
58
+ } catch {
59
+ return false;
60
+ }
61
+ }
62
+ export {
63
+ matchGlobPath
64
+ };
65
+
66
+ //# debugId=D1FF0D8815E8C2D864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/vcs/match.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Match a file path against a glob pattern.\n * Supports `**` for recursive directory matching, `*` for single segment wildcard.\n */\nexport function matchGlobPath(pattern: string, filePath: string): boolean {\n // Normalize: strip leading slashes\n const p = pattern.startsWith(\"/\") ? pattern.slice(1) : pattern;\n const f = filePath.startsWith(\"/\") ? filePath.slice(1) : filePath;\n\n const patternParts = p.split(\"/\");\n const pathParts = f.split(\"/\");\n\n return matchParts(patternParts, pathParts, 0, 0);\n}\n\nfunction matchParts(\n pattern: string[],\n path: string[],\n pi: number,\n fi: number,\n): boolean {\n while (pi < pattern.length && fi < path.length) {\n const seg = pattern[pi]!;\n\n if (seg === \"**\") {\n // ** matches zero or more path segments\n // Try matching rest of pattern against current position and all subsequent positions\n for (let i = fi; i <= path.length; i++) {\n if (matchParts(pattern, path, pi + 1, i)) return true;\n }\n return false;\n }\n\n if (!matchSegment(seg, path[fi]!)) return false;\n pi++;\n fi++;\n }\n\n // Skip trailing ** patterns\n while (pi < pattern.length && pattern[pi] === \"**\") pi++;\n\n return pi === pattern.length && fi === path.length;\n}\n\nfunction matchSegment(pattern: string, segment: string): boolean {\n // Convert glob segment to regex\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern[i]!;\n switch (c) {\n case \"*\":\n regex += \"[^/]*\";\n break;\n case \"?\":\n regex += \"[^/]\";\n break;\n case \".\":\n case \"^\":\n case \"$\":\n case \"+\":\n case \"{\":\n case \"}\":\n case \"(\":\n case \")\":\n case \"|\":\n case \"\\\\\":\n regex += \"\\\\\" + c;\n break;\n default:\n regex += c;\n }\n }\n regex += \"$\";\n\n try {\n return new RegExp(regex).test(segment);\n } catch {\n return false;\n }\n}\n"
6
+ ],
7
+ "mappings": ";AAIO,SAAS,aAAa,CAAC,SAAiB,UAA2B;AAAA,EAExE,MAAM,IAAI,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAAA,EACvD,MAAM,IAAI,SAAS,WAAW,GAAG,IAAI,SAAS,MAAM,CAAC,IAAI;AAAA,EAEzD,MAAM,eAAe,EAAE,MAAM,GAAG;AAAA,EAChC,MAAM,YAAY,EAAE,MAAM,GAAG;AAAA,EAE7B,OAAO,WAAW,cAAc,WAAW,GAAG,CAAC;AAAA;AAGjD,SAAS,UAAU,CACjB,SACA,MACA,IACA,IACS;AAAA,EACT,OAAO,KAAK,QAAQ,UAAU,KAAK,KAAK,QAAQ;AAAA,IAC9C,MAAM,MAAM,QAAQ;AAAA,IAEpB,IAAI,QAAQ,MAAM;AAAA,MAGhB,SAAS,IAAI,GAAI,KAAK,KAAK,QAAQ,KAAK;AAAA,QACtC,IAAI,WAAW,SAAS,MAAM,KAAK,GAAG,CAAC;AAAA,UAAG,OAAO;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,CAAC,aAAa,KAAK,KAAK,GAAI;AAAA,MAAG,OAAO;AAAA,IAC1C;AAAA,IACA;AAAA,EACF;AAAA,EAGA,OAAO,KAAK,QAAQ,UAAU,QAAQ,QAAQ;AAAA,IAAM;AAAA,EAEpD,OAAO,OAAO,QAAQ,UAAU,OAAO,KAAK;AAAA;AAG9C,SAAS,YAAY,CAAC,SAAiB,SAA0B;AAAA,EAE/D,IAAI,QAAQ;AAAA,EACZ,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,IACvC,MAAM,IAAI,QAAQ;AAAA,IAClB,QAAQ;AAAA,WACD;AAAA,QACH,SAAS;AAAA,QACT;AAAA,WACG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,WACG;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,QACH,SAAS,OAAO;AAAA,QAChB;AAAA;AAAA,QAEA,SAAS;AAAA;AAAA,EAEf;AAAA,EACA,SAAS;AAAA,EAET,IAAI;AAAA,IACF,OAAO,IAAI,OAAO,KAAK,EAAE,KAAK,OAAO;AAAA,IACrC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;",
8
+ "debugId": "D1FF0D8815E8C2D864756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,72 @@
1
+ // src/vcs/snapshot.ts
2
+ import { walkTree } from "./walk.mjs";
3
+ async function buildTreeManifest(fs, rootPath, exclude = []) {
4
+ const manifest = {};
5
+ const files = await walkTree(fs, rootPath, exclude);
6
+ for (const relPath of files) {
7
+ const fullPath = fs.resolve(rootPath, relPath);
8
+ const content = await fs.readFile(fullPath);
9
+ const buf = Buffer.from(content);
10
+ manifest[relPath] = {
11
+ content: buf.toString("base64"),
12
+ size: buf.length
13
+ };
14
+ }
15
+ return manifest;
16
+ }
17
+ async function buildPartialManifest(fs, rootPath, paths) {
18
+ const manifest = {};
19
+ for (const relPath of paths) {
20
+ const fullPath = fs.resolve(rootPath, relPath);
21
+ if (!await fs.exists(fullPath))
22
+ continue;
23
+ const stat = await fs.stat(fullPath);
24
+ if (!stat.isFile())
25
+ continue;
26
+ const content = await fs.readFile(fullPath);
27
+ const buf = Buffer.from(content);
28
+ manifest[relPath] = {
29
+ content: buf.toString("base64"),
30
+ size: buf.length
31
+ };
32
+ }
33
+ return manifest;
34
+ }
35
+ async function restoreTree(fs, rootPath, manifest, options) {
36
+ const fullRestore = options?.fullRestore ?? false;
37
+ const filterPaths = options?.paths ? new Set(options.paths) : null;
38
+ for (const [relPath, entry] of Object.entries(manifest)) {
39
+ if (filterPaths && !filterPaths.has(relPath))
40
+ continue;
41
+ await writeFileFromEntry(fs, rootPath, relPath, entry);
42
+ }
43
+ if (fullRestore) {
44
+ const exclude = getVcsDirName(rootPath);
45
+ const currentFiles = await walkTree(fs, rootPath, exclude ? [exclude] : []);
46
+ for (const relPath of currentFiles) {
47
+ if (!manifest[relPath]) {
48
+ const fullPath = fs.resolve(rootPath, relPath);
49
+ await fs.rm(fullPath);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ async function writeFileFromEntry(fs, rootPath, relPath, entry) {
55
+ const fullPath = fs.resolve(rootPath, relPath);
56
+ const dir = fs.dirname(fullPath);
57
+ if (!await fs.exists(dir)) {
58
+ await fs.mkdir(dir, { recursive: true });
59
+ }
60
+ const buf = Buffer.from(entry.content, "base64");
61
+ await fs.writeFile(fullPath, buf);
62
+ }
63
+ function getVcsDirName(_rootPath) {
64
+ return ".vcs";
65
+ }
66
+ export {
67
+ restoreTree,
68
+ buildTreeManifest,
69
+ buildPartialManifest
70
+ };
71
+
72
+ //# debugId=5B02EF25655F560C64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/vcs/snapshot.ts"],
4
+ "sourcesContent": [
5
+ "import type { VirtualFS } from \"../types.mjs\";\nimport type { TreeManifest, FileEntry } from \"./types.mjs\";\nimport { walkTree } from \"./walk.mjs\";\n\n/**\n * Build a TreeManifest from the current working tree.\n */\nexport async function buildTreeManifest(\n fs: VirtualFS,\n rootPath: string,\n exclude: string[] = [],\n): Promise<TreeManifest> {\n const manifest: TreeManifest = {};\n const files = await walkTree(fs, rootPath, exclude);\n\n for (const relPath of files) {\n const fullPath = fs.resolve(rootPath, relPath);\n const content = await fs.readFile(fullPath);\n const buf = Buffer.from(content);\n manifest[relPath] = {\n content: buf.toString(\"base64\"),\n size: buf.length,\n };\n }\n\n return manifest;\n}\n\n/**\n * Build a TreeManifest for only the specified relative paths.\n */\nexport async function buildPartialManifest(\n fs: VirtualFS,\n rootPath: string,\n paths: string[],\n): Promise<TreeManifest> {\n const manifest: TreeManifest = {};\n\n for (const relPath of paths) {\n const fullPath = fs.resolve(rootPath, relPath);\n if (!(await fs.exists(fullPath))) continue;\n const stat = await fs.stat(fullPath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(fullPath);\n const buf = Buffer.from(content);\n manifest[relPath] = {\n content: buf.toString(\"base64\"),\n size: buf.length,\n };\n }\n\n return manifest;\n}\n\n/**\n * Restore a working tree from a TreeManifest.\n *\n * If `fullRestore` is true, deletes working tree files not in the manifest.\n * If `paths` is provided, only restores matching files.\n */\nexport async function restoreTree(\n fs: VirtualFS,\n rootPath: string,\n manifest: TreeManifest,\n options?: { fullRestore?: boolean; paths?: string[] },\n): Promise<void> {\n const fullRestore = options?.fullRestore ?? false;\n const filterPaths = options?.paths ? new Set(options.paths) : null;\n\n // Write files from manifest\n for (const [relPath, entry] of Object.entries(manifest)) {\n if (filterPaths && !filterPaths.has(relPath)) continue;\n await writeFileFromEntry(fs, rootPath, relPath, entry);\n }\n\n // Delete files not in manifest (full restore only)\n if (fullRestore) {\n const exclude = getVcsDirName(rootPath);\n const currentFiles = await walkTree(fs, rootPath, exclude ? [exclude] : []);\n\n for (const relPath of currentFiles) {\n if (!manifest[relPath]) {\n const fullPath = fs.resolve(rootPath, relPath);\n await fs.rm(fullPath);\n }\n }\n }\n}\n\nasync function writeFileFromEntry(\n fs: VirtualFS,\n rootPath: string,\n relPath: string,\n entry: FileEntry,\n): Promise<void> {\n const fullPath = fs.resolve(rootPath, relPath);\n const dir = fs.dirname(fullPath);\n\n // Ensure parent directory exists\n if (!(await fs.exists(dir))) {\n await fs.mkdir(dir, { recursive: true });\n }\n\n const buf = Buffer.from(entry.content, \"base64\");\n await fs.writeFile(fullPath, buf);\n}\n\nfunction getVcsDirName(_rootPath: string): string | null {\n return \".vcs\";\n}\n"
6
+ ],
7
+ "mappings": ";AAEA;AAKA,eAAsB,iBAAiB,CACrC,IACA,UACA,UAAoB,CAAC,GACE;AAAA,EACvB,MAAM,WAAyB,CAAC;AAAA,EAChC,MAAM,QAAQ,MAAM,SAAS,IAAI,UAAU,OAAO;AAAA,EAElD,WAAW,WAAW,OAAO;AAAA,IAC3B,MAAM,WAAW,GAAG,QAAQ,UAAU,OAAO;AAAA,IAC7C,MAAM,UAAU,MAAM,GAAG,SAAS,QAAQ;AAAA,IAC1C,MAAM,MAAM,OAAO,KAAK,OAAO;AAAA,IAC/B,SAAS,WAAW;AAAA,MAClB,SAAS,IAAI,SAAS,QAAQ;AAAA,MAC9B,MAAM,IAAI;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,eAAsB,oBAAoB,CACxC,IACA,UACA,OACuB;AAAA,EACvB,MAAM,WAAyB,CAAC;AAAA,EAEhC,WAAW,WAAW,OAAO;AAAA,IAC3B,MAAM,WAAW,GAAG,QAAQ,UAAU,OAAO;AAAA,IAC7C,IAAI,CAAE,MAAM,GAAG,OAAO,QAAQ;AAAA,MAAI;AAAA,IAClC,MAAM,OAAO,MAAM,GAAG,KAAK,QAAQ;AAAA,IACnC,IAAI,CAAC,KAAK,OAAO;AAAA,MAAG;AAAA,IAEpB,MAAM,UAAU,MAAM,GAAG,SAAS,QAAQ;AAAA,IAC1C,MAAM,MAAM,OAAO,KAAK,OAAO;AAAA,IAC/B,SAAS,WAAW;AAAA,MAClB,SAAS,IAAI,SAAS,QAAQ;AAAA,MAC9B,MAAM,IAAI;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAST,eAAsB,WAAW,CAC/B,IACA,UACA,UACA,SACe;AAAA,EACf,MAAM,cAAc,SAAS,eAAe;AAAA,EAC5C,MAAM,cAAc,SAAS,QAAQ,IAAI,IAAI,QAAQ,KAAK,IAAI;AAAA,EAG9D,YAAY,SAAS,UAAU,OAAO,QAAQ,QAAQ,GAAG;AAAA,IACvD,IAAI,eAAe,CAAC,YAAY,IAAI,OAAO;AAAA,MAAG;AAAA,IAC9C,MAAM,mBAAmB,IAAI,UAAU,SAAS,KAAK;AAAA,EACvD;AAAA,EAGA,IAAI,aAAa;AAAA,IACf,MAAM,UAAU,cAAc,QAAQ;AAAA,IACtC,MAAM,eAAe,MAAM,SAAS,IAAI,UAAU,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AAAA,IAE1E,WAAW,WAAW,cAAc;AAAA,MAClC,IAAI,CAAC,SAAS,UAAU;AAAA,QACtB,MAAM,WAAW,GAAG,QAAQ,UAAU,OAAO;AAAA,QAC7C,MAAM,GAAG,GAAG,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAGF,eAAe,kBAAkB,CAC/B,IACA,UACA,SACA,OACe;AAAA,EACf,MAAM,WAAW,GAAG,QAAQ,UAAU,OAAO;AAAA,EAC7C,MAAM,MAAM,GAAG,QAAQ,QAAQ;AAAA,EAG/B,IAAI,CAAE,MAAM,GAAG,OAAO,GAAG,GAAI;AAAA,IAC3B,MAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,OAAO,KAAK,MAAM,SAAS,QAAQ;AAAA,EAC/C,MAAM,GAAG,UAAU,UAAU,GAAG;AAAA;AAGlC,SAAS,aAAa,CAAC,WAAkC;AAAA,EACvD,OAAO;AAAA;",
8
+ "debugId": "5B02EF25655F560C64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,79 @@
1
+ // src/vcs/storage.ts
2
+ class VCSStorage {
3
+ fs;
4
+ basePath;
5
+ constructor(fs, basePath) {
6
+ this.fs = fs;
7
+ this.basePath = basePath;
8
+ }
9
+ path(...segments) {
10
+ return this.fs.resolve(this.basePath, ...segments);
11
+ }
12
+ async isInitialized() {
13
+ return this.fs.exists(this.path("HEAD"));
14
+ }
15
+ async initialize(defaultBranch = "main") {
16
+ await this.fs.mkdir(this.basePath, { recursive: true });
17
+ await this.fs.mkdir(this.path("refs", "heads"), { recursive: true });
18
+ await this.fs.mkdir(this.path("revisions"), { recursive: true });
19
+ await this.writeHead({ ref: `refs/heads/${defaultBranch}` });
20
+ await this.writeJSON(["counter.json"], { next: 1 });
21
+ await this.writeJSON(["config.json"], { defaultBranch });
22
+ }
23
+ async readHead() {
24
+ return this.readJSON("HEAD");
25
+ }
26
+ async writeHead(head) {
27
+ await this.writeJSON(["HEAD"], head);
28
+ }
29
+ async readBranch(name) {
30
+ const branchPath = this.path("refs", "heads", name);
31
+ if (!await this.fs.exists(branchPath))
32
+ return null;
33
+ return this.readJSON("refs", "heads", name);
34
+ }
35
+ async writeBranch(name, ref) {
36
+ await this.writeJSON(["refs", "heads", name], ref);
37
+ }
38
+ async deleteBranch(name) {
39
+ const branchPath = this.path("refs", "heads", name);
40
+ await this.fs.rm(branchPath);
41
+ }
42
+ async listBranches() {
43
+ const headsPath = this.path("refs", "heads");
44
+ try {
45
+ return await this.fs.readdir(headsPath);
46
+ } catch {
47
+ return [];
48
+ }
49
+ }
50
+ async readRevision(id) {
51
+ return this.readJSON("revisions", `${id}.json`);
52
+ }
53
+ async writeRevision(rev) {
54
+ await this.writeJSON(["revisions", `${rev.id}.json`], rev);
55
+ }
56
+ async nextRevisionId() {
57
+ const counter = await this.readJSON("counter.json");
58
+ const id = counter.next;
59
+ await this.writeJSON(["counter.json"], { next: id + 1 });
60
+ return id;
61
+ }
62
+ async readConfig() {
63
+ return this.readJSON("config.json");
64
+ }
65
+ async readJSON(...segments) {
66
+ const filePath = this.path(...segments);
67
+ const content = await this.fs.readFile(filePath, "utf8");
68
+ return JSON.parse(content);
69
+ }
70
+ async writeJSON(segments, data) {
71
+ const filePath = this.path(...segments);
72
+ await this.fs.writeFile(filePath, JSON.stringify(data, null, 2));
73
+ }
74
+ }
75
+ export {
76
+ VCSStorage
77
+ };
78
+
79
+ //# debugId=63A4490666B1400E64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/vcs/storage.ts"],
4
+ "sourcesContent": [
5
+ "import type { VirtualFS } from \"../types.mjs\";\nimport type {\n HeadRef,\n BranchRef,\n RevisionCounter,\n VCSConfigFile,\n Revision,\n} from \"./types.mjs\";\n\nexport class VCSStorage {\n constructor(\n private readonly fs: VirtualFS,\n private readonly basePath: string,\n ) {}\n\n private path(...segments: string[]): string {\n return this.fs.resolve(this.basePath, ...segments);\n }\n\n // --- Init ---\n\n async isInitialized(): Promise<boolean> {\n return this.fs.exists(this.path(\"HEAD\"));\n }\n\n async initialize(defaultBranch: string = \"main\"): Promise<void> {\n await this.fs.mkdir(this.basePath, { recursive: true });\n await this.fs.mkdir(this.path(\"refs\", \"heads\"), { recursive: true });\n await this.fs.mkdir(this.path(\"revisions\"), { recursive: true });\n\n await this.writeHead({ ref: `refs/heads/${defaultBranch}` });\n await this.writeJSON([\"counter.json\"], { next: 1 } satisfies RevisionCounter);\n await this.writeJSON([\"config.json\"], { defaultBranch } satisfies VCSConfigFile);\n }\n\n // --- HEAD ---\n\n async readHead(): Promise<HeadRef> {\n return this.readJSON<HeadRef>(\"HEAD\");\n }\n\n async writeHead(head: HeadRef): Promise<void> {\n await this.writeJSON([\"HEAD\"], head);\n }\n\n // --- Branches ---\n\n async readBranch(name: string): Promise<BranchRef | null> {\n const branchPath = this.path(\"refs\", \"heads\", name);\n if (!(await this.fs.exists(branchPath))) return null;\n return this.readJSON<BranchRef>(\"refs\", \"heads\", name);\n }\n\n async writeBranch(name: string, ref: BranchRef): Promise<void> {\n await this.writeJSON([\"refs\", \"heads\", name], ref);\n }\n\n async deleteBranch(name: string): Promise<void> {\n const branchPath = this.path(\"refs\", \"heads\", name);\n await this.fs.rm(branchPath);\n }\n\n async listBranches(): Promise<string[]> {\n const headsPath = this.path(\"refs\", \"heads\");\n try {\n return await this.fs.readdir(headsPath);\n } catch {\n return [];\n }\n }\n\n // --- Revisions ---\n\n async readRevision(id: number): Promise<Revision> {\n return this.readJSON<Revision>(\"revisions\", `${id}.json`);\n }\n\n async writeRevision(rev: Revision): Promise<void> {\n await this.writeJSON([\"revisions\", `${rev.id}.json`], rev);\n }\n\n // --- Counter ---\n\n async nextRevisionId(): Promise<number> {\n const counter = await this.readJSON<RevisionCounter>(\"counter.json\");\n const id = counter.next;\n await this.writeJSON([\"counter.json\"], { next: id + 1 } satisfies RevisionCounter);\n return id;\n }\n\n // --- Config ---\n\n async readConfig(): Promise<VCSConfigFile> {\n return this.readJSON<VCSConfigFile>(\"config.json\");\n }\n\n // --- Helpers ---\n\n private async readJSON<T>(...segments: string[]): Promise<T> {\n const filePath = this.path(...segments);\n const content = await this.fs.readFile(filePath, \"utf8\");\n return JSON.parse(content) as T;\n }\n\n private async writeJSON(segments: string[], data: unknown): Promise<void> {\n const filePath = this.path(...segments);\n await this.fs.writeFile(filePath, JSON.stringify(data, null, 2));\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "63A4490666B1400E64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# debugId=26C529951542DBDE64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "26C529951542DBDE64756E2164756E21",
8
+ "names": []
9
+ }