@sonisoft/now-sdk-ext-core 2.4.0 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +96 -27
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +10 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/sn/aggregate/AggregateModels.d.ts +89 -0
  6. package/dist/sn/aggregate/AggregateModels.js +5 -0
  7. package/dist/sn/aggregate/AggregateModels.js.map +1 -0
  8. package/dist/sn/aggregate/AggregateQuery.d.ts +50 -0
  9. package/dist/sn/aggregate/AggregateQuery.js +144 -0
  10. package/dist/sn/aggregate/AggregateQuery.js.map +1 -0
  11. package/dist/sn/batch/QueryBatchModels.d.ts +93 -0
  12. package/dist/sn/batch/QueryBatchModels.js +5 -0
  13. package/dist/sn/batch/QueryBatchModels.js.map +1 -0
  14. package/dist/sn/batch/QueryBatchOperations.d.ts +41 -0
  15. package/dist/sn/batch/QueryBatchOperations.js +195 -0
  16. package/dist/sn/batch/QueryBatchOperations.js.map +1 -0
  17. package/dist/sn/cmdb/CMDBModels.d.ts +141 -0
  18. package/dist/sn/cmdb/CMDBModels.js +5 -0
  19. package/dist/sn/cmdb/CMDBModels.js.map +1 -0
  20. package/dist/sn/cmdb/CMDBRelationships.d.ts +60 -0
  21. package/dist/sn/cmdb/CMDBRelationships.js +286 -0
  22. package/dist/sn/cmdb/CMDBRelationships.js.map +1 -0
  23. package/dist/sn/discovery/DiscoveryModels.d.ts +160 -0
  24. package/dist/sn/discovery/DiscoveryModels.js +5 -0
  25. package/dist/sn/discovery/DiscoveryModels.js.map +1 -0
  26. package/dist/sn/discovery/InstanceDiscovery.d.ts +45 -0
  27. package/dist/sn/discovery/InstanceDiscovery.js +163 -0
  28. package/dist/sn/discovery/InstanceDiscovery.js.map +1 -0
  29. package/dist/sn/health/HealthModels.d.ts +124 -0
  30. package/dist/sn/health/HealthModels.js +5 -0
  31. package/dist/sn/health/HealthModels.js.map +1 -0
  32. package/dist/sn/health/InstanceHealth.d.ts +58 -0
  33. package/dist/sn/health/InstanceHealth.js +221 -0
  34. package/dist/sn/health/InstanceHealth.js.map +1 -0
  35. package/dist/sn/scope/ScopeManager.d.ts +7 -7
  36. package/dist/sn/scope/ScopeManager.js +19 -14
  37. package/dist/sn/scope/ScopeManager.js.map +1 -1
  38. package/dist/sn/scope/ScopeModels.d.ts +9 -3
  39. package/dist/sn/updateset/UpdateSetManager.d.ts +3 -3
  40. package/dist/sn/updateset/UpdateSetManager.js +12 -7
  41. package/dist/sn/updateset/UpdateSetManager.js.map +1 -1
  42. package/dist/sn/updateset/UpdateSetModels.d.ts +11 -0
  43. package/package.json +2 -2
@@ -0,0 +1,286 @@
1
+ import { Logger } from "../../util/Logger.js";
2
+ import { TableAPIRequest } from "../../comm/http/TableAPIRequest.js";
3
+ /**
4
+ * CMDBRelationships provides methods for querying and traversing
5
+ * CMDB relationship graphs. Supports single-level lookups and
6
+ * multi-level BFS traversal with configurable depth and direction.
7
+ */
8
+ export class CMDBRelationships {
9
+ static CMDB_CI_TABLE = 'cmdb_ci';
10
+ static CMDB_REL_CI_TABLE = 'cmdb_rel_ci';
11
+ static MAX_DEPTH = 5;
12
+ static MAX_NODES = 1000;
13
+ _logger = new Logger("CMDBRelationships");
14
+ _tableAPI;
15
+ _instance;
16
+ /** Cache for CI records to minimize API calls during traversal */
17
+ _ciCache = new Map();
18
+ constructor(instance) {
19
+ this._instance = instance;
20
+ this._tableAPI = new TableAPIRequest(instance);
21
+ }
22
+ /**
23
+ * Get direct relationships of a CI (single level).
24
+ *
25
+ * @param options Relationship query options
26
+ * @returns RelationshipsResult with the CI and its direct relationships
27
+ * @throws Error if ciSysId is empty
28
+ */
29
+ async getRelationships(options) {
30
+ if (!options.ciSysId || options.ciSysId.trim().length === 0) {
31
+ throw new Error('CI sys_id is required');
32
+ }
33
+ const direction = options.direction ?? 'both';
34
+ const limit = options.limit ?? 100;
35
+ this._logger.info(`Getting relationships for CI ${options.ciSysId} (direction=${direction})`);
36
+ // Look up the CI
37
+ const ci = await this._lookupCI(options.ciSysId);
38
+ if (!ci) {
39
+ throw new Error(`CI with sys_id '${options.ciSysId}' not found`);
40
+ }
41
+ // Query relationships
42
+ const relationships = [];
43
+ if (direction === 'downstream' || direction === 'both') {
44
+ const downstreamRels = await this._queryRelationships(options.ciSysId, 'parent', limit, options.relationType);
45
+ for (const rel of downstreamRels) {
46
+ const childId = this._extractSysId(rel.child);
47
+ const relatedCI = await this._lookupCI(childId);
48
+ if (relatedCI) {
49
+ relationships.push({
50
+ relatedCI,
51
+ direction: 'downstream',
52
+ typeName: this._extractDisplayValue(rel.type),
53
+ relationshipSysId: rel.sys_id
54
+ });
55
+ }
56
+ }
57
+ }
58
+ if (direction === 'upstream' || direction === 'both') {
59
+ const upstreamRels = await this._queryRelationships(options.ciSysId, 'child', limit, options.relationType);
60
+ for (const rel of upstreamRels) {
61
+ const parentId = this._extractSysId(rel.parent);
62
+ const relatedCI = await this._lookupCI(parentId);
63
+ if (relatedCI) {
64
+ relationships.push({
65
+ relatedCI,
66
+ direction: 'upstream',
67
+ typeName: this._extractDisplayValue(rel.type),
68
+ relationshipSysId: rel.sys_id
69
+ });
70
+ }
71
+ }
72
+ }
73
+ this._logger.info(`Found ${relationships.length} relationships for CI ${options.ciSysId}`);
74
+ return { ci, relationships };
75
+ }
76
+ /**
77
+ * Traverse the CMDB relationship graph using BFS starting from a CI.
78
+ *
79
+ * @param options Traversal options
80
+ * @returns GraphTraversalResult with all nodes, edges, and metadata
81
+ * @throws Error if ciSysId is empty
82
+ */
83
+ async traverseGraph(options) {
84
+ if (!options.ciSysId || options.ciSysId.trim().length === 0) {
85
+ throw new Error('CI sys_id is required');
86
+ }
87
+ const direction = options.direction ?? 'downstream';
88
+ const maxDepth = Math.min(options.maxDepth ?? 3, CMDBRelationships.MAX_DEPTH);
89
+ const maxNodes = Math.min(options.maxNodes ?? 200, CMDBRelationships.MAX_NODES);
90
+ this._logger.info(`Traversing graph from CI ${options.ciSysId} (direction=${direction}, maxDepth=${maxDepth}, maxNodes=${maxNodes})`);
91
+ // Clear cache for fresh traversal
92
+ this._ciCache.clear();
93
+ // Look up root CI
94
+ const rootCI = await this._lookupCI(options.ciSysId);
95
+ if (!rootCI) {
96
+ throw new Error(`CI with sys_id '${options.ciSysId}' not found`);
97
+ }
98
+ const nodes = [];
99
+ const edges = [];
100
+ const visited = new Set();
101
+ const queue = [];
102
+ let apiCallCount = 0;
103
+ let truncated = false;
104
+ let truncationReason;
105
+ // Initialize BFS
106
+ visited.add(options.ciSysId);
107
+ nodes.push({
108
+ sysId: rootCI.sys_id,
109
+ name: rootCI.name || '',
110
+ className: rootCI.sys_class_name || '',
111
+ depth: 0
112
+ });
113
+ queue.push({ sysId: options.ciSysId, depth: 0 });
114
+ let depthLimited = false;
115
+ // BFS loop
116
+ while (queue.length > 0) {
117
+ const { sysId, depth } = queue.shift();
118
+ if (depth >= maxDepth) {
119
+ depthLimited = true;
120
+ continue;
121
+ }
122
+ if (nodes.length >= maxNodes) {
123
+ truncated = true;
124
+ truncationReason = `Maximum node limit reached (${maxNodes})`;
125
+ break;
126
+ }
127
+ // Query relationships based on direction
128
+ const rels = [];
129
+ if (direction === 'downstream' || direction === 'both') {
130
+ const downRels = await this._queryRelationships(sysId, 'parent', 100, options.relationType);
131
+ rels.push(...downRels);
132
+ apiCallCount++;
133
+ }
134
+ if (direction === 'upstream' || direction === 'both') {
135
+ const upRels = await this._queryRelationships(sysId, 'child', 100, options.relationType);
136
+ rels.push(...upRels);
137
+ apiCallCount++;
138
+ }
139
+ // Process relationships
140
+ const newSysIds = [];
141
+ for (const rel of rels) {
142
+ const parentId = this._extractSysId(rel.parent);
143
+ const childId = this._extractSysId(rel.child);
144
+ const typeName = this._extractDisplayValue(rel.type);
145
+ // Determine the "other" CI based on current node
146
+ const relatedId = parentId === sysId ? childId : parentId;
147
+ edges.push({
148
+ parentSysId: parentId,
149
+ childSysId: childId,
150
+ typeName,
151
+ relationshipSysId: rel.sys_id
152
+ });
153
+ if (!visited.has(relatedId)) {
154
+ visited.add(relatedId);
155
+ newSysIds.push(relatedId);
156
+ }
157
+ }
158
+ // Batch-fetch CI details for new nodes
159
+ if (newSysIds.length > 0) {
160
+ const ciRecords = await this._batchLookupCIs(newSysIds);
161
+ apiCallCount++;
162
+ for (const ciRecord of ciRecords) {
163
+ if (nodes.length >= maxNodes) {
164
+ truncated = true;
165
+ truncationReason = `Maximum node limit reached (${maxNodes})`;
166
+ break;
167
+ }
168
+ nodes.push({
169
+ sysId: ciRecord.sys_id,
170
+ name: ciRecord.name || '',
171
+ className: ciRecord.sys_class_name || '',
172
+ depth: depth + 1
173
+ });
174
+ queue.push({ sysId: ciRecord.sys_id, depth: depth + 1 });
175
+ }
176
+ }
177
+ }
178
+ if (depthLimited && !truncated) {
179
+ truncated = true;
180
+ truncationReason = `Maximum depth reached (${maxDepth})`;
181
+ }
182
+ this._logger.info(`Traversal complete: ${nodes.length} nodes, ${edges.length} edges, ${apiCallCount} API calls`);
183
+ return {
184
+ rootCI,
185
+ nodes,
186
+ edges,
187
+ apiCallCount,
188
+ truncated,
189
+ truncationReason
190
+ };
191
+ }
192
+ /**
193
+ * Look up a single CI by sys_id. Uses cache when available.
194
+ * @private
195
+ */
196
+ async _lookupCI(sysId) {
197
+ if (this._ciCache.has(sysId)) {
198
+ return this._ciCache.get(sysId);
199
+ }
200
+ const query = {
201
+ sysparm_query: `sys_id=${sysId}`,
202
+ sysparm_limit: 1
203
+ };
204
+ const response = await this._tableAPI.get(CMDBRelationships.CMDB_CI_TABLE, query);
205
+ if (response && response.status === 200 && response.bodyObject?.result && response.bodyObject.result.length > 0) {
206
+ const ci = response.bodyObject.result[0];
207
+ this._ciCache.set(sysId, ci);
208
+ return ci;
209
+ }
210
+ return null;
211
+ }
212
+ /**
213
+ * Batch look up multiple CIs by sys_id.
214
+ * @private
215
+ */
216
+ async _batchLookupCIs(sysIds) {
217
+ // Filter out already cached IDs
218
+ const uncachedIds = sysIds.filter(id => !this._ciCache.has(id));
219
+ const results = [];
220
+ // Return cached items
221
+ for (const id of sysIds) {
222
+ if (this._ciCache.has(id)) {
223
+ results.push(this._ciCache.get(id));
224
+ }
225
+ }
226
+ if (uncachedIds.length === 0) {
227
+ return results;
228
+ }
229
+ // Batch-fetch in chunks of 50
230
+ for (let i = 0; i < uncachedIds.length; i += 50) {
231
+ const chunk = uncachedIds.slice(i, i + 50);
232
+ const query = {
233
+ sysparm_query: `sys_idIN${chunk.join(',')}`,
234
+ sysparm_limit: chunk.length
235
+ };
236
+ const response = await this._tableAPI.get(CMDBRelationships.CMDB_CI_TABLE, query);
237
+ if (response && response.status === 200 && response.bodyObject?.result) {
238
+ for (const ci of response.bodyObject.result) {
239
+ this._ciCache.set(ci.sys_id, ci);
240
+ results.push(ci);
241
+ }
242
+ }
243
+ }
244
+ return results;
245
+ }
246
+ /**
247
+ * Query relationships from cmdb_rel_ci.
248
+ * @private
249
+ */
250
+ async _queryRelationships(sysId, role, limit, relationType) {
251
+ let queryStr = `${role}=${sysId}`;
252
+ if (relationType) {
253
+ queryStr += `^type.name=${relationType}`;
254
+ }
255
+ const query = {
256
+ sysparm_query: queryStr,
257
+ sysparm_limit: limit
258
+ };
259
+ const response = await this._tableAPI.get(CMDBRelationships.CMDB_REL_CI_TABLE, query);
260
+ if (response && response.status === 200 && response.bodyObject?.result) {
261
+ return response.bodyObject.result;
262
+ }
263
+ return [];
264
+ }
265
+ /**
266
+ * Extract sys_id from a field that may be a string or reference object.
267
+ * @private
268
+ */
269
+ _extractSysId(field) {
270
+ if (typeof field === 'object' && field !== null) {
271
+ return field.value;
272
+ }
273
+ return field;
274
+ }
275
+ /**
276
+ * Extract display value or value from a field.
277
+ * @private
278
+ */
279
+ _extractDisplayValue(field) {
280
+ if (typeof field === 'object' && field !== null) {
281
+ return field.display_value || field.value || '';
282
+ }
283
+ return field || '';
284
+ }
285
+ }
286
+ //# sourceMappingURL=CMDBRelationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CMDBRelationships.js","sourceRoot":"","sources":["../../../src/sn/cmdb/CMDBRelationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Options for listing tables on the instance.
3
+ */
4
+ export interface ListTablesOptions {
5
+ /** Encoded query to filter tables */
6
+ query?: string;
7
+ /** Filter by name prefix (e.g., "cmdb_" to get all CMDB tables) */
8
+ namePrefix?: string;
9
+ /** Filter by scope (application scope sys_id or name) */
10
+ scope?: string;
11
+ /** Only return extendable tables. Defaults to false. */
12
+ extendableOnly?: boolean;
13
+ /** Maximum number of results. Defaults to 100. */
14
+ limit?: number;
15
+ /** Offset for pagination. Defaults to 0. */
16
+ offset?: number;
17
+ /** Fields to return (maps to sysparm_fields). Defaults to common fields. */
18
+ fields?: string[];
19
+ }
20
+ /**
21
+ * Options for listing scoped applications.
22
+ */
23
+ export interface ListScopedAppsOptions {
24
+ /** Encoded query to filter applications */
25
+ query?: string;
26
+ /** Filter by scope name prefix */
27
+ namePrefix?: string;
28
+ /** Only return active applications. Defaults to false. */
29
+ activeOnly?: boolean;
30
+ /** Maximum number of results. Defaults to 100. */
31
+ limit?: number;
32
+ /** Offset for pagination. Defaults to 0. */
33
+ offset?: number;
34
+ }
35
+ /**
36
+ * Options for listing store applications.
37
+ */
38
+ export interface ListStoreAppsOptions {
39
+ /** Encoded query to filter store applications */
40
+ query?: string;
41
+ /** Filter by name prefix */
42
+ namePrefix?: string;
43
+ /** Only return active (installed) applications. Defaults to false. */
44
+ activeOnly?: boolean;
45
+ /** Maximum number of results. Defaults to 100. */
46
+ limit?: number;
47
+ /** Offset for pagination. Defaults to 0. */
48
+ offset?: number;
49
+ }
50
+ /**
51
+ * Options for listing plugins.
52
+ */
53
+ export interface ListPluginsOptions {
54
+ /** Encoded query to filter plugins */
55
+ query?: string;
56
+ /** Filter by name prefix */
57
+ namePrefix?: string;
58
+ /** Only return active plugins. Defaults to false. */
59
+ activeOnly?: boolean;
60
+ /** Maximum number of results. Defaults to 100. */
61
+ limit?: number;
62
+ /** Offset for pagination. Defaults to 0. */
63
+ offset?: number;
64
+ }
65
+ /**
66
+ * A table definition record from sys_db_object.
67
+ */
68
+ export interface TableDefinition {
69
+ /** System ID */
70
+ sys_id: string;
71
+ /** Table name */
72
+ name: string;
73
+ /** Display label */
74
+ label?: string;
75
+ /** Parent table reference */
76
+ super_class?: string | {
77
+ link: string;
78
+ value: string;
79
+ display_value?: string;
80
+ };
81
+ /** Application scope */
82
+ sys_scope?: string | {
83
+ link: string;
84
+ value: string;
85
+ display_value?: string;
86
+ };
87
+ /** Whether the table is extendable */
88
+ is_extendable?: string;
89
+ /** Additional fields */
90
+ [key: string]: unknown;
91
+ }
92
+ /**
93
+ * A scoped application record from sys_app.
94
+ */
95
+ export interface ScopedAppRecord {
96
+ /** System ID */
97
+ sys_id: string;
98
+ /** Application name */
99
+ name: string;
100
+ /** Application scope */
101
+ scope?: string;
102
+ /** Version */
103
+ version?: string;
104
+ /** Whether active */
105
+ active?: string;
106
+ /** Vendor */
107
+ vendor?: string;
108
+ /** Additional fields */
109
+ [key: string]: unknown;
110
+ }
111
+ /**
112
+ * A store application record from sys_store_app.
113
+ */
114
+ export interface StoreAppRecord {
115
+ /** System ID */
116
+ sys_id: string;
117
+ /** Application name */
118
+ name: string;
119
+ /** Application scope */
120
+ scope?: string;
121
+ /** Version */
122
+ version?: string;
123
+ /** Whether active */
124
+ active?: string;
125
+ /** Additional fields */
126
+ [key: string]: unknown;
127
+ }
128
+ /**
129
+ * A plugin record from v_plugin.
130
+ */
131
+ export interface PluginRecord {
132
+ /** System ID */
133
+ sys_id: string;
134
+ /** Plugin ID */
135
+ id?: string;
136
+ /** Plugin display name */
137
+ name?: string;
138
+ /** Whether active */
139
+ active?: string;
140
+ /** Version */
141
+ version?: string;
142
+ /** Additional fields */
143
+ [key: string]: unknown;
144
+ }
145
+ /** Response from sys_db_object query. */
146
+ export interface TableDefinitionResponse {
147
+ result: TableDefinition[];
148
+ }
149
+ /** Response from sys_app query. */
150
+ export interface ScopedAppResponse {
151
+ result: ScopedAppRecord[];
152
+ }
153
+ /** Response from sys_store_app query. */
154
+ export interface StoreAppResponse {
155
+ result: StoreAppRecord[];
156
+ }
157
+ /** Response from v_plugin query. */
158
+ export interface PluginResponse {
159
+ result: PluginRecord[];
160
+ }
@@ -0,0 +1,5 @@
1
+ // ============================================================
2
+ // Options Types
3
+ // ============================================================
4
+ export {};
5
+ //# sourceMappingURL=DiscoveryModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoveryModels.js","sourceRoot":"","sources":["../../../src/sn/discovery/DiscoveryModels.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D"}
@@ -0,0 +1,45 @@
1
+ import { ServiceNowInstance } from "../ServiceNowInstance.js";
2
+ import { ListTablesOptions, ListScopedAppsOptions, ListStoreAppsOptions, ListPluginsOptions, TableDefinition, ScopedAppRecord, StoreAppRecord, PluginRecord } from './DiscoveryModels.js';
3
+ /**
4
+ * InstanceDiscovery provides methods for discovering what tables,
5
+ * scoped applications, store applications, and plugins exist on a
6
+ * ServiceNow instance.
7
+ */
8
+ export declare class InstanceDiscovery {
9
+ private static readonly SYS_DB_OBJECT_TABLE;
10
+ private static readonly SYS_APP_TABLE;
11
+ private static readonly SYS_STORE_APP_TABLE;
12
+ private static readonly V_PLUGIN_TABLE;
13
+ private _logger;
14
+ private _tableAPI;
15
+ private _instance;
16
+ constructor(instance: ServiceNowInstance);
17
+ /**
18
+ * List tables on the instance with optional filtering.
19
+ *
20
+ * @param options Filtering and pagination options
21
+ * @returns Array of table definitions
22
+ */
23
+ listTables(options?: ListTablesOptions): Promise<TableDefinition[]>;
24
+ /**
25
+ * List scoped applications on the instance.
26
+ *
27
+ * @param options Filtering and pagination options
28
+ * @returns Array of scoped application records
29
+ */
30
+ listScopedApps(options?: ListScopedAppsOptions): Promise<ScopedAppRecord[]>;
31
+ /**
32
+ * List store applications on the instance.
33
+ *
34
+ * @param options Filtering and pagination options
35
+ * @returns Array of store application records
36
+ */
37
+ listStoreApps(options?: ListStoreAppsOptions): Promise<StoreAppRecord[]>;
38
+ /**
39
+ * List plugins on the instance.
40
+ *
41
+ * @param options Filtering and pagination options
42
+ * @returns Array of plugin records
43
+ */
44
+ listPlugins(options?: ListPluginsOptions): Promise<PluginRecord[]>;
45
+ }
@@ -0,0 +1,163 @@
1
+ import { Logger } from "../../util/Logger.js";
2
+ import { TableAPIRequest } from "../../comm/http/TableAPIRequest.js";
3
+ /**
4
+ * InstanceDiscovery provides methods for discovering what tables,
5
+ * scoped applications, store applications, and plugins exist on a
6
+ * ServiceNow instance.
7
+ */
8
+ export class InstanceDiscovery {
9
+ static SYS_DB_OBJECT_TABLE = 'sys_db_object';
10
+ static SYS_APP_TABLE = 'sys_app';
11
+ static SYS_STORE_APP_TABLE = 'sys_store_app';
12
+ static V_PLUGIN_TABLE = 'v_plugin';
13
+ _logger = new Logger("InstanceDiscovery");
14
+ _tableAPI;
15
+ _instance;
16
+ constructor(instance) {
17
+ this._instance = instance;
18
+ this._tableAPI = new TableAPIRequest(instance);
19
+ }
20
+ /**
21
+ * List tables on the instance with optional filtering.
22
+ *
23
+ * @param options Filtering and pagination options
24
+ * @returns Array of table definitions
25
+ */
26
+ async listTables(options = {}) {
27
+ this._logger.info('Listing tables on instance');
28
+ const queryParts = [];
29
+ if (options.namePrefix) {
30
+ queryParts.push(`nameSTARTSWITH${options.namePrefix}`);
31
+ }
32
+ if (options.scope) {
33
+ queryParts.push(`sys_scope=${options.scope}`);
34
+ }
35
+ if (options.extendableOnly) {
36
+ queryParts.push('is_extendable=true');
37
+ }
38
+ if (options.query) {
39
+ queryParts.push(options.query);
40
+ }
41
+ const query = {
42
+ sysparm_limit: options.limit ?? 100
43
+ };
44
+ if (options.offset !== undefined && options.offset > 0) {
45
+ query.sysparm_offset = options.offset;
46
+ }
47
+ if (queryParts.length > 0) {
48
+ query.sysparm_query = queryParts.join('^');
49
+ }
50
+ if (options.fields && options.fields.length > 0) {
51
+ query.sysparm_fields = options.fields.join(',');
52
+ }
53
+ const response = await this._tableAPI.get(InstanceDiscovery.SYS_DB_OBJECT_TABLE, query);
54
+ if (response && response.status === 200 && response.bodyObject?.result) {
55
+ this._logger.info(`Found ${response.bodyObject.result.length} tables`);
56
+ return response.bodyObject.result;
57
+ }
58
+ throw new Error(`Failed to list tables. Status: ${response?.status ?? 'unknown'}`);
59
+ }
60
+ /**
61
+ * List scoped applications on the instance.
62
+ *
63
+ * @param options Filtering and pagination options
64
+ * @returns Array of scoped application records
65
+ */
66
+ async listScopedApps(options = {}) {
67
+ this._logger.info('Listing scoped applications');
68
+ const queryParts = [];
69
+ if (options.namePrefix) {
70
+ queryParts.push(`nameSTARTSWITH${options.namePrefix}`);
71
+ }
72
+ if (options.activeOnly) {
73
+ queryParts.push('active=true');
74
+ }
75
+ if (options.query) {
76
+ queryParts.push(options.query);
77
+ }
78
+ const query = {
79
+ sysparm_limit: options.limit ?? 100
80
+ };
81
+ if (options.offset !== undefined && options.offset > 0) {
82
+ query.sysparm_offset = options.offset;
83
+ }
84
+ if (queryParts.length > 0) {
85
+ query.sysparm_query = queryParts.join('^');
86
+ }
87
+ const response = await this._tableAPI.get(InstanceDiscovery.SYS_APP_TABLE, query);
88
+ if (response && response.status === 200 && response.bodyObject?.result) {
89
+ this._logger.info(`Found ${response.bodyObject.result.length} scoped applications`);
90
+ return response.bodyObject.result;
91
+ }
92
+ throw new Error(`Failed to list scoped applications. Status: ${response?.status ?? 'unknown'}`);
93
+ }
94
+ /**
95
+ * List store applications on the instance.
96
+ *
97
+ * @param options Filtering and pagination options
98
+ * @returns Array of store application records
99
+ */
100
+ async listStoreApps(options = {}) {
101
+ this._logger.info('Listing store applications');
102
+ const queryParts = [];
103
+ if (options.namePrefix) {
104
+ queryParts.push(`nameSTARTSWITH${options.namePrefix}`);
105
+ }
106
+ if (options.activeOnly) {
107
+ queryParts.push('active=true');
108
+ }
109
+ if (options.query) {
110
+ queryParts.push(options.query);
111
+ }
112
+ const query = {
113
+ sysparm_limit: options.limit ?? 100
114
+ };
115
+ if (options.offset !== undefined && options.offset > 0) {
116
+ query.sysparm_offset = options.offset;
117
+ }
118
+ if (queryParts.length > 0) {
119
+ query.sysparm_query = queryParts.join('^');
120
+ }
121
+ const response = await this._tableAPI.get(InstanceDiscovery.SYS_STORE_APP_TABLE, query);
122
+ if (response && response.status === 200 && response.bodyObject?.result) {
123
+ this._logger.info(`Found ${response.bodyObject.result.length} store applications`);
124
+ return response.bodyObject.result;
125
+ }
126
+ throw new Error(`Failed to list store applications. Status: ${response?.status ?? 'unknown'}`);
127
+ }
128
+ /**
129
+ * List plugins on the instance.
130
+ *
131
+ * @param options Filtering and pagination options
132
+ * @returns Array of plugin records
133
+ */
134
+ async listPlugins(options = {}) {
135
+ this._logger.info('Listing plugins');
136
+ const queryParts = [];
137
+ if (options.namePrefix) {
138
+ queryParts.push(`nameSTARTSWITH${options.namePrefix}`);
139
+ }
140
+ if (options.activeOnly) {
141
+ queryParts.push('active=active');
142
+ }
143
+ if (options.query) {
144
+ queryParts.push(options.query);
145
+ }
146
+ const query = {
147
+ sysparm_limit: options.limit ?? 100
148
+ };
149
+ if (options.offset !== undefined && options.offset > 0) {
150
+ query.sysparm_offset = options.offset;
151
+ }
152
+ if (queryParts.length > 0) {
153
+ query.sysparm_query = queryParts.join('^');
154
+ }
155
+ const response = await this._tableAPI.get(InstanceDiscovery.V_PLUGIN_TABLE, query);
156
+ if (response && response.status === 200 && response.bodyObject?.result) {
157
+ this._logger.info(`Found ${response.bodyObject.result.length} plugins`);
158
+ return response.bodyObject.result;
159
+ }
160
+ throw new Error(`Failed to list plugins. Status: ${response?.status ?? 'unknown'}`);
161
+ }
162
+ }
163
+ //# sourceMappingURL=InstanceDiscovery.js.map