@detergent-software/atk 3.0.0-dev.1 → 3.0.0-dev.11
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/README.md +361 -0
- package/build/commands/audit.d.ts.map +1 -1
- package/build/commands/audit.js +77 -37
- package/build/commands/audit.js.map +1 -1
- package/build/commands/browse.d.ts.map +1 -1
- package/build/commands/browse.js +117 -152
- package/build/commands/browse.js.map +1 -1
- package/build/commands/diff.d.ts.map +1 -1
- package/build/commands/diff.js +2 -1
- package/build/commands/diff.js.map +1 -1
- package/build/commands/info.d.ts.map +1 -1
- package/build/commands/info.js +1 -1
- package/build/commands/info.js.map +1 -1
- package/build/commands/init.d.ts.map +1 -1
- package/build/commands/init.js +39 -405
- package/build/commands/init.js.map +1 -1
- package/build/commands/install.d.ts.map +1 -1
- package/build/commands/install.js +46 -31
- package/build/commands/install.js.map +1 -1
- package/build/commands/list.d.ts +2 -2
- package/build/commands/list.d.ts.map +1 -1
- package/build/commands/list.js +131 -27
- package/build/commands/list.js.map +1 -1
- package/build/commands/outdated.d.ts.map +1 -1
- package/build/commands/outdated.js +7 -6
- package/build/commands/outdated.js.map +1 -1
- package/build/commands/prune.d.ts.map +1 -1
- package/build/commands/prune.js +35 -47
- package/build/commands/prune.js.map +1 -1
- package/build/commands/publish.d.ts +3 -1
- package/build/commands/publish.d.ts.map +1 -1
- package/build/commands/publish.js +67 -390
- package/build/commands/publish.js.map +1 -1
- package/build/commands/setup.d.ts +1 -1
- package/build/commands/setup.d.ts.map +1 -1
- package/build/commands/setup.js +49 -242
- package/build/commands/setup.js.map +1 -1
- package/build/commands/sync.d.ts.map +1 -1
- package/build/commands/sync.js +111 -120
- package/build/commands/sync.js.map +1 -1
- package/build/commands/uninstall.d.ts.map +1 -1
- package/build/commands/uninstall.js +103 -218
- package/build/commands/uninstall.js.map +1 -1
- package/build/commands/update.d.ts.map +1 -1
- package/build/commands/update.js +30 -23
- package/build/commands/update.js.map +1 -1
- package/build/components/AssetTable.d.ts +3 -1
- package/build/components/AssetTable.d.ts.map +1 -1
- package/build/components/AssetTable.js +30 -37
- package/build/components/AssetTable.js.map +1 -1
- package/build/components/BrowseExpandedBundle.d.ts +7 -0
- package/build/components/BrowseExpandedBundle.d.ts.map +1 -1
- package/build/components/BrowseExpandedBundle.js +19 -0
- package/build/components/BrowseExpandedBundle.js.map +1 -1
- package/build/components/BrowseExpandedRow.d.ts +4 -1
- package/build/components/BrowseExpandedRow.d.ts.map +1 -1
- package/build/components/BrowseExpandedRow.js +24 -3
- package/build/components/BrowseExpandedRow.js.map +1 -1
- package/build/components/BrowseList.d.ts +3 -1
- package/build/components/BrowseList.d.ts.map +1 -1
- package/build/components/BrowseList.js +52 -42
- package/build/components/BrowseList.js.map +1 -1
- package/build/components/DryRunBanner.d.ts +3 -3
- package/build/components/DryRunBanner.d.ts.map +1 -1
- package/build/components/DryRunBanner.js +2 -2
- package/build/components/DryRunBanner.js.map +1 -1
- package/build/components/FilterBar.d.ts +10 -3
- package/build/components/FilterBar.d.ts.map +1 -1
- package/build/components/FilterBar.js +4 -4
- package/build/components/FilterBar.js.map +1 -1
- package/build/components/HelpBar.d.ts.map +1 -1
- package/build/components/HelpBar.js +3 -3
- package/build/components/HelpBar.js.map +1 -1
- package/build/components/InitSuccess.d.ts +5 -0
- package/build/components/InitSuccess.d.ts.map +1 -0
- package/build/components/InitSuccess.js +20 -0
- package/build/components/InitSuccess.js.map +1 -0
- package/build/components/InstallSummary.d.ts +3 -3
- package/build/components/InstallSummary.d.ts.map +1 -1
- package/build/components/InstallSummary.js +2 -2
- package/build/components/InstallSummary.js.map +1 -1
- package/build/components/Link.d.ts +7 -0
- package/build/components/Link.d.ts.map +1 -0
- package/build/components/Link.js +6 -0
- package/build/components/Link.js.map +1 -0
- package/build/components/ListActionBar.d.ts +9 -0
- package/build/components/ListActionBar.d.ts.map +1 -0
- package/build/components/ListActionBar.js +30 -0
- package/build/components/ListActionBar.js.map +1 -0
- package/build/components/ListBrowseList.d.ts +25 -0
- package/build/components/ListBrowseList.d.ts.map +1 -0
- package/build/components/ListBrowseList.js +55 -0
- package/build/components/ListBrowseList.js.map +1 -0
- package/build/components/ListExpandedRow.d.ts +36 -0
- package/build/components/ListExpandedRow.d.ts.map +1 -0
- package/build/components/ListExpandedRow.js +46 -0
- package/build/components/ListExpandedRow.js.map +1 -0
- package/build/components/ListHelpBar.d.ts +19 -0
- package/build/components/ListHelpBar.d.ts.map +1 -0
- package/build/components/ListHelpBar.js +11 -0
- package/build/components/ListHelpBar.js.map +1 -0
- package/build/components/PromptField.d.ts +19 -0
- package/build/components/PromptField.d.ts.map +1 -0
- package/build/components/PromptField.js +7 -0
- package/build/components/PromptField.js.map +1 -0
- package/build/components/StatusBadge.d.ts +1 -1
- package/build/components/StatusBadge.d.ts.map +1 -1
- package/build/components/StatusBadge.js +4 -0
- package/build/components/StatusBadge.js.map +1 -1
- package/build/components/index.d.ts +9 -2
- package/build/components/index.d.ts.map +1 -1
- package/build/components/index.js +9 -2
- package/build/components/index.js.map +1 -1
- package/build/hooks/useBrowseState.d.ts +41 -1
- package/build/hooks/useBrowseState.d.ts.map +1 -1
- package/build/hooks/useBrowseState.js +142 -12
- package/build/hooks/useBrowseState.js.map +1 -1
- package/build/hooks/useConfirmation.d.ts +18 -0
- package/build/hooks/useConfirmation.d.ts.map +1 -0
- package/build/hooks/useConfirmation.js +56 -0
- package/build/hooks/useConfirmation.js.map +1 -0
- package/build/hooks/useInitState.d.ts +72 -0
- package/build/hooks/useInitState.d.ts.map +1 -0
- package/build/hooks/useInitState.js +372 -0
- package/build/hooks/useInitState.js.map +1 -0
- package/build/hooks/useListActions.d.ts +14 -0
- package/build/hooks/useListActions.d.ts.map +1 -0
- package/build/hooks/useListActions.js +151 -0
- package/build/hooks/useListActions.js.map +1 -0
- package/build/hooks/useListState.d.ts +147 -0
- package/build/hooks/useListState.d.ts.map +1 -0
- package/build/hooks/useListState.js +445 -0
- package/build/hooks/useListState.js.map +1 -0
- package/build/hooks/usePublishState.d.ts +115 -0
- package/build/hooks/usePublishState.d.ts.map +1 -0
- package/build/hooks/usePublishState.js +673 -0
- package/build/hooks/usePublishState.js.map +1 -0
- package/build/hooks/useSetupState.d.ts +59 -0
- package/build/hooks/useSetupState.d.ts.map +1 -0
- package/build/hooks/useSetupState.js +295 -0
- package/build/hooks/useSetupState.js.map +1 -0
- package/build/hooks/useUninstallState.d.ts +102 -0
- package/build/hooks/useUninstallState.d.ts.map +1 -0
- package/build/hooks/useUninstallState.js +342 -0
- package/build/hooks/useUninstallState.js.map +1 -0
- package/build/lib/checksum.d.ts +39 -0
- package/build/lib/checksum.d.ts.map +1 -1
- package/build/lib/checksum.js +101 -13
- package/build/lib/checksum.js.map +1 -1
- package/build/lib/config.d.ts +4 -1
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +9 -9
- package/build/lib/config.js.map +1 -1
- package/build/lib/diagnostics.js +1 -1
- package/build/lib/diagnostics.js.map +1 -1
- package/build/lib/format.d.ts +6 -0
- package/build/lib/format.d.ts.map +1 -0
- package/build/lib/format.js +18 -0
- package/build/lib/format.js.map +1 -0
- package/build/lib/github.d.ts +8 -0
- package/build/lib/github.d.ts.map +1 -1
- package/build/lib/github.js +9 -0
- package/build/lib/github.js.map +1 -1
- package/build/lib/installer.d.ts +1 -0
- package/build/lib/installer.d.ts.map +1 -1
- package/build/lib/installer.js +7 -7
- package/build/lib/installer.js.map +1 -1
- package/build/lib/lockfile.d.ts.map +1 -1
- package/build/lib/lockfile.js +1 -4
- package/build/lib/lockfile.js.map +1 -1
- package/build/lib/publisher.d.ts +35 -0
- package/build/lib/publisher.d.ts.map +1 -1
- package/build/lib/publisher.js +210 -16
- package/build/lib/publisher.js.map +1 -1
- package/build/lib/schemas/config.d.ts +7 -3
- package/build/lib/schemas/config.d.ts.map +1 -1
- package/build/lib/schemas/config.js +12 -2
- package/build/lib/schemas/config.js.map +1 -1
- package/build/lib/schemas/index.d.ts +1 -1
- package/build/lib/schemas/index.d.ts.map +1 -1
- package/build/lib/schemas/index.js +1 -1
- package/build/lib/schemas/index.js.map +1 -1
- package/build/lib/schemas/lockfile.d.ts +18 -0
- package/build/lib/schemas/lockfile.d.ts.map +1 -1
- package/build/lib/schemas/lockfile.js +10 -0
- package/build/lib/schemas/lockfile.js.map +1 -1
- package/build/lib/tool-resolver.d.ts +17 -6
- package/build/lib/tool-resolver.d.ts.map +1 -1
- package/build/lib/tool-resolver.js +31 -15
- package/build/lib/tool-resolver.js.map +1 -1
- package/build/lib/updater.d.ts.map +1 -1
- package/build/lib/updater.js +2 -1
- package/build/lib/updater.js.map +1 -1
- package/package.json +78 -65
- package/tool-adapters/claude-code.json +1 -1
- package/tool-adapters/copilot-cli.json +1 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { useEffect, useReducer, useRef } from 'react';
|
|
2
|
+
import { findInstalledAsset, LockfileLockedError, readLockfile, withLockfileLock } from '../lib/lockfile.js';
|
|
3
|
+
import { findProjectRoot } from '../lib/paths.js';
|
|
4
|
+
import { fetchRegistry, findBundle } from '../lib/registry.js';
|
|
5
|
+
import { resolveTools } from '../lib/tool-resolver.js';
|
|
6
|
+
import { executeBundleUninstall, planBundleUninstall, planUninstall, uninstallAsset } from '../lib/uninstaller.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Initial state factory
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export function createInitialState(flags) {
|
|
11
|
+
return {
|
|
12
|
+
bundleError: null,
|
|
13
|
+
bundleResult: null,
|
|
14
|
+
errorMessage: '',
|
|
15
|
+
flags,
|
|
16
|
+
outcome: null,
|
|
17
|
+
phase: 'loading',
|
|
18
|
+
progress: 'Initializing...',
|
|
19
|
+
singleError: null,
|
|
20
|
+
singleResult: null,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Pure reducer
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export function uninstallReducer(state, action) {
|
|
27
|
+
switch (action.type) {
|
|
28
|
+
case 'CANCEL': {
|
|
29
|
+
// Cancellation from the confirming phase leads to done
|
|
30
|
+
if (state.phase !== 'confirming')
|
|
31
|
+
return state;
|
|
32
|
+
return { ...state, phase: 'done' };
|
|
33
|
+
}
|
|
34
|
+
case 'CONFIRM': {
|
|
35
|
+
// Confirmation from the confirming phase transitions to executing
|
|
36
|
+
if (state.phase !== 'confirming')
|
|
37
|
+
return state;
|
|
38
|
+
return { ...state, phase: 'executing', progress: 'Executing...' };
|
|
39
|
+
}
|
|
40
|
+
case 'ERROR':
|
|
41
|
+
return { ...state, errorMessage: action.message, phase: 'error' };
|
|
42
|
+
case 'EXECUTE_DONE': {
|
|
43
|
+
return {
|
|
44
|
+
...state,
|
|
45
|
+
bundleError: action.bundleError ?? state.bundleError,
|
|
46
|
+
bundleResult: action.bundleResult ?? state.bundleResult,
|
|
47
|
+
phase: 'done',
|
|
48
|
+
singleError: action.singleError ?? state.singleError,
|
|
49
|
+
singleResult: action.singleResult ?? state.singleResult,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
case 'EXECUTE_ERROR': {
|
|
53
|
+
return { ...state, errorMessage: action.message, phase: 'error' };
|
|
54
|
+
}
|
|
55
|
+
case 'EXECUTE_PROGRESS': {
|
|
56
|
+
if (state.phase !== 'executing')
|
|
57
|
+
return state;
|
|
58
|
+
return { ...state, progress: action.message };
|
|
59
|
+
}
|
|
60
|
+
case 'LOAD_DONE': {
|
|
61
|
+
const { outcome } = action;
|
|
62
|
+
// Determine the next phase based on the outcome variant
|
|
63
|
+
switch (outcome.outcome) {
|
|
64
|
+
// Confirmation needed
|
|
65
|
+
case 'bundle-confirming':
|
|
66
|
+
case 'confirming':
|
|
67
|
+
return { ...state, outcome, phase: 'confirming' };
|
|
68
|
+
// Terminal outcomes — go straight to done
|
|
69
|
+
case 'bundle-not-installed':
|
|
70
|
+
case 'bundle-success':
|
|
71
|
+
case 'dry-run-bundle':
|
|
72
|
+
// falls through
|
|
73
|
+
case 'dry-run-single':
|
|
74
|
+
case 'not-installed':
|
|
75
|
+
case 'success':
|
|
76
|
+
return { ...state, outcome, phase: 'done' };
|
|
77
|
+
default:
|
|
78
|
+
return { ...state, outcome, phase: 'done' };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
case 'LOAD_PROGRESS': {
|
|
82
|
+
if (state.phase !== 'loading')
|
|
83
|
+
return state;
|
|
84
|
+
return { ...state, progress: action.message };
|
|
85
|
+
}
|
|
86
|
+
default:
|
|
87
|
+
return state;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Hook
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
export function useUninstallState(flags) {
|
|
94
|
+
const [state, dispatch] = useReducer(uninstallReducer, undefined, () => createInitialState(flags));
|
|
95
|
+
// Guard against React development-mode double-firing of effects.
|
|
96
|
+
const hasLoadedRef = useRef(false);
|
|
97
|
+
// --- Loading phase-gated effect ---
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
if (state.phase !== 'loading')
|
|
100
|
+
return;
|
|
101
|
+
if (hasLoadedRef.current)
|
|
102
|
+
return;
|
|
103
|
+
hasLoadedRef.current = true;
|
|
104
|
+
let cancelled = false;
|
|
105
|
+
const load = async () => {
|
|
106
|
+
const { cascade, dryRun, name, projectRoot, refresh, tool, yes } = state.flags;
|
|
107
|
+
const projectDir = findProjectRoot(projectRoot);
|
|
108
|
+
const tools = await resolveTools(tool);
|
|
109
|
+
const toolNames = tools.map((t) => t.tool);
|
|
110
|
+
// Step 1: Try bundle detection first
|
|
111
|
+
dispatch({ message: 'Fetching registry...', type: 'LOAD_PROGRESS' });
|
|
112
|
+
const registry = await fetchRegistry({ force: refresh });
|
|
113
|
+
if (cancelled)
|
|
114
|
+
return;
|
|
115
|
+
const bundle = findBundle(registry, name);
|
|
116
|
+
if (bundle) {
|
|
117
|
+
// Bundle uninstall path
|
|
118
|
+
dispatch({ message: 'Planning bundle removal...', type: 'LOAD_PROGRESS' });
|
|
119
|
+
const lockfile = await readLockfile(projectDir);
|
|
120
|
+
if (cancelled)
|
|
121
|
+
return;
|
|
122
|
+
const plan = planBundleUninstall(lockfile, bundle.name, bundle.version);
|
|
123
|
+
// If nothing to remove, return not-installed outcome
|
|
124
|
+
if (plan.assetsToRemove.length === 0 && plan.orphansToRemove.length === 0) {
|
|
125
|
+
dispatch({ outcome: { bundleName: bundle.name, outcome: 'bundle-not-installed' }, type: 'LOAD_DONE' });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Dry-run: return plan without executing
|
|
129
|
+
if (dryRun) {
|
|
130
|
+
dispatch({ outcome: { outcome: 'dry-run-bundle', plan, tools: toolNames }, type: 'LOAD_DONE' });
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// If --yes flag, execute immediately for all tools
|
|
134
|
+
if (yes) {
|
|
135
|
+
dispatch({ message: 'Removing bundle assets...', type: 'LOAD_PROGRESS' });
|
|
136
|
+
// Execute bundle uninstall with the first adapter (bundle uninstall works on lockfile entries)
|
|
137
|
+
const result = await executeBundleUninstall(plan, {
|
|
138
|
+
adapter: tools[0].adapter,
|
|
139
|
+
cascade,
|
|
140
|
+
onProgress: (message) => {
|
|
141
|
+
if (!cancelled)
|
|
142
|
+
dispatch({ message, type: 'LOAD_PROGRESS' });
|
|
143
|
+
},
|
|
144
|
+
projectDir,
|
|
145
|
+
});
|
|
146
|
+
if (cancelled)
|
|
147
|
+
return;
|
|
148
|
+
dispatch({ outcome: { outcome: 'bundle-success', plan, result, tools: toolNames }, type: 'LOAD_DONE' });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Otherwise, return the plan for confirmation prompt
|
|
152
|
+
if (!process.stdin.isTTY) {
|
|
153
|
+
dispatch({
|
|
154
|
+
message: 'Confirmation required but stdin is not interactive. Use --yes (-y) to skip the prompt.',
|
|
155
|
+
type: 'ERROR',
|
|
156
|
+
});
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
dispatch({ outcome: { outcome: 'bundle-confirming', plan, tools }, type: 'LOAD_DONE' });
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// Dry-run for single asset: read lockfile directly (skip lock), compute plan, return
|
|
163
|
+
if (dryRun) {
|
|
164
|
+
dispatch({ message: 'Reading lockfile...', type: 'LOAD_PROGRESS' });
|
|
165
|
+
const lockfile = await readLockfile(projectDir);
|
|
166
|
+
if (cancelled)
|
|
167
|
+
return;
|
|
168
|
+
const installed = findInstalledAsset(lockfile, name);
|
|
169
|
+
if (!installed) {
|
|
170
|
+
dispatch({ outcome: { name, outcome: 'not-installed' }, type: 'LOAD_DONE' });
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const plan = planUninstall(lockfile, name);
|
|
174
|
+
dispatch({ outcome: { outcome: 'dry-run-single', plan, tools }, type: 'LOAD_DONE' });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// Fall through to existing single-asset uninstall logic
|
|
178
|
+
try {
|
|
179
|
+
const result = await withLockfileLock(projectDir, async () => {
|
|
180
|
+
dispatch({ message: 'Reading lockfile...', type: 'LOAD_PROGRESS' });
|
|
181
|
+
const lockfile = await readLockfile(projectDir);
|
|
182
|
+
if (cancelled)
|
|
183
|
+
return null;
|
|
184
|
+
const installed = findInstalledAsset(lockfile, name);
|
|
185
|
+
if (!installed) {
|
|
186
|
+
return { name, outcome: 'not-installed' };
|
|
187
|
+
}
|
|
188
|
+
// Compute the plan for display
|
|
189
|
+
const plan = planUninstall(lockfile, name);
|
|
190
|
+
// If dependents exist and no --yes flag, ask for confirmation
|
|
191
|
+
if (plan.dependents.length > 0 && !yes) {
|
|
192
|
+
if (!process.stdin.isTTY) {
|
|
193
|
+
throw new Error('Confirmation required but stdin is not interactive. Use --yes (-y) to skip the prompt.');
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
adapter: tools[0].adapter,
|
|
197
|
+
lockfile,
|
|
198
|
+
outcome: 'confirming',
|
|
199
|
+
plan,
|
|
200
|
+
tool: tools[0].tool,
|
|
201
|
+
tools,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// Uninstall for all tools
|
|
205
|
+
dispatch({ message: `Uninstalling ${name}...`, type: 'LOAD_PROGRESS' });
|
|
206
|
+
const toolResults = [];
|
|
207
|
+
for (const { adapter: toolAdapter, tool: toolName } of tools) {
|
|
208
|
+
const results = await uninstallAsset(name, {
|
|
209
|
+
adapter: toolAdapter,
|
|
210
|
+
cascade,
|
|
211
|
+
lockfile,
|
|
212
|
+
onProgress: (message) => {
|
|
213
|
+
if (!cancelled)
|
|
214
|
+
dispatch({ message, type: 'LOAD_PROGRESS' });
|
|
215
|
+
},
|
|
216
|
+
plan,
|
|
217
|
+
projectDir,
|
|
218
|
+
});
|
|
219
|
+
toolResults.push({ plan, results, tool: toolName });
|
|
220
|
+
}
|
|
221
|
+
return { outcome: 'success', toolResults };
|
|
222
|
+
});
|
|
223
|
+
if (cancelled)
|
|
224
|
+
return;
|
|
225
|
+
if (result === null)
|
|
226
|
+
return;
|
|
227
|
+
dispatch({ outcome: result, type: 'LOAD_DONE' });
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
if (cancelled)
|
|
231
|
+
return;
|
|
232
|
+
if (error instanceof LockfileLockedError) {
|
|
233
|
+
dispatch({
|
|
234
|
+
message: 'Another ATK process is currently modifying this project. Please wait and try again.',
|
|
235
|
+
type: 'ERROR',
|
|
236
|
+
});
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
load().catch((err) => {
|
|
243
|
+
if (!cancelled) {
|
|
244
|
+
dispatch({ message: err instanceof Error ? err.message : String(err), type: 'ERROR' });
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
return () => {
|
|
248
|
+
cancelled = true;
|
|
249
|
+
};
|
|
250
|
+
// Phase-gated effect: only runs when entering 'loading'
|
|
251
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
252
|
+
}, [state.phase]);
|
|
253
|
+
// --- Executing phase-gated effect ---
|
|
254
|
+
useEffect(() => {
|
|
255
|
+
if (state.phase !== 'executing')
|
|
256
|
+
return;
|
|
257
|
+
let cancelled = false;
|
|
258
|
+
const execute = async () => {
|
|
259
|
+
const { outcome } = state;
|
|
260
|
+
if (!outcome) {
|
|
261
|
+
dispatch({ message: 'Internal error: no outcome available for execution.', type: 'EXECUTE_ERROR' });
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const { cascade, name, projectRoot } = state.flags;
|
|
265
|
+
const projectDir = findProjectRoot(projectRoot);
|
|
266
|
+
// Handle bundle confirmation execution
|
|
267
|
+
if (outcome.outcome === 'bundle-confirming') {
|
|
268
|
+
const { plan, tools } = outcome;
|
|
269
|
+
try {
|
|
270
|
+
// Execute with first adapter (bundle uninstall works on lockfile entries)
|
|
271
|
+
const result = await executeBundleUninstall(plan, {
|
|
272
|
+
adapter: tools[0].adapter,
|
|
273
|
+
cascade,
|
|
274
|
+
onProgress: (message) => {
|
|
275
|
+
if (!cancelled)
|
|
276
|
+
dispatch({ message, type: 'EXECUTE_PROGRESS' });
|
|
277
|
+
},
|
|
278
|
+
projectDir,
|
|
279
|
+
});
|
|
280
|
+
if (cancelled)
|
|
281
|
+
return;
|
|
282
|
+
dispatch({ bundleResult: result, type: 'EXECUTE_DONE' });
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
if (cancelled)
|
|
286
|
+
return;
|
|
287
|
+
dispatch({
|
|
288
|
+
bundleError: err instanceof Error ? err.message : String(err),
|
|
289
|
+
type: 'EXECUTE_DONE',
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
// Handle single-asset confirmation execution for all tools
|
|
295
|
+
if (outcome.outcome === 'confirming') {
|
|
296
|
+
const { lockfile, plan, tools } = outcome;
|
|
297
|
+
try {
|
|
298
|
+
// Uninstall for all tools
|
|
299
|
+
const allResults = [];
|
|
300
|
+
for (const { adapter: toolAdapter } of tools) {
|
|
301
|
+
const results = await uninstallAsset(name, {
|
|
302
|
+
adapter: toolAdapter,
|
|
303
|
+
cascade,
|
|
304
|
+
lockfile,
|
|
305
|
+
onProgress: (message) => {
|
|
306
|
+
if (!cancelled)
|
|
307
|
+
dispatch({ message, type: 'EXECUTE_PROGRESS' });
|
|
308
|
+
},
|
|
309
|
+
plan,
|
|
310
|
+
projectDir,
|
|
311
|
+
});
|
|
312
|
+
allResults.push(...results);
|
|
313
|
+
}
|
|
314
|
+
if (cancelled)
|
|
315
|
+
return;
|
|
316
|
+
dispatch({ singleResult: allResults, type: 'EXECUTE_DONE' });
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
if (cancelled)
|
|
320
|
+
return;
|
|
321
|
+
dispatch({
|
|
322
|
+
singleError: err instanceof Error ? err.message : String(err),
|
|
323
|
+
type: 'EXECUTE_DONE',
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
execute().catch((err) => {
|
|
330
|
+
if (!cancelled) {
|
|
331
|
+
dispatch({ message: err instanceof Error ? err.message : String(err), type: 'EXECUTE_ERROR' });
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
return () => {
|
|
335
|
+
cancelled = true;
|
|
336
|
+
};
|
|
337
|
+
// Phase-gated effect: only runs when entering 'executing'
|
|
338
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
339
|
+
}, [state.phase]);
|
|
340
|
+
return [state, dispatch];
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=useUninstallState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUninstallState.js","sourceRoot":"","sources":["../../src/hooks/useUninstallState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAMtD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAqEnH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAAC,KAAqB;IACtD,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,EAAE;QAChB,KAAK;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAAC,KAAqB,EAAE,MAAuB;IAC7E,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,uDAAuD;YACvD,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY;gBAAE,OAAO,KAAK,CAAC;YAC/C,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACrC,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,kEAAkE;YAClE,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY;gBAAE,OAAO,KAAK,CAAC;YAC/C,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;QACpE,CAAC;QAED,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAEpE,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,OAAO;gBACL,GAAG,KAAK;gBACR,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW;gBACpD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;gBACvD,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW;gBACpD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;aACxD,CAAC;QACJ,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACpE,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;gBAAE,OAAO,KAAK,CAAC;YAC9C,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAE3B,wDAAwD;YACxD,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,sBAAsB;gBACtB,KAAK,mBAAmB,CAAC;gBACzB,KAAK,YAAY;oBACf,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBACpD,0CAA0C;gBAC1C,KAAK,sBAAsB,CAAC;gBAC5B,KAAK,gBAAgB,CAAC;gBACtB,KAAK,gBAAgB,CAAC;gBACtB,gBAAgB;gBAChB,KAAK,gBAAgB,CAAC;gBACtB,KAAK,eAAe,CAAC;gBACrB,KAAK,SAAS;oBACZ,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBAE9C;oBACE,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC5C,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;QAED;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnG,iEAAiE;IACjE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,qCAAqC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO;QACtC,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO;QACjC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAE5B,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;YAC/E,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAEhD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3C,qCAAqC;YACrC,QAAQ,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAEzD,IAAI,SAAS;gBAAE,OAAO;YAEtB,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE1C,IAAI,MAAM,EAAE,CAAC;gBACX,wBAAwB;gBACxB,QAAQ,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;gBAEhD,IAAI,SAAS;oBAAE,OAAO;gBAEtB,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAExE,qDAAqD;gBACrD,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1E,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;oBACvG,OAAO;gBACT,CAAC;gBAED,yCAAyC;gBACzC,IAAI,MAAM,EAAE,CAAC;oBACX,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;oBAChG,OAAO;gBACT,CAAC;gBAED,mDAAmD;gBACnD,IAAI,GAAG,EAAE,CAAC;oBACR,QAAQ,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;oBAC1E,+FAA+F;oBAC/F,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE;wBAChD,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO;wBAC1B,OAAO;wBACP,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;4BACtB,IAAI,CAAC,SAAS;gCAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;wBAC/D,CAAC;wBACD,UAAU;qBACX,CAAC,CAAC;oBAEH,IAAI,SAAS;wBAAE,OAAO;oBAEtB,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;oBACxG,OAAO;gBACT,CAAC;gBAED,qDAAqD;gBACrD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACzB,QAAQ,CAAC;wBACP,OAAO,EAAE,wFAAwF;wBACjG,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YAED,qFAAqF;YACrF,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;gBAEhD,IAAI,SAAS;oBAAE,OAAO;gBAEtB,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAErD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC7E,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC3C,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,wDAAwD;YACxD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;oBAC3D,QAAQ,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;oBACpE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;oBAEhD,IAAI,SAAS;wBAAE,OAAO,IAAI,CAAC;oBAE3B,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAErD,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAwB,EAAE,CAAC;oBACrD,CAAC;oBAED,+BAA+B;oBAC/B,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAE3C,8DAA8D;oBAC9D,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;wBACvC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;4BACzB,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;wBAC5G,CAAC;wBACD,OAAO;4BACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO;4BAC1B,QAAQ;4BACR,OAAO,EAAE,YAAqB;4BAC9B,IAAI;4BACJ,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI;4BACpB,KAAK;yBACN,CAAC;oBACJ,CAAC;oBAED,0BAA0B;oBAC1B,QAAQ,CAAC,EAAE,OAAO,EAAE,gBAAgB,IAAI,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;oBACxE,MAAM,WAAW,GAA2B,EAAE,CAAC;oBAC/C,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;wBAC7D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE;4BACzC,OAAO,EAAE,WAAW;4BACpB,OAAO;4BACP,QAAQ;4BACR,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gCACtB,IAAI,CAAC,SAAS;oCAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;4BAC/D,CAAC;4BACD,IAAI;4BACJ,UAAU;yBACX,CAAC,CAAC;wBACH,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACtD,CAAC;oBAED,OAAO,EAAE,OAAO,EAAE,SAAkB,EAAE,WAAW,EAAE,CAAC;gBACtD,CAAC,CAAC,CAAC;gBAEH,IAAI,SAAS;oBAAE,OAAO;gBACtB,IAAI,MAAM,KAAK,IAAI;oBAAE,OAAO;gBAE5B,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,SAAS;oBAAE,OAAO;gBACtB,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;oBACzC,QAAQ,CAAC;wBACP,OAAO,EAAE,qFAAqF;wBAC9F,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;QACF,wDAAwD;QACxD,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAExC,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;YAE1B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,EAAE,OAAO,EAAE,qDAAqD,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBACpG,OAAO;YACT,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;YACnD,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAEhD,uCAAuC;YACvC,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;gBAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;gBAEhC,IAAI,CAAC;oBACH,0EAA0E;oBAC1E,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE;wBAChD,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO;wBAC1B,OAAO;wBACP,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;4BACtB,IAAI,CAAC,SAAS;gCAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;wBAClE,CAAC;wBACD,UAAU;qBACX,CAAC,CAAC;oBAEH,IAAI,SAAS;wBAAE,OAAO;oBAEtB,QAAQ,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,IAAI,SAAS;wBAAE,OAAO;oBACtB,QAAQ,CAAC;wBACP,WAAW,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;wBAC7D,IAAI,EAAE,cAAc;qBACrB,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO;YACT,CAAC;YAED,2DAA2D;YAC3D,IAAI,OAAO,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBACrC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;gBAE1C,IAAI,CAAC;oBACH,0BAA0B;oBAC1B,MAAM,UAAU,GAAsB,EAAE,CAAC;oBACzC,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;wBAC7C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE;4BACzC,OAAO,EAAE,WAAW;4BACpB,OAAO;4BACP,QAAQ;4BACR,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gCACtB,IAAI,CAAC,SAAS;oCAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;4BAClE,CAAC;4BACD,IAAI;4BACJ,UAAU;yBACX,CAAC,CAAC;wBACH,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;oBAC9B,CAAC;oBAED,IAAI,SAAS;wBAAE,OAAO;oBAEtB,QAAQ,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,IAAI,SAAS;wBAAE,OAAO;oBACtB,QAAQ,CAAC;wBACP,WAAW,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;wBAC7D,IAAI,EAAE,cAAc;qBACrB,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YACjG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;QACF,0DAA0D;QAC1D,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAU,CAAC;AACpC,CAAC"}
|
package/build/lib/checksum.d.ts
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/** Describes a single config-entry verification failure. */
|
|
2
|
+
export interface ConfigEntryFailure {
|
|
3
|
+
file: string;
|
|
4
|
+
key: string;
|
|
5
|
+
reason: ConfigEntryFailureReason;
|
|
6
|
+
}
|
|
7
|
+
/** Reason a config-entry verification can fail. */
|
|
8
|
+
export type ConfigEntryFailureReason = 'CONFIG_CHECKSUM_MISMATCH' | 'CONFIG_FILE_NOT_FOUND' | 'CONFIG_KEY_NOT_FOUND';
|
|
9
|
+
/** Recursively collect all files in a directory. */
|
|
10
|
+
export declare function collectFilesRecursive(dirPath: string, baseDir: string): Promise<Array<{
|
|
11
|
+
absolutePath: string;
|
|
12
|
+
relativePath: string;
|
|
13
|
+
}>>;
|
|
14
|
+
/**
|
|
15
|
+
* Compute a deterministic SHA-256 checksum for a config entry value.
|
|
16
|
+
*
|
|
17
|
+
* Strips the `_managedBy` metadata key (added by ATK at write time),
|
|
18
|
+
* serializes the remaining keys in sorted order, and returns the hex digest.
|
|
19
|
+
* Both the installer (write path) and the verifier (read path) use this
|
|
20
|
+
* helper so the checksum logic stays in one place.
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeConfigEntryChecksum(entry: Record<string, unknown>): string;
|
|
1
23
|
/**
|
|
2
24
|
* Compute a combined SHA-256 hash for all files in a directory (recursively).
|
|
3
25
|
* Files are sorted by relative path to ensure deterministic output.
|
|
@@ -28,4 +50,21 @@ export declare function verifyChecksums(files: Array<{
|
|
|
28
50
|
expected: string;
|
|
29
51
|
path: string;
|
|
30
52
|
}>>;
|
|
53
|
+
/**
|
|
54
|
+
* Verify config-file entries against their expected checksums.
|
|
55
|
+
*
|
|
56
|
+
* For each entry the function:
|
|
57
|
+
* 1. Reads and parses the config file as JSON → `CONFIG_FILE_NOT_FOUND` on failure.
|
|
58
|
+
* 2. Splits the dot-path key into section/child and looks up the value →
|
|
59
|
+
* `CONFIG_KEY_NOT_FOUND` if missing.
|
|
60
|
+
* 3. Computes a checksum via `computeConfigEntryChecksum()` and compares →
|
|
61
|
+
* `CONFIG_CHECKSUM_MISMATCH` on divergence.
|
|
62
|
+
*
|
|
63
|
+
* Returns only the entries that failed (empty array = all OK).
|
|
64
|
+
*/
|
|
65
|
+
export declare function verifyConfigEntries(entries: Array<{
|
|
66
|
+
checksum: string;
|
|
67
|
+
file: string;
|
|
68
|
+
key: string;
|
|
69
|
+
}>, projectDir: string): Promise<ConfigEntryFailure[]>;
|
|
31
70
|
//# sourceMappingURL=checksum.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBpE"}
|
|
1
|
+
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,wBAAwB,CAAC;CAClC;AAED,mDAAmD;AACnD,MAAM,MAAM,wBAAwB,GAChC,0BAA0B,GAC1B,uBAAuB,GACvB,sBAAsB,CAAC;AAE3B,oDAAoD;AACpD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMjF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/D,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsE/B"}
|
package/build/lib/checksum.js
CHANGED
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { readdir, readFile } from 'node:fs/promises';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
/** Recursively collect all files in a directory. */
|
|
5
|
+
export async function collectFilesRecursive(dirPath, baseDir) {
|
|
6
|
+
const results = [];
|
|
7
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
const fullPath = join(dirPath, entry.name);
|
|
10
|
+
if (entry.isDirectory()) {
|
|
11
|
+
const subFiles = await collectFilesRecursive(fullPath, baseDir);
|
|
12
|
+
results.push(...subFiles);
|
|
13
|
+
}
|
|
14
|
+
else if (entry.isFile()) {
|
|
15
|
+
const relativePath = fullPath.slice(baseDir.length + 1).replace(/\\/g, '/');
|
|
16
|
+
results.push({ absolutePath: fullPath, relativePath });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return results;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Compute a deterministic SHA-256 checksum for a config entry value.
|
|
23
|
+
*
|
|
24
|
+
* Strips the `_managedBy` metadata key (added by ATK at write time),
|
|
25
|
+
* serializes the remaining keys in sorted order, and returns the hex digest.
|
|
26
|
+
* Both the installer (write path) and the verifier (read path) use this
|
|
27
|
+
* helper so the checksum logic stays in one place.
|
|
28
|
+
*/
|
|
29
|
+
export function computeConfigEntryChecksum(entry) {
|
|
30
|
+
const cleaned = { ...entry };
|
|
31
|
+
delete cleaned['_managedBy'];
|
|
32
|
+
const serialized = JSON.stringify(cleaned, Object.keys(cleaned).sort());
|
|
33
|
+
return hashString(serialized);
|
|
34
|
+
}
|
|
4
35
|
/**
|
|
5
36
|
* Compute a combined SHA-256 hash for all files in a directory (recursively).
|
|
6
37
|
* Files are sorted by relative path to ensure deterministic output.
|
|
7
38
|
*/
|
|
8
39
|
export async function hashDirectory(dirPath) {
|
|
9
|
-
const files = await
|
|
40
|
+
const files = await collectFilesRecursive(dirPath, dirPath);
|
|
10
41
|
files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
11
42
|
const hash = createHash('sha256');
|
|
12
43
|
for (const file of files) {
|
|
@@ -58,21 +89,78 @@ export async function verifyChecksums(files) {
|
|
|
58
89
|
}
|
|
59
90
|
return failures;
|
|
60
91
|
}
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Verify config-file entries against their expected checksums.
|
|
94
|
+
*
|
|
95
|
+
* For each entry the function:
|
|
96
|
+
* 1. Reads and parses the config file as JSON → `CONFIG_FILE_NOT_FOUND` on failure.
|
|
97
|
+
* 2. Splits the dot-path key into section/child and looks up the value →
|
|
98
|
+
* `CONFIG_KEY_NOT_FOUND` if missing.
|
|
99
|
+
* 3. Computes a checksum via `computeConfigEntryChecksum()` and compares →
|
|
100
|
+
* `CONFIG_CHECKSUM_MISMATCH` on divergence.
|
|
101
|
+
*
|
|
102
|
+
* Returns only the entries that failed (empty array = all OK).
|
|
103
|
+
*/
|
|
104
|
+
export async function verifyConfigEntries(entries, projectDir) {
|
|
105
|
+
const failures = [];
|
|
65
106
|
for (const entry of entries) {
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
107
|
+
const absolutePath = join(projectDir, entry.file);
|
|
108
|
+
// 1. Read and parse the config file
|
|
109
|
+
let config;
|
|
110
|
+
try {
|
|
111
|
+
const raw = await readFile(absolutePath, 'utf-8');
|
|
112
|
+
config = JSON.parse(raw);
|
|
70
113
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
114
|
+
catch {
|
|
115
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_FILE_NOT_FOUND' });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// 2. Look up the value via dot-path (sectionKey.childKey)
|
|
119
|
+
const dotIndex = entry.key.indexOf('.');
|
|
120
|
+
const sectionKey = dotIndex === -1 ? entry.key : entry.key.slice(0, dotIndex);
|
|
121
|
+
const childKey = dotIndex === -1 ? undefined : entry.key.slice(dotIndex + 1);
|
|
122
|
+
const section = config[sectionKey];
|
|
123
|
+
if (childKey === undefined ||
|
|
124
|
+
section === null ||
|
|
125
|
+
section === undefined ||
|
|
126
|
+
typeof section !== 'object') {
|
|
127
|
+
// No child key means the key format is unexpected, or section missing
|
|
128
|
+
if (childKey === undefined) {
|
|
129
|
+
// Single-segment key — look up directly
|
|
130
|
+
if (!(sectionKey in config)) {
|
|
131
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const value = config[sectionKey];
|
|
135
|
+
if (value === null || value === undefined || typeof value !== 'object') {
|
|
136
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const actual = computeConfigEntryChecksum(value);
|
|
140
|
+
if (actual !== entry.checksum) {
|
|
141
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_CHECKSUM_MISMATCH' });
|
|
142
|
+
}
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const sectionObj = section;
|
|
149
|
+
if (!(childKey in sectionObj)) {
|
|
150
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const value = sectionObj[childKey];
|
|
154
|
+
if (value === null || value === undefined || typeof value !== 'object') {
|
|
155
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_KEY_NOT_FOUND' });
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// 3. Compute checksum and compare
|
|
159
|
+
const actual = computeConfigEntryChecksum(value);
|
|
160
|
+
if (actual !== entry.checksum) {
|
|
161
|
+
failures.push({ file: entry.file, key: entry.key, reason: 'CONFIG_CHECKSUM_MISMATCH' });
|
|
74
162
|
}
|
|
75
163
|
}
|
|
76
|
-
return
|
|
164
|
+
return failures;
|
|
77
165
|
}
|
|
78
166
|
//# sourceMappingURL=checksum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../src/lib/checksum.ts"],"names":[],"mappings":"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"}
|
package/build/lib/config.d.ts
CHANGED
|
@@ -40,20 +40,23 @@ export declare function saveConfig(config: Config): Promise<void>;
|
|
|
40
40
|
export declare function getProjectConfigPath(projectDir: string): string;
|
|
41
41
|
/**
|
|
42
42
|
* Check whether a local project config (.atkrc.json) exists in the given directory.
|
|
43
|
+
* The config stores the developer's selected tools (`tools: string[]`).
|
|
43
44
|
*/
|
|
44
45
|
export declare function hasLocalConfig(projectDir: string): boolean;
|
|
45
46
|
/**
|
|
46
47
|
* Load merged config: user-level config only.
|
|
47
|
-
* Project config now only stores `{
|
|
48
|
+
* Project config now only stores `{ tools: string[] }` and does not contribute to Config fields.
|
|
48
49
|
*/
|
|
49
50
|
export declare function loadMergedConfig(projectDir: string): Promise<Config>;
|
|
50
51
|
/**
|
|
51
52
|
* Load the project-level config from .atkrc.json in the project directory.
|
|
52
53
|
* Returns null if no project config exists.
|
|
54
|
+
* Legacy `{ tool: string }` files are automatically migrated to `{ tools: string[] }` on read via schema preprocess.
|
|
53
55
|
*/
|
|
54
56
|
export declare function loadProjectConfig(projectDir: string): Promise<null | ProjectConfig>;
|
|
55
57
|
/**
|
|
56
58
|
* Save the project-level config to .atkrc.json in the project directory.
|
|
59
|
+
* Always writes the new `{ tools: string[] }` format, never the legacy `{ tool }` format.
|
|
57
60
|
*/
|
|
58
61
|
export declare function saveProjectConfig(projectDir: string, config: ProjectConfig): Promise<void>;
|
|
59
62
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,MAAM,EAGX,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAI7B;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAe5G;AAED;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAUlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,MAAM,EAGX,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAI7B;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAe5G;AAED;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAUlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CASzF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAchG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBjF"}
|