@sonisoft/now-sdk-ext-core 6.11.0 → 6.13.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 +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/sn/metadata/ColumnWriter.d.ts +24 -0
- package/dist/sn/metadata/ColumnWriter.js +292 -0
- package/dist/sn/metadata/ColumnWriter.js.map +1 -0
- package/dist/sn/metadata/MetadataModels.d.ts +41 -0
- package/dist/sn/metadata/MetadataScopeError.d.ts +2 -2
- package/dist/sn/metadata/MetadataScopeError.js.map +1 -1
- package/dist/sn/updateset/UpdateSetExportModels.d.ts +70 -0
- package/dist/sn/updateset/UpdateSetExportModels.js +14 -0
- package/dist/sn/updateset/UpdateSetExportModels.js.map +1 -0
- package/dist/sn/updateset/UpdateSetExporter.d.ts +60 -0
- package/dist/sn/updateset/UpdateSetExporter.js +365 -0
- package/dist/sn/updateset/UpdateSetExporter.js.map +1 -0
- package/dist/sn/updateset/UpdateSetManager.d.ts +6 -5
- package/dist/sn/updateset/UpdateSetManager.js +10 -71
- package/dist/sn/updateset/UpdateSetManager.js.map +1 -1
- package/package.json +1 -1
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';
|
|
@@ -107,6 +108,8 @@ export * from './sn/task/TaskModels.js';
|
|
|
107
108
|
export * from './sn/task/TaskOperations.js';
|
|
108
109
|
export * from './sn/transaction/ClusterTransactionManager.js';
|
|
109
110
|
export * from './sn/transaction/ClusterTransactionModels.js';
|
|
111
|
+
export * from './sn/updateset/UpdateSetExporter.js';
|
|
112
|
+
export * from './sn/updateset/UpdateSetExportModels.js';
|
|
110
113
|
export * from './sn/updateset/UpdateSetManager.js';
|
|
111
114
|
export * from './sn/updateset/UpdateSetModels.js';
|
|
112
115
|
export * from './sn/updateset/WorkingSetManager.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';
|
|
@@ -107,6 +108,8 @@ export * from './sn/task/TaskModels.js';
|
|
|
107
108
|
export * from './sn/task/TaskOperations.js';
|
|
108
109
|
export * from './sn/transaction/ClusterTransactionManager.js';
|
|
109
110
|
export * from './sn/transaction/ClusterTransactionModels.js';
|
|
111
|
+
export * from './sn/updateset/UpdateSetExporter.js';
|
|
112
|
+
export * from './sn/updateset/UpdateSetExportModels.js';
|
|
110
113
|
export * from './sn/updateset/UpdateSetManager.js';
|
|
111
114
|
export * from './sn/updateset/UpdateSetModels.js';
|
|
112
115
|
export * from './sn/updateset/WorkingSetManager.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,
|
|
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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Models for {@link UpdateSetExporter}: exporting an update set to the platform's XML unload.
|
|
3
|
+
*/
|
|
4
|
+
export interface UpdateSetExportOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Export a set (or batch) that is not Complete. The platform's Export to XML is offered only for a
|
|
7
|
+
* Complete set; an In progress export is a snapshot of unfinished work. For a batch it also includes
|
|
8
|
+
* children that are not Complete, as `UpdateSetExport.onlyIncludeCompletedChildren = false` does.
|
|
9
|
+
*/
|
|
10
|
+
includeIncomplete?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** One update set in the file. For a local export, `sysId` is the source set, not the temporary copy. */
|
|
13
|
+
export interface ExportedUpdateSet {
|
|
14
|
+
sysId: string;
|
|
15
|
+
name: string;
|
|
16
|
+
state: string;
|
|
17
|
+
/** sys_update_xml rows in the set, and in the file. */
|
|
18
|
+
records: number;
|
|
19
|
+
}
|
|
20
|
+
export interface UpdateSetExportResult {
|
|
21
|
+
/** The unload XML. It holds every record's full payload. */
|
|
22
|
+
xml: string;
|
|
23
|
+
/** `local`: a sys_update_set; `retrieved`: a sys_remote_update_set (Retrieved Update Sets). */
|
|
24
|
+
source: 'local' | 'retrieved';
|
|
25
|
+
/** `batch`: a batch base exported with its children. */
|
|
26
|
+
kind: 'single' | 'batch';
|
|
27
|
+
/** The set that was asked for. */
|
|
28
|
+
updateSet: {
|
|
29
|
+
sysId: string;
|
|
30
|
+
name: string;
|
|
31
|
+
state: string;
|
|
32
|
+
application: string;
|
|
33
|
+
};
|
|
34
|
+
/** Every set in the file, the requested one first. */
|
|
35
|
+
sets: ExportedUpdateSet[];
|
|
36
|
+
/** Batch children the platform leaves out (not Complete, without includeIncomplete), and their descendants. */
|
|
37
|
+
excluded: Array<{
|
|
38
|
+
sysId: string;
|
|
39
|
+
name: string;
|
|
40
|
+
state: string;
|
|
41
|
+
}>;
|
|
42
|
+
recordCount: number;
|
|
43
|
+
/**
|
|
44
|
+
* A local export makes a temporary Retrieved Update Set copy, which the download deletes. `removedBy` is
|
|
45
|
+
* `platform` when the download removed it and `nex` when the exporter had to; both are read back.
|
|
46
|
+
*/
|
|
47
|
+
cleanup?: {
|
|
48
|
+
temporarySysId: string;
|
|
49
|
+
removedBy: 'platform' | 'nex';
|
|
50
|
+
};
|
|
51
|
+
messages: string[];
|
|
52
|
+
}
|
|
53
|
+
export type UpdateSetExportErrorCode = 'invalid_input' | 'update_set_not_found' | 'update_set_incomplete' | 'batch_member' | 'retrieved_state' | 'evidence_unavailable' | 'script_result_unavailable' | 'export_failed' | 'export_mismatch' | 'cleanup_unverified';
|
|
54
|
+
/** Identifiers and counts that explain a refusal; never names, descriptions or payloads. */
|
|
55
|
+
export interface UpdateSetExportErrorDetail {
|
|
56
|
+
updateSet?: string;
|
|
57
|
+
/** The batch base to export instead of a batch member. */
|
|
58
|
+
base?: string;
|
|
59
|
+
state?: string;
|
|
60
|
+
status?: number;
|
|
61
|
+
expected?: number;
|
|
62
|
+
actual?: number;
|
|
63
|
+
/** Temporary Retrieved Update Set copies left on the instance: delete them (sys_remote_update_set). */
|
|
64
|
+
temporary?: string[];
|
|
65
|
+
}
|
|
66
|
+
export declare class UpdateSetExportError extends Error {
|
|
67
|
+
readonly code: UpdateSetExportErrorCode;
|
|
68
|
+
readonly detail?: UpdateSetExportErrorDetail;
|
|
69
|
+
constructor(code: UpdateSetExportErrorCode, detail?: UpdateSetExportErrorDetail);
|
|
70
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Models for {@link UpdateSetExporter}: exporting an update set to the platform's XML unload.
|
|
3
|
+
*/
|
|
4
|
+
export class UpdateSetExportError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
detail;
|
|
7
|
+
constructor(code, detail) {
|
|
8
|
+
super(`Update set export failed: ${code}`);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.detail = detail;
|
|
11
|
+
this.name = 'UpdateSetExportError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=UpdateSetExportModels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateSetExportModels.js","sourceRoot":"","sources":["../../../src/sn/updateset/UpdateSetExportModels.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmEH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACR;IAAgD;IAAnF,YAAmC,IAA8B,EAAkB,MAAmC;QAClH,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QADZ,SAAI,GAAJ,IAAI,CAA0B;QAAkB,WAAM,GAAN,MAAM,CAA6B;QAElH,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACvC,CAAC;CACJ"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ServiceNowInstance } from '../ServiceNowInstance.js';
|
|
2
|
+
import type { UpdateSetExportOptions, UpdateSetExportResult } from './UpdateSetExportModels.js';
|
|
3
|
+
/**
|
|
4
|
+
* Exports an update set to the XML unload the platform's own UI actions produce, and checks the file.
|
|
5
|
+
*
|
|
6
|
+
* - A local set uses **Export to XML** (`UpdateSetExport.exportUpdateSet`, then `export_update_set.do`).
|
|
7
|
+
* - A local batch base uses **Export Update Set Batch to XML** (`exportHierarchy`, then
|
|
8
|
+
* `export_base_update_set.do`).
|
|
9
|
+
* - A Retrieved Update Set is a plain read of the same processors with `sysparm_is_remote=true`.
|
|
10
|
+
*
|
|
11
|
+
* A local export copies the set into a temporary Retrieved Update Set (state `loaded`), which the
|
|
12
|
+
* download deletes. Left behind, it would sit under Retrieved Update Sets ready to preview and commit,
|
|
13
|
+
* so the exporter reads it back afterwards, deletes it if the platform did not, and refuses to report
|
|
14
|
+
* success while one remains. The file must hold exactly the expected sets and sys_update_xml rows.
|
|
15
|
+
*/
|
|
16
|
+
export declare class UpdateSetExporter {
|
|
17
|
+
private readonly _instance;
|
|
18
|
+
private readonly _request;
|
|
19
|
+
private readonly _reader;
|
|
20
|
+
/** How long to wait for the platform to finish deleting a temporary copy's rows (about 15 seconds). */
|
|
21
|
+
private readonly _poll;
|
|
22
|
+
constructor(_instance: ServiceNowInstance);
|
|
23
|
+
/**
|
|
24
|
+
* Export one update set, a batch base with its children, or a Retrieved Update Set.
|
|
25
|
+
*
|
|
26
|
+
* @param sysId A sys_update_set or sys_remote_update_set sys_id.
|
|
27
|
+
* @throws UpdateSetExportError when the set cannot be exported as asked or the file does not match it.
|
|
28
|
+
*/
|
|
29
|
+
exportUpdateSet(sysId: string, options?: UpdateSetExportOptions): Promise<UpdateSetExportResult>;
|
|
30
|
+
/** Which sets the platform will put in the file, refusing what its UI would not offer. */
|
|
31
|
+
private plan;
|
|
32
|
+
/** The sets exportHierarchy walks: children by parent, Complete only unless includeIncomplete. */
|
|
33
|
+
private hierarchy;
|
|
34
|
+
/** Make the temporary copy with the platform's own UpdateSetExport, as the UI action does. */
|
|
35
|
+
private copy;
|
|
36
|
+
/**
|
|
37
|
+
* The script's result is unknown: report any copy of this set that appeared meanwhile instead of
|
|
38
|
+
* deleting it, because another session may be exporting the same set.
|
|
39
|
+
*/
|
|
40
|
+
private leftovers;
|
|
41
|
+
/** Retrieved Update Set copies of a local set, by remote_sys_id. */
|
|
42
|
+
private copies;
|
|
43
|
+
private download;
|
|
44
|
+
/**
|
|
45
|
+
* Remove the temporary copy if the download did not, and prove that neither it nor its rows remain.
|
|
46
|
+
* The platform's delete runs after the download returns: live, a batch's copies and a set's rows were
|
|
47
|
+
* still readable at first. So after a good download the exporter waits for the platform before
|
|
48
|
+
* deleting anything itself, and a delete that races the platform's is settled by the read-back.
|
|
49
|
+
*/
|
|
50
|
+
private cleanup;
|
|
51
|
+
private parse;
|
|
52
|
+
/** The file holds exactly the planned sets, each with its own number of sys_update_xml rows. */
|
|
53
|
+
private verify;
|
|
54
|
+
private result;
|
|
55
|
+
private token;
|
|
56
|
+
/** sys_update_xml counts come from the Stats API: a set can hold more rows than a paged read allows. */
|
|
57
|
+
private count;
|
|
58
|
+
/** Reads raise MetadataScopeError('evidence_unavailable'); export callers see their own code. */
|
|
59
|
+
private evidence;
|
|
60
|
+
}
|