@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.
- package/AGENTS.md +880 -0
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/__tests__/e2e.spec.d.ts +8 -0
- package/dist/__tests__/e2e.spec.d.ts.map +1 -0
- package/dist/__tests__/e2e.spec.js +253 -0
- package/dist/__tests__/e2e.spec.js.map +1 -0
- package/dist/__tests__/integration.spec.d.ts +8 -0
- package/dist/__tests__/integration.spec.d.ts.map +1 -0
- package/dist/__tests__/integration.spec.js +274 -0
- package/dist/__tests__/integration.spec.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +610 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/consumers.d.ts +37 -0
- package/dist/commands/consumers.d.ts.map +1 -0
- package/dist/commands/consumers.js +107 -0
- package/dist/commands/consumers.js.map +1 -0
- package/dist/commands/docs.d.ts +59 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +262 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/docs.spec.d.ts +5 -0
- package/dist/commands/docs.spec.d.ts.map +1 -0
- package/dist/commands/docs.spec.js +213 -0
- package/dist/commands/docs.spec.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +31 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +234 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +22 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +45 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/list.spec.d.ts +5 -0
- package/dist/commands/list.spec.d.ts.map +1 -0
- package/dist/commands/list.spec.js +95 -0
- package/dist/commands/list.spec.js.map +1 -0
- package/dist/commands/prune.d.ts +27 -0
- package/dist/commands/prune.d.ts.map +1 -0
- package/dist/commands/prune.js +74 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/publish.d.ts +16 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +225 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/publish.spec.d.ts +5 -0
- package/dist/commands/publish.spec.d.ts.map +1 -0
- package/dist/commands/publish.spec.js +98 -0
- package/dist/commands/publish.spec.js.map +1 -0
- package/dist/commands/push.d.ts +16 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +164 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/remove.d.ts +24 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +80 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/remove.spec.d.ts +5 -0
- package/dist/commands/remove.spec.d.ts.map +1 -0
- package/dist/commands/remove.spec.js +87 -0
- package/dist/commands/remove.spec.js.map +1 -0
- package/dist/commands/resolve.d.ts +20 -0
- package/dist/commands/resolve.d.ts.map +1 -0
- package/dist/commands/resolve.js +52 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/resolve.spec.d.ts +5 -0
- package/dist/commands/resolve.spec.d.ts.map +1 -0
- package/dist/commands/resolve.spec.js +87 -0
- package/dist/commands/resolve.spec.js.map +1 -0
- package/dist/commands/verify.d.ts +32 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +127 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +65 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +116 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.spec.d.ts +5 -0
- package/dist/constants.spec.d.ts.map +1 -0
- package/dist/constants.spec.js +72 -0
- package/dist/constants.spec.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/installations.d.ts +79 -0
- package/dist/core/installations.d.ts.map +1 -0
- package/dist/core/installations.js +207 -0
- package/dist/core/installations.js.map +1 -0
- package/dist/core/installations.spec.d.ts +5 -0
- package/dist/core/installations.spec.d.ts.map +1 -0
- package/dist/core/installations.spec.js +261 -0
- package/dist/core/installations.spec.js.map +1 -0
- package/dist/core/lock.d.ts +37 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +198 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/lock.spec.d.ts +5 -0
- package/dist/core/lock.spec.d.ts.map +1 -0
- package/dist/core/lock.spec.js +161 -0
- package/dist/core/lock.spec.js.map +1 -0
- package/dist/core/registry.d.ts +80 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +231 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.spec.d.ts +5 -0
- package/dist/core/registry.spec.d.ts.map +1 -0
- package/dist/core/registry.spec.js +281 -0
- package/dist/core/registry.spec.js.map +1 -0
- package/dist/core/resolver.d.ts +55 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +127 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/resolver.spec.d.ts +5 -0
- package/dist/core/resolver.spec.d.ts.map +1 -0
- package/dist/core/resolver.spec.js +202 -0
- package/dist/core/resolver.spec.js.map +1 -0
- package/dist/core/store.d.ts +65 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +245 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/store.spec.d.ts +5 -0
- package/dist/core/store.spec.d.ts.map +1 -0
- package/dist/core/store.spec.js +195 -0
- package/dist/core/store.spec.js.map +1 -0
- package/dist/formatters/flat.d.ts +41 -0
- package/dist/formatters/flat.d.ts.map +1 -0
- package/dist/formatters/flat.js +131 -0
- package/dist/formatters/flat.js.map +1 -0
- package/dist/formatters/flat.spec.d.ts +5 -0
- package/dist/formatters/flat.spec.d.ts.map +1 -0
- package/dist/formatters/flat.spec.js +130 -0
- package/dist/formatters/flat.spec.js.map +1 -0
- package/dist/formatters/index.d.ts +6 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +6 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/tree.d.ts +29 -0
- package/dist/formatters/tree.d.ts.map +1 -0
- package/dist/formatters/tree.js +256 -0
- package/dist/formatters/tree.js.map +1 -0
- package/dist/formatters/tree.spec.d.ts +5 -0
- package/dist/formatters/tree.spec.d.ts.map +1 -0
- package/dist/formatters/tree.spec.js +127 -0
- package/dist/formatters/tree.spec.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/installer.d.ts +13 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +171 -0
- package/dist/installer.js.map +1 -0
- package/dist/store.d.ts +78 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +344 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +235 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/README.md +68 -0
- package/docs/inspection/consumers.md +178 -0
- package/docs/inspection/list.md +182 -0
- package/docs/inspection/resolve.md +172 -0
- package/docs/installation/configuration.md +238 -0
- package/docs/installation/install.md +184 -0
- package/docs/maintenance/prune.md +159 -0
- package/docs/maintenance/remove.md +174 -0
- package/docs/maintenance/verify.md +174 -0
- package/docs/publishing/publish.md +146 -0
- package/docs/publishing/push.md +146 -0
- package/docs/store/locking.md +118 -0
- package/docs/store/namespaces.md +141 -0
- package/docs/store/structure.md +163 -0
- 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 @@
|
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,cAAc,EAAE,CAAC,EAAU,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,qBAAqB,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE;IACjG,iBAAiB,EAAE,QAAQ;CAC5B,CAAC,CAAC,CAAC;AAEJ,MAAM,kBAAkB,GAAG,GAAa,EAAE,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE;QACV,MAAM,EAAE;YACN,OAAO,EAAE,sBAAsB;YAC/B,QAAQ,EAAE;gBACR,YAAY,EAAE;oBACZ,QAAQ,EAAE;wBACR,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,EAAE;wBACjF,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,EAAE;qBAClF;iBACF;gBACD,YAAY,EAAE;oBACZ,QAAQ,EAAE;wBACR,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;qBACjF;iBACF;aACF;SACF;QACD,OAAO,EAAE;YACP,OAAO,EAAE,sBAAsB;YAC/B,QAAQ,EAAE;gBACR,YAAY,EAAE;oBACZ,QAAQ,EAAE;wBACR,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,EAAE;qBACnF;iBACF;aACF;SACF;KACF;CACF,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEtF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEtF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAE5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEvF,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG;gBACf,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;gBACxC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;aACzC,CAAC;YAEF,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEhE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEtF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,yBAAyB,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEvF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;YAE/E,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE5D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC,CAAC;YAEvE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;YAElF,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,aAAa;gBACxB,kBAAkB,EAAE,CAAC,QAAQ,CAAC;aAC/B,CAAC;YAEF,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAEjD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAChD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,KAAK;gBACZ,kBAAkB,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;aAC1C,CAAC;YAEF,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAEjD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO,GAAG;gBACd,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE;gBACzH,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE;aACpF,CAAC;YAEF,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAEnD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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
|