@unlimitechcloud/devlink 1.0.2

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 (186) hide show
  1. package/AGENTS.md +880 -0
  2. package/LICENSE +21 -0
  3. package/README.md +335 -0
  4. package/dist/__tests__/e2e.spec.d.ts +8 -0
  5. package/dist/__tests__/e2e.spec.d.ts.map +1 -0
  6. package/dist/__tests__/e2e.spec.js +253 -0
  7. package/dist/__tests__/e2e.spec.js.map +1 -0
  8. package/dist/__tests__/integration.spec.d.ts +8 -0
  9. package/dist/__tests__/integration.spec.d.ts.map +1 -0
  10. package/dist/__tests__/integration.spec.js +274 -0
  11. package/dist/__tests__/integration.spec.js.map +1 -0
  12. package/dist/cli.d.ts +6 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +610 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands/consumers.d.ts +37 -0
  17. package/dist/commands/consumers.d.ts.map +1 -0
  18. package/dist/commands/consumers.js +107 -0
  19. package/dist/commands/consumers.js.map +1 -0
  20. package/dist/commands/docs.d.ts +59 -0
  21. package/dist/commands/docs.d.ts.map +1 -0
  22. package/dist/commands/docs.js +262 -0
  23. package/dist/commands/docs.js.map +1 -0
  24. package/dist/commands/docs.spec.d.ts +5 -0
  25. package/dist/commands/docs.spec.d.ts.map +1 -0
  26. package/dist/commands/docs.spec.js +213 -0
  27. package/dist/commands/docs.spec.js.map +1 -0
  28. package/dist/commands/index.d.ts +13 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +13 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/install.d.ts +31 -0
  33. package/dist/commands/install.d.ts.map +1 -0
  34. package/dist/commands/install.js +234 -0
  35. package/dist/commands/install.js.map +1 -0
  36. package/dist/commands/list.d.ts +22 -0
  37. package/dist/commands/list.d.ts.map +1 -0
  38. package/dist/commands/list.js +45 -0
  39. package/dist/commands/list.js.map +1 -0
  40. package/dist/commands/list.spec.d.ts +5 -0
  41. package/dist/commands/list.spec.d.ts.map +1 -0
  42. package/dist/commands/list.spec.js +95 -0
  43. package/dist/commands/list.spec.js.map +1 -0
  44. package/dist/commands/prune.d.ts +27 -0
  45. package/dist/commands/prune.d.ts.map +1 -0
  46. package/dist/commands/prune.js +74 -0
  47. package/dist/commands/prune.js.map +1 -0
  48. package/dist/commands/publish.d.ts +16 -0
  49. package/dist/commands/publish.d.ts.map +1 -0
  50. package/dist/commands/publish.js +225 -0
  51. package/dist/commands/publish.js.map +1 -0
  52. package/dist/commands/publish.spec.d.ts +5 -0
  53. package/dist/commands/publish.spec.d.ts.map +1 -0
  54. package/dist/commands/publish.spec.js +98 -0
  55. package/dist/commands/publish.spec.js.map +1 -0
  56. package/dist/commands/push.d.ts +16 -0
  57. package/dist/commands/push.d.ts.map +1 -0
  58. package/dist/commands/push.js +164 -0
  59. package/dist/commands/push.js.map +1 -0
  60. package/dist/commands/remove.d.ts +24 -0
  61. package/dist/commands/remove.d.ts.map +1 -0
  62. package/dist/commands/remove.js +80 -0
  63. package/dist/commands/remove.js.map +1 -0
  64. package/dist/commands/remove.spec.d.ts +5 -0
  65. package/dist/commands/remove.spec.d.ts.map +1 -0
  66. package/dist/commands/remove.spec.js +87 -0
  67. package/dist/commands/remove.spec.js.map +1 -0
  68. package/dist/commands/resolve.d.ts +20 -0
  69. package/dist/commands/resolve.d.ts.map +1 -0
  70. package/dist/commands/resolve.js +52 -0
  71. package/dist/commands/resolve.js.map +1 -0
  72. package/dist/commands/resolve.spec.d.ts +5 -0
  73. package/dist/commands/resolve.spec.d.ts.map +1 -0
  74. package/dist/commands/resolve.spec.js +87 -0
  75. package/dist/commands/resolve.spec.js.map +1 -0
  76. package/dist/commands/verify.d.ts +32 -0
  77. package/dist/commands/verify.d.ts.map +1 -0
  78. package/dist/commands/verify.js +127 -0
  79. package/dist/commands/verify.js.map +1 -0
  80. package/dist/config.d.ts +22 -0
  81. package/dist/config.d.ts.map +1 -0
  82. package/dist/config.js +70 -0
  83. package/dist/config.js.map +1 -0
  84. package/dist/constants.d.ts +65 -0
  85. package/dist/constants.d.ts.map +1 -0
  86. package/dist/constants.js +116 -0
  87. package/dist/constants.js.map +1 -0
  88. package/dist/constants.spec.d.ts +5 -0
  89. package/dist/constants.spec.d.ts.map +1 -0
  90. package/dist/constants.spec.js +72 -0
  91. package/dist/constants.spec.js.map +1 -0
  92. package/dist/core/index.d.ts +9 -0
  93. package/dist/core/index.d.ts.map +1 -0
  94. package/dist/core/index.js +9 -0
  95. package/dist/core/index.js.map +1 -0
  96. package/dist/core/installations.d.ts +79 -0
  97. package/dist/core/installations.d.ts.map +1 -0
  98. package/dist/core/installations.js +207 -0
  99. package/dist/core/installations.js.map +1 -0
  100. package/dist/core/installations.spec.d.ts +5 -0
  101. package/dist/core/installations.spec.d.ts.map +1 -0
  102. package/dist/core/installations.spec.js +261 -0
  103. package/dist/core/installations.spec.js.map +1 -0
  104. package/dist/core/lock.d.ts +37 -0
  105. package/dist/core/lock.d.ts.map +1 -0
  106. package/dist/core/lock.js +198 -0
  107. package/dist/core/lock.js.map +1 -0
  108. package/dist/core/lock.spec.d.ts +5 -0
  109. package/dist/core/lock.spec.d.ts.map +1 -0
  110. package/dist/core/lock.spec.js +161 -0
  111. package/dist/core/lock.spec.js.map +1 -0
  112. package/dist/core/registry.d.ts +80 -0
  113. package/dist/core/registry.d.ts.map +1 -0
  114. package/dist/core/registry.js +231 -0
  115. package/dist/core/registry.js.map +1 -0
  116. package/dist/core/registry.spec.d.ts +5 -0
  117. package/dist/core/registry.spec.d.ts.map +1 -0
  118. package/dist/core/registry.spec.js +281 -0
  119. package/dist/core/registry.spec.js.map +1 -0
  120. package/dist/core/resolver.d.ts +55 -0
  121. package/dist/core/resolver.d.ts.map +1 -0
  122. package/dist/core/resolver.js +127 -0
  123. package/dist/core/resolver.js.map +1 -0
  124. package/dist/core/resolver.spec.d.ts +5 -0
  125. package/dist/core/resolver.spec.d.ts.map +1 -0
  126. package/dist/core/resolver.spec.js +202 -0
  127. package/dist/core/resolver.spec.js.map +1 -0
  128. package/dist/core/store.d.ts +65 -0
  129. package/dist/core/store.d.ts.map +1 -0
  130. package/dist/core/store.js +245 -0
  131. package/dist/core/store.js.map +1 -0
  132. package/dist/core/store.spec.d.ts +5 -0
  133. package/dist/core/store.spec.d.ts.map +1 -0
  134. package/dist/core/store.spec.js +195 -0
  135. package/dist/core/store.spec.js.map +1 -0
  136. package/dist/formatters/flat.d.ts +41 -0
  137. package/dist/formatters/flat.d.ts.map +1 -0
  138. package/dist/formatters/flat.js +131 -0
  139. package/dist/formatters/flat.js.map +1 -0
  140. package/dist/formatters/flat.spec.d.ts +5 -0
  141. package/dist/formatters/flat.spec.d.ts.map +1 -0
  142. package/dist/formatters/flat.spec.js +130 -0
  143. package/dist/formatters/flat.spec.js.map +1 -0
  144. package/dist/formatters/index.d.ts +6 -0
  145. package/dist/formatters/index.d.ts.map +1 -0
  146. package/dist/formatters/index.js +6 -0
  147. package/dist/formatters/index.js.map +1 -0
  148. package/dist/formatters/tree.d.ts +29 -0
  149. package/dist/formatters/tree.d.ts.map +1 -0
  150. package/dist/formatters/tree.js +256 -0
  151. package/dist/formatters/tree.js.map +1 -0
  152. package/dist/formatters/tree.spec.d.ts +5 -0
  153. package/dist/formatters/tree.spec.d.ts.map +1 -0
  154. package/dist/formatters/tree.spec.js +127 -0
  155. package/dist/formatters/tree.spec.js.map +1 -0
  156. package/dist/index.d.ts +11 -0
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +13 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/installer.d.ts +13 -0
  161. package/dist/installer.d.ts.map +1 -0
  162. package/dist/installer.js +171 -0
  163. package/dist/installer.js.map +1 -0
  164. package/dist/store.d.ts +78 -0
  165. package/dist/store.d.ts.map +1 -0
  166. package/dist/store.js +344 -0
  167. package/dist/store.js.map +1 -0
  168. package/dist/types.d.ts +235 -0
  169. package/dist/types.d.ts.map +1 -0
  170. package/dist/types.js +5 -0
  171. package/dist/types.js.map +1 -0
  172. package/docs/README.md +68 -0
  173. package/docs/inspection/consumers.md +178 -0
  174. package/docs/inspection/list.md +182 -0
  175. package/docs/inspection/resolve.md +172 -0
  176. package/docs/installation/configuration.md +238 -0
  177. package/docs/installation/install.md +184 -0
  178. package/docs/maintenance/prune.md +159 -0
  179. package/docs/maintenance/remove.md +174 -0
  180. package/docs/maintenance/verify.md +174 -0
  181. package/docs/publishing/publish.md +146 -0
  182. package/docs/publishing/push.md +146 -0
  183. package/docs/store/locking.md +118 -0
  184. package/docs/store/namespaces.md +141 -0
  185. package/docs/store/structure.md +163 -0
  186. package/package.json +58 -0
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Resolver - Algoritmo de resolución de paquetes
3
+ */
4
+ import { getPackagePath, DEFAULT_NAMESPACE } from "../constants.js";
5
+ /**
6
+ * Resolve a single package across namespaces
7
+ * Searches namespaces in order and returns the first match
8
+ */
9
+ export function resolvePackage(packageName, version, namespaces, registry) {
10
+ const searchedNamespaces = [];
11
+ // Ensure we have at least global namespace
12
+ const nsToSearch = namespaces.length > 0 ? namespaces : [DEFAULT_NAMESPACE];
13
+ for (const ns of nsToSearch) {
14
+ searchedNamespaces.push(ns);
15
+ const nsEntry = registry.namespaces[ns];
16
+ if (!nsEntry)
17
+ continue;
18
+ const pkgEntry = nsEntry.packages[packageName];
19
+ if (!pkgEntry)
20
+ continue;
21
+ const versionEntry = pkgEntry.versions[version];
22
+ if (!versionEntry)
23
+ continue;
24
+ return {
25
+ package: packageName,
26
+ version,
27
+ found: true,
28
+ namespace: ns,
29
+ path: getPackagePath(ns, packageName, version),
30
+ signature: versionEntry.signature,
31
+ searchedNamespaces,
32
+ };
33
+ }
34
+ return {
35
+ package: packageName,
36
+ version,
37
+ found: false,
38
+ searchedNamespaces,
39
+ };
40
+ }
41
+ /**
42
+ * Resolve multiple packages
43
+ */
44
+ export function resolvePackages(packages, namespaces, registry) {
45
+ return packages.map(pkg => resolvePackage(pkg.name, pkg.version, namespaces, registry));
46
+ }
47
+ /**
48
+ * Find a package in a specific namespace only
49
+ */
50
+ export function findInNamespace(packageName, version, namespace, registry) {
51
+ return resolvePackage(packageName, version, [namespace], registry);
52
+ }
53
+ /**
54
+ * Check if a package exists in any of the given namespaces
55
+ */
56
+ export function packageExistsInNamespaces(packageName, version, namespaces, registry) {
57
+ const result = resolvePackage(packageName, version, namespaces, registry);
58
+ return result.found;
59
+ }
60
+ /**
61
+ * Get all available versions of a package across namespaces
62
+ */
63
+ export function getAllVersions(packageName, namespaces, registry) {
64
+ const results = [];
65
+ const nsToSearch = namespaces.length > 0 ? namespaces : Object.keys(registry.namespaces);
66
+ for (const ns of nsToSearch) {
67
+ const nsEntry = registry.namespaces[ns];
68
+ if (!nsEntry)
69
+ continue;
70
+ const pkgEntry = nsEntry.packages[packageName];
71
+ if (!pkgEntry)
72
+ continue;
73
+ for (const [version, versionEntry] of Object.entries(pkgEntry.versions)) {
74
+ results.push({
75
+ namespace: ns,
76
+ version,
77
+ signature: versionEntry.signature,
78
+ });
79
+ }
80
+ }
81
+ return results;
82
+ }
83
+ /**
84
+ * Parse package specifier (e.g., "@scope/pkg@1.0.0")
85
+ */
86
+ export function parsePackageSpec(spec) {
87
+ // Handle scoped packages: @scope/name@version
88
+ const scopedMatch = spec.match(/^(@[^/]+\/[^@]+)@(.+)$/);
89
+ if (scopedMatch) {
90
+ return { name: scopedMatch[1], version: scopedMatch[2] };
91
+ }
92
+ // Handle non-scoped packages: name@version
93
+ const simpleMatch = spec.match(/^([^@]+)@(.+)$/);
94
+ if (simpleMatch) {
95
+ return { name: simpleMatch[1], version: simpleMatch[2] };
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Parse multiple package specifiers
101
+ */
102
+ export function parsePackageSpecs(specs) {
103
+ const results = [];
104
+ for (const spec of specs) {
105
+ const parsed = parsePackageSpec(spec);
106
+ if (parsed) {
107
+ results.push(parsed);
108
+ }
109
+ }
110
+ return results;
111
+ }
112
+ /**
113
+ * Format resolution result for display
114
+ */
115
+ export function formatResolutionResult(result) {
116
+ if (result.found) {
117
+ return `✓ ${result.package}@${result.version} → ${result.namespace} (${result.signature?.slice(0, 8)})`;
118
+ }
119
+ return `✗ ${result.package}@${result.version} not found (searched: ${result.searchedNamespaces.join(", ")})`;
120
+ }
121
+ /**
122
+ * Batch format resolution results
123
+ */
124
+ export function formatResolutionResults(results) {
125
+ return results.map(formatResolutionResult).join("\n");
126
+ }
127
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Resolver - Unit tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=resolver.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.spec.d.ts","sourceRoot":"","sources":["../../src/core/resolver.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Resolver - Unit tests
3
+ */
4
+ import { describe, it, expect, vi } from "vitest";
5
+ import { resolvePackage, resolvePackages, findInNamespace, packageExistsInNamespaces, getAllVersions, parsePackageSpec, parsePackageSpecs, formatResolutionResult, formatResolutionResults, } from "./resolver.js";
6
+ vi.mock("../constants.js", () => ({
7
+ getPackagePath: (ns, pkg, ver) => `/store/namespaces/${ns}/${pkg}/${ver}`,
8
+ DEFAULT_NAMESPACE: "global",
9
+ }));
10
+ const createTestRegistry = () => ({
11
+ version: "1.0.0",
12
+ namespaces: {
13
+ global: {
14
+ created: "2026-02-12T10:00:00Z",
15
+ packages: {
16
+ "@scope/pkg": {
17
+ versions: {
18
+ "1.0.0": { signature: "global-v1", published: "2026-02-12T10:00:00Z", files: 10 },
19
+ "2.0.0": { signature: "global-v2", published: "2026-02-12T11:00:00Z", files: 12 },
20
+ },
21
+ },
22
+ "simple-pkg": {
23
+ versions: {
24
+ "1.0.0": { signature: "simple-v1", published: "2026-02-12T10:00:00Z", files: 5 },
25
+ },
26
+ },
27
+ },
28
+ },
29
+ feature: {
30
+ created: "2026-02-12T12:00:00Z",
31
+ packages: {
32
+ "@scope/pkg": {
33
+ versions: {
34
+ "1.0.0": { signature: "feature-v1", published: "2026-02-12T12:00:00Z", files: 11 },
35
+ },
36
+ },
37
+ },
38
+ },
39
+ },
40
+ });
41
+ describe("Resolver", () => {
42
+ describe("resolvePackage", () => {
43
+ it("should resolve package from first matching namespace", () => {
44
+ const registry = createTestRegistry();
45
+ const result = resolvePackage("@scope/pkg", "1.0.0", ["feature", "global"], registry);
46
+ expect(result.found).toBe(true);
47
+ expect(result.namespace).toBe("feature");
48
+ expect(result.signature).toBe("feature-v1");
49
+ });
50
+ it("should fall back to later namespaces", () => {
51
+ const registry = createTestRegistry();
52
+ const result = resolvePackage("@scope/pkg", "2.0.0", ["feature", "global"], registry);
53
+ expect(result.found).toBe(true);
54
+ expect(result.namespace).toBe("global");
55
+ expect(result.signature).toBe("global-v2");
56
+ });
57
+ it("should return not found for missing package", () => {
58
+ const registry = createTestRegistry();
59
+ const result = resolvePackage("nonexistent", "1.0.0", ["global"], registry);
60
+ expect(result.found).toBe(false);
61
+ expect(result.searchedNamespaces).toContain("global");
62
+ });
63
+ it("should use global namespace by default", () => {
64
+ const registry = createTestRegistry();
65
+ const result = resolvePackage("simple-pkg", "1.0.0", [], registry);
66
+ expect(result.found).toBe(true);
67
+ expect(result.namespace).toBe("global");
68
+ });
69
+ it("should track searched namespaces", () => {
70
+ const registry = createTestRegistry();
71
+ const result = resolvePackage("nonexistent", "1.0.0", ["feature", "global"], registry);
72
+ expect(result.searchedNamespaces).toEqual(["feature", "global"]);
73
+ });
74
+ it("should include path in result", () => {
75
+ const registry = createTestRegistry();
76
+ const result = resolvePackage("@scope/pkg", "1.0.0", ["global"], registry);
77
+ expect(result.path).toBe("/store/namespaces/global/@scope/pkg/1.0.0");
78
+ });
79
+ });
80
+ describe("resolvePackages", () => {
81
+ it("should resolve multiple packages", () => {
82
+ const registry = createTestRegistry();
83
+ const packages = [
84
+ { name: "@scope/pkg", version: "1.0.0" },
85
+ { name: "simple-pkg", version: "1.0.0" },
86
+ ];
87
+ const results = resolvePackages(packages, ["global"], registry);
88
+ expect(results).toHaveLength(2);
89
+ expect(results[0].found).toBe(true);
90
+ expect(results[1].found).toBe(true);
91
+ });
92
+ });
93
+ describe("findInNamespace", () => {
94
+ it("should find package in specific namespace", () => {
95
+ const registry = createTestRegistry();
96
+ const result = findInNamespace("@scope/pkg", "1.0.0", "feature", registry);
97
+ expect(result.found).toBe(true);
98
+ expect(result.namespace).toBe("feature");
99
+ });
100
+ it("should not find package in wrong namespace", () => {
101
+ const registry = createTestRegistry();
102
+ const result = findInNamespace("simple-pkg", "1.0.0", "feature", registry);
103
+ expect(result.found).toBe(false);
104
+ });
105
+ });
106
+ describe("packageExistsInNamespaces", () => {
107
+ it("should return true for existing package", () => {
108
+ const registry = createTestRegistry();
109
+ const exists = packageExistsInNamespaces("@scope/pkg", "1.0.0", ["global"], registry);
110
+ expect(exists).toBe(true);
111
+ });
112
+ it("should return false for non-existent package", () => {
113
+ const registry = createTestRegistry();
114
+ const exists = packageExistsInNamespaces("nonexistent", "1.0.0", ["global"], registry);
115
+ expect(exists).toBe(false);
116
+ });
117
+ });
118
+ describe("getAllVersions", () => {
119
+ it("should get all versions across namespaces", () => {
120
+ const registry = createTestRegistry();
121
+ const versions = getAllVersions("@scope/pkg", ["global", "feature"], registry);
122
+ expect(versions).toHaveLength(3);
123
+ expect(versions.map(v => v.version)).toContain("1.0.0");
124
+ expect(versions.map(v => v.version)).toContain("2.0.0");
125
+ });
126
+ it("should search all namespaces when none specified", () => {
127
+ const registry = createTestRegistry();
128
+ const versions = getAllVersions("@scope/pkg", [], registry);
129
+ expect(versions.length).toBeGreaterThan(0);
130
+ });
131
+ });
132
+ describe("parsePackageSpec", () => {
133
+ it("should parse scoped package", () => {
134
+ const result = parsePackageSpec("@scope/pkg@1.0.0");
135
+ expect(result).toEqual({ name: "@scope/pkg", version: "1.0.0" });
136
+ });
137
+ it("should parse simple package", () => {
138
+ const result = parsePackageSpec("pkg@1.0.0");
139
+ expect(result).toEqual({ name: "pkg", version: "1.0.0" });
140
+ });
141
+ it("should return null for invalid spec", () => {
142
+ const result = parsePackageSpec("invalid");
143
+ expect(result).toBeNull();
144
+ });
145
+ it("should handle complex versions", () => {
146
+ const result = parsePackageSpec("@scope/pkg@1.0.0-beta.1");
147
+ expect(result).toEqual({ name: "@scope/pkg", version: "1.0.0-beta.1" });
148
+ });
149
+ });
150
+ describe("parsePackageSpecs", () => {
151
+ it("should parse multiple specs", () => {
152
+ const results = parsePackageSpecs(["@scope/pkg@1.0.0", "other@2.0.0"]);
153
+ expect(results).toHaveLength(2);
154
+ });
155
+ it("should skip invalid specs", () => {
156
+ const results = parsePackageSpecs(["@scope/pkg@1.0.0", "invalid", "other@2.0.0"]);
157
+ expect(results).toHaveLength(2);
158
+ });
159
+ });
160
+ describe("formatResolutionResult", () => {
161
+ it("should format found result", () => {
162
+ const result = {
163
+ package: "@scope/pkg",
164
+ version: "1.0.0",
165
+ found: true,
166
+ namespace: "global",
167
+ signature: "abc12345678",
168
+ searchedNamespaces: ["global"],
169
+ };
170
+ const formatted = formatResolutionResult(result);
171
+ expect(formatted).toContain("✓");
172
+ expect(formatted).toContain("@scope/pkg@1.0.0");
173
+ expect(formatted).toContain("global");
174
+ expect(formatted).toContain("abc12345");
175
+ });
176
+ it("should format not found result", () => {
177
+ const result = {
178
+ package: "@scope/pkg",
179
+ version: "1.0.0",
180
+ found: false,
181
+ searchedNamespaces: ["feature", "global"],
182
+ };
183
+ const formatted = formatResolutionResult(result);
184
+ expect(formatted).toContain("✗");
185
+ expect(formatted).toContain("not found");
186
+ expect(formatted).toContain("feature, global");
187
+ });
188
+ });
189
+ describe("formatResolutionResults", () => {
190
+ it("should format multiple results", () => {
191
+ const results = [
192
+ { package: "pkg1", version: "1.0.0", found: true, namespace: "global", signature: "abc", searchedNamespaces: ["global"] },
193
+ { package: "pkg2", version: "1.0.0", found: false, searchedNamespaces: ["global"] },
194
+ ];
195
+ const formatted = formatResolutionResults(results);
196
+ expect(formatted).toContain("pkg1");
197
+ expect(formatted).toContain("pkg2");
198
+ expect(formatted.split("\n")).toHaveLength(2);
199
+ });
200
+ });
201
+ });
202
+ //# sourceMappingURL=resolver.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.spec.js","sourceRoot":"","sources":["../../src/core/resolver.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Store - Operaciones de filesystem para el store
3
+ */
4
+ /**
5
+ * Ensure the store base directory exists
6
+ */
7
+ export declare function ensureStore(): Promise<void>;
8
+ /**
9
+ * Ensure a namespace directory exists
10
+ */
11
+ export declare function ensureNamespace(namespace: string): Promise<void>;
12
+ /**
13
+ * Check if a namespace exists on disk
14
+ */
15
+ export declare function namespaceExists(namespace: string): Promise<boolean>;
16
+ /**
17
+ * List all namespaces on disk
18
+ * Returns global first, then alphabetically sorted
19
+ */
20
+ export declare function listNamespaces(): Promise<string[]>;
21
+ /**
22
+ * Check if a package version exists on disk
23
+ */
24
+ export declare function packageVersionExists(namespace: string, packageName: string, version: string): Promise<boolean>;
25
+ /**
26
+ * List all packages in a namespace
27
+ */
28
+ export declare function listPackagesInNamespace(namespace: string): Promise<string[]>;
29
+ /**
30
+ * List all versions of a package in a namespace
31
+ */
32
+ export declare function listVersionsInNamespace(namespace: string, packageName: string): Promise<string[]>;
33
+ /**
34
+ * Delete a package version from disk
35
+ */
36
+ export declare function deletePackageVersion(namespace: string, packageName: string, version: string): Promise<void>;
37
+ /**
38
+ * Delete an entire package from disk (all versions)
39
+ */
40
+ export declare function deletePackage(namespace: string, packageName: string): Promise<void>;
41
+ /**
42
+ * Delete an entire namespace from disk
43
+ * Cannot delete the global namespace
44
+ */
45
+ export declare function deleteNamespace(namespace: string): Promise<void>;
46
+ /**
47
+ * Read signature file from a package
48
+ */
49
+ export declare function readPackageSignature(namespace: string, packageName: string, version: string): Promise<string | null>;
50
+ /**
51
+ * Write signature file to a package
52
+ */
53
+ export declare function writePackageSignature(namespace: string, packageName: string, version: string, signature: string): Promise<void>;
54
+ /**
55
+ * Get disk usage for a namespace
56
+ */
57
+ export declare function getNamespaceDiskUsage(namespace: string): Promise<number>;
58
+ /**
59
+ * Find orphaned packages on disk (not in registry)
60
+ */
61
+ export declare function findOrphanedPackages(namespace: string, registeredPackages: Set<string>): Promise<{
62
+ packageName: string;
63
+ version: string;
64
+ }[]>;
65
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQzE;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBxD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAQlB;AAGD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgClF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtE;AAuBD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG9E;AA4BD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAgBrD"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Store - Operaciones de filesystem para el store
3
+ */
4
+ import fs from "fs/promises";
5
+ import path from "path";
6
+ import { getStorePath, getNamespacesPath, getNamespacePath, getPackagePath, DEFAULT_NAMESPACE, SIGNATURE_FILE, } from "../constants.js";
7
+ /**
8
+ * Ensure the store base directory exists
9
+ */
10
+ export async function ensureStore() {
11
+ const storePath = getStorePath();
12
+ await fs.mkdir(storePath, { recursive: true });
13
+ }
14
+ /**
15
+ * Ensure a namespace directory exists
16
+ */
17
+ export async function ensureNamespace(namespace) {
18
+ const nsPath = getNamespacePath(namespace);
19
+ await fs.mkdir(nsPath, { recursive: true });
20
+ }
21
+ /**
22
+ * Check if a namespace exists on disk
23
+ */
24
+ export async function namespaceExists(namespace) {
25
+ const nsPath = getNamespacePath(namespace);
26
+ try {
27
+ const stat = await fs.stat(nsPath);
28
+ return stat.isDirectory();
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ /**
35
+ * List all namespaces on disk
36
+ * Returns global first, then alphabetically sorted
37
+ */
38
+ export async function listNamespaces() {
39
+ const namespacesPath = getNamespacesPath();
40
+ try {
41
+ const entries = await fs.readdir(namespacesPath, { withFileTypes: true });
42
+ const namespaces = entries
43
+ .filter(e => e.isDirectory())
44
+ .map(e => e.name);
45
+ return namespaces.sort((a, b) => {
46
+ if (a === DEFAULT_NAMESPACE)
47
+ return -1;
48
+ if (b === DEFAULT_NAMESPACE)
49
+ return 1;
50
+ return a.localeCompare(b);
51
+ });
52
+ }
53
+ catch (error) {
54
+ if (error.code === "ENOENT") {
55
+ return [];
56
+ }
57
+ throw error;
58
+ }
59
+ }
60
+ /**
61
+ * Check if a package version exists on disk
62
+ */
63
+ export async function packageVersionExists(namespace, packageName, version) {
64
+ const pkgPath = getPackagePath(namespace, packageName, version);
65
+ try {
66
+ const stat = await fs.stat(pkgPath);
67
+ return stat.isDirectory();
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ /**
74
+ * List all packages in a namespace
75
+ */
76
+ export async function listPackagesInNamespace(namespace) {
77
+ const nsPath = getNamespacePath(namespace);
78
+ try {
79
+ const entries = await fs.readdir(nsPath, { withFileTypes: true });
80
+ const packages = [];
81
+ for (const entry of entries) {
82
+ if (!entry.isDirectory())
83
+ continue;
84
+ // Check if it's a scoped package (@scope/name)
85
+ if (entry.name.startsWith("@")) {
86
+ const scopePath = path.join(nsPath, entry.name);
87
+ const scopeEntries = await fs.readdir(scopePath, { withFileTypes: true });
88
+ for (const scopeEntry of scopeEntries) {
89
+ if (scopeEntry.isDirectory()) {
90
+ packages.push(`${entry.name}/${scopeEntry.name}`);
91
+ }
92
+ }
93
+ }
94
+ else {
95
+ packages.push(entry.name);
96
+ }
97
+ }
98
+ return packages.sort();
99
+ }
100
+ catch (error) {
101
+ if (error.code === "ENOENT") {
102
+ return [];
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ /**
108
+ * List all versions of a package in a namespace
109
+ */
110
+ export async function listVersionsInNamespace(namespace, packageName) {
111
+ const pkgBasePath = path.join(getNamespacePath(namespace), packageName);
112
+ try {
113
+ const entries = await fs.readdir(pkgBasePath, { withFileTypes: true });
114
+ return entries
115
+ .filter(e => e.isDirectory())
116
+ .map(e => e.name)
117
+ .sort();
118
+ }
119
+ catch (error) {
120
+ if (error.code === "ENOENT") {
121
+ return [];
122
+ }
123
+ throw error;
124
+ }
125
+ }
126
+ /**
127
+ * Delete a package version from disk
128
+ */
129
+ export async function deletePackageVersion(namespace, packageName, version) {
130
+ const pkgPath = getPackagePath(namespace, packageName, version);
131
+ await fs.rm(pkgPath, { recursive: true, force: true });
132
+ // Clean up empty parent directories
133
+ await cleanupEmptyParents(pkgPath, getNamespacePath(namespace));
134
+ }
135
+ /**
136
+ * Delete an entire package from disk (all versions)
137
+ */
138
+ export async function deletePackage(namespace, packageName) {
139
+ const pkgBasePath = path.join(getNamespacePath(namespace), packageName);
140
+ await fs.rm(pkgBasePath, { recursive: true, force: true });
141
+ // Clean up empty scope directory if scoped package
142
+ if (packageName.startsWith("@")) {
143
+ const scopePath = path.dirname(pkgBasePath);
144
+ await cleanupEmptyParents(pkgBasePath, getNamespacePath(namespace));
145
+ }
146
+ }
147
+ /**
148
+ * Delete an entire namespace from disk
149
+ * Cannot delete the global namespace
150
+ */
151
+ export async function deleteNamespace(namespace) {
152
+ if (namespace === DEFAULT_NAMESPACE) {
153
+ throw new Error(`Cannot delete reserved namespace '${DEFAULT_NAMESPACE}'`);
154
+ }
155
+ const nsPath = getNamespacePath(namespace);
156
+ await fs.rm(nsPath, { recursive: true, force: true });
157
+ }
158
+ /**
159
+ * Clean up empty parent directories up to a limit
160
+ */
161
+ async function cleanupEmptyParents(startPath, limitPath) {
162
+ let currentPath = path.dirname(startPath);
163
+ while (currentPath !== limitPath && currentPath.startsWith(limitPath)) {
164
+ try {
165
+ const entries = await fs.readdir(currentPath);
166
+ if (entries.length === 0) {
167
+ await fs.rmdir(currentPath);
168
+ currentPath = path.dirname(currentPath);
169
+ }
170
+ else {
171
+ break;
172
+ }
173
+ }
174
+ catch {
175
+ break;
176
+ }
177
+ }
178
+ }
179
+ /**
180
+ * Read signature file from a package
181
+ */
182
+ export async function readPackageSignature(namespace, packageName, version) {
183
+ const sigPath = path.join(getPackagePath(namespace, packageName, version), SIGNATURE_FILE);
184
+ try {
185
+ return (await fs.readFile(sigPath, "utf-8")).trim();
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * Write signature file to a package
193
+ */
194
+ export async function writePackageSignature(namespace, packageName, version, signature) {
195
+ const sigPath = path.join(getPackagePath(namespace, packageName, version), SIGNATURE_FILE);
196
+ await fs.writeFile(sigPath, signature);
197
+ }
198
+ /**
199
+ * Get disk usage for a namespace
200
+ */
201
+ export async function getNamespaceDiskUsage(namespace) {
202
+ const nsPath = getNamespacePath(namespace);
203
+ return getDirSize(nsPath);
204
+ }
205
+ /**
206
+ * Get directory size recursively
207
+ */
208
+ async function getDirSize(dirPath) {
209
+ let size = 0;
210
+ try {
211
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
212
+ for (const entry of entries) {
213
+ const entryPath = path.join(dirPath, entry.name);
214
+ if (entry.isDirectory()) {
215
+ size += await getDirSize(entryPath);
216
+ }
217
+ else {
218
+ const stat = await fs.stat(entryPath);
219
+ size += stat.size;
220
+ }
221
+ }
222
+ }
223
+ catch {
224
+ // Ignore errors
225
+ }
226
+ return size;
227
+ }
228
+ /**
229
+ * Find orphaned packages on disk (not in registry)
230
+ */
231
+ export async function findOrphanedPackages(namespace, registeredPackages) {
232
+ const orphans = [];
233
+ const packages = await listPackagesInNamespace(namespace);
234
+ for (const pkgName of packages) {
235
+ const versions = await listVersionsInNamespace(namespace, pkgName);
236
+ for (const version of versions) {
237
+ const key = `${pkgName}@${version}`;
238
+ if (!registeredPackages.has(key)) {
239
+ orphans.push({ packageName: pkgName, version });
240
+ }
241
+ }
242
+ }
243
+ return orphans;
244
+ }
245
+ //# sourceMappingURL=store.js.map