@sonisoft/now-sdk-ext-core 6.10.0 → 6.11.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 +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/sn/metadata/ListLayoutWriter.d.ts +23 -0
- package/dist/sn/metadata/ListLayoutWriter.js +272 -0
- package/dist/sn/metadata/ListLayoutWriter.js.map +1 -0
- package/dist/sn/metadata/MetadataModels.d.ts +47 -0
- package/dist/sn/metadata/MetadataScopeError.d.ts +2 -2
- package/dist/sn/metadata/MetadataScopeError.js +3 -1
- package/dist/sn/metadata/MetadataScopeError.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -87,6 +87,7 @@ export * from './sn/health/InstanceHealth.js';
|
|
|
87
87
|
export * from './sn/knowledge/KnowledgeManager.js';
|
|
88
88
|
export * from './sn/knowledge/KnowledgeModels.js';
|
|
89
89
|
export * from './sn/metadata/FormLayoutWriter.js';
|
|
90
|
+
export * from './sn/metadata/ListLayoutWriter.js';
|
|
90
91
|
export * from './sn/metadata/MetadataFormWriter.js';
|
|
91
92
|
export * from './sn/metadata/MetadataModels.js';
|
|
92
93
|
export * from './sn/metadata/MetadataScopeError.js';
|
package/dist/index.js
CHANGED
|
@@ -87,6 +87,7 @@ export * from './sn/health/InstanceHealth.js';
|
|
|
87
87
|
export * from './sn/knowledge/KnowledgeManager.js';
|
|
88
88
|
export * from './sn/knowledge/KnowledgeModels.js';
|
|
89
89
|
export * from './sn/metadata/FormLayoutWriter.js';
|
|
90
|
+
export * from './sn/metadata/ListLayoutWriter.js';
|
|
90
91
|
export * from './sn/metadata/MetadataFormWriter.js';
|
|
91
92
|
export * from './sn/metadata/MetadataModels.js';
|
|
92
93
|
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,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":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAoB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEpF,MAAM,EAAE,GAAG,iBAAiB,CAAC;AAC7B,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,MAAM,MAAM,GAAG,8BAA8B,CAAC;AAC9C,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,WAAW,GAAG,0EAA0E,CAAC;AAC/F,oHAAoH;AACpH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA3B,YAA2B,SAA6B;QAA7B,cAAS,GAAT,SAAS,CAAoB;IAAG,CAAC;IAE5D,wGAAwG;IACjG,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,IAAI,GAAG,EAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACtH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACnK,CAAC;IAED,kGAAkG;IAC3F,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,OAA+B;QACrE,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrH,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAC/I,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3H,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,MAAM,GAA2B,EAAE,CAAC;QACxC,IAAI,IAAI,GAAG,eAAe,KAAK,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QACpD,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACtE,IAAI,KAAK,IAAI,OAAO,CAAC,kBAAkB,EAAE,sBAAsB,KAAK,IAAI;gBAAE,MAAM,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;YACtH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACtD,IAAI,IAAI,EAAE,CAAC;gBACP,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK;oBAAE,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;gBACnF,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;oBAAE,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;oBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;gBAC9F,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;oBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;gBAClG,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;YAChC,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YACzF,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,aAAa,IAAI,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;gBACzE,MAAM,IAAI,kBAAkB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC1I,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,kCAAkC,EAAE,mBAAmB,CAAC,CAAC;YACrG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YAC1G,6FAA6F;YAC7F,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YAClG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7B,MAAM,WAAW,GAAG,KAAK,IAA4B,EAAE;gBACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,IAAI,EAAE,EAAE,wBAAwB,CAAC,CAAC;gBAChG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;oBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;gBAChG,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;YACnC,2FAA2F;YAC3F,IAAI,eAAe,CAAC,MAAM,EAAE,oBAAoB,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS;gBAAE,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;YAC7I,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEhE,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBACtG,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,CAAC,KAAK,EAAE;gBAChH,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvH,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,MAAM,CAAC,yBAAyB,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,MAAM;gBAChI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,+BAA+B,EAAE,CAAC;gBACtH,MAAM,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;YACjE,kGAAkG;YAClG,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YAC7H,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/D,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3H,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK;gBAAE,MAAM,IAAI,yBAAyB,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/J,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAC;YACvG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YACvJ,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAChG,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAExE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;YACnF,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YAEzG,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,aAAsB,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,OAAO,CAAC,IAAI,CAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;oBACxG,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;wBACjE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK;wBACrF,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,+BAA+B,EAAE,EAAE;wBACrG,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE;wBAC5G,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE,EAAE,yBAAyB,EAAE,KAAK,CAAC,KAAK;wBACpG,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;qBACrD,EAAE,CAAC,CAAC;YACb,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,eAAe,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;gBACxC,aAAa,GAAG,KAAK,CAAC;YAC1B,CAAC;YAED,MAAM,GAAG,EAAE,uBAAuB,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAkH,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;gBAC/I,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC/G,CAAC,CAAC;YACF,+FAA+F;YAC/F,yFAAyF;YACzF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,wBAAwB,KAAK,oBAAoB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAClJ,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACtC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YACvB,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,oBAAoB,OAAO,EAAE,EAC1F,wEAAwE,CAAC,CAAC;YAC9E,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,WAAW,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACtF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,CAAC,SAAS,EAAE,sBAAsB,EAAE,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAClK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9F,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK;gBAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7E,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI;gBAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;gBAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;YACpG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;gBAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAChJ,wGAAwG;YACxG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACjJ,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,SAAS;gBAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAClF,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,KAAK;gBAAE,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACzH,IAAI,OAAO,CAAC,MAAM,KAAK,kBAAkB;gBAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9E,IAAI,KAAK;gBAAE,MAAM,CAAC,aAAa,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5F,IAAI,CAAC,UAAU,CAAC,KAAK;gBAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,aAAa;gBAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAClE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK;gBAC7H,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAuB,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,YAAY,kBAAkB,CAAC,IAAI,KAAK,YAAY,yBAAyB;gBAAE,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACpK,IAAI,CAAC,SAAS,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;gBAC5E,MAAM,IAAI,kBAAkB,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAG,KAA2C,CAAC,YAAY,EAAE,CAAC,CAAC;YACvJ,CAAC;YACD,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YACrE,MAAM,IAAI,yBAAyB,CAAC,0BAA0B,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxG,CAAC;IACL,CAAC;IAEO,MAAM;QACV,OAAO,IAAI,cAAc,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC;CACJ;AAED;;;GAGG;AACH,KAAK,UAAU,MAAM,CAAC,MAAsB,EAAE,IAAY;IACtD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,cAAc,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,qGAAqG;AACrG,KAAK,UAAU,QAAQ,CAAC,MAAsB,EAAE,KAAa,EAAE,IAAY;IACvE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,KAAK,SAAS,IAAI,oDAAoD,EAAE,UAAU,WAAW,EAAE,CAAC,CAAC;IACvJ,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAC5I,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,0GAA0G;AAC1G,KAAK,UAAU,QAAQ,CAAC,MAAsB,EAAE,KAAa,EAAE,IAAY;IACvE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,4CAA4C;AAC5C,KAAK,UAAU,OAAO,CAAC,MAAsB,EAAE,IAAY;IACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,WAAW,IAAI,EAAE,EAAE,iCAAiC,CAAC,CAAC;IAC5G,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAC/J,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IAClC,MAAM,QAAQ,GAAI,OAA+C,EAAE,QAAQ,CAAC;IAC5E,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,CAAC;QAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC,QAAQ,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AACtG,CAAC"}
|
|
@@ -100,3 +100,50 @@ 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
|
+
}
|
|
@@ -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';
|
|
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', 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 &&
|
|
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,
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sonisoft/now-sdk-ext-core",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.11.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",
|