gitlab-catalog-browser 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/catalog.d.ts +55 -9
- package/dist/api/catalog.d.ts.map +1 -1
- package/dist/api/catalog.js +306 -32
- package/dist/api/catalog.js.map +1 -1
- package/dist/api/graphql.d.ts +52 -0
- package/dist/api/graphql.d.ts.map +1 -0
- package/dist/api/graphql.js +134 -0
- package/dist/api/graphql.js.map +1 -0
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +8 -2
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/component.d.ts.map +1 -1
- package/dist/commands/component.js +8 -2
- package/dist/commands/component.js.map +1 -1
- package/dist/output/table.d.ts +1 -0
- package/dist/output/table.d.ts.map +1 -1
- package/dist/output/table.js +16 -3
- package/dist/output/table.js.map +1 -1
- package/package.json +1 -1
package/dist/api/catalog.d.ts
CHANGED
|
@@ -1,38 +1,84 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Catalog API methods for GitLab CI/CD Catalog.
|
|
3
3
|
*
|
|
4
|
-
* Provides typed methods for listing, searching, and fetching component details
|
|
4
|
+
* Provides typed methods for listing, searching, and fetching component details
|
|
5
|
+
* using GitLab's GraphQL API. Does NOT require authentication for public resources.
|
|
6
|
+
*
|
|
7
|
+
* Pagination uses GitLab's cursor-based pagination internally, but exposes
|
|
8
|
+
* a page/perPage interface. When no pagination params are given, ALL matching
|
|
9
|
+
* resources are fetched (multi-page) and returned.
|
|
5
10
|
*/
|
|
6
|
-
import {
|
|
11
|
+
import { GraphQLApiClient } from './graphql.js';
|
|
7
12
|
import type { PaginationParams } from '../types/api.js';
|
|
8
13
|
import type { CatalogComponent, CatalogComponentDetail } from '../types/catalog.js';
|
|
9
14
|
export declare class CatalogApi {
|
|
10
15
|
private readonly client;
|
|
11
|
-
constructor(client:
|
|
16
|
+
constructor(client: GraphQLApiClient);
|
|
12
17
|
/**
|
|
13
18
|
* List all catalog components for a given namespace/org.
|
|
14
|
-
*
|
|
19
|
+
*
|
|
20
|
+
* Uses group(fullPath:) { projects { nodes } } to fetch ONLY the projects
|
|
21
|
+
* under the given namespace, then filters by isCatalogResource.
|
|
22
|
+
* Much faster than fetching the global catalog and filtering by prefix.
|
|
15
23
|
*
|
|
16
24
|
* @param namespace - GitLab namespace (e.g. "to-be-continuous")
|
|
17
|
-
* @param pagination - Optional page/perPage parameters
|
|
25
|
+
* @param pagination - Optional page/perPage parameters (omit for all results)
|
|
18
26
|
*/
|
|
19
27
|
listComponents(namespace: string, pagination?: PaginationParams): Promise<CatalogComponent[]>;
|
|
20
28
|
/**
|
|
21
29
|
* Search catalog components by keyword across namespaces.
|
|
22
30
|
*
|
|
31
|
+
* Fetches ALL matching pages from GraphQL (cursor-based with search),
|
|
32
|
+
* then applies offset-based pagination if requested.
|
|
33
|
+
*
|
|
23
34
|
* @param query - Search keyword
|
|
24
|
-
* @param pagination - Optional page/perPage parameters
|
|
35
|
+
* @param pagination - Optional page/perPage parameters (omit for all results)
|
|
25
36
|
*/
|
|
26
37
|
searchComponents(query: string, pagination?: PaginationParams): Promise<CatalogComponent[]>;
|
|
27
38
|
/**
|
|
28
39
|
* Get detailed info for a specific component.
|
|
29
40
|
*
|
|
30
|
-
*
|
|
41
|
+
* Uses GraphQL ciCatalogResource with versions and components.
|
|
42
|
+
*
|
|
43
|
+
* @param fullPath - Full component path, e.g. "to-be-continuous/docker"
|
|
31
44
|
*/
|
|
32
45
|
getComponentInfo(fullPath: string): Promise<CatalogComponentDetail>;
|
|
33
46
|
/**
|
|
34
|
-
*
|
|
47
|
+
* Fetch ALL pages of ciCatalogResources using cursor-based pagination.
|
|
48
|
+
* Keeps requesting the next page while hasNextPage is true.
|
|
49
|
+
*
|
|
50
|
+
* @param search - Optional search term passed to GraphQL
|
|
51
|
+
* @returns Flat array of all resource nodes from all pages
|
|
52
|
+
*/
|
|
53
|
+
private fetchAllResources;
|
|
54
|
+
/**
|
|
55
|
+
* Fetch all catalog resources under a specific group/namespace.
|
|
56
|
+
*
|
|
57
|
+
* Uses group(fullPath:) { projects { nodes } } which returns ONLY the
|
|
58
|
+
* projects within that namespace — far more efficient than fetching the
|
|
59
|
+
* entire global catalog and filtering client-side.
|
|
60
|
+
*
|
|
61
|
+
* Filters projects by isCatalogResource === true.
|
|
62
|
+
*
|
|
63
|
+
* @param namespace - GitLab group/namespace path (e.g. "to-be-continuous")
|
|
64
|
+
* @returns Flat array of all catalog resource nodes in the group
|
|
65
|
+
*/
|
|
66
|
+
private fetchGroupResources;
|
|
67
|
+
/**
|
|
68
|
+
* Apply offset-based pagination to a complete result set.
|
|
69
|
+
* When no pagination params are given, returns all items.
|
|
70
|
+
*/
|
|
71
|
+
private applyOffsetPagination;
|
|
72
|
+
private mapToCatalogComponent;
|
|
73
|
+
private mapToCatalogComponentDetail;
|
|
74
|
+
/**
|
|
75
|
+
* Map GraphQL input type string to our normalized type.
|
|
76
|
+
*/
|
|
77
|
+
private mapInputType;
|
|
78
|
+
/**
|
|
79
|
+
* Extract numeric ID from global GraphQL ID.
|
|
80
|
+
* e.g. "gid://gitlab/Ci::Catalog::Resource/1001971" → 1001971
|
|
35
81
|
*/
|
|
36
|
-
private
|
|
82
|
+
private extractNumericId;
|
|
37
83
|
}
|
|
38
84
|
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EAIvB,MAAM,qBAAqB,CAAC;AAwM7B,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IAErD;;;;;;;;;OASG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAK9B;;;;;;;;OAQG;IACG,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAM9B;;;;;;OAMG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkBzE;;;;;;OAMG;YACW,iBAAiB;IAsC/B;;;;;;;;;;;OAWG;YACW,mBAAmB;IAqDjC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,2BAA2B;IAmDnC;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAKzB"}
|
package/dist/api/catalog.js
CHANGED
|
@@ -1,8 +1,115 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Catalog API methods for GitLab CI/CD Catalog.
|
|
3
3
|
*
|
|
4
|
-
* Provides typed methods for listing, searching, and fetching component details
|
|
4
|
+
* Provides typed methods for listing, searching, and fetching component details
|
|
5
|
+
* using GitLab's GraphQL API. Does NOT require authentication for public resources.
|
|
6
|
+
*
|
|
7
|
+
* Pagination uses GitLab's cursor-based pagination internally, but exposes
|
|
8
|
+
* a page/perPage interface. When no pagination params are given, ALL matching
|
|
9
|
+
* resources are fetched (multi-page) and returned.
|
|
5
10
|
*/
|
|
11
|
+
import { NotFoundError } from '../types/api.js';
|
|
12
|
+
// ──────────────────────────────────────────────
|
|
13
|
+
// Constants
|
|
14
|
+
// ──────────────────────────────────────────────
|
|
15
|
+
/** Max items per GraphQL page — prevents overly large payloads. */
|
|
16
|
+
const GRAPHQL_PAGE_SIZE = 100;
|
|
17
|
+
/** Max pages to fetch (5 pages × 100 = 500 resources). Covers the largest orgs
|
|
18
|
+
* without unbounded requests that could timeout. */
|
|
19
|
+
const MAX_PAGES = 5;
|
|
20
|
+
/** Default items per logical page when user does not specify --per-page. */
|
|
21
|
+
const DEFAULT_PER_PAGE = 50;
|
|
22
|
+
// ──────────────────────────────────────────────
|
|
23
|
+
// GraphQL Queries
|
|
24
|
+
// ──────────────────────────────────────────────
|
|
25
|
+
const RESOURCES_PAGE_QUERY = `
|
|
26
|
+
query catalogResourcesPage($first: Int, $after: String, $search: String) {
|
|
27
|
+
ciCatalogResources(first: $first, after: $after, search: $search) {
|
|
28
|
+
nodes {
|
|
29
|
+
id
|
|
30
|
+
name
|
|
31
|
+
fullPath
|
|
32
|
+
description
|
|
33
|
+
webPath
|
|
34
|
+
latestReleasedAt
|
|
35
|
+
versions(first: 1) {
|
|
36
|
+
nodes {
|
|
37
|
+
name
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
pageInfo {
|
|
42
|
+
hasNextPage
|
|
43
|
+
endCursor
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
const GROUP_RESOURCES_QUERY = `
|
|
49
|
+
query groupCatalogResources($groupPath: ID!, $first: Int, $after: String) {
|
|
50
|
+
group(fullPath: $groupPath) {
|
|
51
|
+
name
|
|
52
|
+
fullPath
|
|
53
|
+
projects(first: $first, after: $after) {
|
|
54
|
+
pageInfo {
|
|
55
|
+
hasNextPage
|
|
56
|
+
endCursor
|
|
57
|
+
}
|
|
58
|
+
nodes {
|
|
59
|
+
id
|
|
60
|
+
name
|
|
61
|
+
path
|
|
62
|
+
description
|
|
63
|
+
starCount
|
|
64
|
+
isCatalogResource
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
70
|
+
const RESOURCE_DETAIL_QUERY = `
|
|
71
|
+
query catalogResource($fullPath: ID!) {
|
|
72
|
+
ciCatalogResource(fullPath: $fullPath) {
|
|
73
|
+
id
|
|
74
|
+
name
|
|
75
|
+
fullPath
|
|
76
|
+
description
|
|
77
|
+
webPath
|
|
78
|
+
starCount
|
|
79
|
+
topics
|
|
80
|
+
verificationLevel
|
|
81
|
+
latestReleasedAt
|
|
82
|
+
versions(first: 1) {
|
|
83
|
+
nodes {
|
|
84
|
+
name
|
|
85
|
+
path
|
|
86
|
+
semver {
|
|
87
|
+
major
|
|
88
|
+
minor
|
|
89
|
+
patch
|
|
90
|
+
}
|
|
91
|
+
components {
|
|
92
|
+
nodes {
|
|
93
|
+
id
|
|
94
|
+
name
|
|
95
|
+
includePath
|
|
96
|
+
description
|
|
97
|
+
inputs {
|
|
98
|
+
name
|
|
99
|
+
type
|
|
100
|
+
required
|
|
101
|
+
default
|
|
102
|
+
description
|
|
103
|
+
options
|
|
104
|
+
regex
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
`;
|
|
6
113
|
// ──────────────────────────────────────────────
|
|
7
114
|
// CatalogApi
|
|
8
115
|
// ──────────────────────────────────────────────
|
|
@@ -13,60 +120,227 @@ export class CatalogApi {
|
|
|
13
120
|
}
|
|
14
121
|
/**
|
|
15
122
|
* List all catalog components for a given namespace/org.
|
|
16
|
-
*
|
|
123
|
+
*
|
|
124
|
+
* Uses group(fullPath:) { projects { nodes } } to fetch ONLY the projects
|
|
125
|
+
* under the given namespace, then filters by isCatalogResource.
|
|
126
|
+
* Much faster than fetching the global catalog and filtering by prefix.
|
|
17
127
|
*
|
|
18
128
|
* @param namespace - GitLab namespace (e.g. "to-be-continuous")
|
|
19
|
-
* @param pagination - Optional page/perPage parameters
|
|
129
|
+
* @param pagination - Optional page/perPage parameters (omit for all results)
|
|
20
130
|
*/
|
|
21
131
|
async listComponents(namespace, pagination) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const groupId = await this.resolveNamespace(namespace);
|
|
25
|
-
return this.client.get(`/projects/${groupId}/ci/catalog/components`, {
|
|
26
|
-
params: {
|
|
27
|
-
page: pagination?.page ?? 1,
|
|
28
|
-
per_page: pagination?.perPage ?? 20,
|
|
29
|
-
},
|
|
30
|
-
});
|
|
132
|
+
const allNodes = await this.fetchGroupResources(namespace);
|
|
133
|
+
return this.applyOffsetPagination(allNodes, pagination);
|
|
31
134
|
}
|
|
32
135
|
/**
|
|
33
136
|
* Search catalog components by keyword across namespaces.
|
|
34
137
|
*
|
|
138
|
+
* Fetches ALL matching pages from GraphQL (cursor-based with search),
|
|
139
|
+
* then applies offset-based pagination if requested.
|
|
140
|
+
*
|
|
35
141
|
* @param query - Search keyword
|
|
36
|
-
* @param pagination - Optional page/perPage parameters
|
|
142
|
+
* @param pagination - Optional page/perPage parameters (omit for all results)
|
|
37
143
|
*/
|
|
38
144
|
async searchComponents(query, pagination) {
|
|
39
|
-
|
|
40
|
-
return this.
|
|
41
|
-
params: {
|
|
42
|
-
search: query,
|
|
43
|
-
page: pagination?.page ?? 1,
|
|
44
|
-
per_page: pagination?.perPage ?? 20,
|
|
45
|
-
},
|
|
46
|
-
});
|
|
145
|
+
const allNodes = await this.fetchAllResources(query);
|
|
146
|
+
return this.applyOffsetPagination(allNodes, pagination);
|
|
47
147
|
}
|
|
48
148
|
/**
|
|
49
149
|
* Get detailed info for a specific component.
|
|
50
150
|
*
|
|
51
|
-
*
|
|
151
|
+
* Uses GraphQL ciCatalogResource with versions and components.
|
|
152
|
+
*
|
|
153
|
+
* @param fullPath - Full component path, e.g. "to-be-continuous/docker"
|
|
52
154
|
*/
|
|
53
155
|
async getComponentInfo(fullPath) {
|
|
54
|
-
|
|
156
|
+
const data = await this.client.query(RESOURCE_DETAIL_QUERY, { fullPath });
|
|
157
|
+
const resource = data.ciCatalogResource;
|
|
158
|
+
if (!resource) {
|
|
159
|
+
throw new NotFoundError(fullPath);
|
|
160
|
+
}
|
|
161
|
+
return this.mapToCatalogComponentDetail(resource);
|
|
55
162
|
}
|
|
56
163
|
// ────────────────────────────────────────────
|
|
57
|
-
//
|
|
164
|
+
// Pagination helpers
|
|
58
165
|
// ────────────────────────────────────────────
|
|
59
166
|
/**
|
|
60
|
-
*
|
|
167
|
+
* Fetch ALL pages of ciCatalogResources using cursor-based pagination.
|
|
168
|
+
* Keeps requesting the next page while hasNextPage is true.
|
|
169
|
+
*
|
|
170
|
+
* @param search - Optional search term passed to GraphQL
|
|
171
|
+
* @returns Flat array of all resource nodes from all pages
|
|
61
172
|
*/
|
|
62
|
-
async
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
173
|
+
async fetchAllResources(search) {
|
|
174
|
+
const allNodes = [];
|
|
175
|
+
let after = null;
|
|
176
|
+
let hasMore = true;
|
|
177
|
+
let pageCount = 0;
|
|
178
|
+
while (hasMore && pageCount < MAX_PAGES) {
|
|
179
|
+
pageCount++;
|
|
180
|
+
const vars = {
|
|
181
|
+
first: GRAPHQL_PAGE_SIZE,
|
|
182
|
+
};
|
|
183
|
+
if (after) {
|
|
184
|
+
vars.after = after;
|
|
185
|
+
}
|
|
186
|
+
if (search) {
|
|
187
|
+
vars.search = search;
|
|
188
|
+
}
|
|
189
|
+
const data = await this.client.query(RESOURCES_PAGE_QUERY, vars);
|
|
190
|
+
const page = data.ciCatalogResources;
|
|
191
|
+
if (!page)
|
|
192
|
+
break;
|
|
193
|
+
allNodes.push(...(page.nodes ?? []));
|
|
194
|
+
hasMore = page.pageInfo?.hasNextPage ?? false;
|
|
195
|
+
after = page.pageInfo?.endCursor ?? null;
|
|
68
196
|
}
|
|
69
|
-
return
|
|
197
|
+
return allNodes;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Fetch all catalog resources under a specific group/namespace.
|
|
201
|
+
*
|
|
202
|
+
* Uses group(fullPath:) { projects { nodes } } which returns ONLY the
|
|
203
|
+
* projects within that namespace — far more efficient than fetching the
|
|
204
|
+
* entire global catalog and filtering client-side.
|
|
205
|
+
*
|
|
206
|
+
* Filters projects by isCatalogResource === true.
|
|
207
|
+
*
|
|
208
|
+
* @param namespace - GitLab group/namespace path (e.g. "to-be-continuous")
|
|
209
|
+
* @returns Flat array of all catalog resource nodes in the group
|
|
210
|
+
*/
|
|
211
|
+
async fetchGroupResources(namespace) {
|
|
212
|
+
const allNodes = [];
|
|
213
|
+
let after = null;
|
|
214
|
+
let hasMore = true;
|
|
215
|
+
let pageCount = 0;
|
|
216
|
+
while (hasMore && pageCount < MAX_PAGES) {
|
|
217
|
+
pageCount++;
|
|
218
|
+
const vars = {
|
|
219
|
+
groupPath: namespace,
|
|
220
|
+
first: GRAPHQL_PAGE_SIZE,
|
|
221
|
+
};
|
|
222
|
+
if (after) {
|
|
223
|
+
vars.after = after;
|
|
224
|
+
}
|
|
225
|
+
const data = await this.client.query(GROUP_RESOURCES_QUERY, vars);
|
|
226
|
+
// Group not found or inaccessible
|
|
227
|
+
if (!data.group)
|
|
228
|
+
break;
|
|
229
|
+
const projects = data.group.projects;
|
|
230
|
+
if (!projects)
|
|
231
|
+
break;
|
|
232
|
+
for (const project of projects.nodes ?? []) {
|
|
233
|
+
if (project.isCatalogResource) {
|
|
234
|
+
// Build fullPath from group path + project path
|
|
235
|
+
const fullPath = `${data.group.fullPath}/${project.path}`;
|
|
236
|
+
allNodes.push({
|
|
237
|
+
id: project.id,
|
|
238
|
+
name: project.name,
|
|
239
|
+
fullPath,
|
|
240
|
+
description: project.description,
|
|
241
|
+
webPath: `/${fullPath}`,
|
|
242
|
+
latestReleasedAt: null,
|
|
243
|
+
versions: undefined,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
hasMore = projects.pageInfo?.hasNextPage ?? false;
|
|
248
|
+
after = projects.pageInfo?.endCursor ?? null;
|
|
249
|
+
}
|
|
250
|
+
return allNodes;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Apply offset-based pagination to a complete result set.
|
|
254
|
+
* When no pagination params are given, returns all items.
|
|
255
|
+
*/
|
|
256
|
+
applyOffsetPagination(nodes, pagination) {
|
|
257
|
+
if (!pagination || pagination.page === undefined) {
|
|
258
|
+
// No pagination requested — return ALL results
|
|
259
|
+
return nodes.map((n) => this.mapToCatalogComponent(n));
|
|
260
|
+
}
|
|
261
|
+
const perPage = pagination.perPage ?? DEFAULT_PER_PAGE;
|
|
262
|
+
const page = pagination.page;
|
|
263
|
+
const offset = (page - 1) * perPage;
|
|
264
|
+
const paged = nodes.slice(offset, offset + perPage);
|
|
265
|
+
return paged.map((n) => this.mapToCatalogComponent(n));
|
|
266
|
+
}
|
|
267
|
+
// ────────────────────────────────────────────
|
|
268
|
+
// Mapping helpers
|
|
269
|
+
// ────────────────────────────────────────────
|
|
270
|
+
mapToCatalogComponent(node) {
|
|
271
|
+
const latestVersion = node.versions?.nodes?.[0]?.name ?? '';
|
|
272
|
+
return {
|
|
273
|
+
id: this.extractNumericId(node.id),
|
|
274
|
+
name: node.name,
|
|
275
|
+
full_path: node.fullPath,
|
|
276
|
+
version: latestVersion,
|
|
277
|
+
description: node.description ?? '',
|
|
278
|
+
updated_at: node.latestReleasedAt ?? undefined,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
mapToCatalogComponentDetail(node) {
|
|
282
|
+
const summary = this.mapToCatalogComponent(node);
|
|
283
|
+
const latestVersion = node.versions?.nodes?.[0];
|
|
284
|
+
const components = latestVersion?.components?.nodes ?? [];
|
|
285
|
+
// Collect all inputs from all components
|
|
286
|
+
const inputs = [];
|
|
287
|
+
const jobs = [];
|
|
288
|
+
const workflows = [];
|
|
289
|
+
for (const comp of components) {
|
|
290
|
+
// Map inputs
|
|
291
|
+
for (const input of comp.inputs ?? []) {
|
|
292
|
+
inputs.push({
|
|
293
|
+
name: input.name,
|
|
294
|
+
type: this.mapInputType(input.type),
|
|
295
|
+
required: input.required,
|
|
296
|
+
default: input.default,
|
|
297
|
+
description: input.description ?? undefined,
|
|
298
|
+
regex: input.regex ?? undefined,
|
|
299
|
+
options: input.options ?? undefined,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
// Each component maps to a "job" (simplified)
|
|
303
|
+
jobs.push({
|
|
304
|
+
name: comp.name,
|
|
305
|
+
stage: 'deploy', // GraphQL doesn't expose stage directly
|
|
306
|
+
script: [], // Not available via GraphQL
|
|
307
|
+
});
|
|
308
|
+
// Each component forms a simple workflow
|
|
309
|
+
workflows.push({
|
|
310
|
+
name: comp.name,
|
|
311
|
+
triggers: [],
|
|
312
|
+
jobs: [comp.name],
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
...summary,
|
|
317
|
+
inputs: inputs.length > 0 ? inputs : undefined,
|
|
318
|
+
jobs: jobs.length > 0 ? jobs : undefined,
|
|
319
|
+
workflows: workflows.length > 0 ? workflows : undefined,
|
|
320
|
+
spec: undefined, // Full YAML spec not available via GraphQL
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Map GraphQL input type string to our normalized type.
|
|
325
|
+
*/
|
|
326
|
+
mapInputType(type) {
|
|
327
|
+
switch (type) {
|
|
328
|
+
case 'BOOLEAN':
|
|
329
|
+
return 'boolean';
|
|
330
|
+
case 'NUMBER':
|
|
331
|
+
return 'number';
|
|
332
|
+
default:
|
|
333
|
+
return 'string';
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Extract numeric ID from global GraphQL ID.
|
|
338
|
+
* e.g. "gid://gitlab/Ci::Catalog::Resource/1001971" → 1001971
|
|
339
|
+
*/
|
|
340
|
+
extractNumericId(gid) {
|
|
341
|
+
const parts = gid.split('/');
|
|
342
|
+
const last = parts[parts.length - 1];
|
|
343
|
+
return parseInt(last, 10) || 0;
|
|
70
344
|
}
|
|
71
345
|
}
|
|
72
346
|
//# sourceMappingURL=catalog.js.map
|
package/dist/api/catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL API client for GitLab.
|
|
3
|
+
*
|
|
4
|
+
* Provides unauthenticated (or optionally authenticated) access to GitLab's
|
|
5
|
+
* GraphQL API. Used primarily for CI/CD Catalog queries which do not require
|
|
6
|
+
* a token for public resources.
|
|
7
|
+
*
|
|
8
|
+
* Token is optional — when provided, it's sent as a Bearer token for queries
|
|
9
|
+
* that need authentication (e.g., private resources, mutations).
|
|
10
|
+
*/
|
|
11
|
+
import type { GitLabCIConfig } from '../config/types.js';
|
|
12
|
+
export interface GraphQLResponse<T> {
|
|
13
|
+
data?: T;
|
|
14
|
+
errors?: Array<{
|
|
15
|
+
message: string;
|
|
16
|
+
locations?: Array<{
|
|
17
|
+
line: number;
|
|
18
|
+
column: number;
|
|
19
|
+
}>;
|
|
20
|
+
path?: (string | number)[];
|
|
21
|
+
extensions?: Record<string, unknown>;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface GraphQLQueryOptions {
|
|
25
|
+
/** Optional auth token */
|
|
26
|
+
token?: string;
|
|
27
|
+
/** Request timeout in ms */
|
|
28
|
+
timeout?: number;
|
|
29
|
+
/** AbortSignal for cancellation */
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
export declare class GraphQLApiClient {
|
|
33
|
+
private readonly baseUrl;
|
|
34
|
+
private readonly token;
|
|
35
|
+
private readonly defaultTimeout;
|
|
36
|
+
constructor(config?: Partial<GitLabCIConfig> & {
|
|
37
|
+
debug?: boolean;
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Execute a GraphQL query against the GitLab API.
|
|
41
|
+
*
|
|
42
|
+
* @param query - The GraphQL query string
|
|
43
|
+
* @param variables - Optional query variables
|
|
44
|
+
* @param options - Optional overrides (token, timeout, signal)
|
|
45
|
+
* @returns The `data` field from the GraphQL response
|
|
46
|
+
* @throws NetworkError on connectivity issues
|
|
47
|
+
* @throws NotFoundError if resource not found
|
|
48
|
+
*/
|
|
49
|
+
query<T>(queryStr: string, variables?: Record<string, unknown>, options?: GraphQLQueryOptions): Promise<T>;
|
|
50
|
+
private throwHttpError;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=graphql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/api/graphql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMzD,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,MAAM,GAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;IAMtE;;;;;;;;;OASG;IACG,KAAK,CAAC,CAAC,EACX,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,CAAC,CAAC;IA+Fb,OAAO,CAAC,cAAc;CAiBvB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL API client for GitLab.
|
|
3
|
+
*
|
|
4
|
+
* Provides unauthenticated (or optionally authenticated) access to GitLab's
|
|
5
|
+
* GraphQL API. Used primarily for CI/CD Catalog queries which do not require
|
|
6
|
+
* a token for public resources.
|
|
7
|
+
*
|
|
8
|
+
* Token is optional — when provided, it's sent as a Bearer token for queries
|
|
9
|
+
* that need authentication (e.g., private resources, mutations).
|
|
10
|
+
*/
|
|
11
|
+
import { NetworkError, NotFoundError, ServerError, AuthenticationError, PermissionError, RateLimitError, } from '../types/api.js';
|
|
12
|
+
// ──────────────────────────────────────────────
|
|
13
|
+
// GraphQLApiClient
|
|
14
|
+
// ──────────────────────────────────────────────
|
|
15
|
+
export class GraphQLApiClient {
|
|
16
|
+
baseUrl;
|
|
17
|
+
token;
|
|
18
|
+
defaultTimeout;
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.baseUrl = (config.gitlabUrl ?? 'https://gitlab.com').replace(/\/+$/, '');
|
|
21
|
+
this.token = config.token;
|
|
22
|
+
this.defaultTimeout = config.timeout ?? 30000;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Execute a GraphQL query against the GitLab API.
|
|
26
|
+
*
|
|
27
|
+
* @param query - The GraphQL query string
|
|
28
|
+
* @param variables - Optional query variables
|
|
29
|
+
* @param options - Optional overrides (token, timeout, signal)
|
|
30
|
+
* @returns The `data` field from the GraphQL response
|
|
31
|
+
* @throws NetworkError on connectivity issues
|
|
32
|
+
* @throws NotFoundError if resource not found
|
|
33
|
+
*/
|
|
34
|
+
async query(queryStr, variables, options = {}) {
|
|
35
|
+
const url = `${this.baseUrl}/api/graphql`;
|
|
36
|
+
const token = options.token ?? this.token;
|
|
37
|
+
const timeout = options.timeout ?? this.defaultTimeout;
|
|
38
|
+
const headers = {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
Accept: 'application/json',
|
|
41
|
+
};
|
|
42
|
+
if (token) {
|
|
43
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
44
|
+
}
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
47
|
+
const signal = options.signal
|
|
48
|
+
? composeAbortSignals(options.signal, controller.signal)
|
|
49
|
+
: controller.signal;
|
|
50
|
+
try {
|
|
51
|
+
const response = await fetch(url, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers,
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
query: queryStr,
|
|
56
|
+
variables: variables ?? undefined,
|
|
57
|
+
}),
|
|
58
|
+
signal,
|
|
59
|
+
});
|
|
60
|
+
clearTimeout(timeoutId);
|
|
61
|
+
// Handle HTTP-level errors
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
this.throwHttpError(response.status, response.statusText, url);
|
|
64
|
+
}
|
|
65
|
+
const json = (await response.json());
|
|
66
|
+
// Handle GraphQL-level errors
|
|
67
|
+
if (json.errors && json.errors.length > 0) {
|
|
68
|
+
const isNotFound = json.errors.some((e) => e.message.includes('does not exist') ||
|
|
69
|
+
e.message.includes("don't have permission"));
|
|
70
|
+
if (isNotFound) {
|
|
71
|
+
throw new NotFoundError(url);
|
|
72
|
+
}
|
|
73
|
+
// For other GraphQL errors, log but return partial data if available
|
|
74
|
+
// This matches GitLab's behavior of returning both errors and partial data
|
|
75
|
+
if (json.data === undefined) {
|
|
76
|
+
throw new Error(`GraphQL error: ${json.errors.map((e) => e.message).join('; ')}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (json.data === undefined) {
|
|
80
|
+
throw new Error('GraphQL response contained no data');
|
|
81
|
+
}
|
|
82
|
+
return json.data;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
clearTimeout(timeoutId);
|
|
86
|
+
if (err instanceof NotFoundError ||
|
|
87
|
+
err instanceof AuthenticationError ||
|
|
88
|
+
err instanceof PermissionError ||
|
|
89
|
+
err instanceof NetworkError ||
|
|
90
|
+
err instanceof ServerError ||
|
|
91
|
+
err instanceof RateLimitError) {
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
if (err instanceof DOMException && err.name === 'AbortError') {
|
|
95
|
+
throw new NetworkError(this.baseUrl, `GraphQL request timed out after ${timeout}ms`);
|
|
96
|
+
}
|
|
97
|
+
throw new NetworkError(this.baseUrl, err instanceof Error ? err.message : String(err));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throwHttpError(status, statusText, url) {
|
|
101
|
+
switch (status) {
|
|
102
|
+
case 401:
|
|
103
|
+
throw new AuthenticationError();
|
|
104
|
+
case 403:
|
|
105
|
+
throw new PermissionError(`Forbidden: ${statusText}`);
|
|
106
|
+
case 404:
|
|
107
|
+
throw new NotFoundError(url);
|
|
108
|
+
case 429:
|
|
109
|
+
throw new RateLimitError(`Rate limited: ${statusText}`);
|
|
110
|
+
default:
|
|
111
|
+
if (status >= 500) {
|
|
112
|
+
throw new ServerError(status, statusText);
|
|
113
|
+
}
|
|
114
|
+
throw new Error(`GitLab API error (${status}): ${statusText}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ──────────────────────────────────────────────
|
|
119
|
+
// Helpers
|
|
120
|
+
// ──────────────────────────────────────────────
|
|
121
|
+
function composeAbortSignals(s1, s2) {
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
const onAbort = () => controller.abort();
|
|
124
|
+
s1.addEventListener('abort', onAbort);
|
|
125
|
+
s2.addEventListener('abort', onAbort);
|
|
126
|
+
if (!s1.aborted && !s2.aborted) {
|
|
127
|
+
controller.signal.addEventListener('abort', () => {
|
|
128
|
+
s1.removeEventListener('abort', onAbort);
|
|
129
|
+
s2.removeEventListener('abort', onAbort);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return controller.signal;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/api/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOzD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOzD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAqBD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoD/C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoD/C;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC/C"}
|
package/dist/commands/catalog.js
CHANGED
|
@@ -5,14 +5,20 @@
|
|
|
5
5
|
* Uses the CatalogApi client for GitLab API interactions.
|
|
6
6
|
*/
|
|
7
7
|
import { CatalogApi } from '../api/catalog.js';
|
|
8
|
-
import {
|
|
8
|
+
import { GraphQLApiClient } from '../api/graphql.js';
|
|
9
9
|
import { renderTable, renderDetail } from '../output/table.js';
|
|
10
10
|
import { NotFoundError } from '../types/api.js';
|
|
11
11
|
// ──────────────────────────────────────────────
|
|
12
12
|
// Helpers
|
|
13
13
|
// ──────────────────────────────────────────────
|
|
14
14
|
function createCatalogApi(config) {
|
|
15
|
-
|
|
15
|
+
// Do NOT pass config.token — Catalog API is public via GraphQL.
|
|
16
|
+
// An expired/invalid token would cause 401 errors even for public resources.
|
|
17
|
+
// Keep gitlabUrl and timeout for self-managed GitLab instances.
|
|
18
|
+
const client = new GraphQLApiClient({
|
|
19
|
+
gitlabUrl: config.gitlabUrl,
|
|
20
|
+
timeout: config.timeout,
|
|
21
|
+
});
|
|
16
22
|
return new CatalogApi(client);
|
|
17
23
|
}
|
|
18
24
|
// ──────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAsBhD,iDAAiD;AACjD,UAAU;AACV,iDAAiD;AAEjD,SAAS,gBAAgB,CAAC,MAA+B;IACvD,gEAAgE;IAChE,6EAA6E;IAC7E,gEAAgE;IAChE,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,iDAAiD;AACjD,WAAW;AACX,iDAAiD;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,MAA+B,EAC/B,UAA8B,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE;YACrD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,OAAO,CAAC,IAAI;oBAClB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,qCAAqC,SAAS,GAAG,EAAE,CAAC;oBACzG,CAAC,CAAC,qCAAqC,SAAS,GAAG;aACtD,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aACrE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAe,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,IAAI,EAAE,CAAC,CAAC,SAAS;SAClB,CAAC,CAAC,CAAC;QAEJ,MAAM,KAAK,GAAG,WAAW,CACvB;YACE,EAAE,MAAM,EAAE,MAAM,EAAE;YAClB,EAAE,MAAM,EAAE,SAAS,EAAE;YACrB,EAAE,MAAM,EAAE,aAAa,EAAE;YACzB,EAAE,MAAM,EAAE,MAAM,EAAE;SACnB,EACD,IAAI,CACL,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;aAC/D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,MAA+B,EAC/B,UAAgC,EAAE;IAElC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE;YACnD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,OAAO,CAAC,IAAI;oBAClB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,2BAA2B,KAAK,GAAG,EAAE,CAAC;oBAC3F,CAAC,CAAC,2BAA2B,KAAK,GAAG;aACxC,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aACrE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAe,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,IAAI,EAAE,CAAC,CAAC,SAAS;SAClB,CAAC,CAAC,CAAC;QAEJ,MAAM,KAAK,GAAG,WAAW,CACvB;YACE,EAAE,MAAM,EAAE,MAAM,EAAE;YAClB,EAAE,MAAM,EAAE,SAAS,EAAE;YACrB,EAAE,MAAM,EAAE,aAAa,EAAE;YACzB,EAAE,MAAM,EAAE,MAAM,EAAE;SACnB,EACD,IAAI,CACL,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;aAC/D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,MAA+B,EAC/B,UAA8B,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aACpE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE;YACxC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE;YAC7C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE;YAC9C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE;YAC5D,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE;YACjE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE;YAC7D,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE;SACxE,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjE,0CAA0C;QAC1C,MAAM,WAAW,GAAG,GAAG,YAAY,aAAa;YAC9C,CAAC,CAAC,cAAc,QAAQ,aAAa;YACrC,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC;QAExB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;aAC5E,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/commands/component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/commands/component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAqBD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoD/C;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4D/C;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAC9B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC/C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD/C"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { writeFileSync } from 'node:fs';
|
|
8
8
|
import { CatalogApi } from '../api/catalog.js';
|
|
9
|
-
import {
|
|
9
|
+
import { GraphQLApiClient } from '../api/graphql.js';
|
|
10
10
|
import { renderTable } from '../output/table.js';
|
|
11
11
|
import { NotFoundError } from '../types/api.js';
|
|
12
12
|
import { SchemaCache, buildComponentCacheKey } from '../cache/schema-cache.js';
|
|
@@ -14,7 +14,13 @@ import { SchemaCache, buildComponentCacheKey } from '../cache/schema-cache.js';
|
|
|
14
14
|
// Helpers
|
|
15
15
|
// ──────────────────────────────────────────────
|
|
16
16
|
function createCatalogApi(config) {
|
|
17
|
-
|
|
17
|
+
// Do NOT pass config.token — Catalog API is public via GraphQL.
|
|
18
|
+
// An expired/invalid token would cause 401 errors even for public resources.
|
|
19
|
+
// Keep gitlabUrl and timeout for self-managed GitLab instances.
|
|
20
|
+
const client = new GraphQLApiClient({
|
|
21
|
+
gitlabUrl: config.gitlabUrl,
|
|
22
|
+
timeout: config.timeout,
|
|
23
|
+
});
|
|
18
24
|
return new CatalogApi(client);
|
|
19
25
|
}
|
|
20
26
|
// ──────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/commands/component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/commands/component.ts"],"names":[],"mappings":"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"}
|
package/dist/output/table.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/output/table.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/output/table.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;AAoBpF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CA6C5E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAMnF"}
|
package/dist/output/table.js
CHANGED
|
@@ -2,8 +2,21 @@
|
|
|
2
2
|
* Simple table formatter for CLI output.
|
|
3
3
|
*
|
|
4
4
|
* Renders aligned, human-readable tables without external dependencies.
|
|
5
|
+
* Sanitizes cell values (strips newlines) to prevent layout breaks.
|
|
5
6
|
*/
|
|
6
7
|
// ──────────────────────────────────────────────
|
|
8
|
+
// Cell value sanitization
|
|
9
|
+
// ──────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Sanitize a cell value for table display.
|
|
12
|
+
*
|
|
13
|
+
* - Replaces newlines/CR with spaces (they break table layout)
|
|
14
|
+
* - Collapses consecutive whitespace into a single space
|
|
15
|
+
*/
|
|
16
|
+
function sanitize(val) {
|
|
17
|
+
return val.replace(/[\r\n]+/g, ' ').replace(/ {2,}/g, ' ');
|
|
18
|
+
}
|
|
19
|
+
// ──────────────────────────────────────────────
|
|
7
20
|
// Render
|
|
8
21
|
// ──────────────────────────────────────────────
|
|
9
22
|
/**
|
|
@@ -17,11 +30,11 @@ export function renderTable(columns, rows) {
|
|
|
17
30
|
if (columns.length === 0)
|
|
18
31
|
return '';
|
|
19
32
|
const headers = columns.map((c) => c.header);
|
|
20
|
-
// Calculate column widths
|
|
33
|
+
// Calculate column widths using sanitized string lengths
|
|
21
34
|
const colWidths = columns.map((col) => {
|
|
22
35
|
const headerLen = col.header.length;
|
|
23
36
|
const maxDataLen = rows.reduce((max, row) => {
|
|
24
|
-
const val = String(row[col.header] ?? '');
|
|
37
|
+
const val = sanitize(String(row[col.header] ?? ''));
|
|
25
38
|
return Math.max(max, val.length);
|
|
26
39
|
}, 0);
|
|
27
40
|
return Math.max(headerLen, maxDataLen);
|
|
@@ -43,7 +56,7 @@ export function renderTable(columns, rows) {
|
|
|
43
56
|
for (const row of rows) {
|
|
44
57
|
const dataLine = columns
|
|
45
58
|
.map((col, i) => {
|
|
46
|
-
const val = String(row[col.header] ?? '');
|
|
59
|
+
const val = sanitize(String(row[col.header] ?? ''));
|
|
47
60
|
const width = colWidths[i];
|
|
48
61
|
const align = col.align ?? 'left';
|
|
49
62
|
return align === 'right' ? val.padStart(width) : val.padEnd(width);
|
package/dist/output/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/output/table.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/output/table.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED