@softacus-software/elwis-data-mcp 0.1.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/CHANGELOG.md +15 -0
- package/LICENSE +6 -0
- package/README.md +183 -0
- package/dist/app-scope.js +92 -0
- package/dist/app-scope.js.map +1 -0
- package/dist/artifact-read.js +114 -0
- package/dist/artifact-read.js.map +1 -0
- package/dist/audit.js +36 -0
- package/dist/audit.js.map +1 -0
- package/dist/builders/artifact-type-execute.js +100 -0
- package/dist/builders/artifact-type-execute.js.map +1 -0
- package/dist/builders/artifact-type-plan.js +139 -0
- package/dist/builders/artifact-type-plan.js.map +1 -0
- package/dist/builders/design-interview.js +246 -0
- package/dist/builders/design-interview.js.map +1 -0
- package/dist/builders/entity-lifecycle-execute.js +12 -0
- package/dist/builders/entity-lifecycle-execute.js.map +1 -0
- package/dist/builders/entity-lifecycle-plan.js +345 -0
- package/dist/builders/entity-lifecycle-plan.js.map +1 -0
- package/dist/builders/links-execute.js +50 -0
- package/dist/builders/links-execute.js.map +1 -0
- package/dist/builders/links-plan.js +62 -0
- package/dist/builders/links-plan.js.map +1 -0
- package/dist/builders/page-execute.js +38 -0
- package/dist/builders/page-execute.js.map +1 -0
- package/dist/builders/page-plan.js +148 -0
- package/dist/builders/page-plan.js.map +1 -0
- package/dist/builders/records-execute.js +24 -0
- package/dist/builders/records-execute.js.map +1 -0
- package/dist/builders/records-lifecycle-execute.js +30 -0
- package/dist/builders/records-lifecycle-execute.js.map +1 -0
- package/dist/builders/records-lifecycle-plan.js +199 -0
- package/dist/builders/records-lifecycle-plan.js.map +1 -0
- package/dist/builders/records-plan.js +74 -0
- package/dist/builders/records-plan.js.map +1 -0
- package/dist/builders/update-page-execute.js +38 -0
- package/dist/builders/update-page-execute.js.map +1 -0
- package/dist/builders/update-page-plan.js +137 -0
- package/dist/builders/update-page-plan.js.map +1 -0
- package/dist/builders/workflow-execute.js +11 -0
- package/dist/builders/workflow-execute.js.map +1 -0
- package/dist/builders/workflow-plan.js +115 -0
- package/dist/builders/workflow-plan.js.map +1 -0
- package/dist/cli/client-configs.js +98 -0
- package/dist/cli/client-configs.js.map +1 -0
- package/dist/cli/login.js +64 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/prompter.js +77 -0
- package/dist/cli/prompter.js.map +1 -0
- package/dist/cli/setup.js +214 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm.js +22 -0
- package/dist/confirm.js.map +1 -0
- package/dist/elwis-api.js +96 -0
- package/dist/elwis-api.js.map +1 -0
- package/dist/http-client.js +142 -0
- package/dist/http-client.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.js +18 -0
- package/dist/jwt.js.map +1 -0
- package/dist/prune.js +9 -0
- package/dist/prune.js.map +1 -0
- package/dist/resolve.js +71 -0
- package/dist/resolve.js.map +1 -0
- package/dist/result.js +16 -0
- package/dist/result.js.map +1 -0
- package/dist/server.js +82 -0
- package/dist/server.js.map +1 -0
- package/dist/session-store.js +51 -0
- package/dist/session-store.js.map +1 -0
- package/dist/tools/build-artifact-type.js +36 -0
- package/dist/tools/build-artifact-type.js.map +1 -0
- package/dist/tools/build-links.js +33 -0
- package/dist/tools/build-links.js.map +1 -0
- package/dist/tools/build-page.js +40 -0
- package/dist/tools/build-page.js.map +1 -0
- package/dist/tools/build-workflow.js +36 -0
- package/dist/tools/build-workflow.js.map +1 -0
- package/dist/tools/create-application.js +44 -0
- package/dist/tools/create-application.js.map +1 -0
- package/dist/tools/create-artifacts.js +33 -0
- package/dist/tools/create-artifacts.js.map +1 -0
- package/dist/tools/create-folder.js +55 -0
- package/dist/tools/create-folder.js.map +1 -0
- package/dist/tools/delete-artifacts.js +33 -0
- package/dist/tools/delete-artifacts.js.map +1 -0
- package/dist/tools/delete-entity.js +35 -0
- package/dist/tools/delete-entity.js.map +1 -0
- package/dist/tools/explain-access.js +40 -0
- package/dist/tools/explain-access.js.map +1 -0
- package/dist/tools/get-entity.js +36 -0
- package/dist/tools/get-entity.js.map +1 -0
- package/dist/tools/get-page.js +75 -0
- package/dist/tools/get-page.js.map +1 -0
- package/dist/tools/list-apps.js +22 -0
- package/dist/tools/list-apps.js.map +1 -0
- package/dist/tools/list-entities.js +43 -0
- package/dist/tools/list-entities.js.map +1 -0
- package/dist/tools/propose-page-design.js +17 -0
- package/dist/tools/propose-page-design.js.map +1 -0
- package/dist/tools/raw-api.js +132 -0
- package/dist/tools/raw-api.js.map +1 -0
- package/dist/tools/read-artifacts.js +197 -0
- package/dist/tools/read-artifacts.js.map +1 -0
- package/dist/tools/resolve-entity.js +22 -0
- package/dist/tools/resolve-entity.js.map +1 -0
- package/dist/tools/update-artifacts.js +33 -0
- package/dist/tools/update-artifacts.js.map +1 -0
- package/dist/tools/update-entity.js +41 -0
- package/dist/tools/update-entity.js.map +1 -0
- package/dist/tools/update-page.js +40 -0
- package/dist/tools/update-page.js.map +1 -0
- package/dist/write-gate.js +25 -0
- package/dist/write-gate.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RequireApplicationId } from '../resolve.js';
|
|
3
|
+
import { Prune } from '../prune.js';
|
|
4
|
+
export const ADVERTISED_WIDGET_CODES = [
|
|
5
|
+
'TEXT', 'LIST-NEW', 'LIST_MATRIX', 'MENU', 'ARTIFACT', 'SIDEBAR_MODAL', 'CHART', 'APEX_CHART',
|
|
6
|
+
'PICTURE', 'CARD', 'NUMBER', 'FOLDER', 'TAG', 'FILTER', 'AUTH', 'AVR', 'CALENDAR', 'COUNTER', 'GANTT',
|
|
7
|
+
];
|
|
8
|
+
const HideDto = z.object({ mobile: z.boolean().default(false), tablet: z.boolean().default(false), pc: z.boolean().default(false) });
|
|
9
|
+
const WidgetInput = z.object({ code: z.string(), value: z.record(z.string(), z.unknown()) });
|
|
10
|
+
export const LIST_NEW_MODEL_DEFAULTS = {
|
|
11
|
+
listUiType: 'STANDARD',
|
|
12
|
+
listType: 'Artifacts',
|
|
13
|
+
state: { filters: {}, columnOrder: [] },
|
|
14
|
+
selected: { columns: [], applications: [], artifactTypes: [], linkTypes: [], linkFiltersNew: {}, folderFilter: {}, dateFilters: {}, userFilters: {} },
|
|
15
|
+
settings: {
|
|
16
|
+
loadMode: 'byArtifactType', folderPath: '', folderId: '', background: {}, showTable: true, showCount: false,
|
|
17
|
+
showLinkButtons: false, sticky: true, caption: null, summary: null, emptyMessage: 'No records found',
|
|
18
|
+
useDoubleClick: false, dragHandle: false, allowSelect: true, multiselect: false, rowSelector: false,
|
|
19
|
+
showNumberOfSelected: false, activateClickOnLoad: false, activateClickOnPagination: true, onActivateClick: 'first',
|
|
20
|
+
editableRow: true, openArtifactCurrentTab: false, rowsPerPage: 20, scrollHeight: '', columnResizeMode: 'fit',
|
|
21
|
+
actions: [], responsive: 'rebuild', size: 'sm', textWrap: 'nowrap', showLineBreaks: false, rowsStriped: false,
|
|
22
|
+
customColors: false, showAddButton: false, showExportButton: false,
|
|
23
|
+
exportFileName: 'export.xls', addButtonLabel: 'Add', doFilterOnUrlChange: false,
|
|
24
|
+
doSortOnUrlChange: false, emitFolderUrl: false, groupingOptions: [], groupMetaData: null,
|
|
25
|
+
grouping: {
|
|
26
|
+
groupingAttributes: [], pagination: 'perTable', groupCollapse: 'expandAll', showEmptyGroups: false,
|
|
27
|
+
sortSettings: { sortAttribute: 'sortOrder', sortType: 1, order: 'orderFirst' },
|
|
28
|
+
groupByDate: { filter: 'currentMonth', customSettings: { offsetInDays: 0, isDateTime: false } },
|
|
29
|
+
},
|
|
30
|
+
filtersForQueryParams: [], refreshOnCustomEvent: false, refreshEventName: '', columnSettings: {},
|
|
31
|
+
cellPaddings: { paddingBottom: '0.1rem', paddingLeft: '0.1rem', paddingRight: '0.1rem', paddingTop: '0.1rem' },
|
|
32
|
+
urlKeys: { listeningKeys: {}, emittingKeys: {} },
|
|
33
|
+
urlToNavigate: '/page',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
function IsPlainObject(v) {
|
|
37
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
38
|
+
}
|
|
39
|
+
export function DeepMergeDefaults(defaults, value) {
|
|
40
|
+
const out = { ...defaults };
|
|
41
|
+
for (const [k, v] of Object.entries(value)) {
|
|
42
|
+
out[k] = IsPlainObject(v) && IsPlainObject(out[k]) ? DeepMergeDefaults(out[k], v) : v;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function WidgetValueWithDefaults(code, value) {
|
|
47
|
+
if (code !== 'LIST-NEW')
|
|
48
|
+
return value;
|
|
49
|
+
const defaults = structuredClone(LIST_NEW_MODEL_DEFAULTS);
|
|
50
|
+
const model = DeepMergeDefaults(defaults, IsPlainObject(value.model) ? value.model : {});
|
|
51
|
+
if (!IsPlainObject(model.selected))
|
|
52
|
+
model.selected = structuredClone(LIST_NEW_MODEL_DEFAULTS.selected);
|
|
53
|
+
if (!IsPlainObject(model.state))
|
|
54
|
+
model.state = structuredClone(LIST_NEW_MODEL_DEFAULTS.state);
|
|
55
|
+
if (!IsPlainObject(model.settings))
|
|
56
|
+
model.settings = structuredClone(LIST_NEW_MODEL_DEFAULTS.settings);
|
|
57
|
+
const selected = model.selected;
|
|
58
|
+
const keys = (Array.isArray(selected.columns) ? selected.columns : []).map(c => c?.key).filter((k) => typeof k === 'string');
|
|
59
|
+
const state = model.state;
|
|
60
|
+
if (!Array.isArray(state.columnOrder))
|
|
61
|
+
state.columnOrder = [];
|
|
62
|
+
if (!state.columnOrder.length)
|
|
63
|
+
state.columnOrder = keys;
|
|
64
|
+
const settings = model.settings;
|
|
65
|
+
if (!IsPlainObject(settings.columnSettings))
|
|
66
|
+
settings.columnSettings = {};
|
|
67
|
+
for (const key of keys) {
|
|
68
|
+
if (!settings.columnSettings[key])
|
|
69
|
+
settings.columnSettings[key] = { actions: [] };
|
|
70
|
+
}
|
|
71
|
+
return { ...value, model };
|
|
72
|
+
}
|
|
73
|
+
const PartInput = z.object({ styles: z.record(z.string(), z.unknown()).optional(), htmlId: z.string().optional(), widget: WidgetInput });
|
|
74
|
+
const BlockInput = z.object({ parts: z.array(PartInput).min(1) });
|
|
75
|
+
const RowInput = z.object({
|
|
76
|
+
layout: z.array(z.string()).min(1),
|
|
77
|
+
styles: z.record(z.string(), z.unknown()).optional(),
|
|
78
|
+
htmlId: z.string().optional(),
|
|
79
|
+
rowHide: HideDto.optional(),
|
|
80
|
+
blocks: z.array(BlockInput).min(1),
|
|
81
|
+
});
|
|
82
|
+
export const SectionInput = z.object({
|
|
83
|
+
styles: z.record(z.string(), z.unknown()).optional(),
|
|
84
|
+
htmlId: z.string().optional(),
|
|
85
|
+
sectionHide: HideDto.optional(),
|
|
86
|
+
alwaysVisible: z.boolean().optional(),
|
|
87
|
+
reactOnUrlParams: z.boolean().optional(),
|
|
88
|
+
showIfNoKeyInUrl: z.boolean().optional(),
|
|
89
|
+
rows: z.array(RowInput).min(1),
|
|
90
|
+
});
|
|
91
|
+
export const BuildPageInput = z.object({
|
|
92
|
+
applicationId: z.string().optional(),
|
|
93
|
+
applicationName: z.string().optional(),
|
|
94
|
+
name: z.string().min(1),
|
|
95
|
+
alias: z.string().optional(),
|
|
96
|
+
isPublic: z.boolean().optional(),
|
|
97
|
+
pageParameters: z.string().optional(),
|
|
98
|
+
settings: z.record(z.string(), z.unknown()).optional(),
|
|
99
|
+
sections: z.array(SectionInput).min(1),
|
|
100
|
+
dryRun: z.boolean().default(false),
|
|
101
|
+
confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
|
|
102
|
+
});
|
|
103
|
+
export async function BuildPagePlan(api, raw) {
|
|
104
|
+
const input = BuildPageInput.parse(raw);
|
|
105
|
+
const applicationId = await RequireApplicationId(api, input);
|
|
106
|
+
const existing = (await api.list('page', { applicationId: { $oid: applicationId }, name: input.name }))[0];
|
|
107
|
+
if (existing)
|
|
108
|
+
return { applicationId, reuse: { id: existing.id, name: existing.name }, widgets: [], pageBody: {} };
|
|
109
|
+
const widgets = [];
|
|
110
|
+
const sections = MapSections(input.sections, widgets);
|
|
111
|
+
const pageBody = Prune({
|
|
112
|
+
applicationId,
|
|
113
|
+
name: input.name,
|
|
114
|
+
alias: input.alias,
|
|
115
|
+
isPublic: input.isPublic,
|
|
116
|
+
pageParameters: input.pageParameters,
|
|
117
|
+
settings: input.settings,
|
|
118
|
+
sections,
|
|
119
|
+
});
|
|
120
|
+
return { applicationId, widgets, pageBody };
|
|
121
|
+
}
|
|
122
|
+
export function MapSections(sections, widgets) {
|
|
123
|
+
return sections.map((s) => Prune({
|
|
124
|
+
templateId: null,
|
|
125
|
+
styles: s.styles,
|
|
126
|
+
htmlId: s.htmlId,
|
|
127
|
+
sectionHide: s.sectionHide,
|
|
128
|
+
alwaysVisible: s.alwaysVisible,
|
|
129
|
+
reactOnUrlParams: s.reactOnUrlParams,
|
|
130
|
+
showIfNoKeyInUrl: s.showIfNoKeyInUrl,
|
|
131
|
+
rows: s.rows.map((r) => Prune({
|
|
132
|
+
templateId: null,
|
|
133
|
+
layout: r.layout,
|
|
134
|
+
styles: r.styles,
|
|
135
|
+
htmlId: r.htmlId,
|
|
136
|
+
rowHide: r.rowHide,
|
|
137
|
+
blocks: r.blocks.map((b) => ({
|
|
138
|
+
templateId: null,
|
|
139
|
+
parts: b.parts.map((p) => {
|
|
140
|
+
const index = widgets.length;
|
|
141
|
+
widgets.push({ code: p.widget.code, value: WidgetValueWithDefaults(p.widget.code, p.widget.value) });
|
|
142
|
+
return Prune({ templateId: null, styles: p.styles, htmlId: p.htmlId, widget: { templateId: null, widgetId: { $widgetIndex: index } } });
|
|
143
|
+
}),
|
|
144
|
+
})),
|
|
145
|
+
})),
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=page-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-plan.js","sourceRoot":"","sources":["../../src/builders/page-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HttpErrorDetail } from '../http-client.js';
|
|
2
|
+
export async function ExecuteRecordsPlan(api, plan) {
|
|
3
|
+
const created = [];
|
|
4
|
+
const baseSequence = Date.now();
|
|
5
|
+
for (const [index, create] of plan.creates.entries()) {
|
|
6
|
+
try {
|
|
7
|
+
const attributes = plan.autoSequenceAttributeId && !create.attributes[plan.autoSequenceAttributeId]
|
|
8
|
+
? { ...create.attributes, [plan.autoSequenceAttributeId]: { value: String(baseSequence + index) } }
|
|
9
|
+
: create.attributes;
|
|
10
|
+
const artifact = await api.createArtifact({
|
|
11
|
+
artifactTypeId: plan.artifactTypeId,
|
|
12
|
+
parentFolderId: null,
|
|
13
|
+
attributes,
|
|
14
|
+
});
|
|
15
|
+
created.push({ id: artifact.id, name: create.name });
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
const done = created.length ? `; already created (not rolled back): ${created.map(c => `${c.name} (${c.id})`).join(', ')}` : '';
|
|
19
|
+
throw new Error(`create_elwis_artifacts failed on "${create.name}": ${e.message}${HttpErrorDetail(e)}${done}`, { cause: e });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return { artifactType: { id: plan.artifactTypeId, name: plan.artifactTypeName }, created };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=records-execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records-execute.js","sourceRoot":"","sources":["../../src/builders/records-execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAa,EAAE,IAAiB;IACvE,MAAM,OAAO,GAAwC,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBACjG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,EAAE,EAAE;gBACnG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACtB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAiB;gBACxD,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,cAAc,EAAE,IAAI;gBACpB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,wCAAwC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChI,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { HttpErrorDetail } from '../http-client.js';
|
|
2
|
+
export async function ExecuteUpdatePlan(api, plan) {
|
|
3
|
+
const updated = [];
|
|
4
|
+
for (const change of plan.changes) {
|
|
5
|
+
try {
|
|
6
|
+
await api.updateArtifact({ id: change.id, attributes: change.attributes });
|
|
7
|
+
updated.push({ id: change.id, name: change.name, artifactType: change.artifactType, changedAttributes: change.changedAttributes });
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
const done = updated.length ? `; already updated: ${updated.map(u => u.name).join(', ')}` : '';
|
|
11
|
+
throw new Error(`update_elwis_artifacts failed on "${change.name}": ${e.message}${HttpErrorDetail(e)}${done}`, { cause: e });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return { updated };
|
|
15
|
+
}
|
|
16
|
+
export async function ExecuteDeletePlan(api, plan) {
|
|
17
|
+
const deleted = [];
|
|
18
|
+
for (const target of plan.deletes) {
|
|
19
|
+
try {
|
|
20
|
+
await api.softDeleteArtifact(target.id);
|
|
21
|
+
deleted.push({ id: target.id, name: target.name });
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
const done = deleted.length ? `; already deleted: ${deleted.map(d => d.name).join(', ')}` : '';
|
|
25
|
+
throw new Error(`delete_elwis_artifacts failed on "${target.name}": ${e.message}${HttpErrorDetail(e)}${done}`, { cause: e });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { deleted };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=records-lifecycle-execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records-lifecycle-execute.js","sourceRoot":"","sources":["../../src/builders/records-lifecycle-execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAa,EAAE,IAAgB;IACrE,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACrI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAa,EAAE,IAAgB;IACrE,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { AmbiguityError, IsObjectId, ResolveOneId } from '../resolve.js';
|
|
3
|
+
import { ElwisHttpError } from '../http-client.js';
|
|
4
|
+
import { LoadAttributeMap, ResolveUnknownAttributeNames } from '../artifact-read.js';
|
|
5
|
+
const ValuePrimitive = z.union([z.string(), z.number(), z.boolean()]);
|
|
6
|
+
const RecordRef = z.string().min(1).describe('Record name or 24-char hex artifact id');
|
|
7
|
+
const TYPE_SCOPE_DESCRIBE = 'Artifact type name or id; scopes record-name resolution and is required only when names are ambiguous across types (one artifactType scope per call; split mixed-type batches)';
|
|
8
|
+
const DRY_RUN_DESCRIBE = 'Preview the resolved records and changes without writing anything';
|
|
9
|
+
export const UpdateArtifactsInput = z.object({
|
|
10
|
+
applicationId: z.string().optional(),
|
|
11
|
+
applicationName: z.string().optional(),
|
|
12
|
+
artifactType: z.string().optional().describe(TYPE_SCOPE_DESCRIBE),
|
|
13
|
+
updates: z
|
|
14
|
+
.array(z.object({
|
|
15
|
+
record: RecordRef,
|
|
16
|
+
values: z
|
|
17
|
+
.record(z.string(), z.union([ValuePrimitive, z.array(ValuePrimitive)]))
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Attribute values to change, keyed by attribute name or id; attributes not listed keep their current value'),
|
|
20
|
+
rename: z.string().min(1).optional().describe('Preferred way to change the record\'s name; do not also pass Name in values'),
|
|
21
|
+
}))
|
|
22
|
+
.min(1)
|
|
23
|
+
.max(50),
|
|
24
|
+
dryRun: z.boolean().default(false).describe(DRY_RUN_DESCRIBE),
|
|
25
|
+
confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
|
|
26
|
+
});
|
|
27
|
+
export const DeleteArtifactsInput = z.object({
|
|
28
|
+
applicationId: z.string().optional(),
|
|
29
|
+
applicationName: z.string().optional(),
|
|
30
|
+
artifactType: z.string().optional().describe(TYPE_SCOPE_DESCRIBE),
|
|
31
|
+
records: z.array(RecordRef).min(1).max(50),
|
|
32
|
+
dryRun: z.boolean().default(false).describe(`${DRY_RUN_DESCRIBE}, always run this first`),
|
|
33
|
+
confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
|
|
34
|
+
});
|
|
35
|
+
function Coerce(value) {
|
|
36
|
+
return Array.isArray(value) ? value.map(String) : String(value);
|
|
37
|
+
}
|
|
38
|
+
class LifecycleContext {
|
|
39
|
+
api;
|
|
40
|
+
applicationId;
|
|
41
|
+
types = new Map();
|
|
42
|
+
appNames = new Map();
|
|
43
|
+
appTypeIds = null;
|
|
44
|
+
typeScope = null;
|
|
45
|
+
nameAttributeId = '';
|
|
46
|
+
constructor(api, applicationId) {
|
|
47
|
+
this.api = api;
|
|
48
|
+
this.applicationId = applicationId;
|
|
49
|
+
}
|
|
50
|
+
async init(artifactType) {
|
|
51
|
+
this.nameAttributeId = (await this.api.systemAttributes()).nameAttributeId;
|
|
52
|
+
if (artifactType) {
|
|
53
|
+
this.typeScope = await this.type(await ResolveOneId(this.api, 'artifact-type', this.applicationId, artifactType));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const rows = await this.api.list('artifact-type', { applicationId: { $oid: this.applicationId } }, 501);
|
|
57
|
+
if (rows.length > 500)
|
|
58
|
+
throw new Error('The application has more than 500 artifact types; pass an explicit artifactType');
|
|
59
|
+
for (const row of rows)
|
|
60
|
+
this.types.set(row.id, { id: row.id, name: row.name, applicationId: this.applicationId, attributes: row.attributes ?? {} });
|
|
61
|
+
this.appTypeIds = rows.map(r => r.id);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async type(id) {
|
|
65
|
+
const hit = this.types.get(id);
|
|
66
|
+
if (hit)
|
|
67
|
+
return hit;
|
|
68
|
+
let doc;
|
|
69
|
+
try {
|
|
70
|
+
doc = await this.api.getOne('artifact-type', id);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if (e instanceof ElwisHttpError && e.status === 404)
|
|
74
|
+
throw new Error(`The record references artifact type ${id} which no longer exists`, { cause: e });
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
const resolved = { id, name: doc.name, applicationId: doc.applicationId ? String(doc.applicationId) : null, attributes: doc.attributes ?? {} };
|
|
78
|
+
this.types.set(id, resolved);
|
|
79
|
+
return resolved;
|
|
80
|
+
}
|
|
81
|
+
async applicationName(id) {
|
|
82
|
+
const hit = this.appNames.get(id);
|
|
83
|
+
if (hit)
|
|
84
|
+
return hit;
|
|
85
|
+
const name = await this.api.getOne('application', id).then(a => a.name).catch(() => id);
|
|
86
|
+
this.appNames.set(id, name);
|
|
87
|
+
return name;
|
|
88
|
+
}
|
|
89
|
+
async assertInApplication(type, ref) {
|
|
90
|
+
if (type.applicationId === this.applicationId)
|
|
91
|
+
return;
|
|
92
|
+
const owner = type.applicationId ? await this.applicationName(type.applicationId) : 'an unknown application';
|
|
93
|
+
const current = await this.applicationName(this.applicationId);
|
|
94
|
+
throw new Error(`Record "${ref}" belongs to application "${owner}", not "${current}"; call again with applicationName "${owner}"`);
|
|
95
|
+
}
|
|
96
|
+
async resolveRecord(ref) {
|
|
97
|
+
if (IsObjectId(ref)) {
|
|
98
|
+
const artifact = await this.api.getOne('artifact', ref);
|
|
99
|
+
await this.assertInApplication(await this.type(String(artifact.artifactTypeId)), ref);
|
|
100
|
+
return artifact;
|
|
101
|
+
}
|
|
102
|
+
const filter = { [`attributes.${this.nameAttributeId}.value`]: ref };
|
|
103
|
+
if (this.typeScope)
|
|
104
|
+
filter.artifactTypeId = { $oid: this.typeScope.id };
|
|
105
|
+
else
|
|
106
|
+
filter.artifactTypeId = { $in: (this.appTypeIds ?? []).map(id => ({ $oid: id })) };
|
|
107
|
+
const page = await this.api.listRecords('artifact', filter, { limit: 6 });
|
|
108
|
+
if (page.data.length === 1)
|
|
109
|
+
return page.data[0];
|
|
110
|
+
const scopeSuffix = this.typeScope ? ` of type "${this.typeScope.name}"` : '';
|
|
111
|
+
if (page.data.length === 0)
|
|
112
|
+
throw new Error(`No record named "${ref}"${scopeSuffix} in this application`);
|
|
113
|
+
const candidates = await Promise.all(page.data.map(async (a) => ({
|
|
114
|
+
id: String(a.id),
|
|
115
|
+
name: `${ref} (${(await this.type(String(a.artifactTypeId))).name})`,
|
|
116
|
+
})));
|
|
117
|
+
const truncated = page.data.length === 6 ? ' (list may be truncated)' : '';
|
|
118
|
+
throw new AmbiguityError(`Multiple records named "${ref}"${scopeSuffix}; narrow with artifactType or pass an explicit id${truncated}`, candidates);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function ResolveTargets(api, applicationId, artifactType, refs) {
|
|
122
|
+
const ctx = new LifecycleContext(api, applicationId);
|
|
123
|
+
await ctx.init(artifactType);
|
|
124
|
+
const targets = [];
|
|
125
|
+
const seen = new Map();
|
|
126
|
+
for (const ref of refs) {
|
|
127
|
+
const artifact = await ctx.resolveRecord(ref);
|
|
128
|
+
const type = await ctx.type(String(artifact.artifactTypeId));
|
|
129
|
+
await ctx.assertInApplication(type, ref);
|
|
130
|
+
const prior = seen.get(String(artifact.id));
|
|
131
|
+
if (prior !== undefined)
|
|
132
|
+
throw new Error(`"${ref}" and "${prior}" resolve to the same record; list each record once`);
|
|
133
|
+
seen.set(String(artifact.id), ref);
|
|
134
|
+
targets.push({ artifact, type, ref });
|
|
135
|
+
}
|
|
136
|
+
return { ctx, targets };
|
|
137
|
+
}
|
|
138
|
+
export async function BuildUpdatePlan(api, raw, applicationId) {
|
|
139
|
+
const input = UpdateArtifactsInput.parse(raw);
|
|
140
|
+
const { ctx, targets } = await ResolveTargets(api, applicationId, input.artifactType, input.updates.map(u => u.record));
|
|
141
|
+
const map = await LoadAttributeMap(api, applicationId);
|
|
142
|
+
const changes = [];
|
|
143
|
+
for (let i = 0; i < input.updates.length; i++) {
|
|
144
|
+
const update = input.updates[i];
|
|
145
|
+
const { artifact, type } = targets[i];
|
|
146
|
+
const attributeIds = Object.keys(type.attributes);
|
|
147
|
+
await ResolveUnknownAttributeNames(api, map, attributeIds);
|
|
148
|
+
const byLowerName = new Map();
|
|
149
|
+
for (const id of attributeIds) {
|
|
150
|
+
const key = (map.byId.get(id) ?? id).toLowerCase();
|
|
151
|
+
byLowerName.set(key, [...(byLowerName.get(key) ?? []), id]);
|
|
152
|
+
}
|
|
153
|
+
const attributes = {};
|
|
154
|
+
for (const [key, value] of Object.entries(update.values ?? {})) {
|
|
155
|
+
let id;
|
|
156
|
+
if (IsObjectId(key)) {
|
|
157
|
+
if (!attributeIds.includes(key))
|
|
158
|
+
throw new Error(`Attribute id "${key}" is not assigned to artifact type "${type.name}"`);
|
|
159
|
+
id = key;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const ids = byLowerName.get(key.toLowerCase()) ?? [];
|
|
163
|
+
if (ids.length === 0)
|
|
164
|
+
throw new Error(`Attribute "${key}" is not assigned to artifact type "${type.name}"; assignable attributes: ${attributeIds.map(a => map.byId.get(a) ?? a).join(', ')}`);
|
|
165
|
+
if (ids.length > 1)
|
|
166
|
+
throw new Error(`Multiple attributes named "${key}" on artifact type "${type.name}"; pass an explicit id: ${ids.map(a => `${map.byId.get(a) ?? a} (${a})`).join(', ')}`);
|
|
167
|
+
id = ids[0];
|
|
168
|
+
}
|
|
169
|
+
attributes[id] = { value: Coerce(value) };
|
|
170
|
+
}
|
|
171
|
+
if (update.rename) {
|
|
172
|
+
if (attributes[ctx.nameAttributeId] !== undefined)
|
|
173
|
+
throw new Error(`Update for "${update.record}" passes both rename and a Name value; use one of them`);
|
|
174
|
+
attributes[ctx.nameAttributeId] = { value: update.rename };
|
|
175
|
+
}
|
|
176
|
+
if (Object.keys(attributes).length === 0)
|
|
177
|
+
throw new Error(`Update for "${update.record}" contains no changes; provide at least one attribute value or a new name`);
|
|
178
|
+
changes.push({
|
|
179
|
+
id: String(artifact.id),
|
|
180
|
+
name: artifact.attributes?.[ctx.nameAttributeId]?.value ?? update.record,
|
|
181
|
+
artifactType: type.name,
|
|
182
|
+
attributes,
|
|
183
|
+
changedAttributes: Object.keys(attributes).map(id => map.byId.get(id) ?? id),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return { changes };
|
|
187
|
+
}
|
|
188
|
+
export async function BuildDeletePlan(api, raw, applicationId) {
|
|
189
|
+
const input = DeleteArtifactsInput.parse(raw);
|
|
190
|
+
const { ctx, targets } = await ResolveTargets(api, applicationId, input.artifactType, input.records);
|
|
191
|
+
return {
|
|
192
|
+
deletes: targets.map(({ artifact, type, ref }) => ({
|
|
193
|
+
id: String(artifact.id),
|
|
194
|
+
name: artifact.attributes?.[ctx.nameAttributeId]?.value ?? ref,
|
|
195
|
+
artifactType: type.name,
|
|
196
|
+
})),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=records-lifecycle-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records-lifecycle-plan.js","sourceRoot":"","sources":["../../src/builders/records-lifecycle-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { IsObjectId, ResolveOneId } from '../resolve.js';
|
|
3
|
+
import { LoadAttributeMap, ResolveUnknownAttributeNames } from '../artifact-read.js';
|
|
4
|
+
const ValuePrimitive = z.union([z.string(), z.number(), z.boolean()]);
|
|
5
|
+
export const CreateArtifactsInput = z.object({
|
|
6
|
+
applicationId: z.string().optional(),
|
|
7
|
+
applicationName: z.string().optional(),
|
|
8
|
+
artifactType: z.string().min(1).describe('Artifact type name or 24-char hex id'),
|
|
9
|
+
records: z
|
|
10
|
+
.array(z.object({
|
|
11
|
+
name: z.string().min(1).describe('Record name (fills the system Name attribute)'),
|
|
12
|
+
values: z
|
|
13
|
+
.record(z.string(), z.union([ValuePrimitive, z.array(ValuePrimitive)]))
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Attribute values keyed by attribute name or id; unspecified attributes default to an empty string'),
|
|
16
|
+
}))
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(50),
|
|
19
|
+
dryRun: z.boolean().default(false),
|
|
20
|
+
confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
|
|
21
|
+
});
|
|
22
|
+
function Coerce(value) {
|
|
23
|
+
return Array.isArray(value) ? value.map(String) : String(value);
|
|
24
|
+
}
|
|
25
|
+
export async function BuildRecordsPlan(api, raw, applicationId) {
|
|
26
|
+
const input = CreateArtifactsInput.parse(raw);
|
|
27
|
+
const artifactTypeId = await ResolveOneId(api, 'artifact-type', applicationId, input.artifactType);
|
|
28
|
+
const type = await api.getOne('artifact-type', artifactTypeId);
|
|
29
|
+
const attributeIds = Object.keys(type.attributes ?? {});
|
|
30
|
+
if (attributeIds.length === 0)
|
|
31
|
+
throw new Error(`Artifact type "${type.name}" has no attributes assigned`);
|
|
32
|
+
const map = await LoadAttributeMap(api, applicationId);
|
|
33
|
+
await ResolveUnknownAttributeNames(api, map, attributeIds);
|
|
34
|
+
const sys = await api.systemAttributes();
|
|
35
|
+
const byLowerName = new Map();
|
|
36
|
+
for (const id of attributeIds) {
|
|
37
|
+
const key = (map.byId.get(id) ?? id).toLowerCase();
|
|
38
|
+
byLowerName.set(key, [...(byLowerName.get(key) ?? []), id]);
|
|
39
|
+
}
|
|
40
|
+
const assignable = attributeIds.map(id => ({ id, name: map.byId.get(id) ?? id }));
|
|
41
|
+
const resolveKey = (key) => {
|
|
42
|
+
if (IsObjectId(key)) {
|
|
43
|
+
if (!attributeIds.includes(key))
|
|
44
|
+
throw new Error(`Attribute id "${key}" is not assigned to artifact type "${type.name}"`);
|
|
45
|
+
return key;
|
|
46
|
+
}
|
|
47
|
+
const ids = byLowerName.get(key.toLowerCase()) ?? [];
|
|
48
|
+
if (ids.length === 1)
|
|
49
|
+
return ids[0];
|
|
50
|
+
if (ids.length === 0)
|
|
51
|
+
throw new Error(`Attribute "${key}" is not assigned to artifact type "${type.name}"; assignable attributes: ${assignable.map(a => a.name).join(', ')}`);
|
|
52
|
+
throw new Error(`Multiple attributes named "${key}" on artifact type "${type.name}"; pass an explicit id`);
|
|
53
|
+
};
|
|
54
|
+
let autoSequenceAttributeId;
|
|
55
|
+
const creates = input.records.map((record) => {
|
|
56
|
+
const provided = new Map();
|
|
57
|
+
for (const [key, value] of Object.entries(record.values ?? {}))
|
|
58
|
+
provided.set(resolveKey(key), Coerce(value));
|
|
59
|
+
const attributes = {};
|
|
60
|
+
for (const id of attributeIds) {
|
|
61
|
+
if (id === sys.nameAttributeId)
|
|
62
|
+
attributes[id] = { value: record.name };
|
|
63
|
+
else if (provided.has(id))
|
|
64
|
+
attributes[id] = { value: provided.get(id) };
|
|
65
|
+
else if (id === sys.sequenceAttributeId)
|
|
66
|
+
autoSequenceAttributeId = id;
|
|
67
|
+
else
|
|
68
|
+
attributes[id] = { value: '' };
|
|
69
|
+
}
|
|
70
|
+
return { name: record.name, attributes };
|
|
71
|
+
});
|
|
72
|
+
return { artifactTypeId, artifactTypeName: type.name, attributes: assignable, creates, autoSequenceAttributeId };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=records-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records-plan.js","sourceRoot":"","sources":["../../src/builders/records-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ResolveWidgetIndices } from './page-execute.js';
|
|
2
|
+
import { HttpErrorDetail } from '../http-client.js';
|
|
3
|
+
import { Prune } from '../prune.js';
|
|
4
|
+
export async function ExecuteUpdatePagePlan(api, plan) {
|
|
5
|
+
const createdWidgets = [];
|
|
6
|
+
const ids = [];
|
|
7
|
+
let pageUpdated = false;
|
|
8
|
+
try {
|
|
9
|
+
for (const w of plan.newWidgets) {
|
|
10
|
+
const res = await api.create('widget', { code: w.code, value: w.value });
|
|
11
|
+
ids.push(res.id);
|
|
12
|
+
createdWidgets.push({ id: res.id, code: w.code });
|
|
13
|
+
}
|
|
14
|
+
const sections = ResolveWidgetIndices(plan.sections, ids);
|
|
15
|
+
const body = Prune({ id: plan.page.id, sections, name: plan.meta.rename, alias: plan.meta.alias, isPublic: plan.meta.isPublic });
|
|
16
|
+
const page = await api.update('page', body);
|
|
17
|
+
pageUpdated = true;
|
|
18
|
+
const updatedWidgets = [];
|
|
19
|
+
for (const edit of plan.widgetTexts) {
|
|
20
|
+
try {
|
|
21
|
+
await api.update('widget', { id: edit.widgetId, code: edit.code, value: edit.value });
|
|
22
|
+
updatedWidgets.push(edit.widgetId);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
const done = updatedWidgets.length ? `; widget contents already updated: ${updatedWidgets.join(', ')}` : '';
|
|
26
|
+
throw new Error(`the page layout was updated but replacing widget ${edit.widgetId} content failed: ${e.message}${HttpErrorDetail(e)}${done}; do not re-run the layout changes`, { cause: e });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return { page: { id: page.id, name: page.name }, createdWidgets, updatedWidgets, applied: plan.summary };
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
const orphans = !pageUpdated && ids.length
|
|
33
|
+
? ` Newly created widgets are unowned and left for the backend's scheduled orphan cleanup: ${ids.join(', ')}.`
|
|
34
|
+
: '';
|
|
35
|
+
throw new Error(`update_elwis_page failed: ${e.message}${HttpErrorDetail(e)}.${orphans}`, { cause: e });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=update-page-execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-page-execute.js","sourceRoot":"","sources":["../../src/builders/update-page-execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AASpC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAa,EAAE,IAAoB;IAC7E,MAAM,cAAc,GAAuC,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAiB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACzF,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjI,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAA+B,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1E,WAAW,GAAG,IAAI,CAAC;QACnB,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,sCAAsC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5G,MAAM,IAAI,KAAK,CAAC,oDAAoD,IAAI,CAAC,QAAQ,oBAAqB,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,oCAAoC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3M,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC3G,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM;YACxC,CAAC,CAAC,2FAA2F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC9G,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6BAA8B,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACrH,CAAC;AACH,CAAC"}
|