@tinyrack/dotweave 0.39.4
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/bin/index.js +5 -0
- package/dist/application.d.ts +5 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +86 -0
- package/dist/application.js.map +1 -0
- package/dist/cli/autocomplete.d.ts +7 -0
- package/dist/cli/autocomplete.d.ts.map +1 -0
- package/dist/cli/autocomplete.js +62 -0
- package/dist/cli/autocomplete.js.map +1 -0
- package/dist/cli/cd.d.ts +4 -0
- package/dist/cli/cd.d.ts.map +1 -0
- package/dist/cli/cd.js +23 -0
- package/dist/cli/cd.js.map +1 -0
- package/dist/cli/doctor.d.ts +4 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +92 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +110 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/profile/index.d.ts +3 -0
- package/dist/cli/profile/index.d.ts.map +1 -0
- package/dist/cli/profile/index.js +15 -0
- package/dist/cli/profile/index.js.map +1 -0
- package/dist/cli/profile/list.d.ts +4 -0
- package/dist/cli/profile/list.d.ts.map +1 -0
- package/dist/cli/profile/list.js +42 -0
- package/dist/cli/profile/list.js.map +1 -0
- package/dist/cli/profile/use.d.ts +4 -0
- package/dist/cli/profile/use.d.ts.map +1 -0
- package/dist/cli/profile/use.js +49 -0
- package/dist/cli/profile/use.js.map +1 -0
- package/dist/cli/pull.d.ts +4 -0
- package/dist/cli/pull.d.ts.map +1 -0
- package/dist/cli/pull.js +107 -0
- package/dist/cli/pull.js.map +1 -0
- package/dist/cli/push.d.ts +4 -0
- package/dist/cli/push.d.ts.map +1 -0
- package/dist/cli/push.js +49 -0
- package/dist/cli/push.js.map +1 -0
- package/dist/cli/root-commands.d.ts +13 -0
- package/dist/cli/root-commands.d.ts.map +1 -0
- package/dist/cli/root-commands.js +25 -0
- package/dist/cli/root-commands.js.map +1 -0
- package/dist/cli/status.d.ts +4 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +132 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/track.d.ts +4 -0
- package/dist/cli/track.d.ts.map +1 -0
- package/dist/cli/track.js +133 -0
- package/dist/cli/track.js.map +1 -0
- package/dist/cli/untrack.d.ts +4 -0
- package/dist/cli/untrack.d.ts.map +1 -0
- package/dist/cli/untrack.js +40 -0
- package/dist/cli/untrack.js.map +1 -0
- package/dist/config/constants.d.ts +31 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +33 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/global-config.d.ts +21 -0
- package/dist/config/global-config.d.ts.map +1 -0
- package/dist/config/global-config.js +89 -0
- package/dist/config/global-config.js.map +1 -0
- package/dist/config/identity-file.d.ts +9 -0
- package/dist/config/identity-file.d.ts.map +1 -0
- package/dist/config/identity-file.js +48 -0
- package/dist/config/identity-file.js.map +1 -0
- package/dist/config/migration.d.ts +9 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +61 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/platform.d.ts +12 -0
- package/dist/config/platform.d.ts.map +1 -0
- package/dist/config/platform.js +25 -0
- package/dist/config/platform.js.map +1 -0
- package/dist/config/runtime-env.d.ts +7 -0
- package/dist/config/runtime-env.d.ts.map +1 -0
- package/dist/config/runtime-env.js +31 -0
- package/dist/config/runtime-env.js.map +1 -0
- package/dist/config/sync-entry.d.ts +14 -0
- package/dist/config/sync-entry.d.ts.map +1 -0
- package/dist/config/sync-entry.js +99 -0
- package/dist/config/sync-entry.js.map +1 -0
- package/dist/config/sync-schema.d.ts +146 -0
- package/dist/config/sync-schema.d.ts.map +1 -0
- package/dist/config/sync-schema.js +392 -0
- package/dist/config/sync-schema.js.map +1 -0
- package/dist/config/sync.d.ts +8 -0
- package/dist/config/sync.d.ts.map +1 -0
- package/dist/config/sync.js +53 -0
- package/dist/config/sync.js.map +1 -0
- package/dist/config/xdg.d.ts +10 -0
- package/dist/config/xdg.d.ts.map +1 -0
- package/dist/config/xdg.js +90 -0
- package/dist/config/xdg.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/content.d.ts +5 -0
- package/dist/lib/content.d.ts.map +1 -0
- package/dist/lib/content.js +29 -0
- package/dist/lib/content.js.map +1 -0
- package/dist/lib/crypto.d.ts +45 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +130 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/env.d.ts +13 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +50 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/error.d.ts +22 -0
- package/dist/lib/error.d.ts.map +1 -0
- package/dist/lib/error.js +50 -0
- package/dist/lib/error.js.map +1 -0
- package/dist/lib/file-mode.d.ts +36 -0
- package/dist/lib/file-mode.d.ts.map +1 -0
- package/dist/lib/file-mode.js +55 -0
- package/dist/lib/file-mode.js.map +1 -0
- package/dist/lib/filesystem.d.ts +60 -0
- package/dist/lib/filesystem.d.ts.map +1 -0
- package/dist/lib/filesystem.js +190 -0
- package/dist/lib/filesystem.js.map +1 -0
- package/dist/lib/git.d.ts +23 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +162 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/jsonc.d.ts +8 -0
- package/dist/lib/jsonc.d.ts.map +1 -0
- package/dist/lib/jsonc.js +78 -0
- package/dist/lib/jsonc.js.map +1 -0
- package/dist/lib/path.d.ts +21 -0
- package/dist/lib/path.d.ts.map +1 -0
- package/dist/lib/path.js +44 -0
- package/dist/lib/path.js.map +1 -0
- package/dist/lib/promise.d.ts +10 -0
- package/dist/lib/promise.d.ts.map +1 -0
- package/dist/lib/promise.js +25 -0
- package/dist/lib/promise.js.map +1 -0
- package/dist/lib/string.d.ts +6 -0
- package/dist/lib/string.d.ts.map +1 -0
- package/dist/lib/string.js +8 -0
- package/dist/lib/string.js.map +1 -0
- package/dist/lib/validation.d.ts +7 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +13 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +4 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/migrations/global-v3.d.ts +3 -0
- package/dist/migrations/global-v3.d.ts.map +1 -0
- package/dist/migrations/global-v3.js +5 -0
- package/dist/migrations/global-v3.js.map +1 -0
- package/dist/services/autocomplete.d.ts +5 -0
- package/dist/services/autocomplete.d.ts.map +1 -0
- package/dist/services/autocomplete.js +185 -0
- package/dist/services/autocomplete.js.map +1 -0
- package/dist/services/config-file.d.ts +73 -0
- package/dist/services/config-file.d.ts.map +1 -0
- package/dist/services/config-file.js +40 -0
- package/dist/services/config-file.js.map +1 -0
- package/dist/services/doctor.d.ts +16 -0
- package/dist/services/doctor.d.ts.map +1 -0
- package/dist/services/doctor.js +126 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/init.d.ts +24 -0
- package/dist/services/init.d.ts.map +1 -0
- package/dist/services/init.js +265 -0
- package/dist/services/init.js.map +1 -0
- package/dist/services/local-materialization.d.ts +30 -0
- package/dist/services/local-materialization.d.ts.map +1 -0
- package/dist/services/local-materialization.js +451 -0
- package/dist/services/local-materialization.js.map +1 -0
- package/dist/services/local-snapshot.d.ts +26 -0
- package/dist/services/local-snapshot.d.ts.map +1 -0
- package/dist/services/local-snapshot.js +119 -0
- package/dist/services/local-snapshot.js.map +1 -0
- package/dist/services/paths.d.ts +8 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/paths.js +71 -0
- package/dist/services/paths.js.map +1 -0
- package/dist/services/profile.d.ts +39 -0
- package/dist/services/profile.d.ts.map +1 -0
- package/dist/services/profile.js +124 -0
- package/dist/services/profile.js.map +1 -0
- package/dist/services/pull.d.ts +38 -0
- package/dist/services/pull.d.ts.map +1 -0
- package/dist/services/pull.js +148 -0
- package/dist/services/pull.js.map +1 -0
- package/dist/services/push.d.ts +38 -0
- package/dist/services/push.d.ts.map +1 -0
- package/dist/services/push.js +120 -0
- package/dist/services/push.js.map +1 -0
- package/dist/services/repo-artifacts.d.ts +52 -0
- package/dist/services/repo-artifacts.d.ts.map +1 -0
- package/dist/services/repo-artifacts.js +325 -0
- package/dist/services/repo-artifacts.js.map +1 -0
- package/dist/services/repo-snapshot.d.ts +7 -0
- package/dist/services/repo-snapshot.d.ts.map +1 -0
- package/dist/services/repo-snapshot.js +181 -0
- package/dist/services/repo-snapshot.js.map +1 -0
- package/dist/services/runtime.d.ts +30 -0
- package/dist/services/runtime.d.ts.map +1 -0
- package/dist/services/runtime.js +71 -0
- package/dist/services/runtime.js.map +1 -0
- package/dist/services/set.d.ts +41 -0
- package/dist/services/set.d.ts.map +1 -0
- package/dist/services/set.js +288 -0
- package/dist/services/set.js.map +1 -0
- package/dist/services/status.d.ts +41 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +87 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/terminal/cli-runtime.d.ts +18 -0
- package/dist/services/terminal/cli-runtime.d.ts.map +1 -0
- package/dist/services/terminal/cli-runtime.js +19 -0
- package/dist/services/terminal/cli-runtime.js.map +1 -0
- package/dist/services/terminal/logger.d.ts +9 -0
- package/dist/services/terminal/logger.d.ts.map +1 -0
- package/dist/services/terminal/logger.js +15 -0
- package/dist/services/terminal/logger.js.map +1 -0
- package/dist/services/terminal/path-completion.d.ts +3 -0
- package/dist/services/terminal/path-completion.d.ts.map +1 -0
- package/dist/services/terminal/path-completion.js +108 -0
- package/dist/services/terminal/path-completion.js.map +1 -0
- package/dist/services/terminal/shell.d.ts +24 -0
- package/dist/services/terminal/shell.d.ts.map +1 -0
- package/dist/services/terminal/shell.js +227 -0
- package/dist/services/terminal/shell.js.map +1 -0
- package/dist/services/track.d.ts +20 -0
- package/dist/services/track.d.ts.map +1 -0
- package/dist/services/track.js +224 -0
- package/dist/services/track.js.map +1 -0
- package/dist/services/untrack.d.ts +13 -0
- package/dist/services/untrack.d.ts.map +1 -0
- package/dist/services/untrack.js +133 -0
- package/dist/services/untrack.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Limits the number of concurrent asynchronous operations.
|
|
3
|
+
*
|
|
4
|
+
* @param concurrency - The maximum number of concurrent operations.
|
|
5
|
+
* @param items - The items to process.
|
|
6
|
+
* @param mapper - The mapping function that returns a promise.
|
|
7
|
+
* @returns A promise that resolves to an array of the results.
|
|
8
|
+
*/
|
|
9
|
+
export const limitConcurrency = async (concurrency, items, mapper) => {
|
|
10
|
+
const results = new Array(items.length);
|
|
11
|
+
let currentIndex = 0;
|
|
12
|
+
const worker = async () => {
|
|
13
|
+
while (currentIndex < items.length) {
|
|
14
|
+
const index = currentIndex;
|
|
15
|
+
currentIndex += 1;
|
|
16
|
+
results[index] = await mapper(items[index], index);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => {
|
|
20
|
+
return worker();
|
|
21
|
+
});
|
|
22
|
+
await Promise.all(workers);
|
|
23
|
+
return results;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../src/lib/promise.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,WAAmB,EACnB,KAAmB,EACnB,MAA8C,EAChC,EAAE;IAChB,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,YAAY,CAAC;YAC3B,YAAY,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAM,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAC/C,GAAG,EAAE;QACH,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/lib/string.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,WAElD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/lib/string.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAE,EAAE;IACrD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;AACrD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,CAAC,CAAC,QAAQ,EAAE,KAAG,MAQxD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description
|
|
3
|
+
* Formats validation issues into CLI-friendly input error messages.
|
|
4
|
+
*/
|
|
5
|
+
export const formatInputIssues = (issues) => {
|
|
6
|
+
return issues
|
|
7
|
+
.map((issue) => {
|
|
8
|
+
const path = issue.path.length === 0 ? "input" : issue.path.join(".");
|
|
9
|
+
return `- ${path}: ${issue.message}`;
|
|
10
|
+
})
|
|
11
|
+
.join("\n");
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAoB,EAAU,EAAE;IAChE,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtE,OAAO,KAAK,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,QAAiD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-v3.d.ts","sourceRoot":"","sources":["../../src/migrations/global-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,eAAO,MAAM,yBAAyB,EAAE,iBAGvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-v3.js","sourceRoot":"","sources":["../../src/migrations/global-v3.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAAsB,CAAC,MAAM,EAAE,EAAE;IACrE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IACtC,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACjC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const BASH_AUTOCOMPLETE_SCRIPT: string;
|
|
2
|
+
export declare const POWERSHELL_AUTOCOMPLETE_SCRIPT: string;
|
|
3
|
+
export declare const ZSH_AUTOCOMPLETE_SCRIPT: string;
|
|
4
|
+
export declare const resolveCompletionInputs: (inputs: readonly string[]) => string[];
|
|
5
|
+
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/services/autocomplete.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,wBAAwB,QA8DpC,CAAC;AAEF,eAAO,MAAM,8BAA8B,QAqB1C,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAsEnC,CAAC;AAqBF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,SAAS,MAAM,EAAE,aAiBhE,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { CONSTANTS } from "#app/config/constants.ts";
|
|
2
|
+
const COMPLETION_FUNCTION_NAME = "__dotweave_complete";
|
|
3
|
+
const ENSURE_FUNCTION_NAME = "__dotweave_ensure_completion";
|
|
4
|
+
export const BASH_AUTOCOMPLETE_SCRIPT = `\
|
|
5
|
+
${COMPLETION_FUNCTION_NAME}() {
|
|
6
|
+
local -a inputs
|
|
7
|
+
local rawCompletions completion
|
|
8
|
+
inputs=("\${COMP_WORDS[@]}")
|
|
9
|
+
if [[ \${#inputs[@]} -eq 1 && \${COMP_CWORD:-0} -eq 0 && "\${inputs[0]}" == "${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}" ]]; then
|
|
10
|
+
inputs+=("")
|
|
11
|
+
elif [[ \${COMP_CWORD:-0} -ge \${#inputs[@]} ]]; then
|
|
12
|
+
inputs+=("")
|
|
13
|
+
fi
|
|
14
|
+
if ! rawCompletions="$(env -u COMP_LINE ${CONSTANTS.AUTOCOMPLETE.COMMAND} "\${inputs[@]}")"; then
|
|
15
|
+
return 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
COMPREPLY=()
|
|
19
|
+
if [[ -z "$rawCompletions" ]]; then
|
|
20
|
+
return 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
local IFS_TAB word desc
|
|
24
|
+
IFS_TAB=$'\\t'
|
|
25
|
+
local maxLen=0
|
|
26
|
+
local -a words descs
|
|
27
|
+
while IFS= read -r completion; do
|
|
28
|
+
word="\${completion%%"$IFS_TAB"*}"
|
|
29
|
+
if [[ "$completion" == *"$IFS_TAB"* ]]; then
|
|
30
|
+
desc="\${completion#*"$IFS_TAB"}"
|
|
31
|
+
else
|
|
32
|
+
desc=""
|
|
33
|
+
fi
|
|
34
|
+
words+=("$word")
|
|
35
|
+
descs+=("$desc")
|
|
36
|
+
if (( \${#word} > maxLen )); then
|
|
37
|
+
maxLen=\${#word}
|
|
38
|
+
fi
|
|
39
|
+
done <<< "$rawCompletions"
|
|
40
|
+
|
|
41
|
+
if (( \${#words[@]} > 1 )); then
|
|
42
|
+
local -a display
|
|
43
|
+
local i
|
|
44
|
+
for (( i=0; i<\${#words[@]}; i++ )); do
|
|
45
|
+
if [[ -n "\${descs[i]}" ]]; then
|
|
46
|
+
printf -v pad "%-\${maxLen}s" "\${words[i]}"
|
|
47
|
+
display+=("$pad -- \${descs[i]}")
|
|
48
|
+
else
|
|
49
|
+
display+=("\${words[i]}")
|
|
50
|
+
fi
|
|
51
|
+
done
|
|
52
|
+
printf '%s\\n' "\${display[@]}" >&2
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
for word in "\${words[@]}"; do
|
|
56
|
+
if [[ "$word" == */ ]]; then
|
|
57
|
+
COMPREPLY+=("$word")
|
|
58
|
+
else
|
|
59
|
+
COMPREPLY+=("\${word} ")
|
|
60
|
+
fi
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
return 0
|
|
64
|
+
}
|
|
65
|
+
complete -o default -o nospace -F ${COMPLETION_FUNCTION_NAME} ${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}
|
|
66
|
+
`;
|
|
67
|
+
export const POWERSHELL_AUTOCOMPLETE_SCRIPT = `\
|
|
68
|
+
Register-ArgumentCompleter -Native -CommandName ${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME} -ScriptBlock {
|
|
69
|
+
param($wordToComplete, $commandAst, $cursorPosition)
|
|
70
|
+
$inputs = $commandAst.ToString().Split(' ', [System.StringSplitOptions]::RemoveEmptyEntries)
|
|
71
|
+
if ($cursorPosition -gt $commandAst.ToString().Length) {
|
|
72
|
+
$inputs += ''
|
|
73
|
+
}
|
|
74
|
+
$rawCompletions = & ${CONSTANTS.AUTOCOMPLETE.COMMAND.replace(" ", " ")} $inputs 2>$null
|
|
75
|
+
if (-not $rawCompletions) { return }
|
|
76
|
+
foreach ($line in $rawCompletions) {
|
|
77
|
+
$parts = $line.Split([char]9, 2)
|
|
78
|
+
$word = $parts[0]
|
|
79
|
+
$desc = if ($parts.Length -gt 1) { $parts[1] } else { '' }
|
|
80
|
+
$type = if ($word.EndsWith('/')) {
|
|
81
|
+
[System.Management.Automation.CompletionResultType]::ParameterValue
|
|
82
|
+
} else {
|
|
83
|
+
[System.Management.Automation.CompletionResultType]::ParameterValue
|
|
84
|
+
}
|
|
85
|
+
[System.Management.Automation.CompletionResult]::new($word, $word, $type, $(if ($desc) { $desc } else { $word }))
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
`;
|
|
89
|
+
export const ZSH_AUTOCOMPLETE_SCRIPT = `\
|
|
90
|
+
if ! (( $+functions[compdef] )); then
|
|
91
|
+
autoload -Uz compinit
|
|
92
|
+
compinit
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
${COMPLETION_FUNCTION_NAME}() {
|
|
96
|
+
emulate -L zsh
|
|
97
|
+
local -a directories inputs plainCompletions
|
|
98
|
+
local rawCompletions
|
|
99
|
+
inputs=("\${words[@]}")
|
|
100
|
+
if (( CURRENT == 1 && \${#inputs[@]} == 1 )) && [[ "\${inputs[1]}" == "${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}" ]]; then
|
|
101
|
+
inputs+=("")
|
|
102
|
+
elif (( CURRENT > \${#inputs[@]} )); then
|
|
103
|
+
inputs+=("")
|
|
104
|
+
fi
|
|
105
|
+
if ! rawCompletions="$(env -u COMP_LINE ${CONSTANTS.AUTOCOMPLETE.COMMAND} "\${inputs[@]}")"; then
|
|
106
|
+
return 1
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
if [[ -z "$rawCompletions" ]]; then
|
|
110
|
+
return 0
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
directories=()
|
|
114
|
+
plainCompletions=()
|
|
115
|
+
local -a plainDisplays dirDisplays
|
|
116
|
+
plainDisplays=()
|
|
117
|
+
dirDisplays=()
|
|
118
|
+
local IFS_TAB completion="" word desc
|
|
119
|
+
IFS_TAB=$'\\t'
|
|
120
|
+
for completion in "\${(@f)rawCompletions}"; do
|
|
121
|
+
word="\${completion%%"$IFS_TAB"*}"
|
|
122
|
+
if [[ "$completion" == *"$IFS_TAB"* ]]; then
|
|
123
|
+
desc="\${completion#*"$IFS_TAB"}"
|
|
124
|
+
else
|
|
125
|
+
desc=""
|
|
126
|
+
fi
|
|
127
|
+
if [[ "$word" == */ ]]; then
|
|
128
|
+
directories+=("$word")
|
|
129
|
+
if [[ -n "$desc" ]]; then
|
|
130
|
+
dirDisplays+=("$word -- $desc")
|
|
131
|
+
else
|
|
132
|
+
dirDisplays+=("$word")
|
|
133
|
+
fi
|
|
134
|
+
else
|
|
135
|
+
plainCompletions+=("$word")
|
|
136
|
+
if [[ -n "$desc" ]]; then
|
|
137
|
+
plainDisplays+=("$word -- $desc")
|
|
138
|
+
else
|
|
139
|
+
plainDisplays+=("$word")
|
|
140
|
+
fi
|
|
141
|
+
fi
|
|
142
|
+
done
|
|
143
|
+
if (( \${#plainCompletions[@]} > 0 )); then
|
|
144
|
+
compadd -Q -l -d plainDisplays -- "\${plainCompletions[@]}"
|
|
145
|
+
fi
|
|
146
|
+
if (( \${#directories[@]} > 0 )); then
|
|
147
|
+
compadd -Q -S "" -l -d dirDisplays -- "\${directories[@]}"
|
|
148
|
+
fi
|
|
149
|
+
}
|
|
150
|
+
compdef ${COMPLETION_FUNCTION_NAME} ${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}
|
|
151
|
+
|
|
152
|
+
${ENSURE_FUNCTION_NAME}() {
|
|
153
|
+
if (( $+functions[compdef] )) && [[ "\${_comps[${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}]}" != ${COMPLETION_FUNCTION_NAME} ]]; then
|
|
154
|
+
compdef ${COMPLETION_FUNCTION_NAME} ${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}
|
|
155
|
+
fi
|
|
156
|
+
}
|
|
157
|
+
autoload -Uz add-zsh-hook
|
|
158
|
+
add-zsh-hook precmd ${ENSURE_FUNCTION_NAME}
|
|
159
|
+
`;
|
|
160
|
+
const isCliCommandToken = (input) => {
|
|
161
|
+
const normalizedInput = input.replace(/\\/gu, "/").split("/").pop() ?? input;
|
|
162
|
+
return (normalizedInput === CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME ||
|
|
163
|
+
normalizedInput === `${CONSTANTS.AUTOCOMPLETE.CLI_COMMAND_NAME}.exe`);
|
|
164
|
+
};
|
|
165
|
+
const normalizeCompletionInputs = (inputs) => {
|
|
166
|
+
const firstInput = inputs[0];
|
|
167
|
+
if (firstInput === undefined || !isCliCommandToken(firstInput)) {
|
|
168
|
+
return [...inputs];
|
|
169
|
+
}
|
|
170
|
+
return inputs.slice(1);
|
|
171
|
+
};
|
|
172
|
+
export const resolveCompletionInputs = (inputs) => {
|
|
173
|
+
const environment = process.env;
|
|
174
|
+
const completionLine = environment.COMP_LINE;
|
|
175
|
+
if (completionLine === undefined) {
|
|
176
|
+
return normalizeCompletionInputs(inputs);
|
|
177
|
+
}
|
|
178
|
+
const trimmedStart = completionLine.trimStart();
|
|
179
|
+
if (trimmedStart === "") {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
const completionInputs = trimmedStart.split(/\s+/u);
|
|
183
|
+
return normalizeCompletionInputs(completionInputs);
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/services/autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AACvD,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D,MAAM,CAAC,MAAM,wBAAwB,GAAG;EACtC,wBAAwB;;;;iFAIuD,SAAS,CAAC,YAAY,CAAC,gBAAgB;;;;;4CAK5E,SAAS,CAAC,YAAY,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAmDtC,wBAAwB,IAAI,SAAS,CAAC,YAAY,CAAC,gBAAgB;CACtG,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;kDACI,SAAS,CAAC,YAAY,CAAC,gBAAgB;;;;;;wBAMjE,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;;;;;;;;;;;;;;CAcvE,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;EAMrC,wBAAwB;;;;;2EAKiD,SAAS,CAAC,YAAY,CAAC,gBAAgB;;;;;4CAKtE,SAAS,CAAC,YAAY,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA6ChE,wBAAwB,IAAI,SAAS,CAAC,YAAY,CAAC,gBAAgB;;EAE3E,oBAAoB;mDAC6B,SAAS,CAAC,YAAY,CAAC,gBAAgB,UAAU,wBAAwB;cAC9G,wBAAwB,IAAI,SAAS,CAAC,YAAY,CAAC,gBAAgB;;;;sBAI3D,oBAAoB;CACzC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE;IAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;IAE7E,OAAO,CACL,eAAe,KAAK,SAAS,CAAC,YAAY,CAAC,gBAAgB;QAC3D,eAAe,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,gBAAgB,MAAM,CACrE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,MAAyB,EAAE,EAAE;IAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7B,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAyB,EAAE,EAAE;IACnE,MAAM,WAAW,GAA+C,OAAO,CAAC,GAAG,CAAC;IAC5E,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC;IAE7C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;IAEhD,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;AACrD,CAAC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type ResolvedSyncConfig, type SyncConfig, type SyncConfigResolutionContext } from "#app/config/sync.ts";
|
|
2
|
+
export declare const sortSyncConfigEntries: (entries: readonly SyncConfig["entries"][number][]) => {
|
|
3
|
+
kind: "file" | "directory";
|
|
4
|
+
localPath: {
|
|
5
|
+
default: string;
|
|
6
|
+
win?: string | undefined;
|
|
7
|
+
mac?: string | undefined;
|
|
8
|
+
linux?: string | undefined;
|
|
9
|
+
wsl?: string | undefined;
|
|
10
|
+
};
|
|
11
|
+
repoPath?: {
|
|
12
|
+
default: string;
|
|
13
|
+
win?: string | undefined;
|
|
14
|
+
mac?: string | undefined;
|
|
15
|
+
linux?: string | undefined;
|
|
16
|
+
wsl?: string | undefined;
|
|
17
|
+
} | undefined;
|
|
18
|
+
profiles?: string[] | undefined;
|
|
19
|
+
mode?: {
|
|
20
|
+
default: "normal" | "secret" | "ignore";
|
|
21
|
+
win?: "normal" | "secret" | "ignore" | undefined;
|
|
22
|
+
mac?: "normal" | "secret" | "ignore" | undefined;
|
|
23
|
+
linux?: "normal" | "secret" | "ignore" | undefined;
|
|
24
|
+
wsl?: "normal" | "secret" | "ignore" | undefined;
|
|
25
|
+
} | undefined;
|
|
26
|
+
permission?: {
|
|
27
|
+
default: string;
|
|
28
|
+
win?: string | undefined;
|
|
29
|
+
mac?: string | undefined;
|
|
30
|
+
linux?: string | undefined;
|
|
31
|
+
wsl?: string | undefined;
|
|
32
|
+
} | undefined;
|
|
33
|
+
}[];
|
|
34
|
+
export declare const buildSyncConfigDocument: (config: ResolvedSyncConfig) => SyncConfig;
|
|
35
|
+
export declare const writeValidatedSyncConfig: (syncDirectory: string, config: SyncConfig, context: SyncConfigResolutionContext) => Promise<{
|
|
36
|
+
version: 7;
|
|
37
|
+
entries: {
|
|
38
|
+
kind: "file" | "directory";
|
|
39
|
+
localPath: {
|
|
40
|
+
default: string;
|
|
41
|
+
win?: string | undefined;
|
|
42
|
+
mac?: string | undefined;
|
|
43
|
+
linux?: string | undefined;
|
|
44
|
+
wsl?: string | undefined;
|
|
45
|
+
};
|
|
46
|
+
repoPath?: {
|
|
47
|
+
default: string;
|
|
48
|
+
win?: string | undefined;
|
|
49
|
+
mac?: string | undefined;
|
|
50
|
+
linux?: string | undefined;
|
|
51
|
+
wsl?: string | undefined;
|
|
52
|
+
} | undefined;
|
|
53
|
+
profiles?: string[] | undefined;
|
|
54
|
+
mode?: {
|
|
55
|
+
default: "normal" | "secret" | "ignore";
|
|
56
|
+
win?: "normal" | "secret" | "ignore" | undefined;
|
|
57
|
+
mac?: "normal" | "secret" | "ignore" | undefined;
|
|
58
|
+
linux?: "normal" | "secret" | "ignore" | undefined;
|
|
59
|
+
wsl?: "normal" | "secret" | "ignore" | undefined;
|
|
60
|
+
} | undefined;
|
|
61
|
+
permission?: {
|
|
62
|
+
default: string;
|
|
63
|
+
win?: string | undefined;
|
|
64
|
+
mac?: string | undefined;
|
|
65
|
+
linux?: string | undefined;
|
|
66
|
+
wsl?: string | undefined;
|
|
67
|
+
} | undefined;
|
|
68
|
+
}[];
|
|
69
|
+
age?: {
|
|
70
|
+
recipients: string[];
|
|
71
|
+
} | undefined;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=config-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../../src/services/config-file.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EACf,KAAK,2BAA2B,EACjC,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,qBAAqB,GAChC,SAAS,SAAS,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAKlD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,kBAAkB,KACzB,UA2BF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,QAAQ,UAAU,EAClB,SAAS,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWrC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CONSTANTS } from "#app/config/constants.ts";
|
|
2
|
+
import { formatSyncConfig, parseSyncConfig, resolveSyncConfigFilePath, } from "#app/config/sync.ts";
|
|
3
|
+
import { writeTextFileAtomically } from "#app/lib/filesystem.ts";
|
|
4
|
+
export const sortSyncConfigEntries = (entries) => {
|
|
5
|
+
return [...entries].sort((left, right) => {
|
|
6
|
+
return left.localPath.default.localeCompare(right.localPath.default);
|
|
7
|
+
});
|
|
8
|
+
};
|
|
9
|
+
export const buildSyncConfigDocument = (config) => {
|
|
10
|
+
const entries = sortSyncConfigEntries(config.entries.map((entry) => ({
|
|
11
|
+
kind: entry.kind,
|
|
12
|
+
localPath: entry.configuredLocalPath,
|
|
13
|
+
...(entry.configuredRepoPath === undefined
|
|
14
|
+
? {}
|
|
15
|
+
: { repoPath: entry.configuredRepoPath }),
|
|
16
|
+
...(entry.modeExplicit ? { mode: entry.configuredMode } : {}),
|
|
17
|
+
...(entry.permissionExplicit
|
|
18
|
+
? { permission: entry.configuredPermission }
|
|
19
|
+
: {}),
|
|
20
|
+
...(entry.profilesExplicit ? { profiles: [...entry.profiles] } : {}),
|
|
21
|
+
})));
|
|
22
|
+
return {
|
|
23
|
+
version: CONSTANTS.SYNC.CONFIG_VERSION,
|
|
24
|
+
...(config.age === undefined
|
|
25
|
+
? {}
|
|
26
|
+
: {
|
|
27
|
+
age: {
|
|
28
|
+
recipients: [...config.age.recipients],
|
|
29
|
+
},
|
|
30
|
+
}),
|
|
31
|
+
entries,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export const writeValidatedSyncConfig = async (syncDirectory, config, context) => {
|
|
35
|
+
const resolvedConfig = parseSyncConfig(config, context);
|
|
36
|
+
const nextConfig = buildSyncConfigDocument(resolvedConfig);
|
|
37
|
+
await writeTextFileAtomically(resolveSyncConfigFilePath(syncDirectory), formatSyncConfig(nextConfig));
|
|
38
|
+
return nextConfig;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=config-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../src/services/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,eAAe,EAEf,yBAAyB,GAG1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAiD,EACjD,EAAE;IACF,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACvC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,MAA0B,EACd,EAAE;IACd,MAAM,OAAO,GAAG,qBAAqB,CACnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAiC,EAAE,CAAC,CAAC;QAC5D,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,mBAAmB;QACpC,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,kBAAkB;YAC1B,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,oBAAoB,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC,CAAC,CACJ,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc;QACtC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS;YAC1B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,GAAG,EAAE;oBACH,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;iBACvC;aACF,CAAC;QACN,OAAO;KACM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,aAAqB,EACrB,MAAkB,EAClB,OAAoC,EACpC,EAAE;IACF,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAE3D,MAAM,uBAAuB,CAC3B,yBAAyB,CAAC,aAAa,CAAC,EACxC,gBAAgB,CAAC,UAAU,CAAC,CAC7B,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ConsolaInstance } from "consola";
|
|
2
|
+
export type DoctorCheckLevel = "fail" | "ok" | "warn";
|
|
3
|
+
export type DoctorCheck = Readonly<{
|
|
4
|
+
checkId: string;
|
|
5
|
+
detail: string;
|
|
6
|
+
level: DoctorCheckLevel;
|
|
7
|
+
}>;
|
|
8
|
+
export type DoctorResult = Readonly<{
|
|
9
|
+
checks: readonly DoctorCheck[];
|
|
10
|
+
configPath: string;
|
|
11
|
+
hasFailures: boolean;
|
|
12
|
+
hasWarnings: boolean;
|
|
13
|
+
syncDirectory: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const runDoctorChecks: (reporter?: ConsolaInstance) => Promise<DoctorResult>;
|
|
16
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/services/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAa/C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,gBAAgB,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAoBH,eAAO,MAAM,eAAe,GAC1B,WAAW,eAAe,KACzB,OAAO,CAAC,YAAY,CAqKtB,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { resolveSyncConfigFilePath } from "#app/config/sync.ts";
|
|
2
|
+
import { formatDotweaveError } from "#app/lib/error.ts";
|
|
3
|
+
import { pathExists } from "#app/lib/filesystem.ts";
|
|
4
|
+
import { ensureRepository } from "#app/lib/git.ts";
|
|
5
|
+
import { buildEntryMaterialization } from "./local-materialization.js";
|
|
6
|
+
import { buildRepositorySnapshot } from "./repo-snapshot.js";
|
|
7
|
+
import { loadSyncConfig, resolveSyncPaths, } from "./runtime.js";
|
|
8
|
+
const ok = (checkId, detail) => ({
|
|
9
|
+
checkId,
|
|
10
|
+
detail,
|
|
11
|
+
level: "ok",
|
|
12
|
+
});
|
|
13
|
+
const warn = (checkId, detail) => ({
|
|
14
|
+
checkId,
|
|
15
|
+
detail,
|
|
16
|
+
level: "warn",
|
|
17
|
+
});
|
|
18
|
+
const fail = (checkId, detail) => ({
|
|
19
|
+
checkId,
|
|
20
|
+
detail,
|
|
21
|
+
level: "fail",
|
|
22
|
+
});
|
|
23
|
+
export const runDoctorChecks = async (reporter) => {
|
|
24
|
+
reporter?.start("Running doctor checks...");
|
|
25
|
+
const { syncDirectory } = resolveSyncPaths();
|
|
26
|
+
const configPath = resolveSyncConfigFilePath(syncDirectory);
|
|
27
|
+
const checks = [];
|
|
28
|
+
try {
|
|
29
|
+
reporter?.start("Checking sync directory...");
|
|
30
|
+
await ensureRepository(syncDirectory);
|
|
31
|
+
checks.push(ok("git", "Sync directory is a git repository."));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
checks.push(fail("git", error instanceof Error ? error.message : "Git repository check failed."));
|
|
35
|
+
return {
|
|
36
|
+
checks,
|
|
37
|
+
configPath,
|
|
38
|
+
hasFailures: true,
|
|
39
|
+
hasWarnings: false,
|
|
40
|
+
syncDirectory,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
let config;
|
|
44
|
+
try {
|
|
45
|
+
reporter?.start("Loading sync configuration...");
|
|
46
|
+
const { effectiveConfig, fullConfig } = await loadSyncConfig(syncDirectory);
|
|
47
|
+
config = effectiveConfig;
|
|
48
|
+
checks.push(ok("config", `Loaded config with ${fullConfig.entries.length} entries and ${effectiveConfig.age.recipients.length} recipients.`));
|
|
49
|
+
checks.push(ok("profiles", effectiveConfig.activeProfile === undefined
|
|
50
|
+
? "No active profile configured."
|
|
51
|
+
: `Active profile: ${effectiveConfig.activeProfile}.`));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
checks.push(fail("config", error instanceof Error
|
|
55
|
+
? formatDotweaveError(error)
|
|
56
|
+
: "Sync configuration could not be read."));
|
|
57
|
+
return {
|
|
58
|
+
checks,
|
|
59
|
+
configPath,
|
|
60
|
+
hasFailures: true,
|
|
61
|
+
hasWarnings: false,
|
|
62
|
+
syncDirectory,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
reporter?.start("Checking age identity...");
|
|
66
|
+
checks.push((await pathExists(config.age.identityFile))
|
|
67
|
+
? ok("age", `Age identity file exists at ${config.age.identityFile}.`)
|
|
68
|
+
: fail("age", `Age identity file is missing: ${config.age.identityFile}`));
|
|
69
|
+
checks.push(config.entries.length === 0
|
|
70
|
+
? warn("entries", "No sync entries are configured yet.")
|
|
71
|
+
: ok("entries", `Tracked ${config.entries.length} sync entries.`));
|
|
72
|
+
const missingEntries = config.entries.filter((entry) => {
|
|
73
|
+
return entry.mode !== "ignore" && entry.localPath.length > 0;
|
|
74
|
+
});
|
|
75
|
+
const missingCount = 0;
|
|
76
|
+
let checkedLocalPathCount = 0;
|
|
77
|
+
const healthyMissingEntries = new Set();
|
|
78
|
+
reporter?.start("Scanning repository artifacts...");
|
|
79
|
+
const repositorySnapshot = await buildRepositorySnapshot(syncDirectory, config, reporter);
|
|
80
|
+
reporter?.start("Checking tracked local paths...");
|
|
81
|
+
try {
|
|
82
|
+
for (const entry of missingEntries) {
|
|
83
|
+
checkedLocalPathCount += 1;
|
|
84
|
+
if ((reporter?.level ?? 0) >= 4) {
|
|
85
|
+
reporter?.verbose(`checked tracked local path ${entry.localPath}`);
|
|
86
|
+
}
|
|
87
|
+
else if (checkedLocalPathCount % 100 === 0) {
|
|
88
|
+
reporter?.start(`Checked ${checkedLocalPathCount} tracked local paths...`);
|
|
89
|
+
}
|
|
90
|
+
if (await pathExists(entry.localPath)) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
buildEntryMaterialization(entry, repositorySnapshot, (reporter?.level ?? 0) >= 4 ? reporter : undefined);
|
|
94
|
+
healthyMissingEntries.add(entry.repoPath);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
checks.push(fail("local-paths", error instanceof Error
|
|
99
|
+
? formatDotweaveError(error)
|
|
100
|
+
: "Tracked local paths could not be checked."));
|
|
101
|
+
const hasFailures = checks.some((check) => check.level === "fail");
|
|
102
|
+
const hasWarnings = checks.some((check) => check.level === "warn");
|
|
103
|
+
return {
|
|
104
|
+
checks,
|
|
105
|
+
configPath,
|
|
106
|
+
hasFailures,
|
|
107
|
+
hasWarnings,
|
|
108
|
+
syncDirectory,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
checks.push(missingCount === 0
|
|
112
|
+
? ok("local-paths", healthyMissingEntries.size === 0
|
|
113
|
+
? "All tracked local paths currently exist."
|
|
114
|
+
: `All missing local paths are healthy for the current sync state (${healthyMissingEntries.size} entr${healthyMissingEntries.size === 1 ? "y" : "ies"}).`)
|
|
115
|
+
: warn("local-paths", `${missingCount} tracked local path${missingCount === 1 ? " is" : "s are"} missing.`));
|
|
116
|
+
const hasFailures = checks.some((check) => check.level === "fail");
|
|
117
|
+
const hasWarnings = checks.some((check) => check.level === "warn");
|
|
118
|
+
return {
|
|
119
|
+
checks,
|
|
120
|
+
configPath,
|
|
121
|
+
hasFailures,
|
|
122
|
+
hasWarnings,
|
|
123
|
+
syncDirectory,
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/services/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ConsolaInstance } from "consola";
|
|
2
|
+
import { DotweaveError } from "#app/lib/error.ts";
|
|
3
|
+
export type InitRequest = Readonly<{
|
|
4
|
+
ageIdentity?: string;
|
|
5
|
+
generateAgeIdentity?: boolean;
|
|
6
|
+
identityFile?: string;
|
|
7
|
+
recipients: readonly string[];
|
|
8
|
+
repository?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export type InitResult = Readonly<{
|
|
11
|
+
alreadyInitialized: boolean;
|
|
12
|
+
configPath: string;
|
|
13
|
+
entryCount: number;
|
|
14
|
+
gitAction: "cloned" | "existing" | "initialized";
|
|
15
|
+
gitSource?: string;
|
|
16
|
+
identityFile: string;
|
|
17
|
+
generatedIdentity: boolean;
|
|
18
|
+
recipientCount: number;
|
|
19
|
+
syncDirectory: string;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const defaultSyncIdentityFile: "~/.config/dotweave/keys.txt";
|
|
22
|
+
export declare const createMissingRepositoryAgeKeyError: () => DotweaveError;
|
|
23
|
+
export declare const initializeSyncDirectory: (request: InitRequest, reporter?: ConsolaInstance) => Promise<InitResult>;
|
|
24
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/services/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAsB/C,OAAO,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAC;AAcpE,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,eAAO,MAAM,uBAAuB,+BAAuC,CAAC;AAK5E,eAAO,MAAM,kCAAkC,qBAQ9C,CAAC;AAwKF,eAAO,MAAM,uBAAuB,GAClC,SAAS,WAAW,EACpB,WAAW,eAAe,KACzB,OAAO,CAAC,UAAU,CA2LpB,CAAC"}
|