@sonisoft/now-sdk-ext-core 6.10.0 → 6.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -86,7 +86,9 @@ export * from './sn/health/HealthModels.js';
86
86
  export * from './sn/health/InstanceHealth.js';
87
87
  export * from './sn/knowledge/KnowledgeManager.js';
88
88
  export * from './sn/knowledge/KnowledgeModels.js';
89
+ export * from './sn/metadata/ColumnWriter.js';
89
90
  export * from './sn/metadata/FormLayoutWriter.js';
91
+ export * from './sn/metadata/ListLayoutWriter.js';
90
92
  export * from './sn/metadata/MetadataFormWriter.js';
91
93
  export * from './sn/metadata/MetadataModels.js';
92
94
  export * from './sn/metadata/MetadataScopeError.js';
package/dist/index.js CHANGED
@@ -86,7 +86,9 @@ export * from './sn/health/HealthModels.js';
86
86
  export * from './sn/health/InstanceHealth.js';
87
87
  export * from './sn/knowledge/KnowledgeManager.js';
88
88
  export * from './sn/knowledge/KnowledgeModels.js';
89
+ export * from './sn/metadata/ColumnWriter.js';
89
90
  export * from './sn/metadata/FormLayoutWriter.js';
91
+ export * from './sn/metadata/ListLayoutWriter.js';
90
92
  export * from './sn/metadata/MetadataFormWriter.js';
91
93
  export * from './sn/metadata/MetadataModels.js';
92
94
  export * from './sn/metadata/MetadataScopeError.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ServiceNowInstance } from '../ServiceNowInstance.js';
2
+ import type { ColumnWriteOptions, ColumnWriteResult } from './MetadataModels.js';
3
+ /**
4
+ * Adds a column to a table through the dictionary form (`sys_dictionary.do`), the path the platform itself uses, and
5
+ * verifies what the platform did:
6
+ *
7
+ * - The column's name. The platform renames it: `u_<name>` in Global and in an installed Store application,
8
+ * `<scope>_<name>` when an application adds it to another application's table, and unchanged on a scoped
9
+ * application's own table. The writer applies that rule before the
10
+ * save, so `column` in the result is the name to use, and checks the saved row has it.
11
+ * - The Dictionary and Field Label captures (`sys_dictionary_<table>_<column>`, `sys_documentation_<table>_<column>_<lang>`).
12
+ * - The Form Layout capture of every section the platform appended the field to. On Global tables and an application's
13
+ * own tables the platform adds it to the end of the Default view's main section; placing it is then a form-layout change.
14
+ *
15
+ * Every capture must be in the given set, of the given application. The writer never changes the user's working set:
16
+ * the set must already be the user's set for that application (see `WorkingSetManager.useUpdateSet`), because the form
17
+ * placement is captured there whatever the dictionary form is told. Removing a column is not part of this writer.
18
+ */
19
+ export declare class ColumnWriter {
20
+ private _instance;
21
+ constructor(_instance: ServiceNowInstance);
22
+ /** Add `options.column` to `table` and verify the column, its label, the form placement and their captures. */
23
+ addColumn(table: string, options: ColumnWriteOptions): Promise<ColumnWriteResult>;
24
+ }
@@ -0,0 +1,292 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { InvalidParameterException } from '../../exception/InvalidParameterException.js';
3
+ import { FormSubmitError } from '../../exception/FormSubmitError.js';
4
+ import { createFormTransport } from '../../comm/http/FormRecordWriter.js';
5
+ import { SessionManager } from '../../comm/http/SessionManager.js';
6
+ import { isPolicyRefusal } from '../../policy/PolicyRefusal.js';
7
+ import { stripSecretsFromError } from '../../util/redact.js';
8
+ import { MetadataScopeError } from './MetadataScopeError.js';
9
+ import { MetadataVerificationError } from './MetadataVerificationError.js';
10
+ import { MetadataReader } from './internal/MetadataReader.js';
11
+ import { comparePreferences, preferenceValue } from './internal/MetadataPreferences.js';
12
+ import { customizationEvidence, resolveScope } from './internal/MetadataScope.js';
13
+ const ID = /^[a-f0-9]{32}$/i;
14
+ const NAME = /^[a-z0-9_]+$/i;
15
+ const COLUMN = /^[a-z][a-z0-9_]*$/;
16
+ const MAX_COLUMN = 80;
17
+ const DICTIONARY = 'sys_dictionary';
18
+ /**
19
+ * Tables whose schema the platform's own metadata, capture and application model depend on. A column added to one of
20
+ * them (or to a table extending one) is added to every record the platform keeps there.
21
+ */
22
+ const TABLE_DENY = new Set(['sys_metadata', 'sys_dictionary', 'sys_db_object', 'sys_documentation', 'sys_choice', 'sys_glide_object',
23
+ 'sys_update_set', 'sys_update_xml', 'sys_update_version', 'sys_metadata_delete', 'sys_scope', 'sys_app', 'sys_store_app',
24
+ 'sys_user_preference']);
25
+ /**
26
+ * Adds a column to a table through the dictionary form (`sys_dictionary.do`), the path the platform itself uses, and
27
+ * verifies what the platform did:
28
+ *
29
+ * - The column's name. The platform renames it: `u_<name>` in Global and in an installed Store application,
30
+ * `<scope>_<name>` when an application adds it to another application's table, and unchanged on a scoped
31
+ * application's own table. The writer applies that rule before the
32
+ * save, so `column` in the result is the name to use, and checks the saved row has it.
33
+ * - The Dictionary and Field Label captures (`sys_dictionary_<table>_<column>`, `sys_documentation_<table>_<column>_<lang>`).
34
+ * - The Form Layout capture of every section the platform appended the field to. On Global tables and an application's
35
+ * own tables the platform adds it to the end of the Default view's main section; placing it is then a form-layout change.
36
+ *
37
+ * Every capture must be in the given set, of the given application. The writer never changes the user's working set:
38
+ * the set must already be the user's set for that application (see `WorkingSetManager.useUpdateSet`), because the form
39
+ * placement is captured there whatever the dictionary form is told. Removing a column is not part of this writer.
40
+ */
41
+ export class ColumnWriter {
42
+ _instance;
43
+ constructor(_instance) {
44
+ this._instance = _instance;
45
+ }
46
+ /** Add `options.column` to `table` and verify the column, its label, the form placement and their captures. */
47
+ async addColumn(table, options) {
48
+ if (!NAME.test(table ?? '') || !options?.updateSet || !ID.test(options.updateSet))
49
+ throw new MetadataScopeError('invalid_input');
50
+ const { column: requested, label, type, maxLength, reference } = options;
51
+ if (typeof requested !== 'string' || !COLUMN.test(requested))
52
+ throw new MetadataScopeError('invalid_input', { field: 'column' });
53
+ if (typeof label !== 'string' || !label.trim() || label.length > 80 || [...label].some(char => char.charCodeAt(0) < 32 || char === '<' || char === '>'))
54
+ throw new MetadataScopeError('invalid_input', { field: 'label' });
55
+ if (typeof type !== 'string' || !NAME.test(type))
56
+ throw new MetadataScopeError('invalid_input', { field: 'type' });
57
+ if (maxLength !== undefined && (!Number.isSafeInteger(maxLength) || maxLength < 1 || maxLength > 65000))
58
+ throw new MetadataScopeError('invalid_input', { field: 'max_length' });
59
+ if (reference !== undefined && (typeof reference !== 'string' || !NAME.test(reference)))
60
+ throw new MetadataScopeError('invalid_input', { field: 'reference' });
61
+ if ((type === 'reference') !== (reference !== undefined) && type !== 'glide_list')
62
+ throw new MetadataScopeError('invalid_input', { field: 'reference' });
63
+ const reader = new MetadataReader(SessionManager.getInstance().getRequest(this._instance));
64
+ let submitted = false;
65
+ let report = {};
66
+ let messages = [];
67
+ let recordId = '';
68
+ try {
69
+ const { store, ...scope } = await resolveScope(reader, options.scope);
70
+ if (store && options.storeCustomization?.acknowledgeUpgradeSkip !== true)
71
+ throw new MetadataScopeError('store_scope');
72
+ const hierarchy = await ancestry(reader, table);
73
+ const column = columnName(requested, scope, store, hierarchy[0].sys_scope);
74
+ if (column.length > MAX_COLUMN)
75
+ throw new MetadataScopeError('invalid_input', { field: 'column' });
76
+ const types = await reader.rows('sys_glide_object', `name=${type}`, 'sys_id,name');
77
+ if (!types.some(row => row.name === type))
78
+ throw new MetadataScopeError('invalid_input', { field: 'type' });
79
+ if (reference !== undefined) {
80
+ const target = await reader.rows('sys_db_object', `name=${reference}`, 'sys_id,name');
81
+ if (target.length !== 1 || target[0].name !== reference)
82
+ throw new MetadataScopeError('table_not_supported', { table: reference });
83
+ }
84
+ // A column of that name on the table or a table it extends: the platform would refuse it, or shadow the parent's.
85
+ const existing = await reader.rows(DICTIONARY, `nameIN${hierarchy.map(row => row.name).join(',')}^element=${column}`, 'sys_id,name,element');
86
+ const clash = existing.find(row => row.element === column);
87
+ if (clash)
88
+ throw new MetadataScopeError('column_exists', { table: clash.name, field: column });
89
+ const set = await reader.exact('sys_update_set', options.updateSet, 'application,state');
90
+ if (!set || set.state !== 'in progress' || set.application !== scope.sysId) {
91
+ throw new MetadataScopeError('invalid_input', set ? { updateSetState: set.state, updateSetApplication: set.application } : undefined);
92
+ }
93
+ const users = await reader.rows('sys_user', 'sys_id=javascript:gs.getUserID()', 'sys_id');
94
+ if (users.length !== 1 || !ID.test(users[0].sys_id))
95
+ throw new MetadataScopeError('evidence_unavailable');
96
+ const user = users[0].sys_id;
97
+ const preferences = async () => {
98
+ const rows = await reader.rows('sys_user_preference', `user=${user}`, 'sys_id,user,name,value');
99
+ if (rows.some(pref => pref.user !== user))
100
+ throw new MetadataScopeError('evidence_unavailable');
101
+ return rows;
102
+ };
103
+ const before = await preferences();
104
+ // The form placement is captured in the user's set for the application, whatever the form is told.
105
+ if (preferenceValue(before, `updateSetForScope${scope.sysId}`) !== options.updateSet)
106
+ throw new MetadataScopeError('update_set_not_current');
107
+ const transport = createFormTransport(this._instance);
108
+ const form = await transport.loadForm(DICTIONARY, '-1', { initialQuery: `name=${table}`,
109
+ query: { sysparm_transaction_scope: scope.sysId, sysparm_isdevstudio: 'true', sysparm_referring_url: `${DICTIONARY}.do`,
110
+ sysparm_nofocus: 'true', sysparm_nameofstack: `${randomUUID()}_bottomless` },
111
+ captureRenderedInputs: true, tokenSource: 'page', sensitive: true });
112
+ recordId = form.sysId;
113
+ if (!ID.test(recordId) || form.fields[`${DICTIONARY}.name`]?.value !== table || form.fields[`${DICTIONARY}.sys_scope`]?.value !== scope.sysId ||
114
+ form.renderedInputs?.sysparm_transaction_scope !== scope.sysId)
115
+ throw new MetadataScopeError('scope_not_applied');
116
+ const fields = { element: column, column_label: label, internal_type: type,
117
+ ...(maxLength !== undefined ? { max_length: String(maxLength) } : {}), ...(reference !== undefined ? { reference } : {}) };
118
+ for (const field of Object.keys(fields))
119
+ if (!form.fields[`${DICTIONARY}.${field}`])
120
+ throw new MetadataScopeError('field_not_supported', { field, table: DICTIONARY });
121
+ try {
122
+ transport.validate(form, { fields });
123
+ }
124
+ catch (error) {
125
+ if (!(error instanceof InvalidParameterException))
126
+ throw error;
127
+ throw new MetadataScopeError('field_not_supported', { table: DICTIONARY });
128
+ }
129
+ const loaded = await preferences();
130
+ if (!comparePreferences(before, loaded).valid)
131
+ throw new MetadataVerificationError('session_changed', DICTIONARY, recordId, undefined, [], false);
132
+ // Every capture this save can make, snapshotted so an older row of the same name never counts as evidence.
133
+ const dictionaryName = `${DICTIONARY}_${table}_${column}`;
134
+ const sections = await reader.rows('sys_ui_section', `name=${table}`, 'sys_id,name');
135
+ if (sections.some(row => row.name !== table || !ID.test(row.sys_id)))
136
+ throw new MetadataScopeError('evidence_unavailable');
137
+ const captureQuery = [`name=${dictionaryName}`, `nameSTARTSWITHsys_documentation_${table}_${column}_`,
138
+ ...(sections.length ? [`nameIN${sections.map(row => `sys_ui_section_${row.sys_id}`).join(',')}`] : [])].join('^OR');
139
+ const prior = await reader.rows('sys_update_xml', captureQuery, 'sys_id,name,sys_mod_count');
140
+ if (prior.some(row => !/^\d+$/.test(row.sys_mod_count)))
141
+ throw new MetadataScopeError('evidence_unavailable');
142
+ const versions = new Map(prior.map(row => [row.sys_id, row.sys_mod_count]));
143
+ // A form element left behind by an earlier column of this name (deleting a column keeps it) is not this save's placement.
144
+ const leftover = new Set((await reader.rows('sys_ui_element', `element=${column}^sys_ui_section.name=${table}`, 'sys_id')).map(element => element.sys_id));
145
+ const started = new Date().toISOString().slice(0, 19).replace('T', ' ');
146
+ submitted = true;
147
+ let submitFailure;
148
+ try {
149
+ // Insert and stay: the platform returns to this record's form, the one landing the guarded submit accepts.
150
+ const result = await transport.submit(form, 'sysverb_insert_and_stay', { fields, postAllRenderedInputs: true,
151
+ tokenSource: 'page', actionValue: 'sysverb_insert_and_stay',
152
+ extraFields: { sysparm_transaction_scope: scope.sysId, sysparm_transaction_update_set: options.updateSet,
153
+ sysparm_record_scope: '', sysparm_goto_url: '' },
154
+ redirect: 'manual', landing: 'guarded', sensitive: true });
155
+ messages = [...result.messages, ...(result.errors ?? [])];
156
+ }
157
+ catch (error) {
158
+ if (isPolicyRefusal(error))
159
+ throw error;
160
+ if (error instanceof FormSubmitError)
161
+ messages = error.messages;
162
+ submitFailure = error;
163
+ }
164
+ report = { predictedUpdateSetSysId: options.updateSet, updateName: dictionaryName };
165
+ const fail = code => {
166
+ throw new MetadataVerificationError(code, DICTIONARY, recordId, report, messages);
167
+ };
168
+ // The form's record keeps its sys_id, so a name the platform chose differently is found and reported.
169
+ const dictionaryFields = 'name,element,internal_type,max_length,reference,sys_scope,sys_update_name';
170
+ const formRecord = await reader.exact(DICTIONARY, recordId, dictionaryFields);
171
+ if (formRecord && formRecord.element !== column) {
172
+ if (NAME.test(formRecord.element))
173
+ messages = [...messages, `The platform saved the column as ${formRecord.element}, not ${column}`];
174
+ fail('write_not_applied');
175
+ }
176
+ // Only the submitted form's record is this save's column: another row of that name was written by someone else.
177
+ const saved = await reader.rows(DICTIONARY, `name=${table}^element=${column}`, `sys_id,${dictionaryFields}`);
178
+ if (saved.some(other => other.sys_id !== recordId))
179
+ fail('verification_unavailable');
180
+ const csrfRejected = submitFailure instanceof Error && submitFailure.message === 'csrf_rejected';
181
+ if (!formRecord)
182
+ fail(csrfRejected ? 'csrf_rejected' : 'write_not_applied');
183
+ const row = formRecord;
184
+ report.recordScope = row.sys_scope;
185
+ if (row.name !== table || row.element !== column || row.internal_type !== type ||
186
+ (maxLength !== undefined && row.max_length !== String(maxLength)) || (reference !== undefined && row.reference !== reference))
187
+ fail('write_not_applied');
188
+ if (row.sys_scope !== scope.sysId)
189
+ fail('scope_not_applied');
190
+ if (row.sys_update_name !== dictionaryName)
191
+ fail('not_captured');
192
+ const labels = await reader.rows('sys_documentation', `name=${table}^element=${column}`, 'sys_id,name,element,language,label,sys_scope,sys_update_name');
193
+ if (!labels.some(doc => doc.label === label))
194
+ fail('write_not_applied');
195
+ if (labels.some(doc => doc.sys_scope !== scope.sysId))
196
+ fail('scope_not_applied');
197
+ if (labels.some(doc => doc.sys_update_name !== `sys_documentation_${table}_${column}_${doc.language}`))
198
+ fail('not_captured');
199
+ const placed = (await reader.rows('sys_ui_element', `element=${column}^sys_ui_section.name=${table}`, 'sys_id,element,sys_ui_section'))
200
+ .filter(element => !leftover.has(element.sys_id));
201
+ if (placed.some(element => element.element !== column || !sections.some(section => section.sys_id === element.sys_ui_section)))
202
+ fail('verification_unavailable');
203
+ const formSections = [...new Set(placed.map(element => element.sys_ui_section))];
204
+ const expected = [dictionaryName, ...labels.map(doc => doc.sys_update_name), ...formSections.map(id => `sys_ui_section_${id}`)];
205
+ const observed = await reader.rows('sys_update_xml', `${captureQuery}^sys_updated_on>=${started}`, 'sys_id,name,update_set,application,action,sys_updated_on,sys_mod_count');
206
+ const comparison = comparePreferences(before, await preferences(), options.updateSet);
207
+ Object.assign(report, { preferencesUnchanged: comparison.unchanged, preferenceRowsReplaced: comparison.replaced, currentUpdateSet: comparison.currentUpdateSet });
208
+ if (observed.some(capture => capture.sys_updated_on < started))
209
+ fail('not_captured');
210
+ const changed = observed.filter(capture => versions.get(capture.sys_id) !== capture.sys_mod_count);
211
+ const targets = new Map();
212
+ let dictionaryCapture;
213
+ for (const name of expected) {
214
+ const captures = changed.filter(capture => capture.name === name);
215
+ if (!captures.length)
216
+ fail('not_captured');
217
+ // One save writes one capture of each file; more than one changed row cannot be attributed to it.
218
+ if (captures.length > 1)
219
+ fail('verification_unavailable');
220
+ const capture = captures[0];
221
+ if (!targets.has(capture.update_set)) {
222
+ targets.set(capture.update_set, ID.test(capture.update_set) ? await reader.exact('sys_update_set', capture.update_set, 'name,application') : undefined);
223
+ }
224
+ const target = targets.get(capture.update_set);
225
+ if (!target)
226
+ fail('not_captured');
227
+ if (name === dictionaryName) {
228
+ dictionaryCapture = capture;
229
+ Object.assign(report, { updateSetSysId: target.sys_id, updateSetName: target.name, updateSetScope: target.application, action: capture.action });
230
+ }
231
+ if (target.sys_id !== options.updateSet)
232
+ fail('captured_elsewhere');
233
+ if (target.application !== scope.sysId || capture.application !== scope.sysId)
234
+ fail('mixed_scope_capture');
235
+ if (capture.action !== 'INSERT_OR_UPDATE')
236
+ fail('not_captured');
237
+ }
238
+ if (store)
239
+ report.customization = await customizationEvidence(reader, dictionaryCapture?.sys_id, dictionaryName);
240
+ if (!comparison.valid)
241
+ fail('session_changed');
242
+ if (submitFailure)
243
+ fail(csrfRejected ? 'csrf_rejected' : 'verification_unavailable');
244
+ return { table, column, sysId: row.sys_id, label, type, scope, formSections, captures: expected, capture: report, messages };
245
+ }
246
+ catch (error) {
247
+ if (isPolicyRefusal(error) || (!submitted && error instanceof MetadataScopeError) || error instanceof MetadataVerificationError)
248
+ throw stripSecretsFromError(error);
249
+ if (!submitted && error instanceof Error && error.message === 'csrf_token_unavailable')
250
+ throw new MetadataScopeError('csrf_token_unavailable');
251
+ if (!submitted && error instanceof Error && error.message === 'form_redirect') {
252
+ throw new MetadataScopeError('form_redirected', { table: DICTIONARY, redirectPath: error.redirectPath });
253
+ }
254
+ if (!submitted)
255
+ throw new MetadataScopeError('evidence_unavailable');
256
+ throw new MetadataVerificationError(error instanceof Error && error.message === 'csrf_rejected' ? 'csrf_rejected' : 'verification_unavailable', DICTIONARY, recordId, report, messages);
257
+ }
258
+ }
259
+ }
260
+ /**
261
+ * The name the platform gives a new column (seen on dev206299): `u_` in Global and in an installed Store application,
262
+ * even on the Store application's own table; `<scope>_` when a scoped application adds it to another application's table;
263
+ * unchanged on a scoped application's own table. A name that already carries the prefix keeps it.
264
+ */
265
+ function columnName(requested, scope, store, tableScope) {
266
+ const prefix = scope.sysId === 'global' || store ? 'u_' : tableScope === scope.sysId ? '' : `${scope.scope}_`;
267
+ return requested.startsWith(prefix) ? requested : `${prefix}${requested}`;
268
+ }
269
+ /** The table and every table it extends, the table first. Refuses the platform's own schema tables. */
270
+ async function ancestry(reader, table) {
271
+ const fields = 'sys_id,name,super_class,sys_scope';
272
+ let rows = await reader.rows('sys_db_object', `name=${table}`, fields);
273
+ if (rows.length !== 1 || rows[0].name !== table)
274
+ throw new MetadataScopeError('table_not_supported', { table });
275
+ const chain = [];
276
+ while (rows.length === 1) {
277
+ const row = rows[0];
278
+ if (chain.some(seen => seen.sys_id === row.sys_id) || chain.length > 30)
279
+ throw new MetadataScopeError('evidence_unavailable');
280
+ if (TABLE_DENY.has(row.name) || !NAME.test(row.name))
281
+ throw new MetadataScopeError('table_not_supported', { table: row.name });
282
+ chain.push(row);
283
+ if (!ID.test(row.super_class))
284
+ return chain;
285
+ const parent = await reader.exact('sys_db_object', row.super_class, 'name,super_class,sys_scope');
286
+ if (!parent)
287
+ throw new MetadataScopeError('evidence_unavailable');
288
+ rows = [parent];
289
+ }
290
+ throw new MetadataScopeError('evidence_unavailable');
291
+ }
292
+ //# sourceMappingURL=ColumnWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnWriter.js","sourceRoot":"","sources":["../../../src/sn/metadata/ColumnWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ServiceNowInstance } from '../ServiceNowInstance.js';
2
+ import type { ListLayout, ListLayoutWriteOptions, ListLayoutWriteResult } from './MetadataModels.js';
3
+ /**
4
+ * Reads and replaces the columns of a table's list (one view, not a related list, not a user's
5
+ * personalized list) through the classic List Layout page, the path the platform itself uses.
6
+ *
7
+ * A save deletes the list's `sys_ui_list` record and inserts a new one (a new sys_id each time),
8
+ * captured as one `sys_ui_list_<table>_<view>` update. So the list is found by table and view,
9
+ * never by sys_id, and after the save its application, update name and columns are read back.
10
+ * A table with no list of its own shows its parent's; saving then creates its own list.
11
+ *
12
+ * The writer never changes the user's working set. The target update set must already be the
13
+ * user's set for the list's application (see `WorkingSetManager.useUpdateSet`).
14
+ */
15
+ export declare class ListLayoutWriter {
16
+ private _instance;
17
+ constructor(_instance: ServiceNowInstance);
18
+ /** The list's current columns. `exists` is false when the table has no list of its own for the view. */
19
+ getListLayout(table: string, view?: string): Promise<ListLayout>;
20
+ /** Replace the list's columns with `columns`, in order, and verify the result and its capture. */
21
+ setListLayout(table: string, options: ListLayoutWriteOptions): Promise<ListLayoutWriteResult>;
22
+ private reader;
23
+ }
@@ -0,0 +1,272 @@
1
+ import { SessionManager } from '../../comm/http/SessionManager.js';
2
+ import { isPolicyRefusal } from '../../policy/PolicyRefusal.js';
3
+ import { READ_ONLY } from '../../policy/PolicyTypes.js';
4
+ import { stripSecretsFromError } from '../../util/redact.js';
5
+ import { MetadataScopeError } from './MetadataScopeError.js';
6
+ import { MetadataVerificationError } from './MetadataVerificationError.js';
7
+ import { MetadataReader } from './internal/MetadataReader.js';
8
+ import { comparePreferences, preferenceValue } from './internal/MetadataPreferences.js';
9
+ import { customizationEvidence, resolveScope } from './internal/MetadataScope.js';
10
+ import { joinLayoutValues, parseSlushbucketPage } from './internal/SlushbucketPage.js';
11
+ const ID = /^[a-f0-9]{32}$/i;
12
+ const NAME = /^[a-z0-9_]+$/i;
13
+ const COLUMN = /^[a-z0-9_]+(\.[a-z0-9_]+)*$/i;
14
+ const UPDATE_NAME = /^sys_ui_list_[a-z0-9_]+$/i;
15
+ const LIST_FIELDS = 'name,view,sys_scope,sys_update_name,sys_policy,sys_domain,sys_created_on';
16
+ /** Lists are domain data: only the global domain is handled, where every session reads and writes the same list. */
17
+ const GLOBAL_DOMAIN = new Set(['', 'global']);
18
+ /**
19
+ * Reads and replaces the columns of a table's list (one view, not a related list, not a user's
20
+ * personalized list) through the classic List Layout page, the path the platform itself uses.
21
+ *
22
+ * A save deletes the list's `sys_ui_list` record and inserts a new one (a new sys_id each time),
23
+ * captured as one `sys_ui_list_<table>_<view>` update. So the list is found by table and view,
24
+ * never by sys_id, and after the save its application, update name and columns are read back.
25
+ * A table with no list of its own shows its parent's; saving then creates its own list.
26
+ *
27
+ * The writer never changes the user's working set. The target update set must already be the
28
+ * user's set for the list's application (see `WorkingSetManager.useUpdateSet`).
29
+ */
30
+ export class ListLayoutWriter {
31
+ _instance;
32
+ constructor(_instance) {
33
+ this._instance = _instance;
34
+ }
35
+ /** The list's current columns. `exists` is false when the table has no list of its own for the view. */
36
+ async getListLayout(table, view = '') {
37
+ if (!NAME.test(table ?? '') || !(view === '' || NAME.test(view ?? '')))
38
+ throw new MetadataScopeError('invalid_input');
39
+ const reader = this.reader();
40
+ const list = await findList(reader, table, await viewId(reader, view));
41
+ if (!list)
42
+ return { table, view, exists: false, columns: [] };
43
+ return { table, view, exists: true, sysId: list.sys_id, scope: list.sys_scope, updateName: list.sys_update_name, columns: await columns(reader, list.sys_id) };
44
+ }
45
+ /** Replace the list's columns with `columns`, in order, and verify the result and its capture. */
46
+ async setListLayout(table, options) {
47
+ const view = options?.view ?? '';
48
+ if (!NAME.test(table ?? '') || !(view === '' || NAME.test(view)) || !options?.updateSet || !ID.test(options.updateSet)) {
49
+ throw new MetadataScopeError('invalid_input');
50
+ }
51
+ const wanted = options.columns;
52
+ if (!Array.isArray(wanted) || !wanted.length || wanted.some(value => typeof value !== 'string'))
53
+ throw new MetadataScopeError('invalid_input');
54
+ for (const value of wanted)
55
+ if (!COLUMN.test(value))
56
+ throw new MetadataScopeError('field_not_supported', { field: value });
57
+ if (new Set(wanted).size !== wanted.length)
58
+ throw new MetadataScopeError('invalid_input');
59
+ const reader = this.reader();
60
+ let submitted = false;
61
+ let report = {};
62
+ let name = `sys_ui_list_${table}_${view || 'null'}`;
63
+ let savedId = '';
64
+ try {
65
+ const { store, ...scope } = await resolveScope(reader, options.scope);
66
+ if (store && options.storeCustomization?.acknowledgeUpgradeSkip !== true)
67
+ throw new MetadataScopeError('store_scope');
68
+ const viewSysId = await viewId(reader, view);
69
+ const list = await findList(reader, table, viewSysId);
70
+ if (list) {
71
+ if (list.sys_scope !== scope.sysId)
72
+ throw new MetadataScopeError('scope_mismatch');
73
+ if (['read', 'protected'].includes(list.sys_policy))
74
+ throw new MetadataScopeError('protected_record', { table: 'sys_ui_list' });
75
+ if (!GLOBAL_DOMAIN.has(list.sys_domain))
76
+ throw new MetadataScopeError('domain_not_supported');
77
+ if (!UPDATE_NAME.test(list.sys_update_name))
78
+ throw new MetadataScopeError('evidence_unavailable');
79
+ name = list.sys_update_name;
80
+ }
81
+ const set = await reader.exact('sys_update_set', options.updateSet, 'application,state');
82
+ if (!set || set.state !== 'in progress' || set.application !== scope.sysId) {
83
+ throw new MetadataScopeError('invalid_input', set ? { updateSetState: set.state, updateSetApplication: set.application } : undefined);
84
+ }
85
+ const users = await reader.rows('sys_user', 'sys_id=javascript:gs.getUserID()', 'sys_id,sys_domain');
86
+ if (users.length !== 1 || !ID.test(users[0].sys_id))
87
+ throw new MetadataScopeError('evidence_unavailable');
88
+ // A user in another domain would save a new list in that domain and leave this one as it is.
89
+ if (!GLOBAL_DOMAIN.has(users[0].sys_domain))
90
+ throw new MetadataScopeError('domain_not_supported');
91
+ const user = users[0].sys_id;
92
+ const preferences = async () => {
93
+ const rows = await reader.rows('sys_user_preference', `user=${user}`, 'sys_id,user,name,value');
94
+ if (rows.some(pref => pref.user !== user))
95
+ throw new MetadataScopeError('evidence_unavailable');
96
+ return rows;
97
+ };
98
+ const before = await preferences();
99
+ // The page saves into the user's set for the transaction scope; it takes no set parameter.
100
+ if (preferenceValue(before, `updateSetForScope${scope.sysId}`) !== options.updateSet)
101
+ throw new MetadataScopeError('update_set_not_current');
102
+ const previous = list ? await columns(reader, list.sys_id) : [];
103
+ const request = SessionManager.getInstance().getRequest(this._instance);
104
+ const page = await request.get({ method: 'GET', path: '/slushbucket.do', headers: null, body: null,
105
+ query: { sysparm_form: 'list', sysparm_list: table, sysparm_view: view, sysparm_transaction_scope: scope.sysId },
106
+ requires: READ_ONLY, responseFormat: 'text', redirect: 'manual', sensitive: true });
107
+ if (page.status !== 200)
108
+ throw Object.assign(new Error('form_redirect'), { redirectPath: locationPath(page.headers) });
109
+ const form = parseSlushbucketPage(typeof page.data === 'string' ? page.data : '');
110
+ const token = form.inputs.sysparm_ck;
111
+ if (!token)
112
+ throw new MetadataScopeError('csrf_token_unavailable');
113
+ if (form.inputs.sysparm_transaction_scope !== scope.sysId || form.inputs.sys_target !== table || form.inputs.sysparm_form !== 'list' ||
114
+ form.inputs.sysparm_list !== table || form.inputs.sysparm_collection || form.inputs.sysparm_collection_relationship) {
115
+ throw new MetadataScopeError('scope_not_applied');
116
+ }
117
+ if (!form.canSave)
118
+ throw new MetadataScopeError('not_permitted');
119
+ // The page must be showing the list read above: otherwise the save would rewrite a different one.
120
+ if (list && JSON.stringify(form.selected) !== JSON.stringify(previous))
121
+ throw new MetadataScopeError('evidence_unavailable');
122
+ const offered = new Set([...form.available, ...form.selected]);
123
+ for (const value of wanted)
124
+ if (!offered.has(value))
125
+ throw new MetadataScopeError('field_not_supported', { field: value });
126
+ const chosen = new Set(wanted);
127
+ const available = [...form.available, ...form.selected].filter(value => !chosen.has(value));
128
+ const loaded = await preferences();
129
+ if (!comparePreferences(before, loaded).valid)
130
+ throw new MetadataVerificationError('session_changed', 'sys_ui_list', list?.sys_id ?? '', undefined, [], false);
131
+ const priorCaptures = await reader.rows('sys_update_xml', `name=${name}`, 'sys_id,name,sys_mod_count');
132
+ if (priorCaptures.some(capture => capture.name !== name || !/^\d+$/.test(capture.sys_mod_count)))
133
+ throw new MetadataScopeError('evidence_unavailable');
134
+ const versions = new Map(priorCaptures.map(capture => [capture.sys_id, capture.sys_mod_count]));
135
+ const started = new Date().toISOString().slice(0, 19).replace('T', ' ');
136
+ const [lcodes0, lcodes1] = [joinLayoutValues(available), joinLayoutValues(wanted)];
137
+ if (lcodes0 === undefined || lcodes1 === undefined)
138
+ throw new MetadataScopeError('evidence_unavailable');
139
+ submitted = true;
140
+ let submitFailure;
141
+ try {
142
+ await request.post({ method: 'POST', path: '/slushbucket.do', headers: null, query: null, body: null,
143
+ responseFormat: 'text', redirect: 'manual', sensitive: true, fields: {
144
+ sysparm_ck: token, sys_action: 'sysverb_save', sys_target: table, sysparm_list: table,
145
+ sysparm_form: 'list', sysparm_view: view, sysparm_collection: '', sysparm_collection_relationship: '',
146
+ sysparm_referring_url: form.inputs.sysparm_referring_url ?? '', sysparm_redirect_url: '', sysparm_sys_id: '',
147
+ sysparm_record_scope: form.inputs.sysparm_record_scope ?? '', sysparm_transaction_scope: scope.sysId,
148
+ lcodes_0: lcodes0, lcodes_1: lcodes1, lcodes_2: '',
149
+ } });
150
+ }
151
+ catch (error) {
152
+ if (isPolicyRefusal(error))
153
+ throw error;
154
+ submitFailure = error;
155
+ }
156
+ report = { predictedUpdateSetSysId: options.updateSet, updateName: name };
157
+ const fail = (code, id, messages) => {
158
+ throw new MetadataVerificationError(code, 'sys_ui_list', id ?? list?.sys_id ?? '', report, messages ?? []);
159
+ };
160
+ // The save replaced the record: find the list again. More than one means the save added a list
161
+ // (another domain, or the old row kept): name every row so the extra one can be removed.
162
+ const lists = await listRows(reader, table, viewSysId);
163
+ if (lists.length > 1) {
164
+ const newest = [...lists].sort((a, b) => b.sys_created_on.localeCompare(a.sys_created_on))[0];
165
+ fail('verification_unavailable', newest.sys_id, [`sys_ui_list rows for ${table} after the save: ${lists.map(row => row.sys_id).join(', ')}`]);
166
+ }
167
+ const saved = lists[0];
168
+ if (!saved)
169
+ fail('write_not_applied');
170
+ savedId = saved.sys_id;
171
+ report.recordScope = saved.sys_scope;
172
+ const after = await columns(reader, saved.sys_id);
173
+ const observed = await reader.rows('sys_update_xml', `name=${name}^sys_updated_on>=${started}`, 'sys_id,name,update_set,application,action,sys_updated_on,sys_mod_count');
174
+ const comparison = comparePreferences(before, await preferences(), options.updateSet);
175
+ Object.assign(report, { preferencesUnchanged: comparison.unchanged, preferenceRowsReplaced: comparison.replaced, currentUpdateSet: comparison.currentUpdateSet });
176
+ if (JSON.stringify(after) !== JSON.stringify(wanted))
177
+ fail('write_not_applied', saved.sys_id);
178
+ if (saved.sys_scope !== scope.sysId)
179
+ fail('scope_not_applied', saved.sys_id);
180
+ if (saved.sys_update_name !== name)
181
+ fail('not_captured', saved.sys_id);
182
+ if (!GLOBAL_DOMAIN.has(saved.sys_domain))
183
+ fail('scope_not_applied', saved.sys_id);
184
+ const captures = observed.filter(capture => versions.get(capture.sys_id) !== capture.sys_mod_count);
185
+ if (!captures.length || observed.some(capture => capture.name !== name || capture.sys_updated_on < started))
186
+ fail('not_captured', saved.sys_id);
187
+ // One save writes one List Layout capture; more than one changed row cannot be attributed to this save.
188
+ if (captures.length > 1)
189
+ fail('verification_unavailable', saved.sys_id);
190
+ const capture = captures[0];
191
+ const target = ID.test(capture.update_set) ? await reader.exact('sys_update_set', capture.update_set, 'name,application') : undefined;
192
+ if (!target)
193
+ fail('not_captured', saved.sys_id);
194
+ Object.assign(report, { updateSetSysId: target.sys_id, updateSetName: target.name, updateSetScope: target.application, action: capture.action });
195
+ if (target.sys_id !== options.updateSet)
196
+ fail('captured_elsewhere', saved.sys_id);
197
+ if (target.application !== scope.sysId || capture.application !== scope.sysId)
198
+ fail('mixed_scope_capture', saved.sys_id);
199
+ if (capture.action !== 'INSERT_OR_UPDATE')
200
+ fail('not_captured', saved.sys_id);
201
+ if (store)
202
+ report.customization = await customizationEvidence(reader, capture.sys_id, name);
203
+ if (!comparison.valid)
204
+ fail('session_changed', saved.sys_id);
205
+ if (submitFailure)
206
+ fail('verification_unavailable', saved.sys_id);
207
+ return { table, view, scope, sysId: saved.sys_id, ...(list ? { previousSysId: list.sys_id } : {}), created: !list, columns: after,
208
+ previousColumns: previous, capture: report };
209
+ }
210
+ catch (error) {
211
+ if (isPolicyRefusal(error) || (!submitted && error instanceof MetadataScopeError) || error instanceof MetadataVerificationError)
212
+ throw stripSecretsFromError(error);
213
+ if (!submitted && error instanceof Error && error.message === 'form_redirect') {
214
+ throw new MetadataScopeError('form_redirected', { table: 'sys_ui_list', redirectPath: error.redirectPath });
215
+ }
216
+ if (!submitted)
217
+ throw new MetadataScopeError('evidence_unavailable');
218
+ throw new MetadataVerificationError('verification_unavailable', 'sys_ui_list', savedId, report, []);
219
+ }
220
+ }
221
+ reader() {
222
+ return new MetadataReader(SessionManager.getInstance().getRequest(this._instance));
223
+ }
224
+ }
225
+ /**
226
+ * The view's sys_ui_view sys_id. The page takes a view by name and calls the Default view '';
227
+ * sys_ui_list.view references sys_ui_view, whose Default view's sys_id is literally 'Default view'.
228
+ */
229
+ async function viewId(reader, view) {
230
+ if (view === '')
231
+ return 'Default view';
232
+ const rows = await reader.rows('sys_ui_view', `name=${view}`, 'sys_id,name');
233
+ const exact = rows.filter(row => row.name === view);
234
+ if (!exact.length)
235
+ throw new MetadataScopeError('invalid_input');
236
+ if (exact.length > 1 || !ID.test(exact[0].sys_id))
237
+ throw new MetadataScopeError('evidence_unavailable');
238
+ return exact[0].sys_id;
239
+ }
240
+ /** Every list of the table for the view that is not a related list or a user's personalized list. */
241
+ async function listRows(reader, table, view) {
242
+ const rows = await reader.rows('sys_ui_list', `name=${table}^view=${view}^sys_userISEMPTY^parentISEMPTY^relationshipISEMPTY`, `sys_id,${LIST_FIELDS}`);
243
+ if (rows.some(row => row.name !== table || row.view !== view || !ID.test(row.sys_id)))
244
+ throw new MetadataScopeError('evidence_unavailable');
245
+ return rows;
246
+ }
247
+ /** The table's own list for the view; more than one (for example one per domain) cannot be told apart. */
248
+ async function findList(reader, table, view) {
249
+ const rows = await listRows(reader, table, view);
250
+ if (rows.length > 1)
251
+ throw new MetadataScopeError('evidence_unavailable');
252
+ return rows[0];
253
+ }
254
+ /** The list's columns in position order. */
255
+ async function columns(reader, list) {
256
+ const rows = await reader.rows('sys_ui_list_element', `list_id=${list}`, 'sys_id,list_id,element,position');
257
+ if (rows.some(row => row.list_id !== list || !/^-?\d+$/.test(row.position) || !COLUMN.test(row.element)))
258
+ throw new MetadataScopeError('evidence_unavailable');
259
+ return rows.sort((a, b) => Number(a.position) - Number(b.position)).map(row => row.element);
260
+ }
261
+ function locationPath(headers) {
262
+ const location = headers?.location;
263
+ if (typeof location !== 'string')
264
+ return undefined;
265
+ try {
266
+ return new URL(location, 'https://instance.invalid').pathname;
267
+ }
268
+ catch {
269
+ return undefined;
270
+ }
271
+ }
272
+ //# sourceMappingURL=ListLayoutWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListLayoutWriter.js","sourceRoot":"","sources":["../../../src/sn/metadata/ListLayoutWriter.ts"],"names":[],"mappings":"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"}
@@ -100,3 +100,91 @@ export interface FormLayoutWriteResult {
100
100
  previousElements: string[];
101
101
  capture: CaptureReport;
102
102
  }
103
+ /** A table's list columns for one view (not a related list, not a user's personalized list). */
104
+ export interface ListLayout {
105
+ table: string;
106
+ /** View name; '' is the Default view. */
107
+ view: string;
108
+ /** False when the table has no list of its own for the view (it shows its parent's); a save creates one. */
109
+ exists: boolean;
110
+ /** sys_id of the list, when it exists. A save replaces it, so it changes on every save. */
111
+ sysId?: string;
112
+ /** sys_scope of the list, when it exists. */
113
+ scope?: string;
114
+ /** sys_update_name of the list, when it exists. */
115
+ updateName?: string;
116
+ /** Column names in order; dot-walked columns as `field.field`. */
117
+ columns: string[];
118
+ }
119
+ export interface ListLayoutWriteOptions {
120
+ /** The complete new column list, in order. Each column must be offered by the List Layout page. */
121
+ columns: string[];
122
+ /** View name; '' or omitted is the Default view. */
123
+ view?: string;
124
+ /** Must be the list's own application; for a table with no list yet, the application the new list will belong to. */
125
+ scope: MetadataScopeRef;
126
+ /** In progress set of that application, already the user's set for it (WorkingSetManager.useUpdateSet). */
127
+ updateSet: string;
128
+ /** Required when the list belongs to an installed Store application. */
129
+ storeCustomization?: StoreCustomizationOptions;
130
+ }
131
+ export interface ListLayoutWriteResult {
132
+ table: string;
133
+ view: string;
134
+ scope: {
135
+ sysId: string;
136
+ scope: string;
137
+ };
138
+ /** sys_id of the list after the save (a new record on every save). */
139
+ sysId: string;
140
+ /** sys_id of the list the save replaced; absent when the list was created. */
141
+ previousSysId?: string;
142
+ /** True when the table had no list of its own and the save created one. */
143
+ created: boolean;
144
+ /** The columns read back after the save. */
145
+ columns: string[];
146
+ /** The columns before the save, to restore them; empty when the list was created. */
147
+ previousColumns: string[];
148
+ capture: CaptureReport;
149
+ }
150
+ export interface ColumnWriteOptions {
151
+ /**
152
+ * The column name, lower case. The platform's prefix is added when it is missing: `u_` in Global, `<scope>_` when the
153
+ * application adds the column to another application's table, none on the application's own table.
154
+ */
155
+ column: string;
156
+ /** The column label (the Field Label record, in the session's language). */
157
+ label: string;
158
+ /** The column type: a sys_glide_object name such as string, integer, boolean, glide_date_time or reference. */
159
+ type: string;
160
+ /** Maximum length, for string types. The platform's default for the type applies when omitted. */
161
+ maxLength?: number;
162
+ /** The referenced table: required for type reference, optional for glide_list, refused otherwise. */
163
+ reference?: string;
164
+ /** The application the column belongs to. */
165
+ scope: MetadataScopeRef;
166
+ /** In progress set of that application, already the user's set for it (WorkingSetManager.useUpdateSet). */
167
+ updateSet: string;
168
+ /** Required when the application is an installed Store application. */
169
+ storeCustomization?: StoreCustomizationOptions;
170
+ }
171
+ export interface ColumnWriteResult {
172
+ table: string;
173
+ /** The column's name as the platform saved it, prefix included. */
174
+ column: string;
175
+ /** sys_id of the sys_dictionary record. */
176
+ sysId: string;
177
+ label: string;
178
+ type: string;
179
+ scope: {
180
+ sysId: string;
181
+ scope: string;
182
+ };
183
+ /** Form sections the platform appended the field to (the Default view's main section); empty when it placed it nowhere. */
184
+ formSections: string[];
185
+ /** Update names of every capture the save made, each verified in the set: Dictionary, Field Label(s), Form Layout(s). */
186
+ captures: string[];
187
+ /** The Dictionary capture. */
188
+ capture: CaptureReport;
189
+ messages: string[];
190
+ }
@@ -11,7 +11,7 @@ export interface MetadataErrorDetail {
11
11
  }
12
12
  /** A refusal before the form POST. Messages contain codes, never caller values. */
13
13
  export declare class MetadataScopeError extends Error {
14
- readonly code: 'scope_required' | 'scope_unknown' | 'scope_ambiguous' | 'scope_mismatch' | 'scope_not_applied' | 'store_scope' | 'table_not_supported' | 'field_not_supported' | 'delete_not_supported' | 'not_permitted' | 'csrf_token_unavailable' | 'invalid_input' | 'evidence_unavailable' | 'update_set_required' | 'protected_record' | 'form_redirected' | 'update_set_not_current' | 'section_not_supported';
14
+ readonly code: 'scope_required' | 'scope_unknown' | 'scope_ambiguous' | 'scope_mismatch' | 'scope_not_applied' | 'store_scope' | 'table_not_supported' | 'field_not_supported' | 'delete_not_supported' | 'not_permitted' | 'csrf_token_unavailable' | 'invalid_input' | 'evidence_unavailable' | 'update_set_required' | 'protected_record' | 'form_redirected' | 'update_set_not_current' | 'section_not_supported' | 'domain_not_supported' | 'column_exists';
15
15
  readonly detail?: MetadataErrorDetail;
16
- constructor(code: 'scope_required' | 'scope_unknown' | 'scope_ambiguous' | 'scope_mismatch' | 'scope_not_applied' | 'store_scope' | 'table_not_supported' | 'field_not_supported' | 'delete_not_supported' | 'not_permitted' | 'csrf_token_unavailable' | 'invalid_input' | 'evidence_unavailable' | 'update_set_required' | 'protected_record' | 'form_redirected' | 'update_set_not_current' | 'section_not_supported', detail?: MetadataErrorDetail);
16
+ constructor(code: 'scope_required' | 'scope_unknown' | 'scope_ambiguous' | 'scope_mismatch' | 'scope_not_applied' | 'store_scope' | 'table_not_supported' | 'field_not_supported' | 'delete_not_supported' | 'not_permitted' | 'csrf_token_unavailable' | 'invalid_input' | 'evidence_unavailable' | 'update_set_required' | 'protected_record' | 'form_redirected' | 'update_set_not_current' | 'section_not_supported' | 'domain_not_supported' | 'column_exists', detail?: MetadataErrorDetail);
17
17
  }
@@ -1,10 +1,12 @@
1
1
  const IDENTIFIER = /^[a-z0-9_]{1,80}$/i;
2
+ // A field may be dot-walked (caller_id.email); each part is an identifier.
3
+ const FIELD = /^[a-z0-9_]{1,80}(\.[a-z0-9_]{1,80}){0,5}$/i;
2
4
  const STATES = new Set(['in progress', 'complete', 'ignore']);
3
5
  function safeDetail(detail) {
4
6
  if (!detail)
5
7
  return undefined;
6
8
  const safe = {};
7
- if (detail.field && IDENTIFIER.test(detail.field))
9
+ if (detail.field && FIELD.test(detail.field))
8
10
  safe.field = detail.field;
9
11
  if (detail.table && IDENTIFIER.test(detail.table))
10
12
  safe.table = detail.table;
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataScopeError.js","sourceRoot":"","sources":["../../../src/sn/metadata/MetadataScopeError.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,oBAAoB,CAAC;AACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAa9D,SAAS,UAAU,CAAC,MAA4B;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7E,IAAI,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7E,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS;QAAE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACrI,IAAI,MAAM,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,oBAAoB,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC;QACnI,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,mFAAmF;AACnF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEN;IADnB,MAAM,CAAuB;IAC7C,YAAmC,IAImB,EAClD,MAA4B;QAC5B,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QANV,SAAI,GAAJ,IAAI,CAIe;QAGlD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;CACJ"}
1
+ {"version":3,"file":"MetadataScopeError.js","sourceRoot":"","sources":["../../../src/sn/metadata/MetadataScopeError.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,oBAAoB,CAAC;AACxC,2EAA2E;AAC3E,MAAM,KAAK,GAAG,4CAA4C,CAAC;AAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAa9D,SAAS,UAAU,CAAC,MAA4B;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACxE,IAAI,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7E,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS;QAAE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACrI,IAAI,MAAM,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,oBAAoB,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC;QACnI,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,mFAAmF;AACnF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEN;IADnB,MAAM,CAAuB;IAC7C,YAAmC,IAI8D,EAC7F,MAA4B;QAC5B,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QANV,SAAI,GAAJ,IAAI,CAI0D;QAG7F,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonisoft/now-sdk-ext-core",
3
- "version": "6.10.0",
3
+ "version": "6.12.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",