kustodian 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +346 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +67 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/command.d.ts +57 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +26 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/apply.d.ts +8 -0
- package/dist/cli/commands/apply.d.ts.map +1 -0
- package/dist/cli/commands/apply.js +802 -0
- package/dist/cli/commands/apply.js.map +1 -0
- package/dist/cli/commands/init.d.ts +5 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +403 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/sources.d.ts +5 -0
- package/dist/cli/commands/sources.d.ts.map +1 -0
- package/dist/cli/commands/sources.js +377 -0
- package/dist/cli/commands/sources.js.map +1 -0
- package/dist/cli/commands/update.d.ts +5 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +314 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +5 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +126 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/container.d.ts +48 -0
- package/dist/cli/container.d.ts.map +1 -0
- package/dist/cli/container.js +49 -0
- package/dist/cli/container.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/middleware.d.ts +118 -0
- package/dist/cli/middleware.d.ts.map +1 -0
- package/dist/cli/middleware.js +280 -0
- package/dist/cli/middleware.js.map +1 -0
- package/dist/cli/runner.d.ts +34 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +156 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/utils/defaults.d.ts +23 -0
- package/dist/cli/utils/defaults.d.ts.map +1 -0
- package/dist/cli/utils/defaults.js +43 -0
- package/dist/cli/utils/defaults.js.map +1 -0
- package/dist/core/error.d.ts +117 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +210 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +31 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +78 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/path.d.ts +57 -0
- package/dist/core/path.d.ts.map +1 -0
- package/dist/core/path.js +154 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/result.d.ts +80 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +150 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/types.d.ts +80 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generator/external-substitutions.d.ts +21 -0
- package/dist/generator/external-substitutions.d.ts.map +1 -0
- package/dist/generator/external-substitutions.js +49 -0
- package/dist/generator/external-substitutions.js.map +1 -0
- package/dist/generator/flux.d.ts +61 -0
- package/dist/generator/flux.d.ts.map +1 -0
- package/dist/generator/flux.js +294 -0
- package/dist/generator/flux.js.map +1 -0
- package/dist/generator/generator.d.ts +77 -0
- package/dist/generator/generator.d.ts.map +1 -0
- package/dist/generator/generator.js +183 -0
- package/dist/generator/generator.js.map +1 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +9 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/kustomization-resolution.d.ts +40 -0
- package/dist/generator/kustomization-resolution.d.ts.map +1 -0
- package/dist/generator/kustomization-resolution.js +59 -0
- package/dist/generator/kustomization-resolution.js.map +1 -0
- package/dist/generator/namespace.d.ts +74 -0
- package/dist/generator/namespace.d.ts.map +1 -0
- package/dist/generator/namespace.js +109 -0
- package/dist/generator/namespace.js.map +1 -0
- package/dist/generator/output.d.ts +56 -0
- package/dist/generator/output.d.ts.map +1 -0
- package/dist/generator/output.js +171 -0
- package/dist/generator/output.js.map +1 -0
- package/dist/generator/preservation.d.ts +45 -0
- package/dist/generator/preservation.d.ts.map +1 -0
- package/dist/generator/preservation.js +71 -0
- package/dist/generator/preservation.js.map +1 -0
- package/dist/generator/substitution.d.ts +79 -0
- package/dist/generator/substitution.d.ts.map +1 -0
- package/dist/generator/substitution.js +210 -0
- package/dist/generator/substitution.js.map +1 -0
- package/dist/generator/types.d.ts +162 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/validation/cycle-detection.d.ts +25 -0
- package/dist/generator/validation/cycle-detection.d.ts.map +1 -0
- package/dist/generator/validation/cycle-detection.js +101 -0
- package/dist/generator/validation/cycle-detection.js.map +1 -0
- package/dist/generator/validation/enablement.d.ts +24 -0
- package/dist/generator/validation/enablement.d.ts.map +1 -0
- package/dist/generator/validation/enablement.js +69 -0
- package/dist/generator/validation/enablement.js.map +1 -0
- package/dist/generator/validation/graph.d.ts +29 -0
- package/dist/generator/validation/graph.d.ts.map +1 -0
- package/dist/generator/validation/graph.js +106 -0
- package/dist/generator/validation/graph.js.map +1 -0
- package/dist/generator/validation/index.d.ts +38 -0
- package/dist/generator/validation/index.d.ts.map +1 -0
- package/dist/generator/validation/index.js +64 -0
- package/dist/generator/validation/index.js.map +1 -0
- package/dist/generator/validation/reference.d.ts +45 -0
- package/dist/generator/validation/reference.d.ts.map +1 -0
- package/dist/generator/validation/reference.js +143 -0
- package/dist/generator/validation/reference.js.map +1 -0
- package/dist/generator/validation/requirements.d.ts +25 -0
- package/dist/generator/validation/requirements.d.ts.map +1 -0
- package/dist/generator/validation/requirements.js +64 -0
- package/dist/generator/validation/requirements.js.map +1 -0
- package/dist/generator/validation/types.d.ts +116 -0
- package/dist/generator/validation/types.d.ts.map +1 -0
- package/dist/generator/validation/types.js +13 -0
- package/dist/generator/validation/types.js.map +1 -0
- package/dist/k8s/exec.d.ts +20 -0
- package/dist/k8s/exec.d.ts.map +1 -0
- package/dist/k8s/exec.js +47 -0
- package/dist/k8s/exec.js.map +1 -0
- package/dist/k8s/flux.d.ts +57 -0
- package/dist/k8s/flux.d.ts.map +1 -0
- package/dist/k8s/flux.js +202 -0
- package/dist/k8s/flux.js.map +1 -0
- package/dist/k8s/index.d.ts +6 -0
- package/dist/k8s/index.d.ts.map +1 -0
- package/dist/k8s/index.js +6 -0
- package/dist/k8s/index.js.map +1 -0
- package/dist/k8s/kubeconfig.d.ts +45 -0
- package/dist/k8s/kubeconfig.d.ts.map +1 -0
- package/dist/k8s/kubeconfig.js +152 -0
- package/dist/k8s/kubeconfig.js.map +1 -0
- package/dist/k8s/kubectl.d.ts +68 -0
- package/dist/k8s/kubectl.d.ts.map +1 -0
- package/dist/k8s/kubectl.js +187 -0
- package/dist/k8s/kubectl.js.map +1 -0
- package/dist/k8s/types.d.ts +65 -0
- package/dist/k8s/types.d.ts.map +1 -0
- package/dist/k8s/types.js +2 -0
- package/dist/k8s/types.js.map +1 -0
- package/dist/loader/file.d.ts +39 -0
- package/dist/loader/file.d.ts.map +1 -0
- package/dist/loader/file.js +121 -0
- package/dist/loader/file.js.map +1 -0
- package/dist/loader/index.d.ts +5 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +5 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/profile.d.ts +23 -0
- package/dist/loader/profile.d.ts.map +1 -0
- package/dist/loader/profile.js +84 -0
- package/dist/loader/profile.js.map +1 -0
- package/dist/loader/project.d.ts +76 -0
- package/dist/loader/project.d.ts.map +1 -0
- package/dist/loader/project.js +279 -0
- package/dist/loader/project.js.map +1 -0
- package/dist/loader/yaml.d.ts +15 -0
- package/dist/loader/yaml.d.ts.map +1 -0
- package/dist/loader/yaml.js +44 -0
- package/dist/loader/yaml.js.map +1 -0
- package/dist/nodes/index.d.ts +5 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +5 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/kubectl-labeler.d.ts +7 -0
- package/dist/nodes/kubectl-labeler.d.ts.map +1 -0
- package/dist/nodes/kubectl-labeler.js +89 -0
- package/dist/nodes/kubectl-labeler.js.map +1 -0
- package/dist/nodes/labeler.d.ts +74 -0
- package/dist/nodes/labeler.d.ts.map +1 -0
- package/dist/nodes/labeler.js +118 -0
- package/dist/nodes/labeler.js.map +1 -0
- package/dist/nodes/profile.d.ts +58 -0
- package/dist/nodes/profile.d.ts.map +1 -0
- package/dist/nodes/profile.js +128 -0
- package/dist/nodes/profile.js.map +1 -0
- package/dist/nodes/types.d.ts +84 -0
- package/dist/nodes/types.d.ts.map +1 -0
- package/dist/nodes/types.js +77 -0
- package/dist/nodes/types.js.map +1 -0
- package/dist/plugins/generators.d.ts +49 -0
- package/dist/plugins/generators.d.ts.map +1 -0
- package/dist/plugins/generators.js +7 -0
- package/dist/plugins/generators.js.map +1 -0
- package/dist/plugins/hooks.d.ts +120 -0
- package/dist/plugins/hooks.d.ts.map +1 -0
- package/dist/plugins/hooks.js +41 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +15 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +40 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +236 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/object-types.d.ts +71 -0
- package/dist/plugins/object-types.d.ts.map +1 -0
- package/dist/plugins/object-types.js +65 -0
- package/dist/plugins/object-types.js.map +1 -0
- package/dist/plugins/registry.d.ts +87 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +158 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/substitution-providers.d.ts +48 -0
- package/dist/plugins/substitution-providers.d.ts.map +1 -0
- package/dist/plugins/substitution-providers.js +2 -0
- package/dist/plugins/substitution-providers.js.map +1 -0
- package/dist/plugins/types.d.ts +288 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +25 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/registry/auth.d.ts +14 -0
- package/dist/registry/auth.d.ts.map +1 -0
- package/dist/registry/auth.js +40 -0
- package/dist/registry/auth.js.map +1 -0
- package/dist/registry/client.d.ts +24 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +85 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/dockerhub.d.ts +6 -0
- package/dist/registry/dockerhub.d.ts.map +1 -0
- package/dist/registry/dockerhub.js +91 -0
- package/dist/registry/dockerhub.js.map +1 -0
- package/dist/registry/ghcr.d.ts +6 -0
- package/dist/registry/ghcr.d.ts.map +1 -0
- package/dist/registry/ghcr.js +95 -0
- package/dist/registry/ghcr.js.map +1 -0
- package/dist/registry/helm.d.ts +11 -0
- package/dist/registry/helm.d.ts.map +1 -0
- package/dist/registry/helm.js +124 -0
- package/dist/registry/helm.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/types.d.ts +55 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/version.d.ts +22 -0
- package/dist/registry/version.d.ts.map +1 -0
- package/dist/registry/version.js +62 -0
- package/dist/registry/version.js.map +1 -0
- package/dist/schema/cluster.d.ts +2890 -0
- package/dist/schema/cluster.d.ts.map +1 -0
- package/dist/schema/cluster.js +231 -0
- package/dist/schema/cluster.js.map +1 -0
- package/dist/schema/common.d.ts +1059 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +340 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/index.d.ts +8 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/node-list.d.ts +361 -0
- package/dist/schema/node-list.d.ts.map +1 -0
- package/dist/schema/node-list.js +104 -0
- package/dist/schema/node-list.js.map +1 -0
- package/dist/schema/profile.d.ts +166 -0
- package/dist/schema/profile.d.ts.map +1 -0
- package/dist/schema/profile.js +61 -0
- package/dist/schema/profile.js.map +1 -0
- package/dist/schema/project.d.ts +168 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +40 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/sources.d.ts +338 -0
- package/dist/schema/sources.d.ts.map +1 -0
- package/dist/schema/sources.js +111 -0
- package/dist/schema/sources.js.map +1 -0
- package/dist/schema/template.d.ts +2711 -0
- package/dist/schema/template.d.ts.map +1 -0
- package/dist/schema/template.js +97 -0
- package/dist/schema/template.js.map +1 -0
- package/dist/sources/cache/index.d.ts +9 -0
- package/dist/sources/cache/index.d.ts.map +1 -0
- package/dist/sources/cache/index.js +278 -0
- package/dist/sources/cache/index.js.map +1 -0
- package/dist/sources/cache/metadata.d.ts +36 -0
- package/dist/sources/cache/metadata.d.ts.map +1 -0
- package/dist/sources/cache/metadata.js +21 -0
- package/dist/sources/cache/metadata.js.map +1 -0
- package/dist/sources/cache/ttl.d.ts +20 -0
- package/dist/sources/cache/ttl.d.ts.map +1 -0
- package/dist/sources/cache/ttl.js +53 -0
- package/dist/sources/cache/ttl.js.map +1 -0
- package/dist/sources/fetchers/git.d.ts +6 -0
- package/dist/sources/fetchers/git.d.ts.map +1 -0
- package/dist/sources/fetchers/git.js +165 -0
- package/dist/sources/fetchers/git.js.map +1 -0
- package/dist/sources/fetchers/http.d.ts +6 -0
- package/dist/sources/fetchers/http.d.ts.map +1 -0
- package/dist/sources/fetchers/http.js +159 -0
- package/dist/sources/fetchers/http.js.map +1 -0
- package/dist/sources/fetchers/index.d.ts +11 -0
- package/dist/sources/fetchers/index.d.ts.map +1 -0
- package/dist/sources/fetchers/index.js +24 -0
- package/dist/sources/fetchers/index.js.map +1 -0
- package/dist/sources/fetchers/oci.d.ts +6 -0
- package/dist/sources/fetchers/oci.d.ts.map +1 -0
- package/dist/sources/fetchers/oci.js +156 -0
- package/dist/sources/fetchers/oci.js.map +1 -0
- package/dist/sources/fetchers/types.d.ts +25 -0
- package/dist/sources/fetchers/types.d.ts.map +1 -0
- package/dist/sources/fetchers/types.js +2 -0
- package/dist/sources/fetchers/types.js.map +1 -0
- package/dist/sources/index.d.ts +6 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/loader.d.ts +34 -0
- package/dist/sources/loader.d.ts.map +1 -0
- package/dist/sources/loader.js +89 -0
- package/dist/sources/loader.js.map +1 -0
- package/dist/sources/resolver.d.ts +17 -0
- package/dist/sources/resolver.d.ts.map +1 -0
- package/dist/sources/resolver.js +125 -0
- package/dist/sources/resolver.js.map +1 -0
- package/dist/sources/types.d.ts +151 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +2 -0
- package/dist/sources/types.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { failure, success } from '../core/index.js';
|
|
2
|
+
const DOCKERHUB_AUTH_URL = 'https://auth.docker.io/token';
|
|
3
|
+
const DOCKERHUB_REGISTRY_URL = 'https://registry-1.docker.io/v2';
|
|
4
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
5
|
+
/**
|
|
6
|
+
* Creates an abort signal with timeout.
|
|
7
|
+
*/
|
|
8
|
+
function create_abort_signal(timeout_ms) {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
setTimeout(() => controller.abort(), timeout_ms);
|
|
11
|
+
return controller.signal;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Gets an authentication token for Docker Hub.
|
|
15
|
+
*/
|
|
16
|
+
async function get_dockerhub_token(image, config) {
|
|
17
|
+
const scope = `repository:${image.namespace}/${image.repository}:pull`;
|
|
18
|
+
const url = `${DOCKERHUB_AUTH_URL}?service=registry.docker.io&scope=${encodeURIComponent(scope)}`;
|
|
19
|
+
const headers = {};
|
|
20
|
+
if (config?.auth?.username && config.auth.password) {
|
|
21
|
+
const credentials = Buffer.from(`${config.auth.username}:${config.auth.password}`).toString('base64');
|
|
22
|
+
headers['Authorization'] = `Basic ${credentials}`;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const response = await fetch(url, {
|
|
26
|
+
headers,
|
|
27
|
+
signal: create_abort_signal(config?.timeout ?? DEFAULT_TIMEOUT),
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
return failure({
|
|
31
|
+
code: 'REGISTRY_AUTH_ERROR',
|
|
32
|
+
message: `Docker Hub auth failed: ${response.status} ${response.statusText}`,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const data = (await response.json());
|
|
36
|
+
const token = data.token || data.access_token;
|
|
37
|
+
if (!token) {
|
|
38
|
+
return failure({
|
|
39
|
+
code: 'REGISTRY_AUTH_ERROR',
|
|
40
|
+
message: 'No token returned from Docker Hub auth',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return success(token);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return failure({
|
|
47
|
+
code: 'REGISTRY_ERROR',
|
|
48
|
+
message: `Docker Hub auth request failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates a Docker Hub registry client.
|
|
54
|
+
*/
|
|
55
|
+
export function create_dockerhub_client(config) {
|
|
56
|
+
return {
|
|
57
|
+
async list_tags(image) {
|
|
58
|
+
// Get auth token
|
|
59
|
+
const token_result = await get_dockerhub_token(image, config);
|
|
60
|
+
if (!token_result.success) {
|
|
61
|
+
return token_result;
|
|
62
|
+
}
|
|
63
|
+
const url = `${DOCKERHUB_REGISTRY_URL}/${image.namespace}/${image.repository}/tags/list`;
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(url, {
|
|
66
|
+
headers: {
|
|
67
|
+
Authorization: `Bearer ${token_result.value}`,
|
|
68
|
+
Accept: 'application/json',
|
|
69
|
+
},
|
|
70
|
+
signal: create_abort_signal(config?.timeout ?? DEFAULT_TIMEOUT),
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
return failure({
|
|
74
|
+
code: 'REGISTRY_ERROR',
|
|
75
|
+
message: `Failed to fetch tags: ${response.status} ${response.statusText}`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const data = (await response.json());
|
|
79
|
+
const tags = (data.tags || []).map((name) => ({ name }));
|
|
80
|
+
return success(tags);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return failure({
|
|
84
|
+
code: 'REGISTRY_ERROR',
|
|
85
|
+
message: `Failed to fetch tags: ${error instanceof Error ? error.message : String(error)}`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=dockerhub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerhub.js","sourceRoot":"","sources":["../../src/registry/dockerhub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RegistryClientConfigType, RegistryClientType } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a GitHub Container Registry client.
|
|
4
|
+
*/
|
|
5
|
+
export declare function create_ghcr_client(config?: RegistryClientConfigType): RegistryClientType;
|
|
6
|
+
//# sourceMappingURL=ghcr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghcr.d.ts","sourceRoot":"","sources":["../../src/registry/ghcr.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,wBAAwB,EACxB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AA8EpB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,wBAAwB,GAAG,kBAAkB,CA0CxF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { failure, success } from '../core/index.js';
|
|
2
|
+
const GHCR_URL = 'https://ghcr.io/v2';
|
|
3
|
+
const GHCR_AUTH_URL = 'https://ghcr.io/token';
|
|
4
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
5
|
+
/**
|
|
6
|
+
* Creates an abort signal with timeout.
|
|
7
|
+
*/
|
|
8
|
+
function create_abort_signal(timeout_ms) {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
setTimeout(() => controller.abort(), timeout_ms);
|
|
11
|
+
return controller.signal;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Gets an authentication token for GHCR.
|
|
15
|
+
*/
|
|
16
|
+
async function get_ghcr_token(image, config) {
|
|
17
|
+
const scope = `repository:${image.namespace}/${image.repository}:pull`;
|
|
18
|
+
const url = `${GHCR_AUTH_URL}?service=ghcr.io&scope=${encodeURIComponent(scope)}`;
|
|
19
|
+
const headers = {};
|
|
20
|
+
// GHCR supports token-based auth or username/password
|
|
21
|
+
if (config?.auth?.token) {
|
|
22
|
+
// Use bearer token (GitHub PAT)
|
|
23
|
+
headers['Authorization'] = `Bearer ${config.auth.token}`;
|
|
24
|
+
}
|
|
25
|
+
else if (config?.auth?.username && config.auth.password) {
|
|
26
|
+
const credentials = Buffer.from(`${config.auth.username}:${config.auth.password}`).toString('base64');
|
|
27
|
+
headers['Authorization'] = `Basic ${credentials}`;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(url, {
|
|
31
|
+
headers,
|
|
32
|
+
signal: create_abort_signal(config?.timeout ?? DEFAULT_TIMEOUT),
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
return failure({
|
|
36
|
+
code: 'REGISTRY_AUTH_ERROR',
|
|
37
|
+
message: `GHCR auth failed: ${response.status} ${response.statusText}`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const data = (await response.json());
|
|
41
|
+
if (!data.token) {
|
|
42
|
+
return failure({
|
|
43
|
+
code: 'REGISTRY_AUTH_ERROR',
|
|
44
|
+
message: 'No token returned from GHCR auth',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return success(data.token);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return failure({
|
|
51
|
+
code: 'REGISTRY_ERROR',
|
|
52
|
+
message: `GHCR auth request failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Creates a GitHub Container Registry client.
|
|
58
|
+
*/
|
|
59
|
+
export function create_ghcr_client(config) {
|
|
60
|
+
return {
|
|
61
|
+
async list_tags(image) {
|
|
62
|
+
// Get auth token
|
|
63
|
+
const token_result = await get_ghcr_token(image, config);
|
|
64
|
+
if (!token_result.success) {
|
|
65
|
+
return token_result;
|
|
66
|
+
}
|
|
67
|
+
const url = `${GHCR_URL}/${image.namespace}/${image.repository}/tags/list`;
|
|
68
|
+
try {
|
|
69
|
+
const response = await fetch(url, {
|
|
70
|
+
headers: {
|
|
71
|
+
Authorization: `Bearer ${token_result.value}`,
|
|
72
|
+
Accept: 'application/json',
|
|
73
|
+
},
|
|
74
|
+
signal: create_abort_signal(config?.timeout ?? DEFAULT_TIMEOUT),
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
return failure({
|
|
78
|
+
code: 'REGISTRY_ERROR',
|
|
79
|
+
message: `Failed to fetch tags: ${response.status} ${response.statusText}`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const data = (await response.json());
|
|
83
|
+
const tags = (data.tags || []).map((name) => ({ name }));
|
|
84
|
+
return success(tags);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return failure({
|
|
88
|
+
code: 'REGISTRY_ERROR',
|
|
89
|
+
message: `Failed to fetch tags: ${error instanceof Error ? error.message : String(error)}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=ghcr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghcr.js","sourceRoot":"","sources":["../../src/registry/ghcr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RegistryClientConfigType, RegistryClientType } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Helm repository client.
|
|
4
|
+
* Supports both traditional Helm repositories and OCI registries.
|
|
5
|
+
*/
|
|
6
|
+
export declare function create_helm_client(helm_config: {
|
|
7
|
+
repository?: string;
|
|
8
|
+
oci?: string;
|
|
9
|
+
chart: string;
|
|
10
|
+
}, config?: RegistryClientConfigType): RegistryClientType;
|
|
11
|
+
//# sourceMappingURL=helm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.d.ts","sourceRoot":"","sources":["../../src/registry/helm.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,wBAAwB,EACxB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAuHpB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACjE,MAAM,CAAC,EAAE,wBAAwB,GAChC,kBAAkB,CA2CpB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { parse } from 'yaml';
|
|
2
|
+
import { failure, success } from '../core/index.js';
|
|
3
|
+
import { create_ghcr_client } from './ghcr.js';
|
|
4
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
5
|
+
/**
|
|
6
|
+
* Creates an abort signal with timeout.
|
|
7
|
+
*/
|
|
8
|
+
function create_abort_signal(timeout_ms) {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
setTimeout(() => controller.abort(), timeout_ms);
|
|
11
|
+
return controller.signal;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Fetches and parses a Helm repository index.yaml file.
|
|
15
|
+
*/
|
|
16
|
+
async function fetch_helm_index(repository_url, config) {
|
|
17
|
+
// Ensure URL doesn't have trailing slash
|
|
18
|
+
const base_url = repository_url.replace(/\/$/, '');
|
|
19
|
+
const index_url = `${base_url}/index.yaml`;
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetch(index_url, {
|
|
22
|
+
signal: create_abort_signal(config?.timeout ?? DEFAULT_TIMEOUT),
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
return failure({
|
|
26
|
+
code: 'HELM_REPO_ERROR',
|
|
27
|
+
message: `Failed to fetch Helm index: ${response.status} ${response.statusText}`,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const content = await response.text();
|
|
31
|
+
const index = parse(content);
|
|
32
|
+
if (!index.entries) {
|
|
33
|
+
return failure({
|
|
34
|
+
code: 'HELM_REPO_ERROR',
|
|
35
|
+
message: 'Invalid Helm index: missing entries',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return success(index);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return failure({
|
|
42
|
+
code: 'HELM_REPO_ERROR',
|
|
43
|
+
message: `Failed to fetch Helm index: ${error instanceof Error ? error.message : String(error)}`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parses an OCI Helm reference into components.
|
|
49
|
+
* Example: oci://ghcr.io/traefik/helm/traefik -> {registry: ghcr.io, namespace: traefik/helm, repository: traefik}
|
|
50
|
+
*/
|
|
51
|
+
function parse_oci_helm_reference(oci_url, chart_name) {
|
|
52
|
+
// Remove oci:// prefix
|
|
53
|
+
const url_without_prefix = oci_url.replace(/^oci:\/\//, '');
|
|
54
|
+
// Split into parts
|
|
55
|
+
const parts = url_without_prefix.split('/');
|
|
56
|
+
if (parts.length < 2) {
|
|
57
|
+
// Fallback for invalid format
|
|
58
|
+
return {
|
|
59
|
+
registry: parts[0] || 'ghcr.io',
|
|
60
|
+
namespace: 'library',
|
|
61
|
+
repository: chart_name,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// First part is registry
|
|
65
|
+
const registry = parts[0] || 'ghcr.io';
|
|
66
|
+
// Everything except first part and last part (if it matches chart name) is namespace
|
|
67
|
+
const last_part = parts[parts.length - 1];
|
|
68
|
+
let namespace;
|
|
69
|
+
if (last_part === chart_name && parts.length > 2) {
|
|
70
|
+
// If last part is the chart name, use everything in between as namespace
|
|
71
|
+
const intermediate_namespace = parts.slice(1, -1).join('/');
|
|
72
|
+
namespace = intermediate_namespace || 'library';
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Otherwise, use everything after registry as namespace
|
|
76
|
+
const full_namespace = parts.slice(1).join('/');
|
|
77
|
+
namespace = full_namespace || 'library';
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
registry,
|
|
81
|
+
namespace,
|
|
82
|
+
repository: chart_name,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Creates a Helm repository client.
|
|
87
|
+
* Supports both traditional Helm repositories and OCI registries.
|
|
88
|
+
*/
|
|
89
|
+
export function create_helm_client(helm_config, config) {
|
|
90
|
+
// OCI registry
|
|
91
|
+
if (helm_config.oci) {
|
|
92
|
+
const image_ref = parse_oci_helm_reference(helm_config.oci, helm_config.chart);
|
|
93
|
+
// Use GHCR client for OCI registries (they all use the same OCI Distribution spec)
|
|
94
|
+
const oci_client = create_ghcr_client(config);
|
|
95
|
+
return {
|
|
96
|
+
list_tags: () => oci_client.list_tags(image_ref),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Traditional Helm repository
|
|
100
|
+
return {
|
|
101
|
+
async list_tags(_image) {
|
|
102
|
+
if (!helm_config.repository) {
|
|
103
|
+
return failure({
|
|
104
|
+
code: 'HELM_REPO_ERROR',
|
|
105
|
+
message: 'No repository URL provided for Helm chart',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const index_result = await fetch_helm_index(helm_config.repository, config);
|
|
109
|
+
if (!index_result.success) {
|
|
110
|
+
return index_result;
|
|
111
|
+
}
|
|
112
|
+
const chart_entries = index_result.value.entries[helm_config.chart];
|
|
113
|
+
if (!chart_entries || chart_entries.length === 0) {
|
|
114
|
+
return failure({
|
|
115
|
+
code: 'HELM_CHART_NOT_FOUND',
|
|
116
|
+
message: `Chart "${helm_config.chart}" not found in Helm repository`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const tags = chart_entries.map((entry) => entry.digest ? { name: entry.version, digest: entry.digest } : { name: entry.version });
|
|
120
|
+
return success(tags);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=helm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.js","sourceRoot":"","sources":["../../src/registry/helm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { get_auth_for_registry, get_dockerhub_auth, get_ghcr_auth } from './auth.js';
|
|
2
|
+
export { create_client_for_image, create_registry_client, detect_registry_type, parse_image_reference, } from './client.js';
|
|
3
|
+
export { create_dockerhub_client } from './dockerhub.js';
|
|
4
|
+
export { create_ghcr_client } from './ghcr.js';
|
|
5
|
+
export { create_helm_client } from './helm.js';
|
|
6
|
+
export type { ImageReferenceType, RegistryAuthType, RegistryClientConfigType, RegistryClientType, TagInfoType, VersionCheckResultType, } from './types.js';
|
|
7
|
+
export { check_version_update, DEFAULT_SEMVER_PATTERN, filter_semver_tags, find_latest_matching, } from './version.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGrF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Types
|
|
2
|
+
// Auth utilities
|
|
3
|
+
export { get_auth_for_registry, get_dockerhub_auth, get_ghcr_auth } from './auth.js';
|
|
4
|
+
// Client utilities
|
|
5
|
+
export { create_client_for_image, create_registry_client, detect_registry_type, parse_image_reference, } from './client.js';
|
|
6
|
+
// Registry implementations
|
|
7
|
+
export { create_dockerhub_client } from './dockerhub.js';
|
|
8
|
+
export { create_ghcr_client } from './ghcr.js';
|
|
9
|
+
export { create_helm_client } from './helm.js';
|
|
10
|
+
// Version utilities
|
|
11
|
+
export { check_version_update, DEFAULT_SEMVER_PATTERN, filter_semver_tags, find_latest_matching, } from './version.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AAER,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAErF,mBAAmB;AACnB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,2BAA2B;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAU/C,oBAAoB;AACpB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { KustodianErrorType, ResultType } from '../core/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Authentication configuration for registries.
|
|
4
|
+
*/
|
|
5
|
+
export interface RegistryAuthType {
|
|
6
|
+
username?: string;
|
|
7
|
+
password?: string;
|
|
8
|
+
token?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Registry client configuration.
|
|
12
|
+
*/
|
|
13
|
+
export interface RegistryClientConfigType {
|
|
14
|
+
auth?: RegistryAuthType | undefined;
|
|
15
|
+
timeout?: number | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parsed image reference components.
|
|
19
|
+
*/
|
|
20
|
+
export interface ImageReferenceType {
|
|
21
|
+
/** Registry hostname (e.g., docker.io, ghcr.io) */
|
|
22
|
+
registry: string;
|
|
23
|
+
/** Namespace/organization (e.g., library, prom) */
|
|
24
|
+
namespace: string;
|
|
25
|
+
/** Repository name (e.g., nginx, prometheus) */
|
|
26
|
+
repository: string;
|
|
27
|
+
/** Optional tag */
|
|
28
|
+
tag?: string | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Tag information from registry.
|
|
32
|
+
*/
|
|
33
|
+
export interface TagInfoType {
|
|
34
|
+
name: string;
|
|
35
|
+
digest?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Version check result.
|
|
39
|
+
*/
|
|
40
|
+
export interface VersionCheckResultType {
|
|
41
|
+
current_version: string;
|
|
42
|
+
latest_version: string;
|
|
43
|
+
available_versions: string[];
|
|
44
|
+
has_update: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Registry client interface.
|
|
48
|
+
*/
|
|
49
|
+
export interface RegistryClientType {
|
|
50
|
+
/**
|
|
51
|
+
* Lists all tags for an image.
|
|
52
|
+
*/
|
|
53
|
+
list_tags(image: ImageReferenceType): Promise<ResultType<TagInfoType[], KustodianErrorType>>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;CAC9F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TagInfoType, VersionCheckResultType } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default pattern for semver-like tags.
|
|
4
|
+
* Matches: 1.0.0, v1.0.0, 1.0.0-alpha, v1.0.0-rc.1
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_SEMVER_PATTERN: RegExp;
|
|
7
|
+
/**
|
|
8
|
+
* Filters tags to only semver-valid versions.
|
|
9
|
+
*/
|
|
10
|
+
export declare function filter_semver_tags(tags: TagInfoType[], options?: {
|
|
11
|
+
pattern?: RegExp;
|
|
12
|
+
exclude_prerelease?: boolean;
|
|
13
|
+
}): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Finds the latest version satisfying a constraint.
|
|
16
|
+
*/
|
|
17
|
+
export declare function find_latest_matching(versions: string[], constraint?: string): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Checks if a newer version is available.
|
|
20
|
+
*/
|
|
21
|
+
export declare function check_version_update(current: string, available: string[], constraint?: string): VersionCheckResultType;
|
|
22
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/registry/version.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAkC,CAAC;AAEtE;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EAAE,EACnB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACzB,GACL,MAAM,EAAE,CA8BV;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQhG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,sBAAsB,CAgBxB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as semver from 'semver';
|
|
2
|
+
/**
|
|
3
|
+
* Default pattern for semver-like tags.
|
|
4
|
+
* Matches: 1.0.0, v1.0.0, 1.0.0-alpha, v1.0.0-rc.1
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_SEMVER_PATTERN = /^v?(\d+\.\d+\.\d+)(-[\w.]+)?$/;
|
|
7
|
+
/**
|
|
8
|
+
* Filters tags to only semver-valid versions.
|
|
9
|
+
*/
|
|
10
|
+
export function filter_semver_tags(tags, options = {}) {
|
|
11
|
+
const pattern = options.pattern ?? DEFAULT_SEMVER_PATTERN;
|
|
12
|
+
const exclude_prerelease = options.exclude_prerelease ?? true;
|
|
13
|
+
const versions = [];
|
|
14
|
+
for (const tag of tags) {
|
|
15
|
+
if (!pattern.test(tag.name)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const cleaned = semver.clean(tag.name);
|
|
19
|
+
if (!cleaned) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const parsed = semver.parse(cleaned);
|
|
23
|
+
if (!parsed) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (exclude_prerelease && parsed.prerelease.length > 0) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
versions.push(cleaned);
|
|
30
|
+
}
|
|
31
|
+
// Sort descending (newest first)
|
|
32
|
+
return versions.sort(semver.rcompare);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Finds the latest version satisfying a constraint.
|
|
36
|
+
*/
|
|
37
|
+
export function find_latest_matching(versions, constraint) {
|
|
38
|
+
if (!constraint) {
|
|
39
|
+
// Return the latest (first in sorted array)
|
|
40
|
+
return versions[0];
|
|
41
|
+
}
|
|
42
|
+
const result = semver.maxSatisfying(versions, constraint);
|
|
43
|
+
return result ?? undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Checks if a newer version is available.
|
|
47
|
+
*/
|
|
48
|
+
export function check_version_update(current, available, constraint) {
|
|
49
|
+
const cleaned_current = semver.clean(current) ?? current;
|
|
50
|
+
const latest = find_latest_matching(available, constraint);
|
|
51
|
+
const has_update = latest !== undefined &&
|
|
52
|
+
semver.valid(latest) !== null &&
|
|
53
|
+
semver.valid(cleaned_current) !== null &&
|
|
54
|
+
semver.gt(latest, cleaned_current);
|
|
55
|
+
return {
|
|
56
|
+
current_version: cleaned_current,
|
|
57
|
+
latest_version: latest ?? cleaned_current,
|
|
58
|
+
available_versions: available,
|
|
59
|
+
has_update,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/registry/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,+BAA+B,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAmB,EACnB,UAGI,EAAE;IAEN,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,sBAAsB,CAAC;IAC1D,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAE9D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,kBAAkB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,SAAS;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,iCAAiC;IACjC,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,UAAmB;IAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,4CAA4C;QAC5C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC1D,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,SAAmB,EACnB,UAAmB;IAEnB,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACzD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE3D,MAAM,UAAU,GACd,MAAM,KAAK,SAAS;QACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI;QAC7B,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,IAAI;QACtC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAErC,OAAO;QACL,eAAe,EAAE,eAAe;QAChC,cAAc,EAAE,MAAM,IAAI,eAAe;QACzC,kBAAkB,EAAE,SAAS;QAC7B,UAAU;KACX,CAAC;AACJ,CAAC"}
|