@sonisoft/now-sdk-ext-core 6.7.0 → 6.9.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.
Files changed (57) hide show
  1. package/dist/comm/http/FormHtmlParser.d.ts +2 -2
  2. package/dist/comm/http/FormHtmlParser.js +26 -9
  3. package/dist/comm/http/FormHtmlParser.js.map +1 -1
  4. package/dist/comm/http/FormRecordWriter.d.ts +30 -16
  5. package/dist/comm/http/FormRecordWriter.js +153 -40
  6. package/dist/comm/http/FormRecordWriter.js.map +1 -1
  7. package/dist/comm/http/HTTPRequest.d.ts +4 -0
  8. package/dist/comm/http/RequestHandler.d.ts +1 -0
  9. package/dist/comm/http/RequestHandler.js +34 -22
  10. package/dist/comm/http/RequestHandler.js.map +1 -1
  11. package/dist/comm/http/internal/FormTransportModels.d.ts +26 -0
  12. package/dist/comm/http/internal/FormTransportModels.js +2 -0
  13. package/dist/comm/http/internal/FormTransportModels.js.map +1 -0
  14. package/dist/index.d.ts +8 -1
  15. package/dist/index.js +8 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/policy/ScanScript.js +3 -0
  18. package/dist/policy/ScanScript.js.map +1 -1
  19. package/dist/sn/metadata/FormLayoutWriter.d.ts +22 -0
  20. package/dist/sn/metadata/FormLayoutWriter.js +237 -0
  21. package/dist/sn/metadata/FormLayoutWriter.js.map +1 -0
  22. package/dist/sn/metadata/MetadataFormWriter.d.ts +12 -0
  23. package/dist/sn/metadata/MetadataFormWriter.js +274 -0
  24. package/dist/sn/metadata/MetadataFormWriter.js.map +1 -0
  25. package/dist/sn/metadata/MetadataModels.d.ts +102 -0
  26. package/dist/sn/metadata/MetadataModels.js +2 -0
  27. package/dist/sn/metadata/MetadataModels.js.map +1 -0
  28. package/dist/sn/metadata/MetadataScopeError.d.ts +17 -0
  29. package/dist/sn/metadata/MetadataScopeError.js +32 -0
  30. package/dist/sn/metadata/MetadataScopeError.js.map +1 -0
  31. package/dist/sn/metadata/MetadataVerificationError.d.ts +11 -0
  32. package/dist/sn/metadata/MetadataVerificationError.js +20 -0
  33. package/dist/sn/metadata/MetadataVerificationError.js.map +1 -0
  34. package/dist/sn/metadata/internal/MetadataPreferences.d.ts +12 -0
  35. package/dist/sn/metadata/internal/MetadataPreferences.js +27 -0
  36. package/dist/sn/metadata/internal/MetadataPreferences.js.map +1 -0
  37. package/dist/sn/metadata/internal/MetadataReader.d.ts +9 -0
  38. package/dist/sn/metadata/internal/MetadataReader.js +55 -0
  39. package/dist/sn/metadata/internal/MetadataReader.js.map +1 -0
  40. package/dist/sn/metadata/internal/MetadataScope.d.ts +12 -0
  41. package/dist/sn/metadata/internal/MetadataScope.js +48 -0
  42. package/dist/sn/metadata/internal/MetadataScope.js.map +1 -0
  43. package/dist/sn/metadata/internal/MetadataUpdateNames.d.ts +8 -0
  44. package/dist/sn/metadata/internal/MetadataUpdateNames.js +28 -0
  45. package/dist/sn/metadata/internal/MetadataUpdateNames.js.map +1 -0
  46. package/dist/sn/metadata/internal/SlushbucketPage.d.ts +20 -0
  47. package/dist/sn/metadata/internal/SlushbucketPage.js +67 -0
  48. package/dist/sn/metadata/internal/SlushbucketPage.js.map +1 -0
  49. package/dist/sn/updateset/UpdateSetManager.js +30 -3
  50. package/dist/sn/updateset/UpdateSetManager.js.map +1 -1
  51. package/dist/sn/updateset/WorkingSetManager.d.ts +53 -0
  52. package/dist/sn/updateset/WorkingSetManager.js +275 -0
  53. package/dist/sn/updateset/WorkingSetManager.js.map +1 -0
  54. package/dist/sn/updateset/WorkingSetModels.d.ts +77 -0
  55. package/dist/sn/updateset/WorkingSetModels.js +12 -0
  56. package/dist/sn/updateset/WorkingSetModels.js.map +1 -0
  57. package/package.json +1 -1
@@ -0,0 +1,275 @@
1
+ import { SessionManager } from '../../comm/http/SessionManager.js';
2
+ import { BackgroundScriptExecutor } from '../BackgroundScriptExecutor.js';
3
+ import { MetadataReader } from '../metadata/internal/MetadataReader.js';
4
+ import { WorkingSetError } from './WorkingSetModels.js';
5
+ const ID = /^[a-f0-9]{32}$/;
6
+ const MARKER = 'NEX_WORKING_SET_RESULT=';
7
+ /**
8
+ * Update-set lifecycle for changes in any application, including installed Store applications and
9
+ * Global: create a set that really belongs to the application, make it the user's working set in
10
+ * every later session, move one capture into it, complete it, and restore the previous working set.
11
+ *
12
+ * Every step reads its outcome back and throws {@link WorkingSetError} rather than report success
13
+ * it did not observe. Only creating a set and saving the working-set preferences run as background
14
+ * scripts: the Table API drops sys_update_set.application, and no API persists apps.current_app.
15
+ */
16
+ export class WorkingSetManager {
17
+ _instance;
18
+ _request;
19
+ _reader;
20
+ constructor(_instance) {
21
+ this._instance = _instance;
22
+ this._request = SessionManager.getInstance().getRequest(_instance);
23
+ this._reader = new MetadataReader(this._request);
24
+ }
25
+ /** The authenticated user's current application and update set. */
26
+ async getWorkingSet() {
27
+ const user = await this.user();
28
+ const rows = await this._reader.rows('sys_user_preference', `user=${user}^nameINapps.current_app,sys_update_set`, 'sys_id,user,name,value');
29
+ const value = (name) => {
30
+ const values = [...new Set(rows.filter(row => row.user === user && row.name === name).map(row => row.value))];
31
+ if (values.length > 1)
32
+ throw new WorkingSetError('evidence_unavailable');
33
+ return values[0] ?? '';
34
+ };
35
+ return { application: value('apps.current_app'), updateSet: value('sys_update_set') };
36
+ }
37
+ /** Read one update set. */
38
+ async getUpdateSet(sysId) {
39
+ if (!ID.test(sysId ?? ''))
40
+ throw new WorkingSetError('invalid_input');
41
+ const row = await this._reader.exact('sys_update_set', sysId, 'name,state,application,is_default');
42
+ if (!row)
43
+ throw new WorkingSetError('update_set_not_found');
44
+ return summary(row);
45
+ }
46
+ /** Create an In progress set whose application is verified to be the requested one. */
47
+ async createUpdateSet(options) {
48
+ const name = options?.name?.trim() ?? '';
49
+ if (!name || name.length > 80 || /\p{Cc}/u.test(name) || /\p{Cc}/u.test(options.description ?? ''))
50
+ throw new WorkingSetError('invalid_input');
51
+ const application = await this.application(options.application);
52
+ // The duplicate check runs with addQuery inside the script: the caller's name never becomes encoded-query text,
53
+ // where '^' would split it and a javascript: term would run on the server.
54
+ const created = await this.script(`
55
+ var open = new GlideRecord('sys_update_set');
56
+ open.addQuery('name', P.name);
57
+ open.addQuery('application', P.application);
58
+ open.addQuery('state', 'in progress');
59
+ open.setLimit(1);
60
+ open.query();
61
+ if (open.hasNext()) { out({ exists: true }); return; }
62
+ var set = new GlideRecord('sys_update_set');
63
+ set.initialize();
64
+ set.setValue('name', P.name);
65
+ set.setValue('state', 'in progress');
66
+ set.setValue('application', P.application);
67
+ if (P.description) set.setValue('description', P.description);
68
+ var id = set.insert();
69
+ out({ sys_id: id ? '' + id : '' });`, { name, application, description: options.description ?? '' });
70
+ if (created.exists === true)
71
+ throw new WorkingSetError('update_set_exists');
72
+ const createdId = typeof created.sys_id === 'string' ? created.sys_id : '';
73
+ if (!ID.test(createdId))
74
+ throw new WorkingSetError('create_not_applied');
75
+ const set = await this.getUpdateSet(createdId);
76
+ if (set.application !== application || set.state !== 'in progress' || set.name !== name) {
77
+ throw new WorkingSetError('application_not_applied', { updateSet: set.sysId, application: set.application });
78
+ }
79
+ return set;
80
+ }
81
+ /**
82
+ * Make an In progress set the user's working set in every later session: apps.current_app,
83
+ * sys_update_set and updateSetForScope<application> are saved and read back. A Default is
84
+ * refused unless `allowDefault` (for restoring a previous context only).
85
+ */
86
+ async useUpdateSet(sysId, options = {}) {
87
+ const set = await this.getUpdateSet(sysId);
88
+ if (set.state !== 'in progress')
89
+ throw new WorkingSetError('update_set_closed', { updateSet: set.sysId, state: set.state });
90
+ if (set.isDefault && !options.allowDefault)
91
+ throw new WorkingSetError('default_update_set', { updateSet: set.sysId });
92
+ const previous = await this.getWorkingSet();
93
+ try {
94
+ return { previous, current: await this.persist(set.application, set.sysId), updateSet: set };
95
+ }
96
+ catch (error) {
97
+ // The preferences may already have changed: the caller needs the pair to put back.
98
+ if (error instanceof WorkingSetError)
99
+ throw new WorkingSetError(error.code, { ...error.detail, previous });
100
+ throw new WorkingSetError('working_set_not_applied', { updateSet: set.sysId, previous });
101
+ }
102
+ }
103
+ /**
104
+ * Put back a working set returned by {@link useUpdateSet}. When its set has closed since, the
105
+ * application's single In progress Default is used instead and reported as the fallback.
106
+ */
107
+ async restoreWorkingSet(previous) {
108
+ // A user with no saved preference reads back as '': the platform's own default is Global and its Default set.
109
+ const requested = previous?.application === '' ? 'global' : previous?.application;
110
+ const application = requested === 'global' || ID.test(requested ?? '') ? requested : undefined;
111
+ const updateSet = previous?.updateSet ?? '';
112
+ if (!application || (updateSet !== '' && !ID.test(updateSet)))
113
+ throw new WorkingSetError('invalid_input');
114
+ let set;
115
+ if (updateSet) {
116
+ try {
117
+ set = await this.getUpdateSet(updateSet);
118
+ }
119
+ catch (error) {
120
+ if (!(error instanceof WorkingSetError && error.code === 'update_set_not_found'))
121
+ throw error;
122
+ }
123
+ }
124
+ if (set && set.application !== application)
125
+ throw new WorkingSetError('scope_mismatch', { application, updateSet: set.sysId });
126
+ if (set?.state === 'in progress')
127
+ return { restored: await this.persist(application, set.sysId) };
128
+ const defaults = await this._reader.rows('sys_update_set', `application=${application}^is_default=true^state=in progress`, 'sys_id,application');
129
+ if (defaults.length !== 1 || defaults[0].application !== application)
130
+ throw new WorkingSetError('no_single_default', { application });
131
+ return { restored: await this.persist(application, defaults[0].sys_id), fallback: 'application_default' };
132
+ }
133
+ /**
134
+ * Move one capture between two In progress sets of the same application, as the platform's
135
+ * "Handle updates moving between sets" rule allows, and read the move back. Refused before the
136
+ * move when the scopes differ, the target is a Default, the target already holds a capture of
137
+ * the same record, or a newer capture of the same record exists elsewhere.
138
+ */
139
+ async moveCapture(options) {
140
+ const { capture, sourceSet, targetSet } = options ?? {};
141
+ if (![capture, sourceSet, targetSet].every(id => ID.test(id ?? '')) || sourceSet === targetSet)
142
+ throw new WorkingSetError('invalid_input');
143
+ if (/[^\p{L}\p{N} .,:;()/_-]/u.test(options.reason ?? '') || !options.reason?.trim())
144
+ throw new WorkingSetError('invalid_input');
145
+ const row = await this._reader.exact('sys_update_xml', capture, 'name,update_set,application,sys_recorded_at,comments');
146
+ if (!row || row.update_set !== sourceSet)
147
+ throw new WorkingSetError('capture_not_in_source', { capture });
148
+ const [source, target] = [await this.getUpdateSet(sourceSet), await this.getUpdateSet(targetSet)];
149
+ if (source.state !== 'in progress' || target.state !== 'in progress')
150
+ throw new WorkingSetError('update_set_closed', { updateSet: source.state !== 'in progress' ? source.sysId : target.sysId });
151
+ if (target.isDefault)
152
+ throw new WorkingSetError('default_update_set', { updateSet: target.sysId });
153
+ if (target.application !== row.application)
154
+ throw new WorkingSetError('scope_mismatch', { application: row.application, updateSet: target.sysId });
155
+ const same = await this._reader.rows('sys_update_xml', `name=${row.name}`, 'sys_id,name,update_set,sys_recorded_at');
156
+ if (same.some(other => other.name !== row.name))
157
+ throw new WorkingSetError('evidence_unavailable');
158
+ if (same.some(other => other.update_set === targetSet))
159
+ throw new WorkingSetError('duplicate_capture', { updateSet: targetSet });
160
+ if (same.some(other => other.sys_id !== capture && other.sys_recorded_at >= row.sys_recorded_at))
161
+ throw new WorkingSetError('newer_capture_exists', { capture });
162
+ const comments = [row.comments, `Moved to ${target.name}: ${options.reason.trim()}`].filter(Boolean).join('\n');
163
+ const response = await this._request.put({ path: `/api/now/table/sys_update_xml/${capture}`, method: 'PUT',
164
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, query: { sysparm_fields: 'sys_id' },
165
+ body: null, json: { update_set: targetSet, comments } });
166
+ const after = await this._reader.exact('sys_update_xml', capture, 'update_set,application');
167
+ if (after?.update_set !== targetSet)
168
+ throw new WorkingSetError('move_not_applied', { capture, status: response?.status });
169
+ return { capture, name: row.name, application: row.application, from: source, to: target };
170
+ }
171
+ /**
172
+ * Mark a set Complete after checking that it holds exactly `expectedCaptures` rows, all of the
173
+ * set's own application, one per record, and that no other user is working in it. Reads the
174
+ * state back. The caller restores its own working set afterwards ({@link restoreWorkingSet}).
175
+ */
176
+ async completeUpdateSet(sysId, options) {
177
+ if (!Number.isSafeInteger(options?.expectedCaptures) || options.expectedCaptures < 0)
178
+ throw new WorkingSetError('invalid_input');
179
+ const set = await this.getUpdateSet(sysId);
180
+ if (set.state !== 'in progress')
181
+ throw new WorkingSetError('update_set_closed', { updateSet: set.sysId, state: set.state });
182
+ if (set.isDefault)
183
+ throw new WorkingSetError('default_update_set', { updateSet: set.sysId });
184
+ const rows = await this._reader.rows('sys_update_xml', `update_set=${sysId}`, 'sys_id,name,update_set,application');
185
+ if (rows.some(row => row.update_set !== sysId))
186
+ throw new WorkingSetError('evidence_unavailable');
187
+ if (rows.length !== options.expectedCaptures)
188
+ throw new WorkingSetError('capture_count_mismatch', { expected: options.expectedCaptures, actual: rows.length });
189
+ const strays = rows.filter(row => row.application !== set.application);
190
+ if (strays.length)
191
+ throw new WorkingSetError('mixed_scope_capture', { captures: strays.map(row => row.sys_id) });
192
+ const names = rows.map(row => row.name);
193
+ if (new Set(names).size !== names.length)
194
+ throw new WorkingSetError('duplicate_capture', { updateSet: sysId });
195
+ const user = await this.user();
196
+ // Another user's current set, or the set remembered for the application, both still capture into it.
197
+ const users = await this._reader.rows('sys_user_preference', `name=sys_update_set^ORnameSTARTSWITHupdateSetForScope^value=${sysId}`, 'sys_id,user,name,value');
198
+ if (users.some(row => row.user !== user))
199
+ throw new WorkingSetError('update_set_in_use', { updateSet: sysId });
200
+ await this._request.put({ path: `/api/now/table/sys_update_set/${sysId}`, method: 'PUT',
201
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, query: { sysparm_fields: 'sys_id' },
202
+ body: null, json: { state: 'complete' } });
203
+ const completed = await this.getUpdateSet(sysId);
204
+ if (completed.state !== 'complete')
205
+ throw new WorkingSetError('complete_not_applied', { updateSet: sysId, state: completed.state });
206
+ // A capture that arrived between the checks and the state change is in the completed set: say so.
207
+ const final = await this._reader.rows('sys_update_xml', `update_set=${sysId}`, 'sys_id,update_set');
208
+ if (final.length !== rows.length || final.some(row => !rows.some(checked => checked.sys_id === row.sys_id))) {
209
+ throw new WorkingSetError('capture_count_mismatch', { updateSet: sysId, state: completed.state, expected: rows.length, actual: final.length });
210
+ }
211
+ return completed;
212
+ }
213
+ async user() {
214
+ const users = await this._reader.rows('sys_user', 'sys_id=javascript:gs.getUserID()', 'sys_id');
215
+ if (users.length !== 1 || !ID.test(users[0].sys_id))
216
+ throw new WorkingSetError('evidence_unavailable');
217
+ return users[0].sys_id;
218
+ }
219
+ /** The value a set of this application carries in sys_update_set.application. */
220
+ async application(ref) {
221
+ if (ref === 'global')
222
+ return 'global';
223
+ if (!ID.test(ref ?? '') && !/^[a-z0-9_]{1,40}$/i.test(ref ?? ''))
224
+ throw new WorkingSetError('invalid_input');
225
+ // A scope name must resolve to exactly one active application; scope strings are not unique.
226
+ const scopes = ID.test(ref) ? await this._reader.rows('sys_scope', `sys_id=${ref}`, 'sys_id,scope')
227
+ : await this._reader.rows('sys_scope', `scope=${ref}^active=true`, 'sys_id,scope');
228
+ if (scopes.length !== 1)
229
+ throw new WorkingSetError(scopes.length ? 'invalid_input' : 'application_not_found', ID.test(ref) ? { application: ref } : undefined);
230
+ return scopes[0].scope === 'global' ? 'global' : scopes[0].sys_id;
231
+ }
232
+ async persist(application, updateSet) {
233
+ await this.script(`
234
+ gs.getUser().savePreference('apps.current_app', P.application);
235
+ gs.setCurrentApplicationId(P.application);
236
+ new GlideUpdateSet().set(P.updateSet);
237
+ out({ ok: true });`, { application, updateSet });
238
+ const after = await this.getWorkingSet();
239
+ const user = await this.user();
240
+ const scoped = await this._reader.rows('sys_user_preference', `user=${user}^name=updateSetForScope${application}`, 'sys_id,user,name,value');
241
+ if (after.application !== application || after.updateSet !== updateSet || !scoped.length || scoped.some(row => row.value !== updateSet)) {
242
+ throw new WorkingSetError('working_set_not_applied', { application: after.application, updateSet: after.updateSet });
243
+ }
244
+ return after;
245
+ }
246
+ /** Run a global background script with JSON parameters `P`; `out(value)` returns one JSON result. */
247
+ async script(body, params) {
248
+ const literal = JSON.stringify(params).replace(/[\u2028\u2029<>]/g, c => `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);
249
+ const script = `(function () {
250
+ var P = ${literal};
251
+ function out(value) { gs.print('${MARKER}' + JSON.stringify(value)); }
252
+ ${body}
253
+ })();`;
254
+ const result = await new BackgroundScriptExecutor(this._instance, 'global').executeScript(script, 'global', this._instance);
255
+ const lines = [...(result.scriptResults ?? []).map(line => line.line), ...(result.consoleResult ?? [])];
256
+ const line = lines.map(decode).find(text => text.includes(MARKER));
257
+ if (!line)
258
+ throw new WorkingSetError('script_result_unavailable');
259
+ try {
260
+ return JSON.parse(line.slice(line.indexOf(MARKER) + MARKER.length));
261
+ }
262
+ catch {
263
+ throw new WorkingSetError('script_result_unavailable');
264
+ }
265
+ }
266
+ }
267
+ function decode(text) {
268
+ return String(text ?? '').replace(/<BR\/?>/gi, '').replace(/&quot;/g, '"').replace(/&#39;/g, "'")
269
+ .replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').trim();
270
+ }
271
+ function summary(row) {
272
+ return { sysId: row.sys_id, name: row.name, state: row.state, application: row.application,
273
+ isDefault: row.is_default === 'true' || row.is_default === '1' };
274
+ }
275
+ //# sourceMappingURL=WorkingSetManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkingSetManager.js","sourceRoot":"","sources":["../../../src/sn/updateset/WorkingSetManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /** The user's working set: apps.current_app and sys_update_set. `global` or a sys_scope sys_id. */
2
+ export interface WorkingSet {
3
+ application: string;
4
+ updateSet: string;
5
+ }
6
+ export interface UpdateSetSummary {
7
+ sysId: string;
8
+ name: string;
9
+ state: string;
10
+ /** sys_update_set.application: `global`, or the application's sys_scope sys_id. */
11
+ application: string;
12
+ isDefault: boolean;
13
+ }
14
+ export interface CreateScopedUpdateSetOptions {
15
+ /**
16
+ * `global`, the sys_scope sys_id of any application (including an installed Store application),
17
+ * or a scope name that resolves to exactly one active application.
18
+ */
19
+ application: string;
20
+ /** At most 80 characters. A second In progress set with the same name in the application is refused. */
21
+ name: string;
22
+ description?: string;
23
+ }
24
+ export interface UseUpdateSetOptions {
25
+ /** Permit an application's Default set. Only for restoring a previous context: never develop in a Default. */
26
+ allowDefault?: boolean;
27
+ }
28
+ export interface UseUpdateSetResult {
29
+ /** Pass to restoreWorkingSet when the work is done. */
30
+ previous: WorkingSet;
31
+ current: WorkingSet;
32
+ updateSet: UpdateSetSummary;
33
+ }
34
+ export interface RestoreWorkingSetResult {
35
+ restored: WorkingSet;
36
+ /** The previous set had closed; the application's Default was made current instead. */
37
+ fallback?: 'application_default';
38
+ }
39
+ export interface MoveCaptureOptions {
40
+ /** sys_update_xml sys_id. */
41
+ capture: string;
42
+ sourceSet: string;
43
+ targetSet: string;
44
+ /** Appended to the capture's comments. Letters, digits and simple punctuation only. */
45
+ reason: string;
46
+ }
47
+ export interface MoveCaptureResult {
48
+ capture: string;
49
+ name: string;
50
+ application: string;
51
+ from: UpdateSetSummary;
52
+ to: UpdateSetSummary;
53
+ }
54
+ export interface CompleteUpdateSetOptions {
55
+ /** The number of captures the caller expects in the set. Completion is refused on any other count. */
56
+ expectedCaptures: number;
57
+ }
58
+ export type WorkingSetErrorCode = 'invalid_input' | 'evidence_unavailable' | 'update_set_not_found' | 'update_set_exists' | 'application_not_found' | 'create_not_applied' | 'application_not_applied' | 'update_set_closed' | 'default_update_set' | 'working_set_not_applied' | 'no_single_default' | 'capture_not_in_source' | 'scope_mismatch' | 'duplicate_capture' | 'newer_capture_exists' | 'move_not_applied' | 'capture_count_mismatch' | 'mixed_scope_capture' | 'update_set_in_use' | 'complete_not_applied' | 'script_result_unavailable';
59
+ /** Identifiers and counts that explain a refusal; never names, descriptions or payloads. */
60
+ export interface WorkingSetErrorDetail {
61
+ updateSet?: string;
62
+ application?: string;
63
+ capture?: string;
64
+ captures?: string[];
65
+ state?: string;
66
+ expected?: number;
67
+ actual?: number;
68
+ status?: number;
69
+ /** The working set before a change that did not read back: pass it to restoreWorkingSet. */
70
+ previous?: WorkingSet;
71
+ }
72
+ /** An update-set lifecycle step was refused, or its outcome did not read back as required. */
73
+ export declare class WorkingSetError extends Error {
74
+ readonly code: WorkingSetErrorCode;
75
+ readonly detail?: WorkingSetErrorDetail;
76
+ constructor(code: WorkingSetErrorCode, detail?: WorkingSetErrorDetail);
77
+ }
@@ -0,0 +1,12 @@
1
+ /** An update-set lifecycle step was refused, or its outcome did not read back as required. */
2
+ export class WorkingSetError extends Error {
3
+ code;
4
+ detail;
5
+ constructor(code, detail) {
6
+ super(`Update set operation failed: ${code}`);
7
+ this.code = code;
8
+ this.detail = detail;
9
+ this.name = 'WorkingSetError';
10
+ }
11
+ }
12
+ //# sourceMappingURL=WorkingSetModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkingSetModels.js","sourceRoot":"","sources":["../../../src/sn/updateset/WorkingSetModels.ts"],"names":[],"mappings":"AA8EA,8FAA8F;AAC9F,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACH;IAA2C;IAA9E,YAAmC,IAAyB,EAAkB,MAA8B;QACxG,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QADf,SAAI,GAAJ,IAAI,CAAqB;QAAkB,WAAM,GAAN,MAAM,CAAwB;QAExG,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonisoft/now-sdk-ext-core",
3
- "version": "6.7.0",
3
+ "version": "6.9.0",
4
4
  "description": "Comprehensive TypeScript library extending ServiceNow SDK with application management, ATF testing, real-time log monitoring, AMB event subscriptions, and automation tools",
5
5
  "keywords": [
6
6
  "servicenow",