@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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from "node:fs";
3
+ import { Command, Option } from "commander";
4
+ import { input, password } from "@inquirer/prompts";
5
+ import { readGlobalConfig, writeGlobalConfig } from "./global-config.js";
6
+ import { providers } from "./providers/index.js";
7
+ import { Stash } from "./stash.js";
8
+ import { LiveLine } from "./ui/live-line.js";
9
+ import { SyncRenderer } from "./ui/sync-renderer.js";
10
+ import { watch as watchStash } from "./watch.js";
11
+ function getProvider(name) {
12
+ const provider = providers[name];
13
+ if (!provider) {
14
+ throw new Error(`Unknown provider: ${name}`);
15
+ }
16
+ return provider;
17
+ }
18
+ async function promptField(field) {
19
+ if (field.secret) {
20
+ return password({ message: field.label });
21
+ }
22
+ return input({ message: field.label });
23
+ }
24
+ async function collectFields(fields, valuesFromCli, current = {}) {
25
+ const values = { ...current };
26
+ for (const field of fields) {
27
+ if (values[field.name]) {
28
+ continue;
29
+ }
30
+ if (valuesFromCli[field.name]) {
31
+ values[field.name] = valuesFromCli[field.name];
32
+ continue;
33
+ }
34
+ values[field.name] = await promptField(field);
35
+ }
36
+ return values;
37
+ }
38
+ async function runInit() {
39
+ const dir = process.cwd();
40
+ const already = existsSync(`${dir}/.stash`);
41
+ await Stash.init(dir, await readGlobalConfig());
42
+ if (already) {
43
+ console.log("Already initialized. Delete .stash to reinitialize.");
44
+ }
45
+ else {
46
+ console.log("Initialized stash.");
47
+ }
48
+ }
49
+ async function runSetup(providerName, valuesFromCli) {
50
+ const provider = getProvider(providerName);
51
+ const globalConfig = await readGlobalConfig();
52
+ const values = await collectFields(provider.spec.setup, valuesFromCli, globalConfig[providerName] ?? {});
53
+ globalConfig[providerName] = values;
54
+ await writeGlobalConfig(globalConfig);
55
+ console.log(`Configured ${providerName}.`);
56
+ }
57
+ async function runConnect(providerName, valuesFromCli) {
58
+ const provider = getProvider(providerName);
59
+ const globalConfig = await readGlobalConfig();
60
+ const setupValues = await collectFields(provider.spec.setup, valuesFromCli, globalConfig[providerName] ?? {});
61
+ globalConfig[providerName] = setupValues;
62
+ await writeGlobalConfig(globalConfig);
63
+ const stash = await Stash.load(process.cwd(), globalConfig);
64
+ const connectValues = await collectFields(provider.spec.connect, valuesFromCli);
65
+ await stash.connect(providerName, connectValues);
66
+ console.log(`Connected ${providerName}.`);
67
+ }
68
+ async function runDisconnect(providerName) {
69
+ const stash = await Stash.load(process.cwd(), await readGlobalConfig());
70
+ await stash.disconnect(providerName);
71
+ console.log(`Disconnected ${providerName}.`);
72
+ }
73
+ async function runSync() {
74
+ const stash = await Stash.load(process.cwd(), await readGlobalConfig());
75
+ const line = new LiveLine(process.stdout);
76
+ const { green, red } = line.colors;
77
+ const renderer = new SyncRenderer(line);
78
+ const subscription = stash.on("mutation", (mutation) => {
79
+ renderer.onMutation(mutation);
80
+ });
81
+ line.startSpinner("checking...");
82
+ try {
83
+ await stash.sync();
84
+ const summary = renderer.done();
85
+ line.print(summary ? `${green("✓")} synced (${summary})` : `${green("✓")} up to date`);
86
+ }
87
+ catch (error) {
88
+ renderer.error(error);
89
+ line.print(`${red("✗")} sync failed: ${error instanceof Error ? error.message : String(error)}`);
90
+ process.exitCode = 1;
91
+ }
92
+ finally {
93
+ subscription.dispose();
94
+ renderer.dispose();
95
+ line.dispose();
96
+ }
97
+ }
98
+ async function runWatch() {
99
+ const dir = process.cwd();
100
+ const stash = await Stash.load(dir, await readGlobalConfig());
101
+ if (Object.keys(stash.connections).length === 0) {
102
+ throw new Error("no connection configured — run `stash connect <provider>` first");
103
+ }
104
+ await watchStash(stash, { dir, stdin: process.stdin, stdout: process.stdout });
105
+ }
106
+ async function runStatus() {
107
+ const stash = await Stash.load(process.cwd(), await readGlobalConfig());
108
+ const status = stash.status();
109
+ console.log("Connections:");
110
+ console.log(JSON.stringify(stash.connections, null, 2));
111
+ console.log("Changes:");
112
+ console.log(JSON.stringify(status, null, 2));
113
+ }
114
+ function addFieldOptions(command, fields) {
115
+ for (const field of fields) {
116
+ command.addOption(new Option(`--${field.name} <value>`, field.label));
117
+ }
118
+ }
119
+ async function main(argv = process.argv) {
120
+ const program = new Command()
121
+ .name("stash")
122
+ .description("Conflict-free synced folders")
123
+ .showHelpAfterError();
124
+ program.command("init").description("Initialize current directory as a stash").action(runInit);
125
+ const setupCommand = program
126
+ .command("setup")
127
+ .description("Configure global provider settings")
128
+ .argument("<provider>", "Provider name")
129
+ .allowUnknownOption(true)
130
+ .action(async (providerName, _opts, command) => {
131
+ await runSetup(providerName, command.opts());
132
+ });
133
+ const connectCommand = program
134
+ .command("connect")
135
+ .description("Connect this stash to a provider")
136
+ .argument("<provider>", "Provider name")
137
+ .allowUnknownOption(true)
138
+ .action(async (providerName, _opts, command) => {
139
+ await runConnect(providerName, command.opts());
140
+ });
141
+ const disconnectCommand = program
142
+ .command("disconnect")
143
+ .description("Disconnect provider from this stash")
144
+ .argument("<provider>", "Provider name")
145
+ .action(async (providerName) => {
146
+ await runDisconnect(providerName);
147
+ });
148
+ program.command("sync").description("Sync local files with connections").action(runSync);
149
+ program.command("watch").description("Watch and sync continuously").action(runWatch);
150
+ program.command("status").description("Show local stash status").action(runStatus);
151
+ const commandName = argv[2];
152
+ const providerName = argv[3];
153
+ if (providerName && (commandName === "setup" || commandName === "connect")) {
154
+ const provider = providers[providerName];
155
+ if (provider) {
156
+ if (commandName === "setup") {
157
+ addFieldOptions(setupCommand, provider.spec.setup);
158
+ }
159
+ else {
160
+ addFieldOptions(connectCommand, [
161
+ ...provider.spec.setup,
162
+ ...provider.spec.connect,
163
+ ]);
164
+ }
165
+ }
166
+ }
167
+ if (argv.length <= 2) {
168
+ program.outputHelp();
169
+ return;
170
+ }
171
+ await program.parseAsync(argv);
172
+ }
173
+ main().catch((error) => {
174
+ console.error(error instanceof Error ? error.message : String(error));
175
+ process.exitCode = 1;
176
+ });
177
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,YAAY,CAAC;AAGjD,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAY;IACrC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAe,EACf,aAAiD,EACjD,UAAkC,EAAE;IAEpC,MAAM,MAAM,GAA2B,EAAE,GAAG,OAAO,EAAE,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;YAChD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,YAAoB,EACpB,aAAiD;IAEjD,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,QAAQ,CAAC,IAAI,CAAC,KAAK,EACnB,aAAa,EACb,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CACjC,CAAC;IACF,YAAY,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;IACpC,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,YAAoB,EACpB,aAAiD;IAEjD,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,aAAa,CACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,EACnB,aAAa,EACb,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CACjC,CAAC;IACF,YAAY,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC;IACzC,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAChF,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAAoB;IAC/C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACxE,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;QACrD,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC;IAC9D,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;IACD,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB,EAAE,MAAe;IACxD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,8BAA8B,CAAC;SAC3C,kBAAkB,EAAE,CAAC;IAExB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/F,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oCAAoC,CAAC;SACjD,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,KAAc,EAAE,OAAgB,EAAE,EAAE;QACvE,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,EAAwC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEL,MAAM,cAAc,GAAG,OAAO;SAC3B,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,KAAc,EAAE,OAAgB,EAAE,EAAE;QACvE,MAAM,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,EAAwC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEL,MAAM,iBAAiB,GAAG,OAAO;SAC9B,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,EAAE;QACrC,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrF,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnF,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,YAAY,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,SAAS,CAAC,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,cAAc,EAAE;oBAC9B,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK;oBACtB,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Emitter, type Disposable } from "@rupertsworld/emitter";
2
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Emitter } from "@rupertsworld/emitter";
2
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class PushConflictError extends Error {
2
+ constructor(message?: string);
3
+ }
4
+ export declare class SyncLockError extends Error {
5
+ constructor(message?: string);
6
+ }
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,SAAkB;CAItC;AAED,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,SAA6B;CAIjD"}
package/dist/errors.js ADDED
@@ -0,0 +1,13 @@
1
+ export class PushConflictError extends Error {
2
+ constructor(message = "push conflict") {
3
+ super(message);
4
+ this.name = "PushConflictError";
5
+ }
6
+ }
7
+ export class SyncLockError extends Error {
8
+ constructor(message = "sync already in progress") {
9
+ super(message);
10
+ this.name = "SyncLockError";
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,GAAG,eAAe;QACnC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,GAAG,0BAA0B;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { GlobalConfig } from "./types.ts";
2
+ export declare function getGlobalConfigPath(): string;
3
+ export declare function readGlobalConfig(): Promise<GlobalConfig>;
4
+ export declare function writeGlobalConfig(config: GlobalConfig): Promise<void>;
5
+ //# sourceMappingURL=global-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../src/global-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAE9D;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E"}
@@ -0,0 +1,17 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { readJsonFile, writeJsonFile } from "./utils/fs.js";
4
+ export function getGlobalConfigPath() {
5
+ const xdg = process.env.XDG_CONFIG_HOME;
6
+ if (xdg) {
7
+ return join(xdg, "stash", "config.json");
8
+ }
9
+ return join(homedir(), ".stash", "config.json");
10
+ }
11
+ export async function readGlobalConfig() {
12
+ return readJsonFile(getGlobalConfigPath(), {});
13
+ }
14
+ export async function writeGlobalConfig(config) {
15
+ await writeJsonFile(getGlobalConfigPath(), config);
16
+ }
17
+ //# sourceMappingURL=global-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.js","sourceRoot":"","sources":["../src/global-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,YAAY,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAoB;IAC1D,MAAM,aAAa,CAAC,mBAAmB,EAAE,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { Stash } from "./stash.ts";
2
+ export { GitHubProvider } from "./providers/github-provider.ts";
3
+ export { PushConflictError, SyncLockError } from "./errors.ts";
4
+ export { getGlobalConfigPath, readGlobalConfig, writeGlobalConfig, } from "./global-config.ts";
5
+ export type { ChangeSet, ConnectionConfig, Field, FileMutation, FileState, GlobalConfig, Provider, ProviderSpec, PushPayload, SnapshotEntry, StatusResult, } from "./types.ts";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { Stash } from "./stash.js";
2
+ export { GitHubProvider } from "./providers/github-provider.js";
3
+ export { PushConflictError, SyncLockError } from "./errors.js";
4
+ export { getGlobalConfigPath, readGlobalConfig, writeGlobalConfig, } from "./global-config.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Readable } from "node:stream";
2
+ import type { ChangeSet, Provider, ProviderSpec, PushPayload, SnapshotEntry } from "../types.ts";
3
+ export interface GitHubConfig {
4
+ token: string;
5
+ repo: string;
6
+ }
7
+ export declare class GitHubProvider implements Provider {
8
+ static spec: ProviderSpec;
9
+ private readonly token;
10
+ private readonly owner;
11
+ private readonly name;
12
+ private headSha;
13
+ private baseTreeSha;
14
+ constructor(config: GitHubConfig);
15
+ fetch(localSnapshot?: Record<string, SnapshotEntry>): Promise<ChangeSet>;
16
+ get(path: string): Promise<Readable>;
17
+ push(payload: PushPayload): Promise<void>;
18
+ private repoPath;
19
+ private bootstrapEmptyRepo;
20
+ private rest;
21
+ private ensureOk;
22
+ private fetchBlobMetadata;
23
+ private fetchRawBytes;
24
+ private createBlob;
25
+ }
26
+ //# sourceMappingURL=github-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-provider.d.ts","sourceRoot":"","sources":["../../src/providers/github-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,KAAK,EACV,SAAS,EAET,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,aAAa,CAAC;AA6BrB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAID,qBAAa,cAAe,YAAW,QAAQ;IAC7C,MAAM,CAAC,IAAI,EAAE,YAAY,CAGvB;IAEF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,WAAW,CAAqB;gBAE5B,MAAM,EAAE,YAAY;IAoB1B,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAqKxE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKpC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyG/C,OAAO,CAAC,QAAQ;YAIF,kBAAkB;YA8BlB,IAAI;YAkCJ,QAAQ;YAQR,iBAAiB;YAoDjB,aAAa;YAWb,UAAU;CASzB"}