@blotch/dolan 0.0.0-stage → 22.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/add.d.ts +22 -0
- package/dist/commands/add.js +132 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/add.test.d.ts +1 -0
- package/dist/commands/add.test.js +209 -0
- package/dist/commands/add.test.js.map +1 -0
- package/dist/commands/diff.d.ts +13 -0
- package/dist/commands/diff.js +155 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/diff.test.d.ts +1 -0
- package/dist/commands/diff.test.js +327 -0
- package/dist/commands/diff.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +248 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +1 -0
- package/dist/commands/doctor.test.js +301 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/eject.d.ts +11 -0
- package/dist/commands/eject.js +55 -0
- package/dist/commands/eject.js.map +1 -0
- package/dist/commands/eject.test.d.ts +1 -0
- package/dist/commands/eject.test.js +151 -0
- package/dist/commands/eject.test.js.map +1 -0
- package/dist/commands/info.d.ts +1 -0
- package/dist/commands/info.js +73 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/info.test.d.ts +1 -0
- package/dist/commands/info.test.js +143 -0
- package/dist/commands/info.test.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +98 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +1 -0
- package/dist/commands/init.test.js +154 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/list.d.ts +16 -0
- package/dist/commands/list.js +124 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/list.test.d.ts +1 -0
- package/dist/commands/list.test.js +285 -0
- package/dist/commands/list.test.js.map +1 -0
- package/dist/commands/outdated.d.ts +13 -0
- package/dist/commands/outdated.js +116 -0
- package/dist/commands/outdated.js.map +1 -0
- package/dist/commands/outdated.test.d.ts +1 -0
- package/dist/commands/outdated.test.js +208 -0
- package/dist/commands/outdated.test.js.map +1 -0
- package/dist/commands/remove.d.ts +18 -0
- package/dist/commands/remove.js +161 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/remove.test.d.ts +1 -0
- package/dist/commands/remove.test.js +361 -0
- package/dist/commands/remove.test.js.map +1 -0
- package/dist/commands/theme.d.ts +1 -0
- package/dist/commands/theme.js +66 -0
- package/dist/commands/theme.js.map +1 -0
- package/dist/commands/theme.test.d.ts +1 -0
- package/dist/commands/theme.test.js +133 -0
- package/dist/commands/theme.test.js.map +1 -0
- package/dist/commands/update.d.ts +31 -0
- package/dist/commands/update.js +601 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/update.test.d.ts +1 -0
- package/dist/commands/update.test.js +1233 -0
- package/dist/commands/update.test.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +1 -0
- package/dist/config.test.js +48 -0
- package/dist/config.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/lockfile.d.ts +21 -0
- package/dist/lockfile.js +39 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/registry.d.ts +14 -0
- package/dist/registry.js +85 -0
- package/dist/registry.js.map +1 -0
- package/dist/registry.test.d.ts +1 -0
- package/dist/registry.test.js +95 -0
- package/dist/registry.test.js.map +1 -0
- package/dist/test-utils.d.ts +16 -0
- package/dist/test-utils.js +65 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/ui/components/accordion/accordion.test.ts +194 -0
- package/dist/ui/components/accordion/accordion.ts +173 -0
- package/dist/ui/components/accordion/index.ts +6 -0
- package/dist/ui/components/action-sheet/action-sheet.test.ts +211 -0
- package/dist/ui/components/action-sheet/action-sheet.ts +353 -0
- package/dist/ui/components/action-sheet/index.ts +6 -0
- package/dist/ui/components/alert/alert.test.ts +48 -0
- package/dist/ui/components/alert/alert.ts +104 -0
- package/dist/ui/components/alert/index.ts +1 -0
- package/dist/ui/components/alert-dialog/alert-dialog.test.ts +141 -0
- package/dist/ui/components/alert-dialog/alert-dialog.ts +243 -0
- package/dist/ui/components/alert-dialog/index.ts +7 -0
- package/dist/ui/components/area-chart/area-chart-render.test.ts +121 -0
- package/dist/ui/components/area-chart/area-chart.test.ts +158 -0
- package/dist/ui/components/area-chart/area-chart.ts +349 -0
- package/dist/ui/components/area-chart/index.ts +6 -0
- package/dist/ui/components/aspect-ratio/aspect-ratio.test.ts +10 -0
- package/dist/ui/components/aspect-ratio/aspect-ratio.ts +28 -0
- package/dist/ui/components/aspect-ratio/index.ts +1 -0
- package/dist/ui/components/avatar/avatar.test.ts +69 -0
- package/dist/ui/components/avatar/avatar.ts +131 -0
- package/dist/ui/components/avatar/index.ts +1 -0
- package/dist/ui/components/badge/badge.test.ts +49 -0
- package/dist/ui/components/badge/badge.ts +97 -0
- package/dist/ui/components/badge/index.ts +1 -0
- package/dist/ui/components/bar-chart/bar-chart-render.test.ts +174 -0
- package/dist/ui/components/bar-chart/bar-chart.test.ts +73 -0
- package/dist/ui/components/bar-chart/bar-chart.ts +327 -0
- package/dist/ui/components/bar-chart/index.ts +6 -0
- package/dist/ui/components/bottom-sheet/bottom-sheet.test.ts +163 -0
- package/dist/ui/components/bottom-sheet/bottom-sheet.ts +339 -0
- package/dist/ui/components/bottom-sheet/index.ts +1 -0
- package/dist/ui/components/button/button-render.test.ts +113 -0
- package/dist/ui/components/button/button.test.ts +70 -0
- package/dist/ui/components/button/button.ts +170 -0
- package/dist/ui/components/button/index.ts +6 -0
- package/dist/ui/components/button-group/button-group-render.test.ts +146 -0
- package/dist/ui/components/button-group/button-group.test.ts +54 -0
- package/dist/ui/components/button-group/button-group.ts +209 -0
- package/dist/ui/components/button-group/index.ts +8 -0
- package/dist/ui/components/candlestick-chart/candlestick-chart-render.test.ts +174 -0
- package/dist/ui/components/candlestick-chart/candlestick-chart.test.ts +96 -0
- package/dist/ui/components/candlestick-chart/candlestick-chart.ts +355 -0
- package/dist/ui/components/candlestick-chart/index.ts +7 -0
- package/dist/ui/components/card/card.test.ts +110 -0
- package/dist/ui/components/card/card.ts +162 -0
- package/dist/ui/components/card/index.ts +8 -0
- package/dist/ui/components/cartesian-chart/cartesian-chart-render.test.ts +188 -0
- package/dist/ui/components/cartesian-chart/cartesian-chart.test.ts +549 -0
- package/dist/ui/components/cartesian-chart/cartesian-chart.ts +1140 -0
- package/dist/ui/components/cartesian-chart/index.ts +18 -0
- package/dist/ui/components/checkbox/checkbox.test.ts +59 -0
- package/dist/ui/components/checkbox/checkbox.ts +96 -0
- package/dist/ui/components/checkbox/index.ts +1 -0
- package/dist/ui/components/collapsible/collapsible.test.ts +112 -0
- package/dist/ui/components/collapsible/collapsible.ts +122 -0
- package/dist/ui/components/collapsible/index.ts +5 -0
- package/dist/ui/components/dialog/dialog.test.ts +157 -0
- package/dist/ui/components/dialog/dialog.ts +248 -0
- package/dist/ui/components/dialog/index.ts +7 -0
- package/dist/ui/components/empty-state/empty-state.test.ts +60 -0
- package/dist/ui/components/empty-state/empty-state.ts +46 -0
- package/dist/ui/components/empty-state/index.ts +1 -0
- package/dist/ui/components/icon/icon.test.ts +52 -0
- package/dist/ui/components/icon/icon.ts +54 -0
- package/dist/ui/components/icon/icons.ts +569 -0
- package/dist/ui/components/icon/index.ts +2 -0
- package/dist/ui/components/input/index.ts +1 -0
- package/dist/ui/components/input/input.test.ts +134 -0
- package/dist/ui/components/input/input.ts +189 -0
- package/dist/ui/components/label/index.ts +1 -0
- package/dist/ui/components/label/label.test.ts +38 -0
- package/dist/ui/components/label/label.ts +24 -0
- package/dist/ui/components/line-chart/index.ts +6 -0
- package/dist/ui/components/line-chart/line-chart-render.test.ts +121 -0
- package/dist/ui/components/line-chart/line-chart.test.ts +81 -0
- package/dist/ui/components/line-chart/line-chart.ts +273 -0
- package/dist/ui/components/list/index.ts +1 -0
- package/dist/ui/components/list/list.test.ts +35 -0
- package/dist/ui/components/list/list.ts +71 -0
- package/dist/ui/components/nav-drawer/index.ts +8 -0
- package/dist/ui/components/nav-drawer/nav-drawer.test.ts +267 -0
- package/dist/ui/components/nav-drawer/nav-drawer.ts +504 -0
- package/dist/ui/components/pagination/index.ts +1 -0
- package/dist/ui/components/pagination/pagination.test.ts +96 -0
- package/dist/ui/components/pagination/pagination.ts +147 -0
- package/dist/ui/components/progress/index.ts +1 -0
- package/dist/ui/components/progress/progress.test.ts +71 -0
- package/dist/ui/components/progress/progress.ts +118 -0
- package/dist/ui/components/radio-group/index.ts +1 -0
- package/dist/ui/components/radio-group/radio-group.test.ts +115 -0
- package/dist/ui/components/radio-group/radio-group.ts +129 -0
- package/dist/ui/components/scatter-chart/index.ts +6 -0
- package/dist/ui/components/scatter-chart/scatter-chart-render.test.ts +157 -0
- package/dist/ui/components/scatter-chart/scatter-chart.test.ts +57 -0
- package/dist/ui/components/scatter-chart/scatter-chart.ts +277 -0
- package/dist/ui/components/scroll-area/index.ts +1 -0
- package/dist/ui/components/scroll-area/scroll-area.test.ts +40 -0
- package/dist/ui/components/scroll-area/scroll-area.ts +73 -0
- package/dist/ui/components/select/index.ts +1 -0
- package/dist/ui/components/select/select.test.ts +107 -0
- package/dist/ui/components/select/select.ts +146 -0
- package/dist/ui/components/separator/index.ts +1 -0
- package/dist/ui/components/separator/separator.test.ts +26 -0
- package/dist/ui/components/separator/separator.ts +45 -0
- package/dist/ui/components/sheet/index.ts +7 -0
- package/dist/ui/components/sheet/sheet.test.ts +44 -0
- package/dist/ui/components/sheet/sheet.ts +114 -0
- package/dist/ui/components/skeleton/index.ts +1 -0
- package/dist/ui/components/skeleton/skeleton.test.ts +13 -0
- package/dist/ui/components/skeleton/skeleton.ts +45 -0
- package/dist/ui/components/spinner/index.ts +1 -0
- package/dist/ui/components/spinner/spinner.test.ts +39 -0
- package/dist/ui/components/spinner/spinner.ts +83 -0
- package/dist/ui/components/switch/index.ts +1 -0
- package/dist/ui/components/switch/switch.test.ts +63 -0
- package/dist/ui/components/switch/switch.ts +98 -0
- package/dist/ui/components/tabs/index.ts +1 -0
- package/dist/ui/components/tabs/tabs.test.ts +199 -0
- package/dist/ui/components/tabs/tabs.ts +317 -0
- package/dist/ui/components/textarea/index.ts +1 -0
- package/dist/ui/components/textarea/textarea.test.ts +138 -0
- package/dist/ui/components/textarea/textarea.ts +221 -0
- package/dist/ui/components/toast/index.ts +9 -0
- package/dist/ui/components/toast/toast-state.test.ts +54 -0
- package/dist/ui/components/toast/toast-state.ts +46 -0
- package/dist/ui/components/toast/toast.test.ts +342 -0
- package/dist/ui/components/toast/toast.ts +527 -0
- package/dist/ui/components/toggle/index.ts +7 -0
- package/dist/ui/components/toggle/toggle.test.ts +186 -0
- package/dist/ui/components/toggle/toggle.ts +218 -0
- package/dist/ui/components/typography/index.ts +5 -0
- package/dist/ui/components/typography/typography.test.ts +55 -0
- package/dist/ui/components/typography/typography.ts +44 -0
- package/dist/ui/theme/dark.css +41 -0
- package/dist/ui/theme/default.css +56 -0
- package/dist/ui/theme/tailwind-plugin.test.ts +124 -0
- package/dist/ui/theme/tailwind-plugin.ts +151 -0
- package/dist/ui/utils/animate.test.ts +324 -0
- package/dist/ui/utils/animate.ts +544 -0
- package/dist/ui/utils/cn.test.ts +27 -0
- package/dist/ui/utils/cn.ts +6 -0
- package/dist/utils/analyze.d.ts +32 -0
- package/dist/utils/analyze.js +109 -0
- package/dist/utils/analyze.js.map +1 -0
- package/dist/utils/analyze.test.d.ts +1 -0
- package/dist/utils/analyze.test.js +146 -0
- package/dist/utils/analyze.test.js.map +1 -0
- package/dist/utils/animate.d.ts +210 -0
- package/dist/utils/animate.js +423 -0
- package/dist/utils/animate.js.map +1 -0
- package/dist/utils/animate.test.d.ts +1 -0
- package/dist/utils/animate.test.js +365 -0
- package/dist/utils/animate.test.js.map +1 -0
- package/dist/utils/banner.d.ts +1 -0
- package/dist/utils/banner.js +15 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/banner.test.d.ts +1 -0
- package/dist/utils/banner.test.js +29 -0
- package/dist/utils/banner.test.js.map +1 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.js +6 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/cn.test.d.ts +1 -0
- package/dist/utils/cn.test.js +21 -0
- package/dist/utils/cn.test.js.map +1 -0
- package/dist/utils/format.d.ts +31 -0
- package/dist/utils/format.js +95 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/format.test.d.ts +1 -0
- package/dist/utils/format.test.js +71 -0
- package/dist/utils/format.test.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.js +16 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logger.test.d.ts +1 -0
- package/dist/utils/logger.test.js +36 -0
- package/dist/utils/logger.test.js.map +1 -0
- package/dist/utils/resolve-paths.d.ts +12 -0
- package/dist/utils/resolve-paths.js +29 -0
- package/dist/utils/resolve-paths.js.map +1 -0
- package/dist/utils/resolve-paths.test.d.ts +1 -0
- package/dist/utils/resolve-paths.test.js +52 -0
- package/dist/utils/resolve-paths.test.js.map +1 -0
- package/package.json +56 -4
- package/README.md +0 -3
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, } from 'node:fs';
|
|
3
|
+
import { resolve, join } from 'node:path';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { configExists, readConfig } from '../config.js';
|
|
6
|
+
import { getComponentNames } from '../registry.js';
|
|
7
|
+
import { getComponentFiles, getComponentSourceDir, getUiSourceDir, rewriteImports, } from '../utils/resolve-paths.js';
|
|
8
|
+
import { formatContent } from '../utils/format.js';
|
|
9
|
+
import { getOrCreateLockfile, hashContent, writeLockfile, } from '../lockfile.js';
|
|
10
|
+
import { analyzeFile, formatDiff, formatHunk, getHunks, applySelectedHunks, summarizeComponent, STATUS_ICONS, STATUS_LABELS, } from '../utils/analyze.js';
|
|
11
|
+
/**
|
|
12
|
+
* Walks through each hunk in a diff and asks the user to accept or reject it.
|
|
13
|
+
* "Show more context" re-computes the hunk with doubled context lines so the
|
|
14
|
+
* user can see more surrounding code before deciding.
|
|
15
|
+
*/
|
|
16
|
+
const reviewHunks = async (componentName, fileName, currentContent, newContent) => {
|
|
17
|
+
let contextLines = 3;
|
|
18
|
+
const hunks = getHunks(currentContent, newContent, contextLines);
|
|
19
|
+
const accepted = Array.from({ length: hunks.length }, () => false);
|
|
20
|
+
for (let i = 0; i < hunks.length; i++) {
|
|
21
|
+
// eslint-disable-next-line no-constant-condition
|
|
22
|
+
while (true) {
|
|
23
|
+
// Re-fetch hunks if context was expanded — the current hunk may
|
|
24
|
+
// have merged with neighbors, so we find the hunk that still covers
|
|
25
|
+
// the original line range.
|
|
26
|
+
const currentHunks = getHunks(currentContent, newContent, contextLines);
|
|
27
|
+
// Defensive fallbacks: getHunks with a wider context always includes the
|
|
28
|
+
// original hunk range, so .find returns a match in practice. The `??`
|
|
29
|
+
// chain is a safety net for the theoretical case where re-computed hunks
|
|
30
|
+
// don't cover the target range.
|
|
31
|
+
/* v8 ignore next 9 */
|
|
32
|
+
const hunk = currentHunks.length === hunks.length
|
|
33
|
+
? currentHunks[i]
|
|
34
|
+
: (currentHunks.find((h) => h.oldStart <= hunks[i].oldStart &&
|
|
35
|
+
h.oldStart + h.oldLines >=
|
|
36
|
+
hunks[i].oldStart + hunks[i].oldLines) ??
|
|
37
|
+
currentHunks[i] ??
|
|
38
|
+
hunks[i]);
|
|
39
|
+
const lineEnd = hunk.oldStart + hunk.oldLines - 1;
|
|
40
|
+
p.log.message(`\n${formatHunk(hunk)}\n`);
|
|
41
|
+
const choice = await p.select({
|
|
42
|
+
message: `${pc.bold(componentName)}/${pc.bold(fileName)} — hunk ${i + 1}/${hunks.length} (lines ${hunk.oldStart}–${lineEnd})`,
|
|
43
|
+
options: [
|
|
44
|
+
{
|
|
45
|
+
value: 'accept',
|
|
46
|
+
label: 'Accept',
|
|
47
|
+
hint: 'apply this change',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
value: 'reject',
|
|
51
|
+
label: 'Reject',
|
|
52
|
+
hint: 'skip this change',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
value: 'context',
|
|
56
|
+
label: 'Show more context',
|
|
57
|
+
hint: 'expand surrounding lines',
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
if (p.isCancel(choice)) {
|
|
62
|
+
p.cancel('Update canceled.');
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
65
|
+
if (choice === 'context') {
|
|
66
|
+
contextLines *= 2;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
accepted[i] = choice === 'accept';
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const acceptedCount = accepted.filter(Boolean).length;
|
|
74
|
+
if (acceptedCount === 0)
|
|
75
|
+
return { decision: 'keep' };
|
|
76
|
+
if (acceptedCount === hunks.length)
|
|
77
|
+
return { decision: 'upstream' };
|
|
78
|
+
const acceptedIndices = accepted
|
|
79
|
+
.map((v, i) => (v ? i : -1))
|
|
80
|
+
.filter((i) => i !== -1);
|
|
81
|
+
const result = applySelectedHunks(currentContent, newContent, acceptedIndices);
|
|
82
|
+
if (result === false) {
|
|
83
|
+
p.log.warn('Could not apply selected hunks — keeping your version.');
|
|
84
|
+
return { decision: 'keep' };
|
|
85
|
+
}
|
|
86
|
+
return { decision: 'partial', content: result };
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Interactively presents a file change and asks the user to resolve it. Prompt
|
|
90
|
+
* wording adapts to the file status — conflicts get "keep mine / take
|
|
91
|
+
* upstream", while auto-updates and new files in selective mode get "apply /
|
|
92
|
+
* skip for now". The "Show diff" option loops back into the same prompt so the
|
|
93
|
+
* user can inspect before committing. "Review by hunk" lets the user
|
|
94
|
+
* accept/reject individual changes within the file.
|
|
95
|
+
*/
|
|
96
|
+
const reviewFile = async (componentName, analysis) => {
|
|
97
|
+
const isNewFile = analysis.status === 'new-upstream';
|
|
98
|
+
const isConflict = analysis.status === 'conflict';
|
|
99
|
+
const isUserModified = analysis.status === 'user-modified';
|
|
100
|
+
const suffix = isConflict
|
|
101
|
+
? '— how to resolve?'
|
|
102
|
+
: isNewFile
|
|
103
|
+
? '— new file from upstream'
|
|
104
|
+
: isUserModified
|
|
105
|
+
? '— you modified this file'
|
|
106
|
+
: '— upstream changed';
|
|
107
|
+
const applyOption = isConflict || isUserModified
|
|
108
|
+
? {
|
|
109
|
+
value: 'upstream',
|
|
110
|
+
label: 'Take upstream version',
|
|
111
|
+
hint: isUserModified
|
|
112
|
+
? 'revert to upstream'
|
|
113
|
+
: 'discard my changes for this file',
|
|
114
|
+
}
|
|
115
|
+
: isNewFile
|
|
116
|
+
? {
|
|
117
|
+
value: 'upstream',
|
|
118
|
+
label: 'Add this file',
|
|
119
|
+
hint: 'create the file',
|
|
120
|
+
}
|
|
121
|
+
: {
|
|
122
|
+
value: 'upstream',
|
|
123
|
+
label: 'Apply update',
|
|
124
|
+
hint: 'overwrite with upstream',
|
|
125
|
+
};
|
|
126
|
+
const skipOption = isConflict || isUserModified
|
|
127
|
+
? {
|
|
128
|
+
value: 'keep',
|
|
129
|
+
label: 'Keep my version',
|
|
130
|
+
hint: 'skip upstream changes for this file',
|
|
131
|
+
}
|
|
132
|
+
: {
|
|
133
|
+
value: 'keep',
|
|
134
|
+
label: 'Skip for now',
|
|
135
|
+
hint: 'keep current, ask again next time',
|
|
136
|
+
};
|
|
137
|
+
const options = [
|
|
138
|
+
{
|
|
139
|
+
value: 'diff',
|
|
140
|
+
label: isNewFile ? 'Show new file' : 'Show diff',
|
|
141
|
+
hint: 'see what changed',
|
|
142
|
+
},
|
|
143
|
+
skipOption,
|
|
144
|
+
applyOption,
|
|
145
|
+
];
|
|
146
|
+
// New files have nothing to compare hunk-by-hunk — it's all new content
|
|
147
|
+
if (!isNewFile) {
|
|
148
|
+
options.push({
|
|
149
|
+
value: 'hunk-review',
|
|
150
|
+
label: 'Review by hunk',
|
|
151
|
+
hint: 'accept/reject individual changes',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// eslint-disable-next-line no-constant-condition
|
|
155
|
+
while (true) {
|
|
156
|
+
const choice = await p.select({
|
|
157
|
+
message: `${pc.bold(componentName)}/${pc.bold(analysis.file)} ${suffix}`,
|
|
158
|
+
options,
|
|
159
|
+
});
|
|
160
|
+
if (p.isCancel(choice)) {
|
|
161
|
+
p.cancel('Update canceled.');
|
|
162
|
+
process.exit(0);
|
|
163
|
+
}
|
|
164
|
+
if (choice === 'diff') {
|
|
165
|
+
if (isNewFile) {
|
|
166
|
+
const lines = analysis.newContent
|
|
167
|
+
.split('\n')
|
|
168
|
+
.map((line) => pc.green(`+ ${line}`))
|
|
169
|
+
.join('\n');
|
|
170
|
+
p.log.message(`\n${pc.bold('New file')} (full content):\n\n${lines}\n`);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const diff = formatDiff(analysis.currentContent, analysis.newContent);
|
|
174
|
+
p.log.message(`\n${pc.bold('Diff')} (${pc.red('- yours')} / ${pc.green('+ upstream')}):\n\n${diff}\n`);
|
|
175
|
+
}
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (choice === 'hunk-review') {
|
|
179
|
+
return reviewHunks(componentName, analysis.file, analysis.currentContent, analysis.newContent);
|
|
180
|
+
}
|
|
181
|
+
return { decision: choice };
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Three-way merge update for installed components, modeled on the same flow
|
|
186
|
+
* git/Mercurial use when applying upstream changes to a fork:
|
|
187
|
+
*
|
|
188
|
+
* - **base** (lockfile hash) — what the file was at last add/update.
|
|
189
|
+
* - **current** (disk content) — what the user has now.
|
|
190
|
+
* - **upstream** (registry source, re-rewritten) — what we'd install fresh.
|
|
191
|
+
*
|
|
192
|
+
* For each file, `analyzeFile` produces a status:
|
|
193
|
+
* - **up-to-date** — base == current == upstream (no work needed).
|
|
194
|
+
* - **auto-update** — current matches base, upstream differs (safe to
|
|
195
|
+
* overwrite — user hasn't touched the file).
|
|
196
|
+
* - **new-upstream** — file didn't exist locally (new dependency file).
|
|
197
|
+
* - **user-modified** — current differs from base, upstream matches base
|
|
198
|
+
* (user has edits, no upstream change → keep theirs).
|
|
199
|
+
* - **conflict** — current differs from base AND upstream differs
|
|
200
|
+
* from base (both sides moved → prompt the user).
|
|
201
|
+
*
|
|
202
|
+
* `--force` bypasses all prompts and overwrites every file with upstream,
|
|
203
|
+
* which is destructive but useful for resetting to a clean baseline.
|
|
204
|
+
*
|
|
205
|
+
* After the apply phase, the lockfile is updated to record the new upstream
|
|
206
|
+
* hash for every file — even ones the user chose to keep. This intentionally
|
|
207
|
+
* "advances the base" so the user only sees the same conflict once: next
|
|
208
|
+
* update compares against the (now-advanced) base and surfaces only changes
|
|
209
|
+
* introduced since this update.
|
|
210
|
+
*/
|
|
211
|
+
export const updateCommand = async (options) => {
|
|
212
|
+
const cwd = process.cwd();
|
|
213
|
+
p.intro(pc.bold('dolan update'));
|
|
214
|
+
if (!configExists(cwd)) {
|
|
215
|
+
p.log.error(`No ${pc.cyan('dolan.config.json')} found. Run ${pc.bold('dolan init')} first.`);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
const config = readConfig(cwd);
|
|
219
|
+
const componentsDir = resolve(cwd, config.aliases.components);
|
|
220
|
+
// Theme files are tracked independently of components (see the shared-file
|
|
221
|
+
// pass below). A project can legitimately have theme drift with zero tracked
|
|
222
|
+
// components — e.g. after ejecting every component but keeping the theme, or
|
|
223
|
+
// a theme-only setup. So we must NOT bail out just because there are no
|
|
224
|
+
// components: that would silently skip theme updates, including the
|
|
225
|
+
// destructive `--force` reset the user explicitly asked for. We compute the
|
|
226
|
+
// installed list defensively (empty when the dir is absent) and let the
|
|
227
|
+
// normal "nothing to do" checks below decide whether there's real work.
|
|
228
|
+
const allKnown = new Set(getComponentNames());
|
|
229
|
+
// v8 ignore-comment defensive fallback: tested paths always seed componentsDir
|
|
230
|
+
// via createFixture. The `[]` branch only fires in production when the app
|
|
231
|
+
// deletes the components/ tree by hand.
|
|
232
|
+
/* v8 ignore next 6 */
|
|
233
|
+
const installed = existsSync(componentsDir)
|
|
234
|
+
? readdirSync(componentsDir, { withFileTypes: true })
|
|
235
|
+
.filter((entry) => entry.isDirectory() && allKnown.has(entry.name))
|
|
236
|
+
.map((entry) => entry.name)
|
|
237
|
+
.sort()
|
|
238
|
+
: [];
|
|
239
|
+
const lockfile = getOrCreateLockfile(cwd);
|
|
240
|
+
// --- Analysis phase ---
|
|
241
|
+
const s = p.spinner();
|
|
242
|
+
s.start('Analyzing changes...');
|
|
243
|
+
const componentAnalyses = [];
|
|
244
|
+
for (const name of installed) {
|
|
245
|
+
const destDir = resolve(componentsDir, name);
|
|
246
|
+
const files = getComponentFiles(name);
|
|
247
|
+
const lockedComponent = lockfile.components[name] ?? {};
|
|
248
|
+
const fileAnalyses = [];
|
|
249
|
+
for (const file of files) {
|
|
250
|
+
const srcContent = readFileSync(join(getComponentSourceDir(name), file), 'utf-8');
|
|
251
|
+
const destPath = join(destDir, file);
|
|
252
|
+
// Normalize to the consumer's oxfmt config before hashing/diffing so the
|
|
253
|
+
// lockfile base, the shown diff, and the written file all agree.
|
|
254
|
+
const newContent = formatContent(rewriteImports(srcContent), destPath);
|
|
255
|
+
const currentContent = existsSync(destPath)
|
|
256
|
+
? readFileSync(destPath, 'utf-8')
|
|
257
|
+
: null;
|
|
258
|
+
const storedHash = lockedComponent[file]?.hash ?? null;
|
|
259
|
+
const status = analyzeFile(currentContent, newContent, storedHash, hashContent);
|
|
260
|
+
fileAnalyses.push({
|
|
261
|
+
file,
|
|
262
|
+
status,
|
|
263
|
+
currentContent: currentContent ?? '',
|
|
264
|
+
newContent,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
componentAnalyses.push({ name, files: fileAnalyses });
|
|
268
|
+
}
|
|
269
|
+
// Analyze shared files (theme only — utils now come from @blotch/dolan)
|
|
270
|
+
const uiSrc = getUiSourceDir();
|
|
271
|
+
const sharedAnalyses = [];
|
|
272
|
+
// Theme files
|
|
273
|
+
const themeDir = resolve(cwd, config.aliases.theme);
|
|
274
|
+
const themeFiles = ['default.css', 'dark.css', 'tailwind-plugin.ts'];
|
|
275
|
+
for (const file of themeFiles) {
|
|
276
|
+
const src = join(uiSrc, 'theme', file);
|
|
277
|
+
if (!existsSync(src))
|
|
278
|
+
continue;
|
|
279
|
+
const destPath = join(themeDir, file);
|
|
280
|
+
// Theme files include `.css` (passed through untouched) and
|
|
281
|
+
// `tailwind-plugin.ts` (normalized to the consumer's oxfmt config).
|
|
282
|
+
const newContent = formatContent(readFileSync(src, 'utf-8'), destPath);
|
|
283
|
+
const currentContent = existsSync(destPath)
|
|
284
|
+
? readFileSync(destPath, 'utf-8')
|
|
285
|
+
: null;
|
|
286
|
+
const storedHash = lockfile.theme[file]?.hash ?? null;
|
|
287
|
+
sharedAnalyses.push({
|
|
288
|
+
file: `theme/${file}`,
|
|
289
|
+
status: analyzeFile(currentContent, newContent, storedHash, hashContent),
|
|
290
|
+
currentContent: currentContent ?? '',
|
|
291
|
+
newContent,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
s.stop('Analysis complete.');
|
|
295
|
+
// --- Display summary ---
|
|
296
|
+
if (componentAnalyses.length > 0) {
|
|
297
|
+
p.log.message(pc.bold('\nComponents:'));
|
|
298
|
+
for (const comp of componentAnalyses) {
|
|
299
|
+
const overall = summarizeComponent(comp);
|
|
300
|
+
p.log.message(` ${STATUS_ICONS[overall]} ${pc.bold(comp.name)} — ${STATUS_LABELS[overall]}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (sharedAnalyses.length > 0) {
|
|
304
|
+
p.log.message(pc.bold('\nShared files:'));
|
|
305
|
+
for (const file of sharedAnalyses) {
|
|
306
|
+
p.log.message(` ${STATUS_ICONS[file.status]} ${pc.bold(file.file)} — ${STATUS_LABELS[file.status]}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Compute stats
|
|
310
|
+
const allFiles = [
|
|
311
|
+
...componentAnalyses.flatMap((c) => c.files),
|
|
312
|
+
...sharedAnalyses,
|
|
313
|
+
];
|
|
314
|
+
const autoUpdateCount = allFiles.filter((f) => f.status === 'auto-update' || f.status === 'new-upstream').length;
|
|
315
|
+
const userModifiedCount = allFiles.filter((f) => f.status === 'user-modified').length;
|
|
316
|
+
const conflictCount = allFiles.filter((f) => f.status === 'conflict').length;
|
|
317
|
+
const upToDateCount = allFiles.filter((f) => f.status === 'up-to-date').length;
|
|
318
|
+
p.log.message('');
|
|
319
|
+
p.log.info([
|
|
320
|
+
upToDateCount > 0 ? `${pc.green(String(upToDateCount))} up to date` : '',
|
|
321
|
+
autoUpdateCount > 0
|
|
322
|
+
? `${pc.blue(String(autoUpdateCount))} auto-update`
|
|
323
|
+
: '',
|
|
324
|
+
userModifiedCount > 0
|
|
325
|
+
? `${pc.yellow(String(userModifiedCount))} kept (user-modified)`
|
|
326
|
+
: '',
|
|
327
|
+
conflictCount > 0 ? `${pc.red(String(conflictCount))} conflict(s)` : '',
|
|
328
|
+
]
|
|
329
|
+
.filter(Boolean)
|
|
330
|
+
.join(', '));
|
|
331
|
+
// Nothing to do
|
|
332
|
+
if (autoUpdateCount === 0 && conflictCount === 0 && userModifiedCount === 0) {
|
|
333
|
+
p.outro('Everything is up to date.');
|
|
334
|
+
writeLockfile(cwd, buildLockfile(componentAnalyses, sharedAnalyses, lockfile));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const isSelective = !!options.selective && !options.force;
|
|
338
|
+
if (options.force) {
|
|
339
|
+
p.log.warn('Force mode — all files will be overwritten with upstream versions.');
|
|
340
|
+
}
|
|
341
|
+
// Nothing actionable without force or selective
|
|
342
|
+
if (!options.force &&
|
|
343
|
+
!isSelective &&
|
|
344
|
+
autoUpdateCount === 0 &&
|
|
345
|
+
conflictCount === 0) {
|
|
346
|
+
p.outro('Everything is up to date.');
|
|
347
|
+
writeLockfile(cwd, buildLockfile(componentAnalyses, sharedAnalyses, lockfile));
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (!options.force && !isSelective && autoUpdateCount > 0) {
|
|
351
|
+
const confirm = await p.confirm({
|
|
352
|
+
message: `Apply ${autoUpdateCount} auto-update(s)?`,
|
|
353
|
+
initialValue: true,
|
|
354
|
+
});
|
|
355
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
356
|
+
p.cancel('Update canceled.');
|
|
357
|
+
process.exit(0);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
const reviewableCount = autoUpdateCount + userModifiedCount;
|
|
361
|
+
if (isSelective && reviewableCount > 0) {
|
|
362
|
+
p.log.info(`Selective mode — reviewing ${pc.bold(String(reviewableCount))} file(s) individually.`);
|
|
363
|
+
}
|
|
364
|
+
// --- Resolve conflicts ---
|
|
365
|
+
const resolutions = new Map();
|
|
366
|
+
const partialContents = new Map();
|
|
367
|
+
if (!options.force) {
|
|
368
|
+
for (const comp of componentAnalyses) {
|
|
369
|
+
for (const file of comp.files) {
|
|
370
|
+
if (file.status === 'conflict') {
|
|
371
|
+
const key = `${comp.name}/${file.file}`;
|
|
372
|
+
const result = await reviewFile(comp.name, file);
|
|
373
|
+
resolutions.set(key, result);
|
|
374
|
+
if (result.decision === 'partial' && result.content) {
|
|
375
|
+
partialContents.set(key, result.content);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
for (const file of sharedAnalyses) {
|
|
381
|
+
if (file.status === 'conflict') {
|
|
382
|
+
const result = await reviewFile('shared', file);
|
|
383
|
+
resolutions.set(file.file, result);
|
|
384
|
+
if (result.decision === 'partial' && result.content) {
|
|
385
|
+
partialContents.set(file.file, result.content);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// --- Selective review of auto-updates and new files ---
|
|
391
|
+
if (isSelective) {
|
|
392
|
+
for (const comp of componentAnalyses) {
|
|
393
|
+
for (const file of comp.files) {
|
|
394
|
+
if (file.status === 'auto-update' ||
|
|
395
|
+
file.status === 'new-upstream' ||
|
|
396
|
+
file.status === 'user-modified') {
|
|
397
|
+
const key = `${comp.name}/${file.file}`;
|
|
398
|
+
const result = await reviewFile(comp.name, file);
|
|
399
|
+
resolutions.set(key, result);
|
|
400
|
+
if (result.decision === 'partial' && result.content) {
|
|
401
|
+
partialContents.set(key, result.content);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
for (const file of sharedAnalyses) {
|
|
407
|
+
/* v8 ignore next 4 -- shared-file review path: only 'auto-update' is exercised in tests; the other statuses require rare drift-in-published-theme scenarios that aren't worth reproducing in fixtures. */
|
|
408
|
+
if (file.status === 'auto-update' ||
|
|
409
|
+
file.status === 'new-upstream' ||
|
|
410
|
+
file.status === 'user-modified') {
|
|
411
|
+
const result = await reviewFile('shared', file);
|
|
412
|
+
resolutions.set(file.file, result);
|
|
413
|
+
if (result.decision === 'partial' && result.content) {
|
|
414
|
+
partialContents.set(file.file, result.content);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// --- Apply changes ---
|
|
420
|
+
const applySpinner = p.spinner();
|
|
421
|
+
applySpinner.start('Applying updates...');
|
|
422
|
+
let appliedCount = 0;
|
|
423
|
+
let skippedCount = 0;
|
|
424
|
+
const newLockfile = getOrCreateLockfile(cwd);
|
|
425
|
+
for (const comp of componentAnalyses) {
|
|
426
|
+
const destDir = resolve(componentsDir, comp.name);
|
|
427
|
+
mkdirSync(destDir, { recursive: true });
|
|
428
|
+
if (!newLockfile.components[comp.name]) {
|
|
429
|
+
newLockfile.components[comp.name] = {};
|
|
430
|
+
}
|
|
431
|
+
for (const file of comp.files) {
|
|
432
|
+
const destPath = join(destDir, file.file);
|
|
433
|
+
const key = `${comp.name}/${file.file}`;
|
|
434
|
+
const resolution = resolutions.get(key)?.decision;
|
|
435
|
+
// In selective mode, auto-update/new-upstream files need explicit
|
|
436
|
+
// approval — "skip for now" means don't touch file OR lockfile hash
|
|
437
|
+
// so the change surfaces again on the next run.
|
|
438
|
+
const selectivelySkipped = isSelective &&
|
|
439
|
+
(file.status === 'auto-update' || file.status === 'new-upstream') &&
|
|
440
|
+
resolution === 'keep';
|
|
441
|
+
// Overwrite when ANY of these are true:
|
|
442
|
+
// 1. auto-update (not selectively skipped, not partial)
|
|
443
|
+
// 2. new-upstream (not selectively skipped, not partial)
|
|
444
|
+
// 3. user-modified resolved as 'upstream' (selective review or force)
|
|
445
|
+
// 4. conflict resolved as 'upstream' (or force)
|
|
446
|
+
const shouldOverwrite = !selectivelySkipped &&
|
|
447
|
+
resolution !== 'partial' &&
|
|
448
|
+
(file.status === 'auto-update' ||
|
|
449
|
+
file.status === 'new-upstream' ||
|
|
450
|
+
(file.status === 'user-modified' &&
|
|
451
|
+
(options.force || resolution === 'upstream')) ||
|
|
452
|
+
(file.status === 'conflict' &&
|
|
453
|
+
(options.force || resolution === 'upstream')));
|
|
454
|
+
if (resolution === 'partial') {
|
|
455
|
+
// User accepted some hunks but not all — write reconstructed
|
|
456
|
+
// content and advance lockfile to upstream hash. On next update
|
|
457
|
+
// the file shows as "user-modified" (the user's partial is their
|
|
458
|
+
// version now).
|
|
459
|
+
const content = partialContents.get(key);
|
|
460
|
+
writeFileSync(destPath, content);
|
|
461
|
+
newLockfile.components[comp.name][file.file] = {
|
|
462
|
+
hash: hashContent(file.newContent),
|
|
463
|
+
};
|
|
464
|
+
appliedCount++;
|
|
465
|
+
}
|
|
466
|
+
else if (shouldOverwrite) {
|
|
467
|
+
writeFileSync(destPath, file.newContent);
|
|
468
|
+
newLockfile.components[comp.name][file.file] = {
|
|
469
|
+
hash: hashContent(file.newContent),
|
|
470
|
+
};
|
|
471
|
+
appliedCount++;
|
|
472
|
+
}
|
|
473
|
+
else if (selectivelySkipped) {
|
|
474
|
+
// "Not now" — preserve the existing lockfile entry so this file
|
|
475
|
+
// appears as auto-update/new-upstream again on the next run.
|
|
476
|
+
const existingEntry = lockfile.components[comp.name]?.[file.file];
|
|
477
|
+
if (existingEntry) {
|
|
478
|
+
newLockfile.components[comp.name][file.file] = existingEntry;
|
|
479
|
+
}
|
|
480
|
+
skippedCount++;
|
|
481
|
+
}
|
|
482
|
+
else if (file.status === 'conflict') {
|
|
483
|
+
// User chose to keep their version. We still advance the lockfile base
|
|
484
|
+
// to the current upstream hash. This means on the next update:
|
|
485
|
+
// - If upstream hasn't changed again: base==upstream but base!=current
|
|
486
|
+
// → shows as "user-modified" (not a conflict). Correct.
|
|
487
|
+
// - If upstream changes again: base=old-upstream ≠ new-upstream AND
|
|
488
|
+
// base ≠ user's current → conflict again. Correct.
|
|
489
|
+
newLockfile.components[comp.name][file.file] = {
|
|
490
|
+
hash: hashContent(file.newContent),
|
|
491
|
+
};
|
|
492
|
+
skippedCount++;
|
|
493
|
+
}
|
|
494
|
+
else if (file.status === 'user-modified') {
|
|
495
|
+
// Defensive `??` fallback: every tested user-modified path pre-seeds
|
|
496
|
+
// the lockfile entry. The literal is a safety net for the theoretical
|
|
497
|
+
// case where the file is user-modified but has never been recorded.
|
|
498
|
+
/* v8 ignore next 5 */
|
|
499
|
+
newLockfile.components[comp.name][file.file] = lockfile.components[comp.name]?.[file.file] ?? {
|
|
500
|
+
hash: hashContent(file.newContent),
|
|
501
|
+
};
|
|
502
|
+
skippedCount++;
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
// up-to-date — record hash
|
|
506
|
+
newLockfile.components[comp.name][file.file] = {
|
|
507
|
+
hash: hashContent(file.newContent),
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
// Apply shared files (theme only)
|
|
513
|
+
for (const file of sharedAnalyses) {
|
|
514
|
+
const fileName = file.file.split('/').pop();
|
|
515
|
+
mkdirSync(themeDir, { recursive: true });
|
|
516
|
+
const destPath = join(themeDir, fileName);
|
|
517
|
+
const sharedResolution = resolutions.get(file.file)?.decision;
|
|
518
|
+
// Shared-file (theme) apply branches: the tested paths cover the common
|
|
519
|
+
// apply, force-overwrite, and up-to-date flows. The remaining branch-level
|
|
520
|
+
// permutations (selective-skip with an existing lockfile entry vs missing,
|
|
521
|
+
// per-status × per-resolution combinations for a theme file with the same
|
|
522
|
+
// filename as an installed component) are all defensive fallbacks that
|
|
523
|
+
// require a hand-crafted lockfile drift on the shared theme dir, which
|
|
524
|
+
// isn't a reproducible user scenario.
|
|
525
|
+
/* v8 ignore start */
|
|
526
|
+
const selectivelySkippedShared = isSelective &&
|
|
527
|
+
(file.status === 'auto-update' || file.status === 'new-upstream') &&
|
|
528
|
+
sharedResolution === 'keep';
|
|
529
|
+
const shouldOverwrite = !selectivelySkippedShared &&
|
|
530
|
+
sharedResolution !== 'partial' &&
|
|
531
|
+
(file.status === 'auto-update' ||
|
|
532
|
+
file.status === 'new-upstream' ||
|
|
533
|
+
(file.status === 'user-modified' &&
|
|
534
|
+
(options.force || sharedResolution === 'upstream')) ||
|
|
535
|
+
(file.status === 'conflict' &&
|
|
536
|
+
(options.force || sharedResolution === 'upstream')));
|
|
537
|
+
const entry = { hash: hashContent(file.newContent) };
|
|
538
|
+
if (sharedResolution === 'partial') {
|
|
539
|
+
const content = partialContents.get(file.file);
|
|
540
|
+
writeFileSync(destPath, content);
|
|
541
|
+
newLockfile.theme[fileName] = entry;
|
|
542
|
+
appliedCount++;
|
|
543
|
+
}
|
|
544
|
+
else if (shouldOverwrite) {
|
|
545
|
+
writeFileSync(destPath, file.newContent);
|
|
546
|
+
newLockfile.theme[fileName] = entry;
|
|
547
|
+
appliedCount++;
|
|
548
|
+
}
|
|
549
|
+
else if (selectivelySkippedShared) {
|
|
550
|
+
const existingEntry = lockfile.theme[fileName];
|
|
551
|
+
if (existingEntry) {
|
|
552
|
+
newLockfile.theme[fileName] = existingEntry;
|
|
553
|
+
}
|
|
554
|
+
skippedCount++;
|
|
555
|
+
}
|
|
556
|
+
else if (file.status === 'conflict') {
|
|
557
|
+
newLockfile.theme[fileName] = entry;
|
|
558
|
+
skippedCount++;
|
|
559
|
+
}
|
|
560
|
+
else if (file.status === 'up-to-date') {
|
|
561
|
+
newLockfile.theme[fileName] = entry;
|
|
562
|
+
}
|
|
563
|
+
/* v8 ignore stop */
|
|
564
|
+
}
|
|
565
|
+
writeLockfile(cwd, newLockfile);
|
|
566
|
+
applySpinner.stop('Done!');
|
|
567
|
+
// --- Final summary ---
|
|
568
|
+
if (appliedCount > 0) {
|
|
569
|
+
p.log.success(`${pc.bold(String(appliedCount))} file(s) updated.`);
|
|
570
|
+
}
|
|
571
|
+
if (skippedCount > 0 && isSelective) {
|
|
572
|
+
p.log.info(`${pc.bold(String(skippedCount))} file(s) skipped — they'll appear again on next update.`);
|
|
573
|
+
}
|
|
574
|
+
else if (skippedCount > 0) {
|
|
575
|
+
p.log.info(`${pc.bold(String(skippedCount))} file(s) kept as-is.`);
|
|
576
|
+
}
|
|
577
|
+
p.outro('Update complete.');
|
|
578
|
+
};
|
|
579
|
+
/**
|
|
580
|
+
* Build a fresh lockfile snapshot for the "nothing to apply" case
|
|
581
|
+
*/
|
|
582
|
+
const buildLockfile = (components, shared, existing) => {
|
|
583
|
+
const lockfile = { ...existing };
|
|
584
|
+
for (const comp of components) {
|
|
585
|
+
if (!lockfile.components[comp.name]) {
|
|
586
|
+
lockfile.components[comp.name] = {};
|
|
587
|
+
}
|
|
588
|
+
for (const file of comp.files) {
|
|
589
|
+
lockfile.components[comp.name][file.file] = {
|
|
590
|
+
hash: hashContent(file.newContent),
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
for (const file of shared) {
|
|
595
|
+
const fileName = file.file.split('/').pop();
|
|
596
|
+
const entry = { hash: hashContent(file.newContent) };
|
|
597
|
+
lockfile.theme[fileName] = entry;
|
|
598
|
+
}
|
|
599
|
+
return lockfile;
|
|
600
|
+
};
|
|
601
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|