@sonisoft/now-sdk-ext-core 6.11.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,6 +86,7 @@ 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';
90
91
  export * from './sn/metadata/ListLayoutWriter.js';
91
92
  export * from './sn/metadata/MetadataFormWriter.js';
package/dist/index.js CHANGED
@@ -86,6 +86,7 @@ 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';
90
91
  export * from './sn/metadata/ListLayoutWriter.js';
91
92
  export * from './sn/metadata/MetadataFormWriter.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC;AACvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACpG,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,0EAA0E;AAC1E,4EAA4E;AAC5E,gEAAgE;AAChE,cAAc,gBAAgB,CAAC"}
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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"}
@@ -147,3 +147,44 @@ export interface ListLayoutWriteResult {
147
147
  previousColumns: string[];
148
148
  capture: CaptureReport;
149
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' | 'domain_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' | 'domain_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 +1 @@
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,IAI4C,EAC3E,MAA4B;QAC5B,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QANV,SAAI,GAAJ,IAAI,CAIwC;QAG3E,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.11.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",