@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.
Files changed (246) hide show
  1. package/bin/index.js +5 -0
  2. package/dist/application.d.ts +5 -0
  3. package/dist/application.d.ts.map +1 -0
  4. package/dist/application.js +86 -0
  5. package/dist/application.js.map +1 -0
  6. package/dist/cli/autocomplete.d.ts +7 -0
  7. package/dist/cli/autocomplete.d.ts.map +1 -0
  8. package/dist/cli/autocomplete.js +62 -0
  9. package/dist/cli/autocomplete.js.map +1 -0
  10. package/dist/cli/cd.d.ts +4 -0
  11. package/dist/cli/cd.d.ts.map +1 -0
  12. package/dist/cli/cd.js +23 -0
  13. package/dist/cli/cd.js.map +1 -0
  14. package/dist/cli/doctor.d.ts +4 -0
  15. package/dist/cli/doctor.d.ts.map +1 -0
  16. package/dist/cli/doctor.js +92 -0
  17. package/dist/cli/doctor.js.map +1 -0
  18. package/dist/cli/index.d.ts +4 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +22 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/init.d.ts +4 -0
  23. package/dist/cli/init.d.ts.map +1 -0
  24. package/dist/cli/init.js +110 -0
  25. package/dist/cli/init.js.map +1 -0
  26. package/dist/cli/profile/index.d.ts +3 -0
  27. package/dist/cli/profile/index.d.ts.map +1 -0
  28. package/dist/cli/profile/index.js +15 -0
  29. package/dist/cli/profile/index.js.map +1 -0
  30. package/dist/cli/profile/list.d.ts +4 -0
  31. package/dist/cli/profile/list.d.ts.map +1 -0
  32. package/dist/cli/profile/list.js +42 -0
  33. package/dist/cli/profile/list.js.map +1 -0
  34. package/dist/cli/profile/use.d.ts +4 -0
  35. package/dist/cli/profile/use.d.ts.map +1 -0
  36. package/dist/cli/profile/use.js +49 -0
  37. package/dist/cli/profile/use.js.map +1 -0
  38. package/dist/cli/pull.d.ts +4 -0
  39. package/dist/cli/pull.d.ts.map +1 -0
  40. package/dist/cli/pull.js +107 -0
  41. package/dist/cli/pull.js.map +1 -0
  42. package/dist/cli/push.d.ts +4 -0
  43. package/dist/cli/push.d.ts.map +1 -0
  44. package/dist/cli/push.js +49 -0
  45. package/dist/cli/push.js.map +1 -0
  46. package/dist/cli/root-commands.d.ts +13 -0
  47. package/dist/cli/root-commands.d.ts.map +1 -0
  48. package/dist/cli/root-commands.js +25 -0
  49. package/dist/cli/root-commands.js.map +1 -0
  50. package/dist/cli/status.d.ts +4 -0
  51. package/dist/cli/status.d.ts.map +1 -0
  52. package/dist/cli/status.js +132 -0
  53. package/dist/cli/status.js.map +1 -0
  54. package/dist/cli/track.d.ts +4 -0
  55. package/dist/cli/track.d.ts.map +1 -0
  56. package/dist/cli/track.js +133 -0
  57. package/dist/cli/track.js.map +1 -0
  58. package/dist/cli/untrack.d.ts +4 -0
  59. package/dist/cli/untrack.d.ts.map +1 -0
  60. package/dist/cli/untrack.js +40 -0
  61. package/dist/cli/untrack.js.map +1 -0
  62. package/dist/config/constants.d.ts +31 -0
  63. package/dist/config/constants.d.ts.map +1 -0
  64. package/dist/config/constants.js +33 -0
  65. package/dist/config/constants.js.map +1 -0
  66. package/dist/config/global-config.d.ts +21 -0
  67. package/dist/config/global-config.d.ts.map +1 -0
  68. package/dist/config/global-config.js +89 -0
  69. package/dist/config/global-config.js.map +1 -0
  70. package/dist/config/identity-file.d.ts +9 -0
  71. package/dist/config/identity-file.d.ts.map +1 -0
  72. package/dist/config/identity-file.js +48 -0
  73. package/dist/config/identity-file.js.map +1 -0
  74. package/dist/config/migration.d.ts +9 -0
  75. package/dist/config/migration.d.ts.map +1 -0
  76. package/dist/config/migration.js +61 -0
  77. package/dist/config/migration.js.map +1 -0
  78. package/dist/config/platform.d.ts +12 -0
  79. package/dist/config/platform.d.ts.map +1 -0
  80. package/dist/config/platform.js +25 -0
  81. package/dist/config/platform.js.map +1 -0
  82. package/dist/config/runtime-env.d.ts +7 -0
  83. package/dist/config/runtime-env.d.ts.map +1 -0
  84. package/dist/config/runtime-env.js +31 -0
  85. package/dist/config/runtime-env.js.map +1 -0
  86. package/dist/config/sync-entry.d.ts +14 -0
  87. package/dist/config/sync-entry.d.ts.map +1 -0
  88. package/dist/config/sync-entry.js +99 -0
  89. package/dist/config/sync-entry.js.map +1 -0
  90. package/dist/config/sync-schema.d.ts +146 -0
  91. package/dist/config/sync-schema.d.ts.map +1 -0
  92. package/dist/config/sync-schema.js +392 -0
  93. package/dist/config/sync-schema.js.map +1 -0
  94. package/dist/config/sync.d.ts +8 -0
  95. package/dist/config/sync.d.ts.map +1 -0
  96. package/dist/config/sync.js +53 -0
  97. package/dist/config/sync.js.map +1 -0
  98. package/dist/config/xdg.d.ts +10 -0
  99. package/dist/config/xdg.d.ts.map +1 -0
  100. package/dist/config/xdg.js +90 -0
  101. package/dist/config/xdg.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +4 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/content.d.ts +5 -0
  107. package/dist/lib/content.d.ts.map +1 -0
  108. package/dist/lib/content.js +29 -0
  109. package/dist/lib/content.js.map +1 -0
  110. package/dist/lib/crypto.d.ts +45 -0
  111. package/dist/lib/crypto.d.ts.map +1 -0
  112. package/dist/lib/crypto.js +130 -0
  113. package/dist/lib/crypto.js.map +1 -0
  114. package/dist/lib/env.d.ts +13 -0
  115. package/dist/lib/env.d.ts.map +1 -0
  116. package/dist/lib/env.js +50 -0
  117. package/dist/lib/env.js.map +1 -0
  118. package/dist/lib/error.d.ts +22 -0
  119. package/dist/lib/error.d.ts.map +1 -0
  120. package/dist/lib/error.js +50 -0
  121. package/dist/lib/error.js.map +1 -0
  122. package/dist/lib/file-mode.d.ts +36 -0
  123. package/dist/lib/file-mode.d.ts.map +1 -0
  124. package/dist/lib/file-mode.js +55 -0
  125. package/dist/lib/file-mode.js.map +1 -0
  126. package/dist/lib/filesystem.d.ts +60 -0
  127. package/dist/lib/filesystem.d.ts.map +1 -0
  128. package/dist/lib/filesystem.js +190 -0
  129. package/dist/lib/filesystem.js.map +1 -0
  130. package/dist/lib/git.d.ts +23 -0
  131. package/dist/lib/git.d.ts.map +1 -0
  132. package/dist/lib/git.js +162 -0
  133. package/dist/lib/git.js.map +1 -0
  134. package/dist/lib/jsonc.d.ts +8 -0
  135. package/dist/lib/jsonc.d.ts.map +1 -0
  136. package/dist/lib/jsonc.js +78 -0
  137. package/dist/lib/jsonc.js.map +1 -0
  138. package/dist/lib/path.d.ts +21 -0
  139. package/dist/lib/path.d.ts.map +1 -0
  140. package/dist/lib/path.js +44 -0
  141. package/dist/lib/path.js.map +1 -0
  142. package/dist/lib/promise.d.ts +10 -0
  143. package/dist/lib/promise.d.ts.map +1 -0
  144. package/dist/lib/promise.js +25 -0
  145. package/dist/lib/promise.js.map +1 -0
  146. package/dist/lib/string.d.ts +6 -0
  147. package/dist/lib/string.d.ts.map +1 -0
  148. package/dist/lib/string.js +8 -0
  149. package/dist/lib/string.js.map +1 -0
  150. package/dist/lib/validation.d.ts +7 -0
  151. package/dist/lib/validation.d.ts.map +1 -0
  152. package/dist/lib/validation.js +13 -0
  153. package/dist/lib/validation.js.map +1 -0
  154. package/dist/lib/version.d.ts +2 -0
  155. package/dist/lib/version.d.ts.map +1 -0
  156. package/dist/lib/version.js +4 -0
  157. package/dist/lib/version.js.map +1 -0
  158. package/dist/migrations/global-v3.d.ts +3 -0
  159. package/dist/migrations/global-v3.d.ts.map +1 -0
  160. package/dist/migrations/global-v3.js +5 -0
  161. package/dist/migrations/global-v3.js.map +1 -0
  162. package/dist/services/autocomplete.d.ts +5 -0
  163. package/dist/services/autocomplete.d.ts.map +1 -0
  164. package/dist/services/autocomplete.js +185 -0
  165. package/dist/services/autocomplete.js.map +1 -0
  166. package/dist/services/config-file.d.ts +73 -0
  167. package/dist/services/config-file.d.ts.map +1 -0
  168. package/dist/services/config-file.js +40 -0
  169. package/dist/services/config-file.js.map +1 -0
  170. package/dist/services/doctor.d.ts +16 -0
  171. package/dist/services/doctor.d.ts.map +1 -0
  172. package/dist/services/doctor.js +126 -0
  173. package/dist/services/doctor.js.map +1 -0
  174. package/dist/services/init.d.ts +24 -0
  175. package/dist/services/init.d.ts.map +1 -0
  176. package/dist/services/init.js +265 -0
  177. package/dist/services/init.js.map +1 -0
  178. package/dist/services/local-materialization.d.ts +30 -0
  179. package/dist/services/local-materialization.d.ts.map +1 -0
  180. package/dist/services/local-materialization.js +451 -0
  181. package/dist/services/local-materialization.js.map +1 -0
  182. package/dist/services/local-snapshot.d.ts +26 -0
  183. package/dist/services/local-snapshot.d.ts.map +1 -0
  184. package/dist/services/local-snapshot.js +119 -0
  185. package/dist/services/local-snapshot.js.map +1 -0
  186. package/dist/services/paths.d.ts +8 -0
  187. package/dist/services/paths.d.ts.map +1 -0
  188. package/dist/services/paths.js +71 -0
  189. package/dist/services/paths.js.map +1 -0
  190. package/dist/services/profile.d.ts +39 -0
  191. package/dist/services/profile.d.ts.map +1 -0
  192. package/dist/services/profile.js +124 -0
  193. package/dist/services/profile.js.map +1 -0
  194. package/dist/services/pull.d.ts +38 -0
  195. package/dist/services/pull.d.ts.map +1 -0
  196. package/dist/services/pull.js +148 -0
  197. package/dist/services/pull.js.map +1 -0
  198. package/dist/services/push.d.ts +38 -0
  199. package/dist/services/push.d.ts.map +1 -0
  200. package/dist/services/push.js +120 -0
  201. package/dist/services/push.js.map +1 -0
  202. package/dist/services/repo-artifacts.d.ts +52 -0
  203. package/dist/services/repo-artifacts.d.ts.map +1 -0
  204. package/dist/services/repo-artifacts.js +325 -0
  205. package/dist/services/repo-artifacts.js.map +1 -0
  206. package/dist/services/repo-snapshot.d.ts +7 -0
  207. package/dist/services/repo-snapshot.d.ts.map +1 -0
  208. package/dist/services/repo-snapshot.js +181 -0
  209. package/dist/services/repo-snapshot.js.map +1 -0
  210. package/dist/services/runtime.d.ts +30 -0
  211. package/dist/services/runtime.d.ts.map +1 -0
  212. package/dist/services/runtime.js +71 -0
  213. package/dist/services/runtime.js.map +1 -0
  214. package/dist/services/set.d.ts +41 -0
  215. package/dist/services/set.d.ts.map +1 -0
  216. package/dist/services/set.js +288 -0
  217. package/dist/services/set.js.map +1 -0
  218. package/dist/services/status.d.ts +41 -0
  219. package/dist/services/status.d.ts.map +1 -0
  220. package/dist/services/status.js +87 -0
  221. package/dist/services/status.js.map +1 -0
  222. package/dist/services/terminal/cli-runtime.d.ts +18 -0
  223. package/dist/services/terminal/cli-runtime.d.ts.map +1 -0
  224. package/dist/services/terminal/cli-runtime.js +19 -0
  225. package/dist/services/terminal/cli-runtime.js.map +1 -0
  226. package/dist/services/terminal/logger.d.ts +9 -0
  227. package/dist/services/terminal/logger.d.ts.map +1 -0
  228. package/dist/services/terminal/logger.js +15 -0
  229. package/dist/services/terminal/logger.js.map +1 -0
  230. package/dist/services/terminal/path-completion.d.ts +3 -0
  231. package/dist/services/terminal/path-completion.d.ts.map +1 -0
  232. package/dist/services/terminal/path-completion.js +108 -0
  233. package/dist/services/terminal/path-completion.js.map +1 -0
  234. package/dist/services/terminal/shell.d.ts +24 -0
  235. package/dist/services/terminal/shell.d.ts.map +1 -0
  236. package/dist/services/terminal/shell.js +227 -0
  237. package/dist/services/terminal/shell.js.map +1 -0
  238. package/dist/services/track.d.ts +20 -0
  239. package/dist/services/track.d.ts.map +1 -0
  240. package/dist/services/track.js +224 -0
  241. package/dist/services/track.js.map +1 -0
  242. package/dist/services/untrack.d.ts +13 -0
  243. package/dist/services/untrack.d.ts.map +1 -0
  244. package/dist/services/untrack.js +133 -0
  245. package/dist/services/untrack.js.map +1 -0
  246. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg.d.ts","sourceRoot":"","sources":["../../src/config/xdg.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,GAAG,SAAS,WAQ5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,MAAM,MAAM,GAAG,SAAS,EACxB,eAAe,MAAM,GAAG,SAAS,WASlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,eAAe,MAAM,WAEnE,CAAC;AAEF,eAAO,MAAM,mCAAmC,GAC9C,yBAAyB,MAAM,WAGhC,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,yBAAyB,MAAM,WAGhC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS,WAWrE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EACb,MAAM,MAAM,GAAG,SAAS,EACxB,eAAe,MAAM,GAAG,SAAS,EACjC,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,WA4B/C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,MAAM,EACb,MAAM,MAAM,GAAG,SAAS,EACxB,eAAe,MAAM,GAAG,SAAS,EACjC,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,WAgB/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EACb,SAAS,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,KAC5C,MAUF,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { homedir } from "node:os";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { CONSTANTS } from "#app/config/constants.ts";
4
+ const xdgConfigHomeToken = "$XDG_CONFIG_HOME";
5
+ const xdgConfigHomeTokenPrefix = `${xdgConfigHomeToken}/`;
6
+ const bracedXdgConfigHomeToken = "${XDG_CONFIG_HOME}";
7
+ const bracedXdgConfigHomePrefix = `${bracedXdgConfigHomeToken}/`;
8
+ const trimConfiguredValue = (value) => {
9
+ if (value === undefined) {
10
+ return undefined;
11
+ }
12
+ const trimmedValue = value.trim();
13
+ return trimmedValue === "" ? undefined : trimmedValue;
14
+ };
15
+ const readTrimmedEnvironmentValue = (readEnv, key) => {
16
+ const value = readEnv(key);
17
+ return value === undefined ? undefined : trimConfiguredValue(value);
18
+ };
19
+ export const resolveHomeDirectory = (home) => {
20
+ const configuredValue = trimConfiguredValue(home);
21
+ if (configuredValue !== undefined) {
22
+ return resolve(configuredValue);
23
+ }
24
+ return resolve(homedir());
25
+ };
26
+ export const resolveXdgConfigHome = (home, xdgConfigHome) => {
27
+ const configuredValue = trimConfiguredValue(xdgConfigHome);
28
+ if (configuredValue !== undefined) {
29
+ return resolve(configuredValue);
30
+ }
31
+ return resolve(resolveHomeDirectory(home), ".config");
32
+ };
33
+ export const resolveDotweaveConfigDirectory = (xdgConfigHome) => {
34
+ return resolve(xdgConfigHome, CONSTANTS.XDG.APP_DIRECTORY_NAME);
35
+ };
36
+ export const resolveDotweaveGlobalConfigFilePath = (dotweaveConfigDirectory) => {
37
+ return resolve(dotweaveConfigDirectory, CONSTANTS.GLOBAL_CONFIG.FILE_NAME);
38
+ };
39
+ export const resolveDotweaveSyncDirectory = (dotweaveConfigDirectory) => {
40
+ return resolve(dotweaveConfigDirectory, CONSTANTS.XDG.SYNC_DIRECTORY_NAME);
41
+ };
42
+ export const expandHomePath = (value, home) => {
43
+ let expandedValue = value.trim();
44
+ const homeDirectory = resolveHomeDirectory(home);
45
+ if (expandedValue === "~") {
46
+ expandedValue = homeDirectory;
47
+ }
48
+ else if (expandedValue.startsWith("~/")) {
49
+ expandedValue = resolve(homeDirectory, expandedValue.slice(2));
50
+ }
51
+ return expandedValue;
52
+ };
53
+ export const expandConfiguredPath = (value, home, xdgConfigHome, readEnv) => {
54
+ let expandedValue = value.trim();
55
+ if (readEnv !== undefined && expandedValue.includes("%")) {
56
+ expandedValue = expandWindowsEnvVars(expandedValue, readEnv);
57
+ }
58
+ expandedValue = expandHomePath(expandedValue, home);
59
+ const resolvedXdgConfigHome = resolveXdgConfigHome(home, xdgConfigHome);
60
+ if (expandedValue === xdgConfigHomeToken) {
61
+ expandedValue = resolvedXdgConfigHome;
62
+ }
63
+ else if (expandedValue.startsWith(xdgConfigHomeTokenPrefix)) {
64
+ expandedValue = resolve(resolvedXdgConfigHome, expandedValue.slice(xdgConfigHomeTokenPrefix.length));
65
+ }
66
+ else if (expandedValue === bracedXdgConfigHomeToken) {
67
+ expandedValue = resolvedXdgConfigHome;
68
+ }
69
+ else if (expandedValue.startsWith(bracedXdgConfigHomePrefix)) {
70
+ expandedValue = resolve(resolvedXdgConfigHome, expandedValue.slice(bracedXdgConfigHomePrefix.length));
71
+ }
72
+ return expandedValue;
73
+ };
74
+ export const resolveConfiguredAbsolutePath = (value, home, xdgConfigHome, readEnv) => {
75
+ const expandedValue = expandConfiguredPath(value, home, xdgConfigHome, readEnv);
76
+ if (!isAbsolute(expandedValue)) {
77
+ throw new Error(`Configured path must be absolute or start with ~ or ${xdgConfigHomeToken}: ${value}`);
78
+ }
79
+ return resolve(expandedValue);
80
+ };
81
+ export const expandWindowsEnvVars = (value, readEnv) => {
82
+ return value.replace(/%([^%]+)%/g, (_match, varName) => {
83
+ const envValue = readTrimmedEnvironmentValue(readEnv, varName);
84
+ if (envValue === undefined) {
85
+ throw new Error(`Environment variable %${varName}% is not defined.`);
86
+ }
87
+ return envValue;
88
+ });
89
+ };
90
+ //# sourceMappingURL=xdg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg.js","sourceRoot":"","sources":["../../src/config/xdg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "#app/application.ts";
3
+ await runCli(process.argv.slice(2));
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const fileContentsEqual: (left: Uint8Array, right: Uint8Array, options?: Readonly<{
2
+ normalizeTextLineEndings?: boolean;
3
+ }>) => boolean;
4
+ export declare const shouldNormalizeTextLineEndings: () => boolean;
5
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/lib/content.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,iBAAiB,GAC5B,MAAM,UAAU,EAChB,OAAO,UAAU,EACjB,UAAS,QAAQ,CAAC;IAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAM,YAkBR,CAAC;AAEF,eAAO,MAAM,8BAA8B,eAE1C,CAAC"}
@@ -0,0 +1,29 @@
1
+ const decodeUtf8 = (contents) => {
2
+ try {
3
+ return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(contents);
4
+ }
5
+ catch {
6
+ return undefined;
7
+ }
8
+ };
9
+ const normalizeLineEndings = (contents) => {
10
+ return contents.replaceAll("\r\n", "\n");
11
+ };
12
+ export const fileContentsEqual = (left, right, options = {}) => {
13
+ if (Buffer.compare(Buffer.from(left), Buffer.from(right)) === 0) {
14
+ return true;
15
+ }
16
+ if (options.normalizeTextLineEndings !== true) {
17
+ return false;
18
+ }
19
+ const leftText = decodeUtf8(left);
20
+ const rightText = decodeUtf8(right);
21
+ if (leftText === undefined || rightText === undefined) {
22
+ return false;
23
+ }
24
+ return normalizeLineEndings(leftText) === normalizeLineEndings(rightText);
25
+ };
26
+ export const shouldNormalizeTextLineEndings = () => {
27
+ return process.platform === "win32";
28
+ };
29
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/lib/content.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAC,QAAoB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CACtE,QAAQ,CACT,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,EAAE;IAChD,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAgB,EAChB,KAAiB,EACjB,UAEK,EAAE,EACP,EAAE;IACF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,wBAAwB,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,oBAAoB,CAAC,QAAQ,CAAC,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,EAAE;IACjD,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @description
3
+ * Validates and normalizes a single age identity for dotweave use.
4
+ */
5
+ export declare const resolveAgeIdentity: (identity: string) => Promise<{
6
+ identity: string;
7
+ recipient: string;
8
+ }>;
9
+ /**
10
+ * @description
11
+ * Reads usable age identities from an identity file.
12
+ */
13
+ export declare const readAgeIdentityLines: (identityFile: string) => Promise<string[]>;
14
+ /**
15
+ * @description
16
+ * Derives the unique recipient list represented by an identity file.
17
+ */
18
+ export declare const readAgeRecipientsFromIdentityFile: (identityFile: string) => Promise<string[]>;
19
+ /**
20
+ * @description
21
+ * Generates and persists a new age identity file for dotweave.
22
+ */
23
+ export declare const createAgeIdentityFile: (identityFile: string) => Promise<{
24
+ identity: string;
25
+ recipient: string;
26
+ }>;
27
+ /**
28
+ * @description
29
+ * Persists a supplied age identity after validating it.
30
+ */
31
+ export declare const writeAgeIdentityFile: (identityFile: string, identity: string) => Promise<{
32
+ identity: string;
33
+ recipient: string;
34
+ }>;
35
+ /**
36
+ * @description
37
+ * Encrypts secret file contents for the configured recipients.
38
+ */
39
+ export declare const encryptSecretFile: (contents: Uint8Array, recipients: readonly string[]) => Promise<string>;
40
+ /**
41
+ * @description
42
+ * Decrypts an armored secret artifact with identities from the configured file.
43
+ */
44
+ export declare const decryptSecretFile: (armoredCiphertext: string, identityFile: string) => Promise<Uint8Array<ArrayBufferLike>>;
45
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAU,UAAU,MAAM;;;EAqBxD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAU,cAAc,MAAM,sBAqB9D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iCAAiC,GAC5C,cAAc,MAAM,sBAwBrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAU,cAAc,MAAM;;;EAW/D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAC/B,cAAc,MAAM,EACpB,UAAU,MAAM;;;EAYjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,UAAU,EACpB,YAAY,SAAS,MAAM,EAAE,oBAW9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,mBAAmB,MAAM,EACzB,cAAc,MAAM,yCAkBrB,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { armor, Decrypter, Encrypter, generateIdentity, identityToRecipient, } from "age-encryption";
4
+ import { DotweaveError, wrapUnknownError } from "#app/lib/error.ts";
5
+ import { ensureTrailingNewline } from "#app/lib/string.ts";
6
+ /**
7
+ * @description
8
+ * Validates and normalizes a single age identity for dotweave use.
9
+ */
10
+ export const resolveAgeIdentity = async (identity) => {
11
+ const normalizedIdentity = identity.trim();
12
+ if (normalizedIdentity === "") {
13
+ throw new DotweaveError("Age private key cannot be empty.", {
14
+ code: "AGE_IDENTITY_INVALID",
15
+ hint: "Provide a valid age private key starting with 'AGE-SECRET-KEY-'.",
16
+ });
17
+ }
18
+ try {
19
+ return {
20
+ identity: normalizedIdentity,
21
+ recipient: await identityToRecipient(normalizedIdentity),
22
+ };
23
+ }
24
+ catch (error) {
25
+ throw wrapUnknownError("Invalid age private key.", error, {
26
+ code: "AGE_IDENTITY_INVALID",
27
+ hint: "Provide a valid age private key starting with 'AGE-SECRET-KEY-'.",
28
+ });
29
+ }
30
+ };
31
+ /**
32
+ * @description
33
+ * Reads usable age identities from an identity file.
34
+ */
35
+ export const readAgeIdentityLines = async (identityFile) => {
36
+ const contents = await readFile(identityFile, "utf8");
37
+ const identities = contents
38
+ .split(/\r?\n/u)
39
+ .map((line) => line.trim())
40
+ .filter((line) => {
41
+ return line !== "" && !line.startsWith("#");
42
+ });
43
+ if (identities.length === 0) {
44
+ throw new DotweaveError("No age identities were found in the configured identity file.", {
45
+ code: "AGE_IDENTITY_EMPTY",
46
+ details: [`Identity file: ${identityFile}`],
47
+ hint: "Add at least one age private key to the identity file, or run 'dotweave init' to generate one.",
48
+ });
49
+ }
50
+ return identities;
51
+ };
52
+ /**
53
+ * @description
54
+ * Derives the unique recipient list represented by an identity file.
55
+ */
56
+ export const readAgeRecipientsFromIdentityFile = async (identityFile) => {
57
+ const identities = await readAgeIdentityLines(identityFile);
58
+ let recipients;
59
+ try {
60
+ recipients = await Promise.all(identities.map(async (identity) => {
61
+ return await identityToRecipient(identity);
62
+ }));
63
+ }
64
+ catch (error) {
65
+ throw wrapUnknownError("Failed to read age recipients from the configured identity file.", error, {
66
+ code: "AGE_RECIPIENT_READ_FAILED",
67
+ details: [`Identity file: ${identityFile}`],
68
+ hint: "Check that the identity file contains valid age private keys.",
69
+ });
70
+ }
71
+ return [...new Set(recipients)];
72
+ };
73
+ /**
74
+ * @description
75
+ * Generates and persists a new age identity file for dotweave.
76
+ */
77
+ export const createAgeIdentityFile = async (identityFile) => {
78
+ const identity = await generateIdentity();
79
+ const recipient = await identityToRecipient(identity);
80
+ await mkdir(dirname(identityFile), { recursive: true });
81
+ await writeFile(identityFile, ensureTrailingNewline(identity), "utf8");
82
+ return {
83
+ identity,
84
+ recipient,
85
+ };
86
+ };
87
+ /**
88
+ * @description
89
+ * Persists a supplied age identity after validating it.
90
+ */
91
+ export const writeAgeIdentityFile = async (identityFile, identity) => {
92
+ const resolvedIdentity = await resolveAgeIdentity(identity);
93
+ await mkdir(dirname(identityFile), { recursive: true });
94
+ await writeFile(identityFile, ensureTrailingNewline(resolvedIdentity.identity), "utf8");
95
+ return resolvedIdentity;
96
+ };
97
+ /**
98
+ * @description
99
+ * Encrypts secret file contents for the configured recipients.
100
+ */
101
+ export const encryptSecretFile = async (contents, recipients) => {
102
+ const encrypter = new Encrypter();
103
+ for (const recipient of recipients) {
104
+ encrypter.addRecipient(recipient);
105
+ }
106
+ const ciphertext = await encrypter.encrypt(contents);
107
+ return armor.encode(ciphertext);
108
+ };
109
+ /**
110
+ * @description
111
+ * Decrypts an armored secret artifact with identities from the configured file.
112
+ */
113
+ export const decryptSecretFile = async (armoredCiphertext, identityFile) => {
114
+ const decrypter = new Decrypter();
115
+ const identities = await readAgeIdentityLines(identityFile);
116
+ for (const identity of identities) {
117
+ decrypter.addIdentity(identity);
118
+ }
119
+ try {
120
+ return await decrypter.decrypt(armor.decode(armoredCiphertext));
121
+ }
122
+ catch (error) {
123
+ throw wrapUnknownError("Failed to decrypt a secret artifact.", error, {
124
+ code: "AGE_DECRYPT_FAILED",
125
+ details: [`Identity file: ${identityFile}`],
126
+ hint: "Check that the artifact is valid age data and that the configured identity file matches one of its recipients.",
127
+ });
128
+ }
129
+ };
130
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import z from "zod";
2
+ declare const EnvSchema: z.ZodObject<{
3
+ COMSPEC: z.ZodOptional<z.ZodString>;
4
+ HOME: z.ZodOptional<z.ZodString>;
5
+ SHELL: z.ZodOptional<z.ZodString>;
6
+ WSL_DISTRO_NAME: z.ZodOptional<z.ZodString>;
7
+ WSL_INTEROP: z.ZodOptional<z.ZodString>;
8
+ XDG_CONFIG_HOME: z.ZodOptional<z.ZodString>;
9
+ }, z.z.core.$catchall<z.ZodOptional<z.ZodString>>>;
10
+ export type Env = z.infer<typeof EnvSchema>;
11
+ export declare const ENV: Env;
12
+ export {};
13
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,QAAA,MAAM,SAAS;;;;;;;kDAmDmB,CAAC;AAEnC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAE5C,eAAO,MAAM,GAAG,EAAE,GAAkC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import z from "zod";
2
+ const EnvSchema = z
3
+ .object({
4
+ /**
5
+ * @description
6
+ * Windows only. Path to the default command interpreter (usually `cmd.exe`).
7
+ * Used as the fallback shell command when no explicit override is configured
8
+ * and no parent PowerShell process is detected on the Windows platform.
9
+ */
10
+ COMSPEC: z.string().optional(),
11
+ /**
12
+ * @description
13
+ * The current user's home directory. Used as the root for resolving `~`-prefixed
14
+ * local paths throughout config loading, path expansion, and sync entry
15
+ * resolution on all platforms.
16
+ */
17
+ HOME: z.string().optional(),
18
+ /**
19
+ * @description
20
+ * Unix/macOS/WSL. Absolute path to the user's preferred login shell (e.g.
21
+ * `/bin/zsh` or `/usr/bin/fish`). Read by the `dotweave cd` command to select
22
+ * the shell to launch when no explicit override is configured.
23
+ */
24
+ SHELL: z.string().optional(),
25
+ /**
26
+ * @description
27
+ * WSL (Windows Subsystem for Linux) only. Set by WSL to the name of the active
28
+ * distro (e.g. `Ubuntu`). Its presence is used to detect the WSL platform so
29
+ * that WSL-specific sync mode overrides are applied when resolving config entries.
30
+ */
31
+ WSL_DISTRO_NAME: z.string().optional(),
32
+ /**
33
+ * @description
34
+ * WSL (Windows Subsystem for Linux) only. Path to the WSL interop socket used
35
+ * to communicate with the Windows host. Its presence is used as a secondary
36
+ * signal for detecting the WSL platform alongside `WSL_DISTRO_NAME`.
37
+ */
38
+ WSL_INTEROP: z.string().optional(),
39
+ /**
40
+ * @description
41
+ * XDG Base Directory spec override for the user's config home. When set,
42
+ * replaces the default `~/.config` location for all dotweave configuration
43
+ * files (global config, identity keys, the sync directory). Expanded via
44
+ * Windows-style `%VARIABLE%` expansion when running under WSL or Windows.
45
+ */
46
+ XDG_CONFIG_HOME: z.string().optional(),
47
+ })
48
+ .catchall(z.string().optional());
49
+ export const ENV = EnvSchema.parse(process.env);
50
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN;;;;;OAKG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE9B;;;;;OAKG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE3B;;;;;OAKG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE5B;;;;;OAKG;IACH,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEtC;;;;;OAKG;IACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAElC;;;;;;OAMG;IACH,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC;KACD,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAInC,MAAM,CAAC,MAAM,GAAG,GAAQ,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type DotweaveErrorOptions = Readonly<{
2
+ code?: string;
3
+ details?: readonly string[];
4
+ hint?: string;
5
+ }>;
6
+ export declare class DotweaveError extends Error {
7
+ readonly code?: string;
8
+ readonly details: readonly string[];
9
+ readonly hint?: string;
10
+ constructor(message: string, options?: DotweaveErrorOptions);
11
+ }
12
+ /**
13
+ * @description
14
+ * Renders supported error values into the user-facing dotweave error format.
15
+ */
16
+ export declare const formatDotweaveError: (error: DotweaveError | Error | string) => string;
17
+ /**
18
+ * @description
19
+ * Wraps unknown failures in a DotweaveError with normalized detail lines.
20
+ */
21
+ export declare const wrapUnknownError: (message: string, error: unknown, options?: DotweaveErrorOptions) => DotweaveError;
22
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAYH,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB;CAOvE;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,aAAa,GAAG,KAAK,GAAG,MAAM,WAcxE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,MAAM,EACf,OAAO,OAAO,EACd,UAAS,oBAAyB,kBAQnC,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @description
3
+ * Removes empty lines before error details are rendered or stored.
4
+ */
5
+ const compactLines = (lines) => {
6
+ return lines.filter((line) => {
7
+ return typeof line === "string" && line.trim().length > 0;
8
+ });
9
+ };
10
+ export class DotweaveError extends Error {
11
+ code;
12
+ details;
13
+ hint;
14
+ constructor(message, options = {}) {
15
+ super(message);
16
+ this.name = "DotweaveError";
17
+ this.code = options.code;
18
+ this.details = options.details ?? [];
19
+ this.hint = options.hint;
20
+ }
21
+ }
22
+ /**
23
+ * @description
24
+ * Renders supported error values into the user-facing dotweave error format.
25
+ */
26
+ export const formatDotweaveError = (error) => {
27
+ if (typeof error === "string") {
28
+ return error;
29
+ }
30
+ if (!(error instanceof DotweaveError)) {
31
+ return error.message;
32
+ }
33
+ return compactLines([
34
+ error.message,
35
+ ...error.details,
36
+ error.hint === undefined ? undefined : `Hint: ${error.hint}`,
37
+ ]).join("\n");
38
+ };
39
+ /**
40
+ * @description
41
+ * Wraps unknown failures in a DotweaveError with normalized detail lines.
42
+ */
43
+ export const wrapUnknownError = (message, error, options = {}) => {
44
+ const detail = error instanceof Error ? error.message.trim() : String(error);
45
+ return new DotweaveError(message, {
46
+ ...options,
47
+ details: compactLines([...(options.details ?? []), detail]),
48
+ });
49
+ };
50
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,KAAsC,EAAE,EAAE;IAC9D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE;QAC3C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtB,IAAI,CAAU;IACd,OAAO,CAAoB;IAC3B,IAAI,CAAU;IAE9B,YAAmB,OAAe,EAAE,UAAgC,EAAE;QACpE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAqC,EAAE,EAAE;IAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,YAAY,CAAC;QAClB,KAAK,CAAC,OAAO;QACb,GAAG,KAAK,CAAC,OAAO;QAChB,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE;KAC7D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAe,EACf,KAAc,EACd,UAAgC,EAAE,EAClC,EAAE;IACF,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7E,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE;QAChC,GAAG,OAAO;QACV,OAAO,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @description
3
+ * Indicates whether the current filesystem can reliably round-trip POSIX modes.
4
+ */
5
+ export declare const supportsPosixFileModes: () => boolean;
6
+ /**
7
+ * @description
8
+ * Builds the default file mode for regular sync artifacts.
9
+ */
10
+ export declare const buildExecutableMode: (executable: boolean) => 493 | 420;
11
+ /**
12
+ * @description
13
+ * Expands directory permissions so readable entries remain searchable.
14
+ */
15
+ export declare const buildSearchableDirectoryMode: (mode: number) => number;
16
+ /**
17
+ * @description
18
+ * Determines whether a mode grants execute permission to any class.
19
+ */
20
+ export declare const isExecutableMode: (mode: number | bigint) => boolean;
21
+ /**
22
+ * @description
23
+ * Validates permission strings accepted by dotweave configuration.
24
+ */
25
+ export declare const isPermissionOctal: (value: string) => boolean;
26
+ /**
27
+ * @description
28
+ * Converts a validated permission string into a numeric file mode.
29
+ */
30
+ export declare const parsePermissionOctal: (value: string) => number;
31
+ /**
32
+ * @description
33
+ * Formats a mode as the permission string shape used in configuration.
34
+ */
35
+ export declare const formatPermissionOctal: (mode: number) => string;
36
+ //# sourceMappingURL=file-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mode.d.ts","sourceRoot":"","sources":["../../src/lib/file-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,eAElC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,YAAY,OAAO,cAEtD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GAAI,MAAM,MAAM,WAIxD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,GAAG,MAAM,YAErD,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,YAE9C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,WAQjD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,WAEjD,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @description
3
+ * Indicates whether the current filesystem can reliably round-trip POSIX modes.
4
+ */
5
+ export const supportsPosixFileModes = () => {
6
+ return process.platform !== "win32";
7
+ };
8
+ /**
9
+ * @description
10
+ * Builds the default file mode for regular sync artifacts.
11
+ */
12
+ export const buildExecutableMode = (executable) => {
13
+ return executable ? 0o755 : 0o644;
14
+ };
15
+ /**
16
+ * @description
17
+ * Expands directory permissions so readable entries remain searchable.
18
+ */
19
+ export const buildSearchableDirectoryMode = (mode) => {
20
+ const normalizedMode = mode & 0o777;
21
+ return normalizedMode | ((normalizedMode & 0o444) >> 2);
22
+ };
23
+ /**
24
+ * @description
25
+ * Determines whether a mode grants execute permission to any class.
26
+ */
27
+ export const isExecutableMode = (mode) => {
28
+ return (Number(mode) & 0o111) !== 0;
29
+ };
30
+ const permissionOctalPattern = /^0[0-7]{3}$/;
31
+ /**
32
+ * @description
33
+ * Validates permission strings accepted by dotweave configuration.
34
+ */
35
+ export const isPermissionOctal = (value) => {
36
+ return permissionOctalPattern.test(value);
37
+ };
38
+ /**
39
+ * @description
40
+ * Converts a validated permission string into a numeric file mode.
41
+ */
42
+ export const parsePermissionOctal = (value) => {
43
+ if (!isPermissionOctal(value)) {
44
+ throw new Error(`Invalid permission octal: ${value}. Expected a 4-character octal string like "0600" or "0755".`);
45
+ }
46
+ return Number.parseInt(value, 8);
47
+ };
48
+ /**
49
+ * @description
50
+ * Formats a mode as the permission string shape used in configuration.
51
+ */
52
+ export const formatPermissionOctal = (mode) => {
53
+ return `0${(mode & 0o777).toString(8).padStart(3, "0")}`;
54
+ };
55
+ //# sourceMappingURL=file-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mode.js","sourceRoot":"","sources":["../../src/lib/file-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAmB,EAAE,EAAE;IACzD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACpC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAY,EAAE,EAAE;IAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,KAAK,CAAC;IAEpC,OAAO,cAAc,GAAG,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAE,EAAE;IACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE;IACjD,OAAO,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,EAAE;IACpD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,8DAA8D,CACjG,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,EAAE;IACpD,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC,CAAC"}