@detergent-software/atk 8.1.2-dev.3 → 8.1.2-dev.31

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 (131) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/build/commands/browse.js +5 -9
  3. package/build/commands/browse.js.map +1 -1
  4. package/build/commands/install.js +2 -2
  5. package/build/commands/install.js.map +1 -1
  6. package/build/commands/list.js +2 -2
  7. package/build/commands/list.js.map +1 -1
  8. package/build/commands/login.js +2 -2
  9. package/build/commands/login.js.map +1 -1
  10. package/build/commands/register.js +3 -3
  11. package/build/commands/register.js.map +1 -1
  12. package/build/commands/sync.d.ts.map +1 -1
  13. package/build/commands/sync.js +16 -11
  14. package/build/commands/sync.js.map +1 -1
  15. package/build/commands/uninstall.d.ts +9 -1
  16. package/build/commands/uninstall.d.ts.map +1 -1
  17. package/build/commands/uninstall.js +23 -26
  18. package/build/commands/uninstall.js.map +1 -1
  19. package/build/commands/update.d.ts +9 -1
  20. package/build/commands/update.d.ts.map +1 -1
  21. package/build/commands/update.js +54 -14
  22. package/build/commands/update.js.map +1 -1
  23. package/build/components/InstallConfirmBar.d.ts.map +1 -1
  24. package/build/components/InstallConfirmBar.js +2 -1
  25. package/build/components/InstallConfirmBar.js.map +1 -1
  26. package/build/components/ListActionBar.d.ts.map +1 -1
  27. package/build/components/ListActionBar.js +3 -2
  28. package/build/components/ListActionBar.js.map +1 -1
  29. package/build/components/RunStoppedHint.d.ts +13 -0
  30. package/build/components/RunStoppedHint.d.ts.map +1 -0
  31. package/build/components/RunStoppedHint.js +12 -0
  32. package/build/components/RunStoppedHint.js.map +1 -0
  33. package/build/components/SkippedAssetSection.d.ts +2 -0
  34. package/build/components/SkippedAssetSection.d.ts.map +1 -1
  35. package/build/components/SkippedAssetSection.js +1 -1
  36. package/build/components/SkippedAssetSection.js.map +1 -1
  37. package/build/components/SyncDriftedList.d.ts +3 -2
  38. package/build/components/SyncDriftedList.d.ts.map +1 -1
  39. package/build/components/SyncDriftedList.js +11 -3
  40. package/build/components/SyncDriftedList.js.map +1 -1
  41. package/build/components/index.d.ts +1 -0
  42. package/build/components/index.d.ts.map +1 -1
  43. package/build/components/index.js +1 -0
  44. package/build/components/index.js.map +1 -1
  45. package/build/hooks/useCommand.js +2 -2
  46. package/build/hooks/useCommand.js.map +1 -1
  47. package/build/hooks/useInitState.js +5 -5
  48. package/build/hooks/useInitState.js.map +1 -1
  49. package/build/hooks/useListActions.d.ts.map +1 -1
  50. package/build/hooks/useListActions.js +34 -18
  51. package/build/hooks/useListActions.js.map +1 -1
  52. package/build/hooks/usePruneState.js +7 -7
  53. package/build/hooks/usePruneState.js.map +1 -1
  54. package/build/hooks/usePublishState.js +3 -3
  55. package/build/hooks/usePublishState.js.map +1 -1
  56. package/build/hooks/useRegistryChangeState.js +2 -2
  57. package/build/hooks/useRegistryChangeState.js.map +1 -1
  58. package/build/hooks/useSetupState.js +3 -3
  59. package/build/hooks/useSetupState.js.map +1 -1
  60. package/build/hooks/useUninstallState.d.ts +16 -29
  61. package/build/hooks/useUninstallState.d.ts.map +1 -1
  62. package/build/hooks/useUninstallState.js +147 -140
  63. package/build/hooks/useUninstallState.js.map +1 -1
  64. package/build/lib/adapter.d.ts.map +1 -1
  65. package/build/lib/adapter.js +3 -3
  66. package/build/lib/adapter.js.map +1 -1
  67. package/build/lib/asset-tools.d.ts +5 -0
  68. package/build/lib/asset-tools.d.ts.map +1 -1
  69. package/build/lib/asset-tools.js +7 -0
  70. package/build/lib/asset-tools.js.map +1 -1
  71. package/build/lib/auth.d.ts.map +1 -1
  72. package/build/lib/auth.js +3 -3
  73. package/build/lib/auth.js.map +1 -1
  74. package/build/lib/checksum.d.ts.map +1 -1
  75. package/build/lib/checksum.js +2 -1
  76. package/build/lib/checksum.js.map +1 -1
  77. package/build/lib/diagnostics.d.ts.map +1 -1
  78. package/build/lib/diagnostics.js +6 -5
  79. package/build/lib/diagnostics.js.map +1 -1
  80. package/build/lib/diff-command.d.ts.map +1 -1
  81. package/build/lib/diff-command.js +10 -6
  82. package/build/lib/diff-command.js.map +1 -1
  83. package/build/lib/entra.d.ts.map +1 -1
  84. package/build/lib/entra.js +3 -2
  85. package/build/lib/entra.js.map +1 -1
  86. package/build/lib/errors.d.ts +9 -0
  87. package/build/lib/errors.d.ts.map +1 -1
  88. package/build/lib/errors.js +29 -0
  89. package/build/lib/errors.js.map +1 -1
  90. package/build/lib/file-snapshot.d.ts +17 -0
  91. package/build/lib/file-snapshot.d.ts.map +1 -0
  92. package/build/lib/file-snapshot.js +41 -0
  93. package/build/lib/file-snapshot.js.map +1 -0
  94. package/build/lib/installer.d.ts +64 -3
  95. package/build/lib/installer.d.ts.map +1 -1
  96. package/build/lib/installer.js +177 -48
  97. package/build/lib/installer.js.map +1 -1
  98. package/build/lib/lockfile.d.ts +23 -4
  99. package/build/lib/lockfile.d.ts.map +1 -1
  100. package/build/lib/lockfile.js +32 -14
  101. package/build/lib/lockfile.js.map +1 -1
  102. package/build/lib/org.d.ts +16 -0
  103. package/build/lib/org.d.ts.map +1 -1
  104. package/build/lib/org.js +18 -0
  105. package/build/lib/org.js.map +1 -1
  106. package/build/lib/owned-paths.d.ts +9 -0
  107. package/build/lib/owned-paths.d.ts.map +1 -0
  108. package/build/lib/owned-paths.js +23 -0
  109. package/build/lib/owned-paths.js.map +1 -0
  110. package/build/lib/publisher.d.ts.map +1 -1
  111. package/build/lib/publisher.js +2 -1
  112. package/build/lib/publisher.js.map +1 -1
  113. package/build/lib/registry.d.ts.map +1 -1
  114. package/build/lib/registry.js +10 -6
  115. package/build/lib/registry.js.map +1 -1
  116. package/build/lib/setup.d.ts.map +1 -1
  117. package/build/lib/setup.js +4 -3
  118. package/build/lib/setup.js.map +1 -1
  119. package/build/lib/sync.d.ts +17 -4
  120. package/build/lib/sync.d.ts.map +1 -1
  121. package/build/lib/sync.js +110 -41
  122. package/build/lib/sync.js.map +1 -1
  123. package/build/lib/uninstaller.d.ts +21 -4
  124. package/build/lib/uninstaller.d.ts.map +1 -1
  125. package/build/lib/uninstaller.js +45 -36
  126. package/build/lib/uninstaller.js.map +1 -1
  127. package/build/lib/updater.d.ts +64 -3
  128. package/build/lib/updater.d.ts.map +1 -1
  129. package/build/lib/updater.js +355 -83
  130. package/build/lib/updater.js.map +1 -1
  131. package/package.json +1 -1
@@ -45,6 +45,8 @@ export declare abstract class ApiCodeError extends GuidedError {
45
45
  export declare class SetupRequiredError extends GuidedError {
46
46
  name: string;
47
47
  }
48
+ /** Text as a sentence: a period is added only when it doesn't already end with one. */
49
+ export declare function asSentence(text: string): string;
48
50
  /**
49
51
  * Read `code`, `command` and `hint` off any thrown value (ApiRequestError,
50
52
  * AuthError, SetupRequiredError, ...), keeping each only when it is a string.
@@ -52,4 +54,11 @@ export declare class SetupRequiredError extends GuidedError {
52
54
  * error state and JSON payload; rewraps and failure entries carry it on.
53
55
  */
54
56
  export declare function errorGuidance(err: unknown): ErrorGuidance;
57
+ /** The message of a thrown value: an Error's `message`, anything else as a string. */
58
+ export declare function errorMessage(err: unknown): string;
59
+ /**
60
+ * Whether a failure's API code fails every asset of a run, so bulk update and sync
61
+ * stop at it instead of repeating the same failure for each remaining asset.
62
+ */
63
+ export declare function isRunWideFailure({ code }: ErrorGuidance): boolean;
55
64
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAErE,yFAAyF;AACzF,8BAAsB,WAAY,SAAQ,KAAK;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;CAK9D;AAED;;;GAGG;AACH,8BAAsB,YAAa,SAAQ,WAAW;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;CAIzD;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IACxC,IAAI,SAAwB;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAWzD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAErE,yFAAyF;AACzF,8BAAsB,WAAY,SAAQ,KAAK;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;CAK9D;AAED;;;GAGG;AACH,8BAAsB,YAAa,SAAQ,WAAW;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;CAIzD;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IACxC,IAAI,SAAwB;CACtC;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAWzD;AAiBD,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,aAAa,GAAG,OAAO,CAEjE"}
@@ -29,6 +29,10 @@ export class ApiCodeError extends GuidedError {
29
29
  export class SetupRequiredError extends GuidedError {
30
30
  name = 'SetupRequiredError';
31
31
  }
32
+ /** Text as a sentence: a period is added only when it doesn't already end with one. */
33
+ export function asSentence(text) {
34
+ return /[.!?]$/.test(text) ? text : `${text}.`;
35
+ }
32
36
  /**
33
37
  * Read `code`, `command` and `hint` off any thrown value (ApiRequestError,
34
38
  * AuthError, SetupRequiredError, ...), keeping each only when it is a string.
@@ -43,4 +47,29 @@ export function errorGuidance(err) {
43
47
  ...(typeof hint === 'string' ? { hint } : {}),
44
48
  };
45
49
  }
50
+ /**
51
+ * API codes that fail every request of a run the same way, whatever the asset: an
52
+ * outdated CLI, a rejected credential, or a caller outside the org.
53
+ */
54
+ const RUN_WIDE_CODES = new Set([
55
+ 'cli_outdated',
56
+ 'github_auth_retired',
57
+ 'guest_not_allowed',
58
+ 'invalid_token',
59
+ 'not_org_member',
60
+ 'org_membership_unverifiable',
61
+ 'unauthenticated',
62
+ 'unsupported_token',
63
+ ]);
64
+ /** The message of a thrown value: an Error's `message`, anything else as a string. */
65
+ export function errorMessage(err) {
66
+ return err instanceof Error ? err.message : String(err);
67
+ }
68
+ /**
69
+ * Whether a failure's API code fails every asset of a run, so bulk update and sync
70
+ * stop at it instead of repeating the same failure for each remaining asset.
71
+ */
72
+ export function isRunWideFailure({ code }) {
73
+ return code !== undefined && RUN_WIDE_CODES.has(code);
74
+ }
46
75
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAwBA,yFAAyF;AACzF,MAAM,OAAgB,WAAY,SAAQ,KAAK;IAC7C,OAAO,CAAU;IACjB,IAAI,CAAU;IAEd,YAAY,OAAe,EAAE,UAA8B,EAAE;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAgB,YAAa,SAAQ,WAAW;IACpD,IAAI,CAAU;IAEd,YAAY,OAAe,EAAE,UAAyB,EAAE;QACtD,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACxC,IAAI,GAAG,oBAAoB,CAAC;CACtC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAIlF,CAAC;IACF,OAAO;QACL,GAAG,CAAC,GAAG,YAAY,YAAY,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAwBA,yFAAyF;AACzF,MAAM,OAAgB,WAAY,SAAQ,KAAK;IAC7C,OAAO,CAAU;IACjB,IAAI,CAAU;IAEd,YAAY,OAAe,EAAE,UAA8B,EAAE;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAgB,YAAa,SAAQ,WAAW;IACpD,IAAI,CAAU;IAEd,YAAY,OAAe,EAAE,UAAyB,EAAE;QACtD,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACxC,IAAI,GAAG,oBAAoB,CAAC;CACtC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAIlF,CAAC;IACF,OAAO;QACL,GAAG,CAAC,GAAG,YAAY,YAAY,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,eAAe;IACf,gBAAgB;IAChB,6BAA6B;IAC7B,iBAAiB;IACjB,mBAAmB;CACpB,CAAC,CAAC;AAEH,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAiB;IACtD,OAAO,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** The bytes and mode of files captured before a change, by absolute path. */
2
+ export type FileSnapshot = ReadonlyMap<string, {
3
+ content: Buffer;
4
+ mode: number;
5
+ }>;
6
+ /**
7
+ * Write every file of a snapshot back as it was, recreating its directory and mode (a hook
8
+ * script keeps its exec bit). Files created since the snapshot are left alone. A file that
9
+ * can't be written doesn't stop the others; the first error is thrown once all were tried.
10
+ */
11
+ export declare function restoreFiles(snapshot: FileSnapshot): Promise<void>;
12
+ /**
13
+ * Capture the bytes and mode of each file in `paths` that exists. A missing path is skipped,
14
+ * including one under a file where a directory would be (`ENOTDIR` on POSIX, `ENOENT` on Windows).
15
+ */
16
+ export declare function snapshotFiles(paths: Iterable<string>): Promise<FileSnapshot>;
17
+ //# sourceMappingURL=file-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.d.ts","sourceRoot":"","sources":["../../src/lib/file-snapshot.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAYlF"}
@@ -0,0 +1,41 @@
1
+ import { chmod, readFile, stat } from 'node:fs/promises';
2
+ import { writeBinaryFile } from './write-file.js';
3
+ /**
4
+ * Write every file of a snapshot back as it was, recreating its directory and mode (a hook
5
+ * script keeps its exec bit). Files created since the snapshot are left alone. A file that
6
+ * can't be written doesn't stop the others; the first error is thrown once all were tried.
7
+ */
8
+ export async function restoreFiles(snapshot) {
9
+ const errors = [];
10
+ for (const [path, { content, mode }] of snapshot) {
11
+ try {
12
+ await writeBinaryFile(path, content);
13
+ await chmod(path, mode);
14
+ }
15
+ catch (error) {
16
+ errors.push(error);
17
+ }
18
+ }
19
+ if (errors.length > 0)
20
+ throw errors[0];
21
+ }
22
+ /**
23
+ * Capture the bytes and mode of each file in `paths` that exists. A missing path is skipped,
24
+ * including one under a file where a directory would be (`ENOTDIR` on POSIX, `ENOENT` on Windows).
25
+ */
26
+ export async function snapshotFiles(paths) {
27
+ const snapshot = new Map();
28
+ for (const path of new Set(paths)) {
29
+ const stats = await stat(path).catch((error) => {
30
+ const code = error.code;
31
+ if (code === 'ENOENT' || code === 'ENOTDIR')
32
+ return undefined;
33
+ throw error;
34
+ });
35
+ if (!stats?.isFile())
36
+ continue;
37
+ snapshot.set(path, { content: await readFile(path), mode: stats.mode });
38
+ }
39
+ return snapshot;
40
+ }
41
+ //# sourceMappingURL=file-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.js","sourceRoot":"","sources":["../../src/lib/file-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKlD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAsB;IACvD,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAuB;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6C,CAAC;IACtE,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACtD,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC9D,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;YAAE,SAAS;QAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,6 +1,9 @@
1
1
  import type { InstallPlan } from './resolver.js';
2
2
  import type { Adapter } from './schemas/adapter.js';
3
+ import type { RegistryAsset } from './schemas/index.js';
4
+ import type { Lockfile } from './schemas/lockfile.js';
3
5
  import { ApiCodeError } from './errors.js';
6
+ import { type AssetIdentity } from './lockfile.js';
4
7
  export interface InstallOptions {
5
8
  /** Adapter for the target tool. */
6
9
  adapter: Adapter;
@@ -10,8 +13,16 @@ export interface InstallOptions {
10
13
  org?: string;
11
14
  version: string;
12
15
  };
16
+ /** Files already downloaded with {@link fetchPlanFiles}, for every entry this tool can place. */
17
+ files?: PlanFiles;
13
18
  /** Skip file conflict detection, allowing overwrite of non-ATK files. */
14
19
  force?: boolean;
20
+ /**
21
+ * The lockfile as this tool has it, for deciding which files are ATK-managed. In a multi-tool
22
+ * update the shared lockfile can already list the files of a version an earlier tool installed,
23
+ * which a later tool does not have yet. Defaults to the lockfile on disk.
24
+ */
25
+ managedFrom?: Lockfile;
15
26
  /** Callback for progress updates. */
16
27
  onProgress?: (message: string) => void;
17
28
  /** Pin the asset at the installed version. */
@@ -47,9 +58,46 @@ export interface InstallResult {
47
58
  type: string;
48
59
  version: string;
49
60
  }
61
+ /** The downloaded files of a plan's entries, keyed by {@link planEntryKey}. */
62
+ export type PlanFiles = Map<string, AssetFiles>;
63
+ interface AssetFile {
64
+ /** Raw file bytes — asset files may be binary (images, spreadsheets), never assume text. */
65
+ content: Buffer;
66
+ relativePath: string;
67
+ }
68
+ interface AssetFiles {
69
+ entrypoint?: string;
70
+ files: AssetFile[];
71
+ }
50
72
  export declare class InstallerError extends ApiCodeError {
51
73
  name: string;
52
74
  }
75
+ /**
76
+ * A file the install would place at `path` exists and is not ATK-managed, or belongs to `owner`,
77
+ * another installed asset; nothing was written there.
78
+ */
79
+ export declare class FileConflictError extends InstallerError {
80
+ name: string;
81
+ readonly owner?: AssetIdentity;
82
+ readonly path: string;
83
+ constructor(path: string, owner?: AssetIdentity);
84
+ }
85
+ /**
86
+ * An install plan that failed at `asset` with `cause`, after rolling back the
87
+ * `rolledBack` assets it had already installed. Keeps the cause's API code and
88
+ * guidance, so callers that name the asset themselves can quote just the cause.
89
+ */
90
+ export declare class InstallPlanError extends InstallerError {
91
+ readonly asset: Pick<RegistryAsset, 'name' | 'org' | 'type'>;
92
+ readonly cause: unknown;
93
+ name: string;
94
+ constructor(asset: Pick<RegistryAsset, 'name' | 'org' | 'type'>, cause: unknown, rolledBack: number);
95
+ }
96
+ /** A plan whose files for `asset` could not be downloaded; nothing was written. */
97
+ export declare class PlanDownloadError extends InstallPlanError {
98
+ name: string;
99
+ constructor(asset: Pick<RegistryAsset, 'name' | 'org' | 'type'>, cause: unknown);
100
+ }
53
101
  /**
54
102
  * Guard for multi-tool installs run with `skipUnsupported`. Each tool skips the asset
55
103
  * types it cannot place, which is fine as long as some tool placed something. If every
@@ -62,9 +110,22 @@ export declare function assertInstalledByAnyTool(plan: InstallPlan, toolResults:
62
110
  }>): void;
63
111
  /**
64
112
  * Execute a full install plan — install all assets in order.
65
- * On partial failure, rolls back previously installed assets (deletes placed files,
66
- * reverts config entries, removes lockfile entries) so the system is not left in
67
- * an inconsistent state.
113
+ * On partial failure, deletes the files the failing asset wrote where no file was before placing
114
+ * its files failed, and rolls back previously installed assets (deletes placed files, reverts config entries, removes
115
+ * lockfile entries) so the system is not left in an inconsistent state.
68
116
  */
69
117
  export declare function executeInstallPlan(plan: InstallPlan, options: InstallOptions): Promise<InstallResult[]>;
118
+ /**
119
+ * Download the files of every plan entry this tool can place, without writing anything. A
120
+ * caller that replaces an installed asset downloads first, so a refused download leaves the
121
+ * installed version in place, then passes the result to {@link executeInstallPlan} as `files`.
122
+ */
123
+ export declare function fetchPlanFiles(plan: InstallPlan, adapter: Adapter): Promise<PlanFiles>;
124
+ /**
125
+ * The message of an install failure for `asset`, for a caller whose own message already names
126
+ * it: a plan that failed at that asset gives just its cause; one that failed at another asset
127
+ * keeps the installer's message, which names that asset.
128
+ */
129
+ export declare function installFailureMessage(error: unknown, asset: Pick<RegistryAsset, 'name' | 'org' | 'type'>): string;
130
+ export {};
70
131
  //# sourceMappingURL=installer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAiBpD,OAAO,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAS1D,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,8CAA8C;IAC9C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,oBAAoB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,WAAW,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,aAAa,EAAE,YAAY,GAAG,QAAQ,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD,qBAAa,cAAe,SAAQ,YAAY;IACrC,IAAI,SAAoB;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7D,IAAI,CAUN;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAiH7G"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"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"}