opkg 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/package.json +3 -1
  2. package/packages/cli/dist/add-U44SL3OR.js +624 -0
  3. package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
  4. package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
  5. package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
  6. package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
  7. package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
  8. package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
  9. package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
  10. package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
  11. package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
  12. package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
  13. package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
  14. package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
  15. package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
  16. package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
  17. package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
  18. package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
  19. package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
  20. package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
  21. package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
  22. package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
  23. package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
  24. package/packages/cli/dist/index.js +15 -15
  25. package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
  26. package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
  27. package/packages/cli/dist/list-XR7RSJFS.js +327 -0
  28. package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
  29. package/packages/cli/dist/login-NRKHXZKM.js +150 -0
  30. package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
  31. package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
  32. package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
  33. package/packages/cli/dist/new-F46OSD72.js +277 -0
  34. package/packages/cli/dist/new-F46OSD72.js.map +7 -0
  35. package/packages/cli/dist/publish-4H43PCSG.js +619 -0
  36. package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
  37. package/packages/cli/dist/remove-BD52BHR2.js +542 -0
  38. package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
  39. package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
  40. package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
  41. package/packages/cli/dist/search-ABROK3UO.js +157 -0
  42. package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
  43. package/packages/cli/dist/set-NGM2FIKF.js +251 -0
  44. package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
  45. package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
  46. package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
  47. package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
  48. package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
  49. package/packages/cli/dist/view-MXRBMXOG.js +488 -0
  50. package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
  51. package/packages/cli/package.json +2 -0
  52. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +5 -4
  53. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
  54. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +6 -5
  55. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
  56. package/packages/core/dist/core/install/install-reporting.js +1 -1
  57. package/packages/core/dist/core/install/install-reporting.js.map +1 -1
  58. package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
  59. package/packages/core/dist/core/install/list-handler.js +7 -0
  60. package/packages/core/dist/core/install/list-handler.js.map +1 -1
  61. package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
  62. package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
  63. package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
  64. package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
  65. package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
  66. package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
  67. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
  68. package/packages/core/dist/core/install/orchestrator/orchestrator.js +22 -14
  69. package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
  70. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
  71. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
  72. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
  73. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
  74. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
  75. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
  76. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
  77. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
  78. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
  79. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
  80. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
  81. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
  82. package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
  83. package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
  84. package/packages/core/dist/core/install/platform-resolution.js +5 -2
  85. package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
  86. package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
  87. package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
  88. package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
  89. package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
  90. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
  91. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
  92. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
  93. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
  94. package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
  95. package/packages/core/dist/core/install/sources/path-source.js +8 -0
  96. package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
  97. package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
  98. package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
  99. package/packages/core/dist/core/install/unified/context-builders.js +13 -0
  100. package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
  101. package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
  102. package/packages/core/dist/core/install/unified/context-helpers.js +5 -0
  103. package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
  104. package/packages/core/dist/core/install/unified/context.d.ts +6 -0
  105. package/packages/core/dist/core/install/unified/context.d.ts.map +1 -1
  106. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
  107. package/packages/core/dist/core/install/unified/multi-context-pipeline.js +0 -2
  108. package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
  109. package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
  110. package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
  111. package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
  112. package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
  113. package/packages/core/dist/core/install/unified/phases/execute.js +2 -1
  114. package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
  115. package/packages/core/dist/core/install/unified/phases/report.js +1 -1
  116. package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
  117. package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
  118. package/packages/core/dist/core/install/unified/pipeline.js +5 -2
  119. package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
  120. package/packages/core/dist/core/ports/resolve.d.ts +0 -13
  121. package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
  122. package/packages/core/dist/core/ports/resolve.js +0 -28
  123. package/packages/core/dist/core/ports/resolve.js.map +1 -1
  124. package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
  125. package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
  126. package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
  127. package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
  128. package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
  129. package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
  130. package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
  131. package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
  132. package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
  133. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
  134. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
  135. package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
  136. package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
  137. package/packages/core/dist/index.d.ts +1 -1
  138. package/packages/core/dist/index.d.ts.map +1 -1
  139. package/packages/core/dist/types/execution-context.d.ts +24 -10
  140. package/packages/core/dist/types/execution-context.d.ts.map +1 -1
@@ -0,0 +1,539 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ classifySourceKey,
4
+ scanUntrackedFiles
5
+ } from "./chunk-YXLKLL3V.js";
6
+ import {
7
+ buildPreservedDirectoriesSet,
8
+ runSelectiveUninstallPipeline,
9
+ runUninstallPipeline
10
+ } from "./chunk-D6LEPODL.js";
11
+ import "./chunk-E2HYZWNV.js";
12
+ import {
13
+ RESOURCE_TYPE_ORDER,
14
+ normalizeType,
15
+ toLabelPlural
16
+ } from "./chunk-2PMMVTRN.js";
17
+ import {
18
+ cleanupEmptyParents
19
+ } from "./chunk-AMHDY5PC.js";
20
+ import "./chunk-CVA64SXK.js";
21
+ import "./chunk-TFQ4JBVO.js";
22
+ import "./chunk-QURLGVA4.js";
23
+ import {
24
+ getTargetPath
25
+ } from "./chunk-SHKYQQJJ.js";
26
+ import {
27
+ readWorkspaceIndex
28
+ } from "./chunk-GP5FJYSS.js";
29
+ import "./chunk-BCYZDID6.js";
30
+ import "./chunk-V5OW4YEB.js";
31
+ import {
32
+ deriveUntrackedResourceName
33
+ } from "./chunk-6YZNE3MU.js";
34
+ import "./chunk-Q2N6OZJC.js";
35
+ import "./chunk-FRYA3JAQ.js";
36
+ import {
37
+ formatPathForDisplay,
38
+ formatScopeTag
39
+ } from "./chunk-4B5HJLP2.js";
40
+ import {
41
+ createCliExecutionContext,
42
+ createExecutionContext,
43
+ resolveOutput,
44
+ resolvePrompt
45
+ } from "./chunk-BROJ6OUT.js";
46
+ import "./chunk-XEPVYZO3.js";
47
+ import {
48
+ parsePackageYml
49
+ } from "./chunk-QTQYI4L5.js";
50
+ import "./chunk-VN22A7NW.js";
51
+ import "./chunk-GKEHDSL4.js";
52
+ import "./chunk-YMKK4XPN.js";
53
+ import "./chunk-J4IFFBLP.js";
54
+ import {
55
+ exists,
56
+ remove
57
+ } from "./chunk-S47F4OG4.js";
58
+ import {
59
+ ValidationError
60
+ } from "./chunk-ID4SVDQZ.js";
61
+ import {
62
+ logger
63
+ } from "./chunk-5EFWGD33.js";
64
+
65
+ // src/commands/uninstall.ts
66
+ import { join as join2 } from "path";
67
+
68
+ // ../core/src/core/resources/resource-builder.ts
69
+ async function buildWorkspaceResources(targetDir, scope) {
70
+ let { index } = await readWorkspaceIndex(targetDir), packages = index.packages || {}, resources = [], resolvedPackages = [];
71
+ for (let [pkgName, pkgEntry] of Object.entries(packages)) {
72
+ let filesMapping = pkgEntry.files || {}, resourceMap = /* @__PURE__ */ new Map(), allTargetFiles = [];
73
+ for (let [sourceKey, mappings] of Object.entries(filesMapping)) {
74
+ let { resourceType, resourceName } = classifySourceKey(sourceKey), key = resourceType === "other" ? "other::other" : `${resourceType}::${resourceName}`;
75
+ resourceMap.has(key) || resourceMap.set(key, { sourceKeys: /* @__PURE__ */ new Set(), targetFiles: [] });
76
+ let entry = resourceMap.get(key);
77
+ entry.sourceKeys.add(sourceKey);
78
+ for (let mapping of mappings) {
79
+ let target = getTargetPath(mapping);
80
+ entry.targetFiles.push(target), allTargetFiles.push(target);
81
+ }
82
+ }
83
+ for (let [key, entry] of resourceMap) {
84
+ let [resourceType, resourceName] = key.split("::");
85
+ resources.push({
86
+ kind: "tracked",
87
+ resourceName,
88
+ resourceType,
89
+ packageName: pkgName,
90
+ sourceKeys: entry.sourceKeys,
91
+ targetFiles: entry.targetFiles,
92
+ scope
93
+ });
94
+ }
95
+ resolvedPackages.push({
96
+ packageName: pkgName,
97
+ version: pkgEntry.version,
98
+ resourceCount: resourceMap.size,
99
+ targetFiles: allTargetFiles,
100
+ scope
101
+ });
102
+ }
103
+ let untrackedResult = await scanUntrackedFiles(targetDir), untrackedMap = /* @__PURE__ */ new Map();
104
+ for (let file of untrackedResult.files) {
105
+ let resourceType = normalizeType(file.category), resourceName = deriveUntrackedResourceName(file.workspacePath), key = `${resourceType}::${resourceName}`;
106
+ untrackedMap.has(key) || untrackedMap.set(key, []), untrackedMap.get(key).push(file.workspacePath);
107
+ }
108
+ for (let [key, targetFiles] of untrackedMap) {
109
+ let [resourceType, resourceName] = key.split("::");
110
+ resources.push({
111
+ kind: "untracked",
112
+ resourceName,
113
+ resourceType,
114
+ sourceKeys: /* @__PURE__ */ new Set(),
115
+ targetFiles,
116
+ scope
117
+ });
118
+ }
119
+ let typeOrderMap = new Map(RESOURCE_TYPE_ORDER.map((t, i) => [t, i]));
120
+ return resources.sort((a, b) => {
121
+ let orderA = typeOrderMap.get(a.resourceType) ?? 1 / 0, orderB = typeOrderMap.get(b.resourceType) ?? 1 / 0;
122
+ return orderA !== orderB ? orderA - orderB : a.resourceName.localeCompare(b.resourceName);
123
+ }), resolvedPackages.sort((a, b) => a.packageName.localeCompare(b.packageName)), { resources, packages: resolvedPackages };
124
+ }
125
+
126
+ // ../core/src/core/resources/resource-resolver.ts
127
+ async function resolveByName(name, targetDir, scope) {
128
+ let workspace = await buildWorkspaceResources(targetDir, scope), candidates = [], nameLower = name.toLowerCase();
129
+ for (let resource of workspace.resources)
130
+ resource.resourceName.toLowerCase() === nameLower && candidates.push({ kind: "resource", resource });
131
+ for (let pkg of workspace.packages)
132
+ pkg.packageName === name && candidates.push({ kind: "package", package: pkg });
133
+ return { candidates };
134
+ }
135
+
136
+ // ../core/src/core/resources/scope-traversal.ts
137
+ async function traverseScopes(options, callback) {
138
+ let results = [], cwd = options.programOpts?.cwd;
139
+ if (!options.globalOnly)
140
+ try {
141
+ let context = await createExecutionContext({ global: !1, cwd }), result = await callback({ scope: "project", context });
142
+ results.push({ scope: "project", result });
143
+ } catch (error) {
144
+ logger.debug("Project scope traversal skipped", {
145
+ reason: error instanceof Error ? error.message : String(error)
146
+ });
147
+ }
148
+ if (!options.projectOnly)
149
+ try {
150
+ let context = await createExecutionContext({ global: !0, cwd }), result = await callback({ scope: "global", context });
151
+ results.push({ scope: "global", result });
152
+ } catch (error) {
153
+ logger.debug("Global scope traversal skipped", {
154
+ reason: error instanceof Error ? error.message : String(error)
155
+ });
156
+ }
157
+ return results;
158
+ }
159
+ async function traverseScopesFlat(options, callback) {
160
+ return (await traverseScopes(options, callback)).flatMap((sr) => sr.result);
161
+ }
162
+
163
+ // ../core/src/core/resources/disambiguation-prompt.ts
164
+ async function disambiguate(name, candidates, formatChoice, options = {}, output, prompt) {
165
+ let {
166
+ notFoundMessage = `"${name}" not found.
167
+ Run \`opkg ls\` to see installed resources.`,
168
+ ambiguousHeader = `
169
+ "${name}" matches multiple items:
170
+ `,
171
+ promptMessage = "Select which to act on:",
172
+ multi = !0
173
+ } = options, out = output ?? resolveOutput(), prm = prompt ?? resolvePrompt();
174
+ if (candidates.length === 0)
175
+ throw new ValidationError(
176
+ notFoundMessage.replace(/\$\{name\}/g, name)
177
+ );
178
+ if (candidates.length === 1)
179
+ return [candidates[0]];
180
+ let choices = candidates.map((c, i) => {
181
+ let choice = formatChoice(c, i);
182
+ return {
183
+ title: choice.title,
184
+ description: choice.description,
185
+ value: i
186
+ };
187
+ });
188
+ if (out.info(ambiguousHeader.replace(/\$\{name\}/g, name).trim()), multi) {
189
+ let selectedIndices = await prm.multiselect(
190
+ promptMessage,
191
+ choices
192
+ );
193
+ return !selectedIndices || selectedIndices.length === 0 ? [] : selectedIndices.map((i) => candidates[i]);
194
+ } else {
195
+ let selectedIndex = await prm.select(
196
+ promptMessage,
197
+ choices
198
+ );
199
+ return selectedIndex == null ? [] : [candidates[selectedIndex]];
200
+ }
201
+ }
202
+
203
+ // ../core/src/core/uninstall/uninstall-executor.ts
204
+ import path from "path";
205
+
206
+ // ../core/src/core/uninstall/uninstall-reporter.ts
207
+ function reportUninstallResult(result, context, output) {
208
+ if (context?.outputMode === "rich") return;
209
+ let out = output ?? resolveOutput(), cwd = process.cwd();
210
+ if (out.success(`Uninstalled ${result.packageName}`), result.removedFiles.length > 0) {
211
+ out.success(`Removed files: ${result.removedFiles.length}`);
212
+ let sortedFiles = [...result.removedFiles].sort((a, b) => a.localeCompare(b)), displayFiles = sortedFiles.slice(0, 10);
213
+ for (let file of displayFiles)
214
+ out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);
215
+ sortedFiles.length > 10 && out.info(` ... and ${sortedFiles.length - 10} more`);
216
+ }
217
+ if (result.rootFilesUpdated.length > 0) {
218
+ out.success(`Updated root files: ${result.rootFilesUpdated.length}`);
219
+ let sortedFiles = [...result.rootFilesUpdated].sort((a, b) => a.localeCompare(b)), displayFiles = sortedFiles.slice(0, 10);
220
+ for (let file of displayFiles)
221
+ out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);
222
+ sortedFiles.length > 10 && out.info(` ... and ${sortedFiles.length - 10} more`);
223
+ }
224
+ }
225
+ function reportResourceUninstallResult(result, context, output) {
226
+ if (context?.outputMode === "rich") return;
227
+ let out = output ?? resolveOutput(), cwd = process.cwd(), fromPkg = result.packageName ? ` from ${result.packageName}` : "";
228
+ if (out.success(`Uninstalled ${result.resourceName}${fromPkg}`), result.removedFiles.length > 0) {
229
+ out.success(`Removed files: ${result.removedFiles.length}`);
230
+ let sortedFiles = [...result.removedFiles].sort((a, b) => a.localeCompare(b)), displayFiles = sortedFiles.slice(0, 10);
231
+ for (let file of displayFiles)
232
+ out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);
233
+ sortedFiles.length > 10 && out.info(` ... and ${sortedFiles.length - 10} more`);
234
+ }
235
+ if (result.rootFilesUpdated.length > 0) {
236
+ out.success(`Updated root files: ${result.rootFilesUpdated.length}`);
237
+ let sortedFiles = [...result.rootFilesUpdated].sort((a, b) => a.localeCompare(b)), displayFiles = sortedFiles.slice(0, 10);
238
+ for (let file of displayFiles)
239
+ out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);
240
+ sortedFiles.length > 10 && out.info(` ... and ${sortedFiles.length - 10} more`);
241
+ }
242
+ }
243
+
244
+ // ../core/src/core/uninstall/uninstall-executor.ts
245
+ async function executeUninstallCandidate(candidate, options, execContext) {
246
+ if (candidate.kind === "package") {
247
+ let pkg = candidate.package, result = await runUninstallPipeline(pkg.packageName, options, execContext);
248
+ if (!result.success)
249
+ throw new ValidationError(result.error || `Uninstall failed for ${pkg.packageName}`);
250
+ reportUninstallResult({
251
+ packageName: pkg.packageName,
252
+ removedFiles: result.data?.removedFiles ?? [],
253
+ rootFilesUpdated: result.data?.rootFilesUpdated ?? []
254
+ }, execContext);
255
+ return;
256
+ }
257
+ let resource = candidate.resource;
258
+ if (resource.kind === "tracked") {
259
+ let result = await runSelectiveUninstallPipeline(
260
+ resource.packageName,
261
+ resource.sourceKeys,
262
+ options,
263
+ execContext
264
+ );
265
+ if (!result.success)
266
+ throw new ValidationError(result.error || `Uninstall failed for ${resource.resourceName}`);
267
+ reportResourceUninstallResult({
268
+ resourceName: resource.resourceName,
269
+ resourceType: resource.resourceType,
270
+ packageName: resource.packageName,
271
+ removedFiles: result.data?.removedFiles ?? [],
272
+ rootFilesUpdated: result.data?.rootFilesUpdated ?? []
273
+ }, execContext);
274
+ return;
275
+ }
276
+ let targetDir = execContext.targetDir, out = resolveOutput(execContext), removedFiles = [];
277
+ if (options.dryRun) {
278
+ out.info(`(dry-run) Would remove ${resource.targetFiles.length} file${resource.targetFiles.length === 1 ? "" : "s"}:`);
279
+ let displayFiles = resource.targetFiles.slice(0, 10);
280
+ for (let file of displayFiles)
281
+ out.message(` \u251C\u2500\u2500 ${file}`);
282
+ resource.targetFiles.length > 10 && out.message(` ... and ${resource.targetFiles.length - 10} more`);
283
+ }
284
+ for (let filePath of resource.targetFiles) {
285
+ let absPath = path.join(targetDir, filePath);
286
+ options.dryRun ? removedFiles.push(filePath) : await exists(absPath) && (await remove(absPath), removedFiles.push(filePath));
287
+ }
288
+ if (!options.dryRun && removedFiles.length > 0) {
289
+ let preservedDirs = buildPreservedDirectoriesSet(targetDir), deletedAbsPaths = removedFiles.map((f) => path.join(targetDir, f));
290
+ await cleanupEmptyParents(targetDir, deletedAbsPaths, preservedDirs);
291
+ }
292
+ reportResourceUninstallResult({
293
+ resourceName: resource.resourceName,
294
+ resourceType: resource.resourceType,
295
+ removedFiles,
296
+ rootFilesUpdated: []
297
+ }, execContext);
298
+ }
299
+
300
+ // ../core/src/core/uninstall/direct-uninstall-flow.ts
301
+ function defaultFormatTitle(candidate) {
302
+ if (candidate.kind === "package") {
303
+ let pkg = candidate.package, version = pkg.version && pkg.version !== "0.0.0" ? ` (v${pkg.version})` : "", scopeTag2 = formatScopeTag(pkg.scope);
304
+ return `${pkg.packageName}${version} (package, ${pkg.resourceCount} resources)${scopeTag2}`;
305
+ }
306
+ let r = candidate.resource, fromPkg = r.packageName ? `, from ${r.packageName}` : "", scopeTag = formatScopeTag(r.scope);
307
+ return `${r.resourceName} (${r.resourceType}${fromPkg})${scopeTag}`;
308
+ }
309
+ function defaultFormatDescription(candidate) {
310
+ let files = candidate.kind === "package" ? candidate.package.targetFiles : candidate.resource.targetFiles;
311
+ if (files.length === 0) return "no files";
312
+ let displayFiles = files.slice(0, 5), remaining = files.length - displayFiles.length, desc = displayFiles.join(`
313
+ `);
314
+ return remaining > 0 && (desc += `
315
+ +${remaining} more`), desc;
316
+ }
317
+ async function runDirectUninstallFlow(name, options, traverseOpts, createContext, formatters) {
318
+ let fmt = formatters ?? {
319
+ formatTitle: defaultFormatTitle,
320
+ formatDescription: defaultFormatDescription
321
+ }, candidates = await traverseScopesFlat(
322
+ traverseOpts,
323
+ async ({ scope, context }) => (await resolveByName(name, context.targetDir, scope)).candidates
324
+ ), disambiguationCtx = await createContext({
325
+ global: traverseOpts.globalOnly ?? !1,
326
+ cwd: traverseOpts.programOpts?.cwd,
327
+ interactive: !0
328
+ }), selected = await disambiguate(
329
+ name,
330
+ candidates,
331
+ (c) => ({
332
+ title: fmt.formatTitle(c),
333
+ description: fmt.formatDescription(c),
334
+ value: c
335
+ }),
336
+ {
337
+ notFoundMessage: `"${name}" not found as a resource or package.
338
+ Run \`opkg ls\` to see installed resources.`,
339
+ promptMessage: "Select which to uninstall:"
340
+ },
341
+ resolveOutput(disambiguationCtx),
342
+ resolvePrompt(disambiguationCtx)
343
+ );
344
+ if (selected.length === 0)
345
+ return { uninstalledCount: 0, cancelled: !0 };
346
+ for (let candidate of selected) {
347
+ let ctx = await createContext({
348
+ global: candidate.resource?.scope === "global" || candidate.package?.scope === "global",
349
+ cwd: traverseOpts.programOpts?.cwd,
350
+ interactive: !1
351
+ });
352
+ await executeUninstallCandidate(candidate, options, ctx);
353
+ }
354
+ return { uninstalledCount: selected.length, cancelled: !1 };
355
+ }
356
+
357
+ // ../core/src/core/uninstall/workspace-resource-collector.ts
358
+ import { join } from "path";
359
+ async function collectWorkspaceResources(traverseOpts, packageFilter) {
360
+ let scopeToTargetDir = /* @__PURE__ */ new Map(), scopeResults = await traverseScopes(
361
+ traverseOpts,
362
+ async ({ scope, context }) => (scopeToTargetDir.set(scope, context.targetDir), buildWorkspaceResources(context.targetDir, scope))
363
+ ), allResources = scopeResults.flatMap((sr) => sr.result.resources), allPackages = scopeResults.flatMap((sr) => sr.result.packages);
364
+ return packageFilter && (allResources = allResources.filter((r) => r.packageName === packageFilter), allPackages = allPackages.filter((p) => p.packageName === packageFilter)), { allResources, allPackages, scopeToTargetDir };
365
+ }
366
+ async function buildGroupedUninstallOptions(collection, programOpts) {
367
+ let { allResources, allPackages, scopeToTargetDir } = collection, groupedOptions = {}, resourcesByPackageAndScope = /* @__PURE__ */ new Map(), untrackedResources = [];
368
+ for (let resource of allResources)
369
+ if (resource.kind === "tracked" && resource.packageName) {
370
+ let key = `${resource.packageName}::${resource.scope}`;
371
+ resourcesByPackageAndScope.has(key) || resourcesByPackageAndScope.set(key, []), resourcesByPackageAndScope.get(key).push(resource);
372
+ } else
373
+ untrackedResources.push(resource);
374
+ for (let pkg of allPackages) {
375
+ let key = `${pkg.packageName}::${pkg.scope}`;
376
+ resourcesByPackageAndScope.has(key) || resourcesByPackageAndScope.set(key, []);
377
+ }
378
+ let packageGroups = Array.from(resourcesByPackageAndScope.entries()).sort((a, b) => {
379
+ let [pkgA, scopeA] = a[0].split("::"), [pkgB, scopeB] = b[0].split("::"), nameCompare = pkgA.localeCompare(pkgB);
380
+ return nameCompare !== 0 ? nameCompare : scopeA === "project" ? -1 : 1;
381
+ }), totalItems = packageGroups.length + untrackedResources.length;
382
+ if (totalItems === 0)
383
+ return { groupedOptions, totalItems: 0 };
384
+ let packageDependencyCounts = await loadPackageDependencyCounts(
385
+ allPackages,
386
+ scopeToTargetDir,
387
+ programOpts
388
+ ), packageOptions = [];
389
+ for (let [key, resources] of packageGroups) {
390
+ let [pkgName, scope] = key.split("::"), pkg = allPackages.find((p) => p.packageName === pkgName && p.scope === scope), versionSuffix = pkg?.version && pkg.version !== "0.0.0" ? `@${pkg.version}` : "", scopeTag = pkg ? formatScopeTag(pkg.scope) : formatScopeTag(scope), resourceCount = resources.length, depCount = packageDependencyCounts.get(key) || 0, hint;
391
+ if (resourceCount === 0)
392
+ hint = depCount > 0 ? `No resources, declares ${depCount} ${depCount === 1 ? "dependency" : "dependencies"}` : "No resources";
393
+ else {
394
+ let totalFiles = resources.flatMap((r) => r.targetFiles).length;
395
+ hint = `${totalFiles} ${totalFiles === 1 ? "file" : "files"}`;
396
+ }
397
+ packageOptions.push({
398
+ value: { kind: "package", packageName: pkgName, scope, resources },
399
+ label: `${pkgName}${versionSuffix}${scopeTag} (${hint})`
400
+ });
401
+ }
402
+ packageOptions.length > 0 && (groupedOptions.Packages = packageOptions);
403
+ let untrackedByType = /* @__PURE__ */ new Map();
404
+ for (let resource of untrackedResources) {
405
+ let type = normalizeType(resource.resourceType);
406
+ untrackedByType.has(type) || untrackedByType.set(type, []), untrackedByType.get(type).push(resource);
407
+ }
408
+ for (let typeId of RESOURCE_TYPE_ORDER) {
409
+ let resources = untrackedByType.get(typeId);
410
+ if (!resources || resources.length === 0) continue;
411
+ let categoryName = toLabelPlural(typeId);
412
+ groupedOptions[categoryName] = resources.map((resource) => {
413
+ let scopeTag = formatScopeTag(resource.scope), fileCount = resource.targetFiles.length;
414
+ return {
415
+ value: { kind: "resource", resource },
416
+ label: `${resource.resourceName}${scopeTag} (${fileCount} ${fileCount === 1 ? "file" : "files"})`
417
+ };
418
+ });
419
+ }
420
+ return { groupedOptions, totalItems };
421
+ }
422
+ async function executeBatchUninstall(selected, options, collection, programOpts, createContext, executeCandidate) {
423
+ let { allPackages, scopeToTargetDir } = collection, typeCounts = /* @__PURE__ */ new Map(), uninstalledCount = 0, allRemovedFiles = [];
424
+ for (let selection of selected)
425
+ if (selection.kind === "package") {
426
+ let { packageName, scope, resources } = selection, targetDir = scopeToTargetDir.get(scope), pkg = allPackages.find((p) => p.packageName === packageName && p.scope === scope), execCtx = await createContext({
427
+ global: scope === "global",
428
+ cwd: programOpts.cwd,
429
+ interactive: !0
430
+ }), candidate = {
431
+ kind: "package",
432
+ package: {
433
+ packageName,
434
+ scope,
435
+ version: pkg?.version,
436
+ resourceCount: resources.length,
437
+ targetFiles: resources.flatMap((r) => r.targetFiles)
438
+ }
439
+ };
440
+ targetDir && candidate.package.targetFiles.forEach((f) => allRemovedFiles.push({ path: f, targetDir })), await executeCandidate(candidate, options, execCtx), typeCounts.set("packages", (typeCounts.get("packages") || 0) + 1), uninstalledCount++;
441
+ } else {
442
+ let resource = selection.resource, targetDir = scopeToTargetDir.get(resource.scope), candidate = { kind: "resource", resource }, execCtx = await createContext({
443
+ global: resource.scope === "global",
444
+ cwd: programOpts.cwd,
445
+ interactive: !0
446
+ });
447
+ targetDir && resource.targetFiles.forEach((f) => allRemovedFiles.push({ path: f, targetDir })), await executeCandidate(candidate, options, execCtx);
448
+ let typePlural = toLabelPlural(normalizeType(resource.resourceType)).toLowerCase();
449
+ typeCounts.set(typePlural, (typeCounts.get(typePlural) || 0) + 1), uninstalledCount++;
450
+ }
451
+ return { uninstalledCount, typeCounts, allRemovedFiles };
452
+ }
453
+ async function loadPackageDependencyCounts(packages, scopeToTargetDir, programOpts) {
454
+ let counts = /* @__PURE__ */ new Map();
455
+ for (let pkg of packages) {
456
+ let key = `${pkg.packageName}::${pkg.scope}`;
457
+ try {
458
+ let targetDir = scopeToTargetDir.get(pkg.scope);
459
+ if (!targetDir) continue;
460
+ let { index } = await readWorkspaceIndex(targetDir), pkgEntry = index.packages[pkg.packageName];
461
+ if (!pkgEntry?.path) continue;
462
+ let packagePath = pkgEntry.path.startsWith("~") ? pkgEntry.path.replace("~", programOpts.homeDir || process.env.HOME || process.env.USERPROFILE || "") : pkgEntry.path, manifestPath = join(packagePath, "openpackage.yml"), manifest = await parsePackageYml(manifestPath), depCount = (manifest.dependencies || []).length + (manifest["dev-dependencies"] || []).length;
463
+ counts.set(key, depCount);
464
+ } catch {
465
+ counts.set(key, 0);
466
+ }
467
+ }
468
+ return counts;
469
+ }
470
+
471
+ // src/commands/uninstall.ts
472
+ async function uninstallCommand(nameArg, options, command) {
473
+ let programOpts = command.parent?.opts() || {}, traverseOpts = {
474
+ programOpts,
475
+ ...options.global ? { globalOnly: !0 } : { projectOnly: !0 }
476
+ };
477
+ if (options.interactive) {
478
+ await handleListUninstall(nameArg, options, programOpts, traverseOpts);
479
+ return;
480
+ }
481
+ if (!nameArg)
482
+ throw new ValidationError("Resource or package name is required. Use --interactive to interactively select.");
483
+ if ((await runDirectUninstallFlow(
484
+ nameArg,
485
+ options,
486
+ traverseOpts,
487
+ (opts) => createCliExecutionContext({ ...opts, outputMode: opts.interactive ? "rich" : "plain" })
488
+ )).cancelled) {
489
+ let ctx = await createCliExecutionContext({ interactive: !1, outputMode: "plain" });
490
+ resolveOutput(ctx).info("Uninstall cancelled");
491
+ }
492
+ }
493
+ async function handleListUninstall(packageFilter, options, programOpts, traverseOpts) {
494
+ let ctx = await createCliExecutionContext({ interactive: !0, outputMode: "rich" }), out = resolveOutput(ctx), prm = resolvePrompt(ctx), s = out.spinner();
495
+ s.start("Loading installed resources");
496
+ let collection = await collectWorkspaceResources(traverseOpts, packageFilter);
497
+ if (packageFilter && collection.allResources.length === 0 && collection.allPackages.length === 0)
498
+ throw s.stop("No resources found"), new ValidationError(`Package '${packageFilter}' not found.`);
499
+ let { groupedOptions, totalItems } = await buildGroupedUninstallOptions(collection, programOpts);
500
+ if (totalItems === 0) {
501
+ s.stop("No installed resources found"), out.note("Run `opkg install --interactive` to install resources.", "Info");
502
+ return;
503
+ }
504
+ s.stop(`Found ${totalItems} item${totalItems === 1 ? "" : "s"}`);
505
+ let selected = await prm.groupMultiselect(
506
+ "Select items to uninstall:",
507
+ groupedOptions
508
+ );
509
+ if (!selected || selected.length === 0) {
510
+ out.info("Uninstall cancelled");
511
+ return;
512
+ }
513
+ out.step(`Uninstalling ${selected.length} item${selected.length === 1 ? "" : "s"}`);
514
+ let summary = await executeBatchUninstall(
515
+ selected,
516
+ options,
517
+ collection,
518
+ programOpts,
519
+ (opts) => createCliExecutionContext({ ...opts, outputMode: opts.interactive ? "rich" : "plain" }),
520
+ executeUninstallCandidate
521
+ ), breakdown = Array.from(summary.typeCounts.entries()).sort((a, b) => b[1] - a[1]).map(([type, count]) => `${count} ${type}`).join(", ");
522
+ if (out.success(`Successfully uninstalled ${summary.uninstalledCount} item${summary.uninstalledCount === 1 ? "" : "s"} (${breakdown})`), summary.allRemovedFiles.length > 0) {
523
+ let cwd = process.cwd(), absolutePaths = [...new Set(
524
+ summary.allRemovedFiles.map(({ path: p, targetDir }) => join2(targetDir, p))
525
+ )].sort((a, b) => a.localeCompare(b)), fileLines = absolutePaths.slice(0, 10).map((f) => formatPathForDisplay(f, cwd)), more = absolutePaths.length > 10 ? `
526
+ ... and ${absolutePaths.length - 10} more` : "";
527
+ out.note(fileLines.join(`
528
+ `) + more, "Removed files");
529
+ }
530
+ out.success("Uninstall complete");
531
+ }
532
+ async function setupUninstallCommand(args) {
533
+ let [nameArg, options, command] = args;
534
+ await uninstallCommand(nameArg, options, command);
535
+ }
536
+ export {
537
+ setupUninstallCommand
538
+ };
539
+ //# sourceMappingURL=uninstall-Q3CP4UN5.js.map