@memberjunction/core-actions 6.1.4 → 6.2.0-edge.1
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/config.d.ts +74 -10
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +48 -9
- package/dist/config.js.map +1 -1
- package/dist/custom/ai/base-find-actions.action.js +6 -6
- package/dist/custom/ai/base-find-agents.action.js +6 -6
- package/dist/custom/ai/find-candidate-agents.action.js +2 -2
- package/dist/custom/ai/generate-image.action.d.ts +13 -1
- package/dist/custom/ai/generate-image.action.d.ts.map +1 -1
- package/dist/custom/ai/generate-image.action.js +25 -13
- package/dist/custom/ai/generate-image.action.js.map +1 -1
- package/dist/custom/ai/semantic-entity-search.helper.d.ts +6 -0
- package/dist/custom/ai/semantic-entity-search.helper.d.ts.map +1 -1
- package/dist/custom/ai/semantic-entity-search.helper.js +16 -4
- package/dist/custom/ai/semantic-entity-search.helper.js.map +1 -1
- package/dist/custom/data/search-query-catalog.action.js +2 -2
- package/dist/custom/integration/api-rate-limiter.action.d.ts +4 -0
- package/dist/custom/integration/api-rate-limiter.action.d.ts.map +1 -1
- package/dist/custom/integration/api-rate-limiter.action.js +10 -2
- package/dist/custom/integration/api-rate-limiter.action.js.map +1 -1
- package/dist/custom/integration/gamma-generate-presentation.action.js +2 -2
- package/dist/custom/integration/integration-action-executor.d.ts +22 -22
- package/dist/custom/integration/integration-action-executor.js +83 -83
- package/dist/custom/interactive-forms/_shared.d.ts +69 -0
- package/dist/custom/interactive-forms/_shared.d.ts.map +1 -1
- package/dist/custom/interactive-forms/_shared.js +118 -38
- package/dist/custom/interactive-forms/_shared.js.map +1 -1
- package/dist/custom/interactive-forms/activate-interactive-form-version.action.js +25 -25
- package/dist/custom/interactive-forms/create-interactive-form.action.js +22 -22
- package/dist/custom/interactive-forms/modify-interactive-form.action.js +35 -35
- package/dist/custom/interactive-forms/revert-interactive-form.action.js +32 -32
- package/dist/custom/lists/_action-helpers.d.ts +10 -0
- package/dist/custom/lists/_action-helpers.d.ts.map +1 -1
- package/dist/custom/lists/_action-helpers.js +26 -6
- package/dist/custom/lists/_action-helpers.js.map +1 -1
- package/dist/custom/lists/add-view-results-to-list.action.js +8 -8
- package/dist/custom/lists/bulk-update-list-item-status.action.js +8 -8
- package/dist/custom/lists/compose-lists.action.js +14 -14
- package/dist/custom/lists/invite-to-list.action.js +10 -10
- package/dist/custom/lists/materialize-list-from-view.action.js +13 -13
- package/dist/custom/lists/move-list-members.action.js +12 -12
- package/dist/custom/lists/refresh-list-from-source.action.js +8 -8
- package/dist/custom/lists/resolve-audience.action.js +7 -7
- package/dist/custom/lists/revoke-list-invitation.action.js +3 -3
- package/dist/custom/lists/share-list.action.js +8 -8
- package/dist/custom/lists/unshare-list.action.js +3 -3
- package/dist/custom/utilities/address-services.action.js +2 -2
- package/dist/custom/utilities/artifact-builder-service.d.ts +16 -16
- package/dist/custom/utilities/artifact-builder-service.js +39 -39
- package/dist/custom/utilities/artifact-builder-service.js.map +1 -1
- package/dist/custom/utilities/base-file-handler.d.ts.map +1 -1
- package/dist/custom/utilities/base-file-handler.js +4 -2
- package/dist/custom/utilities/base-file-handler.js.map +1 -1
- package/dist/custom/utilities/docx-renderer.d.ts +17 -11
- package/dist/custom/utilities/docx-renderer.d.ts.map +1 -1
- package/dist/custom/utilities/docx-renderer.js +60 -48
- package/dist/custom/utilities/docx-renderer.js.map +1 -1
- package/dist/custom/utilities/json-param-helper.d.ts +6 -0
- package/dist/custom/utilities/json-param-helper.d.ts.map +1 -1
- package/dist/custom/utilities/json-param-helper.js +16 -4
- package/dist/custom/utilities/json-param-helper.js.map +1 -1
- package/dist/custom/utilities/pdf-renderer.d.ts +13 -7
- package/dist/custom/utilities/pdf-renderer.d.ts.map +1 -1
- package/dist/custom/utilities/pdf-renderer.js +27 -15
- package/dist/custom/utilities/pdf-renderer.js.map +1 -1
- package/dist/custom/utilities/xlsx-renderer.d.ts +19 -11
- package/dist/custom/utilities/xlsx-renderer.d.ts.map +1 -1
- package/dist/custom/utilities/xlsx-renderer.js +55 -39
- package/dist/custom/utilities/xlsx-renderer.js.map +1 -1
- package/dist/custom/visualization/create-svg-chart.action.js +23 -23
- package/dist/custom/visualization/create-svg-diagram.action.js +10 -10
- package/dist/custom/visualization/create-svg-infographic.action.js +4 -4
- package/dist/custom/visualization/create-svg-network.action.js +12 -12
- package/dist/custom/visualization/create-svg-sketch-diagram.action.js +10 -10
- package/dist/custom/visualization/create-svg-word-cloud.action.js +11 -11
- package/dist/custom/visualization/shared/svg-theming.d.ts +17 -0
- package/dist/custom/visualization/shared/svg-theming.d.ts.map +1 -1
- package/dist/custom/visualization/shared/svg-theming.js +34 -10
- package/dist/custom/visualization/shared/svg-theming.js.map +1 -1
- package/dist/custom/visualization/shared/svg-utils.d.ts +39 -0
- package/dist/custom/visualization/shared/svg-utils.d.ts.map +1 -1
- package/dist/custom/visualization/shared/svg-utils.js +81 -17
- package/dist/custom/visualization/shared/svg-utils.js.map +1 -1
- package/dist/custom/web/brave-search.action.d.ts +108 -0
- package/dist/custom/web/brave-search.action.d.ts.map +1 -0
- package/dist/custom/web/brave-search.action.js +285 -0
- package/dist/custom/web/brave-search.action.js.map +1 -0
- package/dist/custom/web/duckduckgo-rate-limiter.d.ts +17 -1
- package/dist/custom/web/duckduckgo-rate-limiter.d.ts.map +1 -1
- package/dist/custom/web/duckduckgo-rate-limiter.js +26 -6
- package/dist/custom/web/duckduckgo-rate-limiter.js.map +1 -1
- package/dist/custom/web/google-custom-search.action.js +2 -2
- package/dist/custom/web/perplexity-search.action.d.ts +76 -44
- package/dist/custom/web/perplexity-search.action.d.ts.map +1 -1
- package/dist/custom/web/perplexity-search.action.js +228 -157
- package/dist/custom/web/perplexity-search.action.js.map +1 -1
- package/dist/custom/web/rss-feed-parsing.d.ts +19 -0
- package/dist/custom/web/rss-feed-parsing.d.ts.map +1 -1
- package/dist/custom/web/rss-feed-parsing.js +45 -13
- package/dist/custom/web/rss-feed-parsing.js.map +1 -1
- package/dist/custom/web/rss-feed-read.action.d.ts.map +1 -1
- package/dist/custom/web/rss-feed-read.action.js +9 -6
- package/dist/custom/web/rss-feed-read.action.js.map +1 -1
- package/dist/custom/web/tavily-search.action.js +2 -2
- package/dist/custom/web/web-search.action.d.ts +56 -40
- package/dist/custom/web/web-search.action.d.ts.map +1 -1
- package/dist/custom/web/web-search.action.js +141 -413
- package/dist/custom/web/web-search.action.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +40 -39
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { BaseAction } from "@memberjunction/actions";
|
|
8
8
|
import { Metadata, LogError, RunView } from "@memberjunction/core";
|
|
9
9
|
import { RegisterClass } from "@memberjunction/global";
|
|
10
|
-
import {
|
|
10
|
+
import { AddOutput, CheckOverrideOwnership, Failure, GetStringParam, LoadComponent, LoadOverride, MapToComponentStatus, } from "./_shared.js";
|
|
11
11
|
/**
|
|
12
12
|
* Promote a Pending override to Active. Flips:
|
|
13
13
|
* - target Override: Status='Active'
|
|
@@ -34,32 +34,32 @@ import { addOutput, checkOverrideOwnership, failure, getStringParam, loadCompone
|
|
|
34
34
|
let ActivateInteractiveFormVersionAction = class ActivateInteractiveFormVersionAction extends BaseAction {
|
|
35
35
|
async InternalRunAction(params) {
|
|
36
36
|
try {
|
|
37
|
-
const overrideID =
|
|
37
|
+
const overrideID = GetStringParam(params, "OverrideID");
|
|
38
38
|
if (!overrideID) {
|
|
39
|
-
return
|
|
39
|
+
return Failure("MISSING_PARAMETER", "Parameter 'OverrideID' is required.");
|
|
40
40
|
}
|
|
41
41
|
const provider = params.Provider ?? Metadata.Provider;
|
|
42
42
|
if (!provider)
|
|
43
|
-
return
|
|
43
|
+
return Failure("NO_PROVIDER", "No metadata provider available.");
|
|
44
44
|
const user = params.ContextUser;
|
|
45
45
|
if (!user)
|
|
46
|
-
return
|
|
47
|
-
const target = await
|
|
46
|
+
return Failure("NO_USER", "Action requires a ContextUser.");
|
|
47
|
+
const target = await LoadOverride(provider, user, overrideID);
|
|
48
48
|
if (!target) {
|
|
49
|
-
return
|
|
49
|
+
return Failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${overrideID}' not found.`);
|
|
50
50
|
}
|
|
51
|
-
const ownershipFail =
|
|
51
|
+
const ownershipFail = CheckOverrideOwnership(target, user);
|
|
52
52
|
if (ownershipFail)
|
|
53
53
|
return ownershipFail;
|
|
54
54
|
if (target.Status === 'Active') {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
AddOutput(params, "ComponentID", target.ComponentID);
|
|
56
|
+
AddOutput(params, "OverrideID", target.ID);
|
|
57
|
+
AddOutput(params, "PreviousActiveOverrideID", null);
|
|
58
58
|
return { Success: true, ResultCode: "SUCCESS",
|
|
59
59
|
Message: JSON.stringify({ noop: true, OverrideID: target.ID, ComponentID: target.ComponentID }) };
|
|
60
60
|
}
|
|
61
61
|
if (target.Status === 'Inactive') {
|
|
62
|
-
return
|
|
62
|
+
return Failure("NOT_PENDING", `Override ${overrideID} is Inactive. Use 'Revert Interactive Form' to restore an older version, not 'Activate'.`);
|
|
63
63
|
}
|
|
64
64
|
// Find sibling Active overrides at the same (entity, scope target).
|
|
65
65
|
const rv = RunView.FromMetadataProvider(provider);
|
|
@@ -75,42 +75,42 @@ let ActivateInteractiveFormVersionAction = class ActivateInteractiveFormVersionA
|
|
|
75
75
|
ResultType: 'simple',
|
|
76
76
|
}, user);
|
|
77
77
|
if (!priorResult.Success) {
|
|
78
|
-
return
|
|
78
|
+
return Failure("QUERY_FAILED", `Prior-active lookup failed: ${priorResult.ErrorMessage ?? 'unknown error'}`);
|
|
79
79
|
}
|
|
80
80
|
// Promote target's component.
|
|
81
|
-
const newComponent = await
|
|
81
|
+
const newComponent = await LoadComponent(provider, user, target.ComponentID);
|
|
82
82
|
if (!newComponent) {
|
|
83
|
-
return
|
|
83
|
+
return Failure("COMPONENT_NOT_FOUND", `Override ${overrideID} points at Component ${target.ComponentID} which no longer exists.`);
|
|
84
84
|
}
|
|
85
|
-
newComponent.Status =
|
|
85
|
+
newComponent.Status = MapToComponentStatus('Active');
|
|
86
86
|
const ncSaved = await newComponent.Save();
|
|
87
87
|
if (!ncSaved) {
|
|
88
|
-
return
|
|
88
|
+
return Failure("PERSIST_FAILED", `Could not flip Component to Active: ${newComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
89
89
|
}
|
|
90
90
|
target.Status = 'Active';
|
|
91
91
|
const tSaved = await target.Save();
|
|
92
92
|
if (!tSaved) {
|
|
93
|
-
return
|
|
93
|
+
return Failure("PERSIST_FAILED", `Could not flip Override to Active: ${target.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
94
94
|
}
|
|
95
95
|
// Demote priors. Component AND Override flipped in lock-step.
|
|
96
96
|
let firstPriorID = null;
|
|
97
97
|
for (const prior of priorResult.Results ?? []) {
|
|
98
98
|
if (!firstPriorID)
|
|
99
99
|
firstPriorID = prior.ID;
|
|
100
|
-
const priorO = await
|
|
101
|
-
const priorC = await
|
|
100
|
+
const priorO = await LoadOverride(provider, user, prior.ID);
|
|
101
|
+
const priorC = await LoadComponent(provider, user, prior.ComponentID);
|
|
102
102
|
if (priorO) {
|
|
103
103
|
priorO.Status = 'Inactive';
|
|
104
104
|
await priorO.Save();
|
|
105
105
|
}
|
|
106
106
|
if (priorC) {
|
|
107
|
-
priorC.Status =
|
|
107
|
+
priorC.Status = MapToComponentStatus('Inactive');
|
|
108
108
|
await priorC.Save();
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
AddOutput(params, "ComponentID", target.ComponentID);
|
|
112
|
+
AddOutput(params, "OverrideID", target.ID);
|
|
113
|
+
AddOutput(params, "PreviousActiveOverrideID", firstPriorID);
|
|
114
114
|
return { Success: true, ResultCode: "SUCCESS",
|
|
115
115
|
Message: JSON.stringify({
|
|
116
116
|
OverrideID: target.ID,
|
|
@@ -122,7 +122,7 @@ let ActivateInteractiveFormVersionAction = class ActivateInteractiveFormVersionA
|
|
|
122
122
|
catch (err) {
|
|
123
123
|
const message = err instanceof Error ? err.message : String(err);
|
|
124
124
|
LogError(`ActivateInteractiveFormVersionAction: ${message}`);
|
|
125
|
-
return
|
|
125
|
+
return Failure("UNEXPECTED_ERROR", message);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
};
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { BaseAction } from "@memberjunction/actions";
|
|
8
8
|
import { Metadata, LogError, RunView } from "@memberjunction/core";
|
|
9
9
|
import { RegisterClass } from "@memberjunction/global";
|
|
10
|
-
import {
|
|
10
|
+
import { AddOutput, Failure, GetStringParam, InsertComponent, InsertOverride, LintFormSpec, ParseSpecParam, } from "./_shared.js";
|
|
11
11
|
/**
|
|
12
12
|
* Create a net-new interactive-form override for the requesting user.
|
|
13
13
|
*
|
|
@@ -39,13 +39,13 @@ let CreateInteractiveFormAction = class CreateInteractiveFormAction extends Base
|
|
|
39
39
|
return inputs.error;
|
|
40
40
|
const provider = params.Provider ?? Metadata.Provider;
|
|
41
41
|
if (!provider)
|
|
42
|
-
return
|
|
42
|
+
return Failure("NO_PROVIDER", "No metadata provider available.");
|
|
43
43
|
const user = params.ContextUser;
|
|
44
44
|
if (!user)
|
|
45
|
-
return
|
|
45
|
+
return Failure("NO_USER", "Action requires a ContextUser to clamp override scope.");
|
|
46
46
|
const entityInfo = provider.EntityByName(inputs.EntityName);
|
|
47
47
|
if (!entityInfo) {
|
|
48
|
-
return
|
|
48
|
+
return Failure("ENTITY_NOT_FOUND", `Entity '${inputs.EntityName}' is not registered with the active metadata provider.`);
|
|
49
49
|
}
|
|
50
50
|
// Guard: don't silently create a duplicate override. We match
|
|
51
51
|
// BOTH Active and Pending sibling overrides — either is grounds
|
|
@@ -62,10 +62,10 @@ let CreateInteractiveFormAction = class CreateInteractiveFormAction extends Base
|
|
|
62
62
|
}, user);
|
|
63
63
|
if (dupResult.Success && (dupResult.Results ?? []).length > 0) {
|
|
64
64
|
const existing = dupResult.Results[0];
|
|
65
|
-
return
|
|
65
|
+
return Failure("ALREADY_EXISTS", `A ${existing.Status} User-scope override already exists for entity '${inputs.EntityName}' (OverrideID=${existing.ID}). Use 'Modify Interactive Form' on this OverrideID to refine it (with a VersionBumpKind of 'patch' / 'minor' / 'major' to snapshot a new version, or 'in-place' against a Pending row to keep iterating on the same version). Use 'Revert Interactive Form' to switch to a different historical version.`);
|
|
66
66
|
}
|
|
67
67
|
// Lint before any persistence — fail-hard.
|
|
68
|
-
const lintFail = await
|
|
68
|
+
const lintFail = await LintFormSpec(inputs.Spec, user);
|
|
69
69
|
if (lintFail)
|
|
70
70
|
return lintFail;
|
|
71
71
|
// Create v1.0.0 as Pending (NOT Active). The cockpit / agent
|
|
@@ -79,7 +79,7 @@ let CreateInteractiveFormAction = class CreateInteractiveFormAction extends Base
|
|
|
79
79
|
// wasted version, no premature publication. The user
|
|
80
80
|
// explicitly Activates from the Form Builder dashboard when
|
|
81
81
|
// they're happy with the result.
|
|
82
|
-
const componentInsert = await
|
|
82
|
+
const componentInsert = await InsertComponent({
|
|
83
83
|
provider, user,
|
|
84
84
|
spec: inputs.Spec,
|
|
85
85
|
fallbackName: inputs.Name,
|
|
@@ -91,7 +91,7 @@ let CreateInteractiveFormAction = class CreateInteractiveFormAction extends Base
|
|
|
91
91
|
if ('error' in componentInsert)
|
|
92
92
|
return componentInsert.error;
|
|
93
93
|
const componentID = componentInsert.id;
|
|
94
|
-
const overrideInsert = await
|
|
94
|
+
const overrideInsert = await InsertOverride({
|
|
95
95
|
provider, user,
|
|
96
96
|
entityID: entityInfo.ID,
|
|
97
97
|
componentID,
|
|
@@ -102,11 +102,11 @@ let CreateInteractiveFormAction = class CreateInteractiveFormAction extends Base
|
|
|
102
102
|
priority: 0,
|
|
103
103
|
});
|
|
104
104
|
if ('error' in overrideInsert) {
|
|
105
|
-
return
|
|
105
|
+
return Failure("PERSIST_FAILED", `${overrideInsert.error.Message} (Component ${componentID} was persisted but has no override yet.)`);
|
|
106
106
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
AddOutput(params, "ComponentID", componentID);
|
|
108
|
+
AddOutput(params, "OverrideID", overrideInsert.id);
|
|
109
|
+
AddOutput(params, "Version", "1.0.0");
|
|
110
110
|
return {
|
|
111
111
|
Success: true,
|
|
112
112
|
ResultCode: "SUCCESS",
|
|
@@ -123,29 +123,29 @@ let CreateInteractiveFormAction = class CreateInteractiveFormAction extends Base
|
|
|
123
123
|
catch (err) {
|
|
124
124
|
const message = err instanceof Error ? err.message : String(err);
|
|
125
125
|
LogError(`CreateInteractiveFormAction: ${message}`);
|
|
126
|
-
return
|
|
126
|
+
return Failure("UNEXPECTED_ERROR", message);
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
extractInputs(params) {
|
|
130
|
-
const entityName =
|
|
130
|
+
const entityName = GetStringParam(params, "EntityName");
|
|
131
131
|
if (!entityName)
|
|
132
|
-
return { error:
|
|
133
|
-
const name =
|
|
132
|
+
return { error: Failure("MISSING_PARAMETER", "Parameter 'EntityName' is required.") };
|
|
133
|
+
const name = GetStringParam(params, "Name");
|
|
134
134
|
if (!name)
|
|
135
|
-
return { error:
|
|
135
|
+
return { error: Failure("MISSING_PARAMETER", "Parameter 'Name' is required.") };
|
|
136
136
|
const specRaw = params.Params.find(x => x.Name?.trim().toLowerCase() === "spec")?.Value;
|
|
137
137
|
if (specRaw == null)
|
|
138
|
-
return { error:
|
|
139
|
-
const parsed =
|
|
138
|
+
return { error: Failure("MISSING_PARAMETER", "Parameter 'Spec' is required.") };
|
|
139
|
+
const parsed = ParseSpecParam(specRaw);
|
|
140
140
|
if ('error' in parsed) {
|
|
141
|
-
return { error:
|
|
141
|
+
return { error: Failure("LINT_FAILED", `Spec is not valid JSON: ${parsed.error}`) };
|
|
142
142
|
}
|
|
143
143
|
return {
|
|
144
144
|
EntityName: entityName,
|
|
145
145
|
Spec: parsed,
|
|
146
146
|
Name: name,
|
|
147
|
-
Description:
|
|
148
|
-
Notes:
|
|
147
|
+
Description: GetStringParam(params, "Description"),
|
|
148
|
+
Notes: GetStringParam(params, "Notes"),
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
};
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { BaseAction } from "@memberjunction/actions";
|
|
8
8
|
import { Metadata, LogError } from "@memberjunction/core";
|
|
9
9
|
import { RegisterClass } from "@memberjunction/global";
|
|
10
|
-
import {
|
|
10
|
+
import { AddOutput, BumpVersion, CheckOverrideOwnership, Failure, GetStringParam, InsertComponent, InsertOverride, LintFormSpec, LoadComponent, LoadOverride, MapToComponentStatus, ParseSpecParam, ParseVersionBumpKind, } from "./_shared.js";
|
|
11
11
|
/**
|
|
12
12
|
* Modify an existing interactive-form override.
|
|
13
13
|
*
|
|
@@ -56,37 +56,37 @@ import { addOutput, bumpVersion, checkOverrideOwnership, failure, getStringParam
|
|
|
56
56
|
let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends BaseAction {
|
|
57
57
|
async InternalRunAction(params) {
|
|
58
58
|
try {
|
|
59
|
-
const overrideID =
|
|
59
|
+
const overrideID = GetStringParam(params, "OverrideID");
|
|
60
60
|
if (!overrideID) {
|
|
61
|
-
return
|
|
61
|
+
return Failure("MISSING_PARAMETER", "Parameter 'OverrideID' is required.");
|
|
62
62
|
}
|
|
63
63
|
const specRaw = this.findParam(params, "Spec");
|
|
64
64
|
if (specRaw == null) {
|
|
65
|
-
return
|
|
65
|
+
return Failure("MISSING_PARAMETER", "Parameter 'Spec' is required.");
|
|
66
66
|
}
|
|
67
|
-
const parsed =
|
|
67
|
+
const parsed = ParseSpecParam(specRaw);
|
|
68
68
|
if ('error' in parsed) {
|
|
69
|
-
return
|
|
69
|
+
return Failure("LINT_FAILED", `Spec is not valid JSON: ${parsed.error}`);
|
|
70
70
|
}
|
|
71
71
|
const spec = parsed;
|
|
72
|
-
const notes =
|
|
72
|
+
const notes = GetStringParam(params, "Notes");
|
|
73
73
|
const provider = params.Provider ?? Metadata.Provider;
|
|
74
74
|
if (!provider)
|
|
75
|
-
return
|
|
75
|
+
return Failure("NO_PROVIDER", "No metadata provider available.");
|
|
76
76
|
const user = params.ContextUser;
|
|
77
77
|
if (!user)
|
|
78
|
-
return
|
|
79
|
-
const override = await
|
|
78
|
+
return Failure("NO_USER", "Action requires a ContextUser.");
|
|
79
|
+
const override = await LoadOverride(provider, user, overrideID);
|
|
80
80
|
if (!override) {
|
|
81
|
-
return
|
|
81
|
+
return Failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${overrideID}' not found.`);
|
|
82
82
|
}
|
|
83
83
|
// Defense-in-depth ownership check — see _shared.ts.
|
|
84
|
-
const ownershipFail =
|
|
84
|
+
const ownershipFail = CheckOverrideOwnership(override, user);
|
|
85
85
|
if (ownershipFail)
|
|
86
86
|
return ownershipFail;
|
|
87
|
-
const existingComponent = await
|
|
87
|
+
const existingComponent = await LoadComponent(provider, user, override.ComponentID);
|
|
88
88
|
if (!existingComponent) {
|
|
89
|
-
return
|
|
89
|
+
return Failure("COMPONENT_NOT_FOUND", `Override ${overrideID} points at Component ${override.ComponentID} which no longer exists.`);
|
|
90
90
|
}
|
|
91
91
|
// Lineage identity guard. Component lineage is collapsed by Name
|
|
92
92
|
// in the Form Builder version rail — different Name = different
|
|
@@ -101,7 +101,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
101
101
|
// existing Component.Name and sanitize the function name to
|
|
102
102
|
// match, never the other way around.
|
|
103
103
|
if (spec.name && spec.name !== existingComponent.Name) {
|
|
104
|
-
return
|
|
104
|
+
return Failure("LINEAGE_NAME_MISMATCH", `Modify requires spec.name to match the existing Component name '${existingComponent.Name}', got '${spec.name}'. Modify operates on a Component lineage — its identity is the Name and cannot change between versions. Update spec.name and the function declaration in spec.code to '${existingComponent.Name}' and retry. (If the user wants a renamed form, that's a Create on the new entity or a manual rename in Form Builder, not a Modify.)`);
|
|
105
105
|
}
|
|
106
106
|
// Pin Name and Title to the existing row regardless — covers
|
|
107
107
|
// the case where the agent omitted spec.name entirely.
|
|
@@ -110,7 +110,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
110
110
|
spec.title = existingComponent.Title;
|
|
111
111
|
// Lint AFTER the lineage guard so any name/title pinning is
|
|
112
112
|
// visible to the linter (function-name match, etc.).
|
|
113
|
-
const lintFail = await
|
|
113
|
+
const lintFail = await LintFormSpec(spec, user);
|
|
114
114
|
if (lintFail)
|
|
115
115
|
return lintFail;
|
|
116
116
|
// Resolve VersionBumpKind: explicit param wins; otherwise default
|
|
@@ -126,12 +126,12 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
126
126
|
const sourceStatus = overrideStatus === 'Active' ? 'Active' :
|
|
127
127
|
overrideStatus === 'Pending' ? 'Pending' : 'Inactive';
|
|
128
128
|
const isPendingSource = sourceStatus === 'Pending';
|
|
129
|
-
const rawKind =
|
|
129
|
+
const rawKind = GetStringParam(params, "VersionBumpKind");
|
|
130
130
|
let bumpKind;
|
|
131
131
|
if (rawKind) {
|
|
132
|
-
const parsed =
|
|
132
|
+
const parsed = ParseVersionBumpKind(rawKind);
|
|
133
133
|
if (!parsed) {
|
|
134
|
-
return
|
|
134
|
+
return Failure("INVALID_BUMP_KIND", `Unknown VersionBumpKind '${rawKind}'. Expected one of: 'in-place', 'patch', 'minor', 'major'.`);
|
|
135
135
|
}
|
|
136
136
|
bumpKind = parsed;
|
|
137
137
|
}
|
|
@@ -147,7 +147,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
147
147
|
// row achieves nothing — won't re-activate it; use Revert for
|
|
148
148
|
// that) we reject loudly so the caller corrects intent.
|
|
149
149
|
if (bumpKind === 'in-place' && !isPendingSource) {
|
|
150
|
-
return
|
|
150
|
+
return Failure("INVALID_BUMP_FOR_STATUS", `'in-place' is only valid against a Pending Override (got Status='${overrideStatus}'). Use 'patch', 'minor', or 'major' to snapshot a new Pending version from this source; use 'Revert Interactive Form' to re-activate an Inactive historical version.`);
|
|
151
151
|
}
|
|
152
152
|
if (bumpKind === 'in-place') {
|
|
153
153
|
// ── in-place modify of the Pending Component ─────────────
|
|
@@ -159,7 +159,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
159
159
|
existingComponent.Description = spec.description;
|
|
160
160
|
const saved = await existingComponent.Save();
|
|
161
161
|
if (!saved) {
|
|
162
|
-
return
|
|
162
|
+
return Failure("PERSIST_FAILED", `Component in-place update failed: ${existingComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
163
163
|
}
|
|
164
164
|
if (notes) {
|
|
165
165
|
// Append a line of human-readable notes. The Notes column
|
|
@@ -170,10 +170,10 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
170
170
|
: notes;
|
|
171
171
|
await override.Save();
|
|
172
172
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
173
|
+
AddOutput(params, "ComponentID", existingComponent.ID);
|
|
174
|
+
AddOutput(params, "OverrideID", override.ID);
|
|
175
|
+
AddOutput(params, "Mode", "in-place");
|
|
176
|
+
AddOutput(params, "Version", existingComponent.Version);
|
|
177
177
|
return {
|
|
178
178
|
Success: true, ResultCode: "SUCCESS",
|
|
179
179
|
Message: JSON.stringify({
|
|
@@ -191,9 +191,9 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
191
191
|
// two concurrent Pendings), and Inactive sources (branch-from-
|
|
192
192
|
// historical — no demote needed since source is already Inactive,
|
|
193
193
|
// and the user explicitly opened it to fork from there).
|
|
194
|
-
const newVersion =
|
|
194
|
+
const newVersion = BumpVersion(existingComponent.Version, bumpKind);
|
|
195
195
|
const newSequence = (existingComponent.VersionSequence ?? 0) + 1;
|
|
196
|
-
const componentInsert = await
|
|
196
|
+
const componentInsert = await InsertComponent({
|
|
197
197
|
provider, user, spec,
|
|
198
198
|
fallbackName: existingComponent.Name,
|
|
199
199
|
description: existingComponent.Description,
|
|
@@ -208,7 +208,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
208
208
|
// do not widen scope: if existing is User-scoped, new is too. If
|
|
209
209
|
// somehow existing is Role/Global (manual promotion), we still
|
|
210
210
|
// honor that — Modify is a content change, not a scope change.
|
|
211
|
-
const overrideInsert = await
|
|
211
|
+
const overrideInsert = await InsertOverride({
|
|
212
212
|
provider, user,
|
|
213
213
|
entityID: override.EntityID,
|
|
214
214
|
componentID: newComponentID,
|
|
@@ -219,7 +219,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
219
219
|
priority: override.Priority,
|
|
220
220
|
});
|
|
221
221
|
if ('error' in overrideInsert) {
|
|
222
|
-
return
|
|
222
|
+
return Failure("PERSIST_FAILED", `${overrideInsert.error.Message} (Component ${newComponentID} was persisted; its sibling override row failed to write.)`);
|
|
223
223
|
}
|
|
224
224
|
// Demote the prior Pending source — both the Component row and
|
|
225
225
|
// its Override row — to Inactive. This preserves the rollback
|
|
@@ -234,7 +234,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
234
234
|
// Component table uses 'Draft'/'Published'/'Deprecated' —
|
|
235
235
|
// map our 'Inactive' lifecycle to the table's 'Deprecated'.
|
|
236
236
|
try {
|
|
237
|
-
existingComponent.Status =
|
|
237
|
+
existingComponent.Status = MapToComponentStatus('Inactive');
|
|
238
238
|
const ok = await existingComponent.Save();
|
|
239
239
|
if (ok)
|
|
240
240
|
demotedComponentID = existingComponent.ID;
|
|
@@ -256,10 +256,10 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
256
256
|
LogError(`ModifyInteractiveFormAction: error demoting prior Pending Override ${override.ID}: ${err instanceof Error ? err.message : String(err)}`);
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
259
|
+
AddOutput(params, "ComponentID", newComponentID);
|
|
260
|
+
AddOutput(params, "OverrideID", overrideInsert.id);
|
|
261
|
+
AddOutput(params, "Mode", "new-version");
|
|
262
|
+
AddOutput(params, "Version", newVersion);
|
|
263
263
|
return {
|
|
264
264
|
Success: true, ResultCode: "SUCCESS",
|
|
265
265
|
Message: JSON.stringify({
|
|
@@ -279,7 +279,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
|
|
|
279
279
|
catch (err) {
|
|
280
280
|
const message = err instanceof Error ? err.message : String(err);
|
|
281
281
|
LogError(`ModifyInteractiveFormAction: ${message}`);
|
|
282
|
-
return
|
|
282
|
+
return Failure("UNEXPECTED_ERROR", message);
|
|
283
283
|
}
|
|
284
284
|
}
|
|
285
285
|
findParam(params, name) {
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { BaseAction } from "@memberjunction/actions";
|
|
8
8
|
import { Metadata, LogError, RunView } from "@memberjunction/core";
|
|
9
9
|
import { RegisterClass, UUIDsEqual } from "@memberjunction/global";
|
|
10
|
-
import {
|
|
10
|
+
import { AddOutput, CheckOverrideOwnership, Failure, GetNumberParam, GetStringParam, LoadComponent, LoadOverride, MapToComponentStatus, } from "./_shared.js";
|
|
11
11
|
/**
|
|
12
12
|
* Revert the user's Active override to an older Component version. Pure
|
|
13
13
|
* re-point: no new Component is created, no new Override row is created.
|
|
@@ -42,45 +42,45 @@ import { addOutput, checkOverrideOwnership, failure, getNumberParam, getStringPa
|
|
|
42
42
|
let RevertInteractiveFormAction = class RevertInteractiveFormAction extends BaseAction {
|
|
43
43
|
async InternalRunAction(params) {
|
|
44
44
|
try {
|
|
45
|
-
const activeOverrideID =
|
|
45
|
+
const activeOverrideID = GetStringParam(params, "ActiveOverrideID");
|
|
46
46
|
if (!activeOverrideID) {
|
|
47
|
-
return
|
|
47
|
+
return Failure("MISSING_PARAMETER", "Parameter 'ActiveOverrideID' is required.");
|
|
48
48
|
}
|
|
49
|
-
const targetComponentID =
|
|
50
|
-
const targetVersionSequence =
|
|
49
|
+
const targetComponentID = GetStringParam(params, "TargetComponentID");
|
|
50
|
+
const targetVersionSequence = GetNumberParam(params, "TargetVersionSequence");
|
|
51
51
|
if (!targetComponentID && targetVersionSequence == null) {
|
|
52
|
-
return
|
|
52
|
+
return Failure("MISSING_PARAMETER", "Either 'TargetComponentID' or 'TargetVersionSequence' is required.");
|
|
53
53
|
}
|
|
54
54
|
const provider = params.Provider ?? Metadata.Provider;
|
|
55
55
|
if (!provider)
|
|
56
|
-
return
|
|
56
|
+
return Failure("NO_PROVIDER", "No metadata provider available.");
|
|
57
57
|
const user = params.ContextUser;
|
|
58
58
|
if (!user)
|
|
59
|
-
return
|
|
60
|
-
const override = await
|
|
59
|
+
return Failure("NO_USER", "Action requires a ContextUser.");
|
|
60
|
+
const override = await LoadOverride(provider, user, activeOverrideID);
|
|
61
61
|
if (!override) {
|
|
62
|
-
return
|
|
62
|
+
return Failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${activeOverrideID}' not found.`);
|
|
63
63
|
}
|
|
64
|
-
const ownershipFail =
|
|
64
|
+
const ownershipFail = CheckOverrideOwnership(override, user);
|
|
65
65
|
if (ownershipFail)
|
|
66
66
|
return ownershipFail;
|
|
67
67
|
if (override.Status !== 'Active') {
|
|
68
|
-
return
|
|
68
|
+
return Failure("NOT_ACTIVE", `Override ${activeOverrideID} is not Active (current Status=${override.Status}). Reverting only operates on the Active override row.`);
|
|
69
69
|
}
|
|
70
|
-
const currentComponent = await
|
|
70
|
+
const currentComponent = await LoadComponent(provider, user, override.ComponentID);
|
|
71
71
|
if (!currentComponent) {
|
|
72
|
-
return
|
|
72
|
+
return Failure("COMPONENT_NOT_FOUND", `Active override points at Component ${override.ComponentID} which no longer exists.`);
|
|
73
73
|
}
|
|
74
74
|
// Resolve target Component
|
|
75
75
|
let target = null;
|
|
76
76
|
if (targetComponentID) {
|
|
77
|
-
const c = await
|
|
77
|
+
const c = await LoadComponent(provider, user, targetComponentID);
|
|
78
78
|
if (!c) {
|
|
79
|
-
return
|
|
79
|
+
return Failure("COMPONENT_NOT_FOUND", `TargetComponentID '${targetComponentID}' not found.`);
|
|
80
80
|
}
|
|
81
81
|
// Confirm same lineage (same Name).
|
|
82
82
|
if ((c.Name ?? '') !== (currentComponent.Name ?? '')) {
|
|
83
|
-
return
|
|
83
|
+
return Failure("LINEAGE_MISMATCH", `Target Component name '${c.Name}' differs from current '${currentComponent.Name}'. Revert is restricted to the same Name lineage.`);
|
|
84
84
|
}
|
|
85
85
|
target = { ID: c.ID, Version: c.Version };
|
|
86
86
|
}
|
|
@@ -94,18 +94,18 @@ let RevertInteractiveFormAction = class RevertInteractiveFormAction extends Base
|
|
|
94
94
|
MaxRows: 1,
|
|
95
95
|
}, user);
|
|
96
96
|
if (!r.Success || (r.Results ?? []).length === 0) {
|
|
97
|
-
return
|
|
97
|
+
return Failure("COMPONENT_NOT_FOUND", `No Component with VersionSequence=${targetVersionSequence} in lineage '${currentComponent.Name}'.`);
|
|
98
98
|
}
|
|
99
99
|
target = { ID: r.Results[0].ID, Version: r.Results[0].Version };
|
|
100
100
|
}
|
|
101
101
|
if (!target) {
|
|
102
|
-
return
|
|
102
|
+
return Failure("COMPONENT_NOT_FOUND", "Could not resolve target Component.");
|
|
103
103
|
}
|
|
104
104
|
if (UUIDsEqual(target.ID, currentComponent.ID)) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
AddOutput(params, "OverrideID", override.ID);
|
|
106
|
+
AddOutput(params, "ComponentID", target.ID);
|
|
107
|
+
AddOutput(params, "PreviousComponentID", null);
|
|
108
|
+
AddOutput(params, "Version", target.Version);
|
|
109
109
|
return { Success: true, ResultCode: "SUCCESS",
|
|
110
110
|
Message: JSON.stringify({ noop: true, reason: 'TargetComponent is already the Active component.' }) };
|
|
111
111
|
}
|
|
@@ -113,20 +113,20 @@ let RevertInteractiveFormAction = class RevertInteractiveFormAction extends Base
|
|
|
113
113
|
override.ComponentID = target.ID;
|
|
114
114
|
const oSaved = await override.Save();
|
|
115
115
|
if (!oSaved) {
|
|
116
|
-
return
|
|
116
|
+
return Failure("PERSIST_FAILED", `Could not re-point Override: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
117
117
|
}
|
|
118
118
|
// Flip Component statuses to reflect the new active selection.
|
|
119
|
-
const newActive = await
|
|
119
|
+
const newActive = await LoadComponent(provider, user, target.ID);
|
|
120
120
|
if (newActive) {
|
|
121
|
-
newActive.Status =
|
|
121
|
+
newActive.Status = MapToComponentStatus('Active');
|
|
122
122
|
await newActive.Save();
|
|
123
123
|
}
|
|
124
|
-
currentComponent.Status =
|
|
124
|
+
currentComponent.Status = MapToComponentStatus('Inactive');
|
|
125
125
|
await currentComponent.Save();
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
AddOutput(params, "OverrideID", override.ID);
|
|
127
|
+
AddOutput(params, "ComponentID", target.ID);
|
|
128
|
+
AddOutput(params, "PreviousComponentID", currentComponent.ID);
|
|
129
|
+
AddOutput(params, "Version", target.Version);
|
|
130
130
|
return { Success: true, ResultCode: "SUCCESS",
|
|
131
131
|
Message: JSON.stringify({
|
|
132
132
|
OverrideID: override.ID,
|
|
@@ -138,7 +138,7 @@ let RevertInteractiveFormAction = class RevertInteractiveFormAction extends Base
|
|
|
138
138
|
catch (err) {
|
|
139
139
|
const message = err instanceof Error ? err.message : String(err);
|
|
140
140
|
LogError(`RevertInteractiveFormAction: ${message}`);
|
|
141
|
-
return
|
|
141
|
+
return Failure("UNEXPECTED_ERROR", message);
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
};
|
|
@@ -4,9 +4,19 @@ import type { ActionResultSimple, RunActionParams } from '@memberjunction/action
|
|
|
4
4
|
* the patterns the older list actions inline individually — extracted here
|
|
5
5
|
* so the new actions stay small.
|
|
6
6
|
*/
|
|
7
|
+
export declare function GetStringParam(params: RunActionParams, name: string): string | undefined;
|
|
8
|
+
/** @deprecated Use {@link GetStringParam}. */
|
|
7
9
|
export declare function getStringParam(params: RunActionParams, name: string): string | undefined;
|
|
10
|
+
export declare function GetBooleanParam(params: RunActionParams, name: string, defaultValue: boolean): boolean;
|
|
11
|
+
/** @deprecated Use {@link GetBooleanParam}. */
|
|
8
12
|
export declare function getBooleanParam(params: RunActionParams, name: string, defaultValue: boolean): boolean;
|
|
13
|
+
export declare function GetJsonParam<T>(params: RunActionParams, name: string): T | undefined;
|
|
14
|
+
/** @deprecated Use {@link GetJsonParam}. */
|
|
9
15
|
export declare function getJsonParam<T>(params: RunActionParams, name: string): T | undefined;
|
|
16
|
+
export declare function AddOutputParam(params: RunActionParams, name: string, value: unknown): void;
|
|
17
|
+
/** @deprecated Use {@link AddOutputParam}. */
|
|
10
18
|
export declare function addOutputParam(params: RunActionParams, name: string, value: unknown): void;
|
|
19
|
+
export declare function MissingParam(name: string): ActionResultSimple;
|
|
20
|
+
/** @deprecated Use {@link MissingParam}. */
|
|
11
21
|
export declare function missingParam(name: string): ActionResultSimple;
|
|
12
22
|
//# sourceMappingURL=_action-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_action-helpers.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/_action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAExF;;;;GAIG;AAEH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,GACpB,OAAO,CAOT;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQpF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE1F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAM7D"}
|
|
1
|
+
{"version":3,"file":"_action-helpers.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/_action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAExF;;;;GAIG;AAEH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,GACpB,OAAO,CAOT;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,GACpB,OAAO,CAET;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQpF;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAEpF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE1F;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE1F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAM7D;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAE7D"}
|