@telepath-computer/stash 0.1.0

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 (73) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +177 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/emitter.d.ts +2 -0
  6. package/dist/emitter.d.ts.map +1 -0
  7. package/dist/emitter.js +2 -0
  8. package/dist/emitter.js.map +1 -0
  9. package/dist/errors.d.ts +7 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +13 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/global-config.d.ts +5 -0
  14. package/dist/global-config.d.ts.map +1 -0
  15. package/dist/global-config.js +17 -0
  16. package/dist/global-config.js.map +1 -0
  17. package/dist/index.d.ts +6 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +5 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/providers/github-provider.d.ts +26 -0
  22. package/dist/providers/github-provider.d.ts.map +1 -0
  23. package/dist/providers/github-provider.js +391 -0
  24. package/dist/providers/github-provider.js.map +1 -0
  25. package/dist/providers/index.d.ts +3 -0
  26. package/dist/providers/index.d.ts.map +1 -0
  27. package/dist/providers/index.js +5 -0
  28. package/dist/providers/index.js.map +1 -0
  29. package/dist/stash.d.ts +48 -0
  30. package/dist/stash.d.ts.map +1 -0
  31. package/dist/stash.js +627 -0
  32. package/dist/stash.js.map +1 -0
  33. package/dist/types.d.ts +61 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/ui/color.d.ts +10 -0
  38. package/dist/ui/color.d.ts.map +1 -0
  39. package/dist/ui/color.js +16 -0
  40. package/dist/ui/color.js.map +1 -0
  41. package/dist/ui/format.d.ts +8 -0
  42. package/dist/ui/format.d.ts.map +1 -0
  43. package/dist/ui/format.js +80 -0
  44. package/dist/ui/format.js.map +1 -0
  45. package/dist/ui/live-line.d.ts +18 -0
  46. package/dist/ui/live-line.d.ts.map +1 -0
  47. package/dist/ui/live-line.js +65 -0
  48. package/dist/ui/live-line.js.map +1 -0
  49. package/dist/ui/sync-renderer.d.ts +14 -0
  50. package/dist/ui/sync-renderer.d.ts.map +1 -0
  51. package/dist/ui/sync-renderer.js +37 -0
  52. package/dist/ui/sync-renderer.js.map +1 -0
  53. package/dist/utils/fs.d.ts +3 -0
  54. package/dist/utils/fs.d.ts.map +1 -0
  55. package/dist/utils/fs.js +19 -0
  56. package/dist/utils/fs.js.map +1 -0
  57. package/dist/utils/hash.d.ts +3 -0
  58. package/dist/utils/hash.d.ts.map +1 -0
  59. package/dist/utils/hash.js +9 -0
  60. package/dist/utils/hash.js.map +1 -0
  61. package/dist/utils/is-tracked-path.d.ts +2 -0
  62. package/dist/utils/is-tracked-path.d.ts.map +1 -0
  63. package/dist/utils/is-tracked-path.js +23 -0
  64. package/dist/utils/is-tracked-path.js.map +1 -0
  65. package/dist/utils/text.d.ts +2 -0
  66. package/dist/utils/text.d.ts.map +1 -0
  67. package/dist/utils/text.js +14 -0
  68. package/dist/utils/text.js.map +1 -0
  69. package/dist/watch.d.ts +12 -0
  70. package/dist/watch.d.ts.map +1 -0
  71. package/dist/watch.js +291 -0
  72. package/dist/watch.js.map +1 -0
  73. package/package.json +46 -0
package/dist/watch.js ADDED
@@ -0,0 +1,291 @@
1
+ import watcher from "@parcel/watcher";
2
+ import { DisposableGroup } from "@rupertsworld/disposable";
3
+ import { lstatSync } from "node:fs";
4
+ import { relative } from "node:path";
5
+ import { isTrackedPath } from "./utils/is-tracked-path.js";
6
+ import { formatCountdown } from "./ui/format.js";
7
+ import { LiveLine } from "./ui/live-line.js";
8
+ import { SyncRenderer } from "./ui/sync-renderer.js";
9
+ const DEFAULT_DEBOUNCE_MS = 1_000;
10
+ const DEFAULT_POLL_MS = 30_000;
11
+ const CTRL_C = "\u0003";
12
+ function asDisposable(dispose) {
13
+ return { dispose };
14
+ }
15
+ function eventPath(dir, absolutePath) {
16
+ const relPath = relative(dir, absolutePath).split("\\").join("/");
17
+ if (!relPath || relPath === "." || relPath.startsWith("../")) {
18
+ return null;
19
+ }
20
+ if (!isTrackedPath(relPath)) {
21
+ return null;
22
+ }
23
+ return relPath;
24
+ }
25
+ function isSymlink(path) {
26
+ try {
27
+ return lstatSync(path).isSymbolicLink();
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export async function watch(stash, options = {}) {
34
+ if (Object.keys(stash.connections).length === 0) {
35
+ throw new Error("no connection configured — run `stash connect <provider>` first");
36
+ }
37
+ const dir = options.dir ?? process.cwd();
38
+ const stdin = options.stdin ?? process.stdin;
39
+ const stdout = options.stdout ?? process.stdout;
40
+ const debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;
41
+ const pollMs = options.pollMs ?? DEFAULT_POLL_MS;
42
+ const resources = new DisposableGroup();
43
+ const line = resources.add(new LiveLine(stdout));
44
+ const { dim, green, red } = line.colors;
45
+ let state = "idle";
46
+ let pendingEvents = false;
47
+ let debounceTimer = null;
48
+ let pollTimer = null;
49
+ let tickTimer = null;
50
+ let syncPromise = null;
51
+ let subscription = null;
52
+ let shuttingDown = false;
53
+ let status = null;
54
+ let resolveDone = null;
55
+ const done = new Promise((resolve) => {
56
+ resolveDone = resolve;
57
+ });
58
+ const interactive = stdin.isTTY && stdout.isTTY;
59
+ const renderStatus = () => {
60
+ if (!stdout.isTTY || state === "syncing" || !status) {
61
+ return;
62
+ }
63
+ const countdown = dim(`checking in ${formatCountdown(status.nextCheck)}`);
64
+ if (status.kind === "synced") {
65
+ line.update(`${green("●")} ${status.summary} ${dim("·")} ${countdown}`);
66
+ return;
67
+ }
68
+ if (status.kind === "error") {
69
+ line.update(`${red("✗")} sync failed: ${status.message} ${dim("·")} ${dim(`retrying in ${formatCountdown(status.nextCheck)}`)}`);
70
+ return;
71
+ }
72
+ line.update(`${green("●")} ${dim("up to date")} ${dim("·")} ${countdown}`);
73
+ };
74
+ const clearDebounceTimer = () => {
75
+ if (!debounceTimer) {
76
+ return;
77
+ }
78
+ clearTimeout(debounceTimer);
79
+ debounceTimer = null;
80
+ };
81
+ const clearPollTimer = () => {
82
+ if (!pollTimer) {
83
+ return;
84
+ }
85
+ clearTimeout(pollTimer);
86
+ pollTimer = null;
87
+ };
88
+ let nextCheckAt = new Date(Date.now() + pollMs);
89
+ const schedulePoll = () => {
90
+ clearPollTimer();
91
+ nextCheckAt = new Date(Date.now() + pollMs);
92
+ pollTimer = setTimeout(() => {
93
+ if (shuttingDown) {
94
+ return;
95
+ }
96
+ if (state === "idle") {
97
+ startSync();
98
+ }
99
+ }, pollMs);
100
+ };
101
+ const startDebounce = () => {
102
+ clearDebounceTimer();
103
+ debounceTimer = setTimeout(() => {
104
+ debounceTimer = null;
105
+ if (shuttingDown || state !== "debouncing") {
106
+ return;
107
+ }
108
+ startSync();
109
+ }, debounceMs);
110
+ };
111
+ const startSync = () => {
112
+ if (shuttingDown || state === "syncing") {
113
+ return;
114
+ }
115
+ clearDebounceTimer();
116
+ state = "syncing";
117
+ pendingEvents = false;
118
+ syncPromise = (async () => {
119
+ const renderer = new SyncRenderer(line);
120
+ const sub = stash.on("mutation", (mutation) => {
121
+ renderer.onMutation(mutation);
122
+ });
123
+ line.startSpinner("checking...");
124
+ try {
125
+ await stash.sync();
126
+ const summary = renderer.done();
127
+ schedulePoll();
128
+ if (summary) {
129
+ status = { kind: "synced", summary, nextCheck: nextCheckAt };
130
+ if (!stdout.isTTY) {
131
+ line.print(`✓ synced (${summary})`);
132
+ }
133
+ }
134
+ else {
135
+ status = { kind: "checked", nextCheck: nextCheckAt };
136
+ if (!stdout.isTTY) {
137
+ line.print("✓ up to date");
138
+ }
139
+ }
140
+ if (pendingEvents) {
141
+ state = "debouncing";
142
+ startDebounce();
143
+ }
144
+ else {
145
+ state = "idle";
146
+ }
147
+ renderStatus();
148
+ }
149
+ catch (error) {
150
+ renderer.error(error);
151
+ state = "idle";
152
+ schedulePoll();
153
+ const message = error instanceof Error ? error.message : String(error);
154
+ status = { kind: "error", message, nextCheck: nextCheckAt };
155
+ if (stdout.isTTY) {
156
+ renderStatus();
157
+ }
158
+ else {
159
+ line.print(`${red("✗")} sync failed: ${message}`);
160
+ }
161
+ }
162
+ finally {
163
+ sub.dispose();
164
+ renderer.dispose();
165
+ }
166
+ })();
167
+ syncPromise.finally(() => {
168
+ syncPromise = null;
169
+ });
170
+ };
171
+ const queueFilesystemEvent = () => {
172
+ if (shuttingDown) {
173
+ return;
174
+ }
175
+ if (state === "syncing") {
176
+ pendingEvents = true;
177
+ return;
178
+ }
179
+ state = "debouncing";
180
+ startDebounce();
181
+ };
182
+ const requestStop = (force) => {
183
+ if (shuttingDown) {
184
+ if (force && syncPromise) {
185
+ process.exit(130);
186
+ }
187
+ return;
188
+ }
189
+ shuttingDown = true;
190
+ clearDebounceTimer();
191
+ clearPollTimer();
192
+ void (async () => {
193
+ if (subscription) {
194
+ await subscription.unsubscribe();
195
+ }
196
+ if (syncPromise) {
197
+ await syncPromise;
198
+ }
199
+ if (interactive) {
200
+ stdin.setRawMode?.(false);
201
+ }
202
+ line.print(dim(`stopped watching ${dir}`));
203
+ resources.dispose();
204
+ if (resolveDone) {
205
+ resolveDone();
206
+ }
207
+ })();
208
+ };
209
+ subscription = await watcher.subscribe(dir, (error, events) => {
210
+ if (error) {
211
+ const message = error instanceof Error ? error.message : String(error);
212
+ schedulePoll();
213
+ status = { kind: "error", message, nextCheck: nextCheckAt };
214
+ if (stdout.isTTY) {
215
+ renderStatus();
216
+ }
217
+ else {
218
+ line.print(`${red("✗")} watcher error: ${message}`);
219
+ }
220
+ return;
221
+ }
222
+ for (const event of events) {
223
+ const relPath = eventPath(dir, event.path);
224
+ if (!relPath) {
225
+ continue;
226
+ }
227
+ if (event.type !== "delete" && isSymlink(event.path)) {
228
+ continue;
229
+ }
230
+ queueFilesystemEvent();
231
+ break;
232
+ }
233
+ });
234
+ resources.add(asDisposable(() => {
235
+ if (subscription) {
236
+ void subscription.unsubscribe();
237
+ }
238
+ }));
239
+ if (interactive) {
240
+ stdin.setRawMode?.(true);
241
+ stdin.resume();
242
+ const onData = (chunk) => {
243
+ for (const key of chunk.toString("utf8")) {
244
+ if (key === "." && !shuttingDown) {
245
+ if (state === "debouncing") {
246
+ clearDebounceTimer();
247
+ }
248
+ if (state === "syncing") {
249
+ pendingEvents = true;
250
+ continue;
251
+ }
252
+ startSync();
253
+ continue;
254
+ }
255
+ if (key === "q") {
256
+ requestStop(false);
257
+ return;
258
+ }
259
+ if (key === CTRL_C) {
260
+ requestStop(true);
261
+ }
262
+ }
263
+ };
264
+ stdin.on("data", onData);
265
+ resources.add(asDisposable(() => {
266
+ stdin.off("data", onData);
267
+ }));
268
+ }
269
+ const onSigInt = () => {
270
+ requestStop(true);
271
+ };
272
+ process.on("SIGINT", onSigInt);
273
+ resources.add(asDisposable(() => {
274
+ process.off("SIGINT", onSigInt);
275
+ }));
276
+ if (stdout.isTTY) {
277
+ tickTimer = setInterval(() => {
278
+ renderStatus();
279
+ }, 1_000);
280
+ resources.add(asDisposable(() => {
281
+ if (tickTimer) {
282
+ clearInterval(tickTimer);
283
+ tickTimer = null;
284
+ }
285
+ }));
286
+ }
287
+ line.print(dim(`watching ${dir} (. to sync, q to quit)`));
288
+ startSync();
289
+ await done;
290
+ }
291
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC;AAiBxB,SAAS,YAAY,CAAC,OAAmB;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,YAAoB;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAY,EAAE,UAAwB,EAAE;IAClE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;IAExC,IAAI,KAAK,GAAe,MAAM,CAAC;IAC/B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,aAAa,GAA0B,IAAI,CAAC;IAChD,IAAI,SAAS,GAA0B,IAAI,CAAC;IAC5C,IAAI,SAAS,GAA0B,IAAI,CAAC;IAC5C,IAAI,WAAW,GAAyB,IAAI,CAAC;IAC7C,IAAI,YAAY,GAAyD,IAAI,CAAC;IAC9E,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,MAAM,GAAuB,IAAI,CAAC;IACtC,IAAI,WAAW,GAAwB,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACzC,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;IAEhD,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,eAAe,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjI,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAS,EAAE;QACpC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,YAAY,CAAC,aAAa,CAAC,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,WAAW,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,cAAc,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;QAC5C,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,kBAAkB,EAAE,CAAC;QACrB,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,aAAa,GAAG,IAAI,CAAC;YACrB,IAAI,YAAY,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;gBAC3C,OAAO;YACT,CAAC;YACD,SAAS,EAAE,CAAC;QACd,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,IAAI,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,kBAAkB,EAAE,CAAC;QACrB,KAAK,GAAG,SAAS,CAAC;QAClB,aAAa,GAAG,KAAK,CAAC;QAEtB,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC5C,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAEjC,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEhC,YAAY,EAAE,CAAC;gBAEf,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;oBAC7D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,IAAI,CAAC,KAAK,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;oBACrD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,IAAI,aAAa,EAAE,CAAC;oBAClB,KAAK,GAAG,YAAY,CAAC;oBACrB,aAAa,EAAE,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,MAAM,CAAC;gBACjB,CAAC;gBAED,YAAY,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;gBAC/B,KAAK,GAAG,MAAM,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;gBAC5D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,YAAY,EAAE,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;YACvB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAS,EAAE;QACtC,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,GAAG,YAAY,CAAC;QACrB,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAQ,EAAE;QAC3C,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,OAAO;QACT,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;QACpB,kBAAkB,EAAE,CAAC;QACrB,cAAc,EAAE,CAAC;QAEjB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC;YACnC,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,WAAW,CAAC;YACpB,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3C,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,YAAY,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,YAAY,EAAE,CAAC;YACf,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;YAC5D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;YACD,oBAAoB,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;IACH,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE;QAC9B,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IAEJ,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;YACrC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBACjC,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;wBAC3B,kBAAkB,EAAE,CAAC;oBACvB,CAAC;oBACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,aAAa,GAAG,IAAI,CAAC;wBACrB,SAAS;oBACX,CAAC;oBACD,SAAS,EAAE,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;oBAChB,WAAW,CAAC,KAAK,CAAC,CAAC;oBACnB,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,WAAW,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,SAAS,CAAC,GAAG,CACX,YAAY,CAAC,GAAG,EAAE;YAChB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,SAAS,CAAC,GAAG,CACX,YAAY,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CACH,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAC3B,YAAY,EAAE,CAAC;QACjB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,SAAS,CAAC,GAAG,CACX,YAAY,CAAC,GAAG,EAAE;YAChB,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,CAAC,SAAS,CAAC,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,yBAAyB,CAAC,CAAC,CAAC;IAC1D,SAAS,EAAE,CAAC;IACZ,MAAM,IAAI,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@telepath-computer/stash",
3
+ "version": "0.1.0",
4
+ "description": "Conflict-free synced folders",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "stash": "dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "npm run build",
17
+ "stash": "node ./src/cli.ts",
18
+ "test": "node --test tests/unit/*.test.ts tests/integration/*.test.ts",
19
+ "test:e2e": "node --test tests/e2e/*.test.ts",
20
+ "test:all": "npm test && npm run test:e2e"
21
+ },
22
+ "keywords": [
23
+ "sync",
24
+ "files",
25
+ "merge",
26
+ "conflict-free"
27
+ ],
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/telepath-computer/stash.git",
31
+ "directory": "code"
32
+ },
33
+ "license": "ISC",
34
+ "dependencies": {
35
+ "@inquirer/prompts": "^8.3.0",
36
+ "@parcel/watcher": "^2.5.6",
37
+ "@rupertsworld/disposable": "^0.1.0",
38
+ "@rupertsworld/emitter": "^0.1.0",
39
+ "commander": "^14.0.3",
40
+ "diff-match-patch": "^1.0.5"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^25.3.3",
44
+ "typescript": "^5.9.3"
45
+ }
46
+ }