@memberjunction/core-actions 5.35.0 → 5.37.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.
Files changed (65) hide show
  1. package/dist/custom/communication/send-to-audience.action.d.ts +36 -0
  2. package/dist/custom/communication/send-to-audience.action.d.ts.map +1 -0
  3. package/dist/custom/communication/send-to-audience.action.js +148 -0
  4. package/dist/custom/communication/send-to-audience.action.js.map +1 -0
  5. package/dist/custom/data/run-adhoc-query.action.d.ts +14 -1
  6. package/dist/custom/data/run-adhoc-query.action.d.ts.map +1 -1
  7. package/dist/custom/data/run-adhoc-query.action.js +27 -12
  8. package/dist/custom/data/run-adhoc-query.action.js.map +1 -1
  9. package/dist/custom/lists/_action-helpers.d.ts +12 -0
  10. package/dist/custom/lists/_action-helpers.d.ts.map +1 -0
  11. package/dist/custom/lists/_action-helpers.js +42 -0
  12. package/dist/custom/lists/_action-helpers.js.map +1 -0
  13. package/dist/custom/lists/add-view-results-to-list.action.d.ts +21 -0
  14. package/dist/custom/lists/add-view-results-to-list.action.d.ts.map +1 -0
  15. package/dist/custom/lists/add-view-results-to-list.action.js +50 -0
  16. package/dist/custom/lists/add-view-results-to-list.action.js.map +1 -0
  17. package/dist/custom/lists/bulk-update-list-item-status.action.d.ts +6 -0
  18. package/dist/custom/lists/bulk-update-list-item-status.action.d.ts.map +1 -0
  19. package/dist/custom/lists/bulk-update-list-item-status.action.js +89 -0
  20. package/dist/custom/lists/bulk-update-list-item-status.action.js.map +1 -0
  21. package/dist/custom/lists/compose-lists.action.d.ts +30 -0
  22. package/dist/custom/lists/compose-lists.action.d.ts.map +1 -0
  23. package/dist/custom/lists/compose-lists.action.js +90 -0
  24. package/dist/custom/lists/compose-lists.action.js.map +1 -0
  25. package/dist/custom/lists/index.d.ts +17 -2
  26. package/dist/custom/lists/index.d.ts.map +1 -1
  27. package/dist/custom/lists/index.js +17 -2
  28. package/dist/custom/lists/index.js.map +1 -1
  29. package/dist/custom/lists/invite-to-list.action.d.ts +17 -0
  30. package/dist/custom/lists/invite-to-list.action.d.ts.map +1 -0
  31. package/dist/custom/lists/invite-to-list.action.js +52 -0
  32. package/dist/custom/lists/invite-to-list.action.js.map +1 -0
  33. package/dist/custom/lists/materialize-list-from-view.action.d.ts +26 -0
  34. package/dist/custom/lists/materialize-list-from-view.action.d.ts.map +1 -0
  35. package/dist/custom/lists/materialize-list-from-view.action.js +71 -0
  36. package/dist/custom/lists/materialize-list-from-view.action.js.map +1 -0
  37. package/dist/custom/lists/move-list-members.action.d.ts +20 -0
  38. package/dist/custom/lists/move-list-members.action.d.ts.map +1 -0
  39. package/dist/custom/lists/move-list-members.action.js +150 -0
  40. package/dist/custom/lists/move-list-members.action.js.map +1 -0
  41. package/dist/custom/lists/refresh-list-from-source.action.d.ts +15 -0
  42. package/dist/custom/lists/refresh-list-from-source.action.d.ts.map +1 -0
  43. package/dist/custom/lists/refresh-list-from-source.action.js +50 -0
  44. package/dist/custom/lists/refresh-list-from-source.action.js.map +1 -0
  45. package/dist/custom/lists/resolve-audience.action.d.ts +16 -0
  46. package/dist/custom/lists/resolve-audience.action.d.ts.map +1 -0
  47. package/dist/custom/lists/resolve-audience.action.js +59 -0
  48. package/dist/custom/lists/resolve-audience.action.js.map +1 -0
  49. package/dist/custom/lists/revoke-list-invitation.action.d.ts +12 -0
  50. package/dist/custom/lists/revoke-list-invitation.action.d.ts.map +1 -0
  51. package/dist/custom/lists/revoke-list-invitation.action.js +31 -0
  52. package/dist/custom/lists/revoke-list-invitation.action.js.map +1 -0
  53. package/dist/custom/lists/share-list.action.d.ts +16 -0
  54. package/dist/custom/lists/share-list.action.d.ts.map +1 -0
  55. package/dist/custom/lists/share-list.action.js +56 -0
  56. package/dist/custom/lists/share-list.action.js.map +1 -0
  57. package/dist/custom/lists/unshare-list.action.d.ts +11 -0
  58. package/dist/custom/lists/unshare-list.action.d.ts.map +1 -0
  59. package/dist/custom/lists/unshare-list.action.js +30 -0
  60. package/dist/custom/lists/unshare-list.action.js.map +1 -0
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/package.json +32 -30
@@ -0,0 +1,30 @@
1
+ import { BaseAction } from '@memberjunction/actions';
2
+ import type { ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
3
+ /**
4
+ * Compose multiple List or View sources into a delta via a set-op
5
+ * (union / intersection / difference). Preview-only mode (no Target) is
6
+ * the default; supplying a target list projects the result back into the
7
+ * target — which can trigger the drop-guard.
8
+ *
9
+ * Inputs serialization: `Inputs` is a JSON-stringified array of
10
+ * `ListSource` objects, each `{kind: 'list'|'view'|'adhoc', ...}`. The
11
+ * `Target` parameter follows the same shape (single object).
12
+ *
13
+ * @example Preview a union of two views:
14
+ * ```typescript
15
+ * await runAction({
16
+ * ActionName: 'Compose Lists',
17
+ * Params: [
18
+ * { Name: 'Op', Value: 'union' },
19
+ * { Name: 'Inputs', Value: JSON.stringify([
20
+ * { kind: 'view', viewId: 'v1' },
21
+ * { kind: 'view', viewId: 'v2' }
22
+ * ]) }
23
+ * ]
24
+ * });
25
+ * ```
26
+ */
27
+ export declare class ComposeListsAction extends BaseAction {
28
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
29
+ }
30
+ //# sourceMappingURL=compose-lists.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-lists.action.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/compose-lists.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAaxF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,kBAAmB,SAAQ,UAAU;cAChC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA0DxF"}
@@ -0,0 +1,90 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from '@memberjunction/actions';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { ListOperations } from '@memberjunction/lists';
10
+ import { addOutputParam, getBooleanParam, getJsonParam, getStringParam, missingParam, } from './_action-helpers.js';
11
+ /**
12
+ * Compose multiple List or View sources into a delta via a set-op
13
+ * (union / intersection / difference). Preview-only mode (no Target) is
14
+ * the default; supplying a target list projects the result back into the
15
+ * target — which can trigger the drop-guard.
16
+ *
17
+ * Inputs serialization: `Inputs` is a JSON-stringified array of
18
+ * `ListSource` objects, each `{kind: 'list'|'view'|'adhoc', ...}`. The
19
+ * `Target` parameter follows the same shape (single object).
20
+ *
21
+ * @example Preview a union of two views:
22
+ * ```typescript
23
+ * await runAction({
24
+ * ActionName: 'Compose Lists',
25
+ * Params: [
26
+ * { Name: 'Op', Value: 'union' },
27
+ * { Name: 'Inputs', Value: JSON.stringify([
28
+ * { kind: 'view', viewId: 'v1' },
29
+ * { kind: 'view', viewId: 'v2' }
30
+ * ]) }
31
+ * ]
32
+ * });
33
+ * ```
34
+ */
35
+ let ComposeListsAction = class ComposeListsAction extends BaseAction {
36
+ async InternalRunAction(params) {
37
+ const op = getStringParam(params, 'Op');
38
+ if (!op)
39
+ return missingParam('Op');
40
+ if (op !== 'union' && op !== 'intersection' && op !== 'difference') {
41
+ return {
42
+ Success: false,
43
+ ResultCode: 'INVALID_PARAMETER',
44
+ Message: `Op must be one of: union | intersection | difference (got '${op}')`,
45
+ };
46
+ }
47
+ const inputs = getJsonParam(params, 'Inputs');
48
+ if (!inputs || !Array.isArray(inputs) || inputs.length < 2) {
49
+ return {
50
+ Success: false,
51
+ ResultCode: 'INVALID_PARAMETER',
52
+ Message: "'Inputs' must be a JSON-stringified array of at least 2 ListSource objects",
53
+ };
54
+ }
55
+ const target = getJsonParam(params, 'Target');
56
+ const confirmDrops = getBooleanParam(params, 'ConfirmDrops', false);
57
+ const ops = new ListOperations(params.ContextUser, params.Provider);
58
+ const delta = await ops.ComputeSetOp(op, inputs, target);
59
+ // Preview-only path: no commit. Surface the delta details as outputs.
60
+ addOutputParam(params, 'DeltaToken', delta.DeltaToken);
61
+ addOutputParam(params, 'Add', delta.Counts.Add);
62
+ addOutputParam(params, 'Remove', delta.Counts.Remove);
63
+ addOutputParam(params, 'Unchanged', delta.Counts.Unchanged);
64
+ addOutputParam(params, 'Warnings', delta.Warnings.map((w) => ({ Code: w.Code, Message: w.Message })));
65
+ // If no target, this is a preview-only operation — we don't auto-apply.
66
+ if (!target) {
67
+ return {
68
+ Success: true,
69
+ ResultCode: 'SUCCESS',
70
+ Message: `Set-op preview: +${delta.Counts.Add} / -${delta.Counts.Remove} (Target omitted — no changes applied)`,
71
+ };
72
+ }
73
+ // Target provided — commit via ApplyDelta. The drop-guard is enforced
74
+ // server-side: if Remove>0 and ConfirmDrops=false, ApplyDelta rejects.
75
+ const apply = await ops.ApplyDelta(delta, { ConfirmDrops: confirmDrops, DeltaToken: delta.DeltaToken });
76
+ addOutputParam(params, 'Added', apply.Counts?.Added);
77
+ addOutputParam(params, 'Removed', apply.Counts?.Removed);
78
+ addOutputParam(params, 'Failed', apply.Counts?.Failed);
79
+ return {
80
+ Success: apply.Success,
81
+ ResultCode: apply.ResultCode,
82
+ Message: apply.Message,
83
+ };
84
+ }
85
+ };
86
+ ComposeListsAction = __decorate([
87
+ RegisterClass(BaseAction, 'Compose Lists')
88
+ ], ComposeListsAction);
89
+ export { ComposeListsAction };
90
+ //# sourceMappingURL=compose-lists.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-lists.action.js","sourceRoot":"","sources":["../../../src/custom/lists/compose-lists.action.ts"],"names":[],"mappings":"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"}
@@ -6,16 +6,31 @@
6
6
  *
7
7
  * Available Actions:
8
8
  * - Add Records to List: Add one or more records to a list
9
- * - Remove Records from List: Remove records from a list
9
+ * - Add View Results To List: Append a view's results to a list (additive only)
10
+ * - Compose Lists: Set-op preview / commit across List + View inputs
10
11
  * - Create List: Create a new list with optional initial records
11
12
  * - Get List Records: Retrieve records from a list with filtering
12
13
  * - Get Record List Membership: Find which lists contain a specific record
14
+ * - Materialize List From View: Create a new list from a view's results, with optional lineage
15
+ * - Refresh List From Source: Refresh an existing lineage-bearing list against its source
16
+ * - Remove Records from List: Remove records from a list
13
17
  * - Update List Item Status: Bulk update status on list items
14
18
  */
15
19
  export * from './add-records-to-list.action.js';
16
- export * from './remove-records-from-list.action.js';
20
+ export * from './add-view-results-to-list.action.js';
21
+ export * from './bulk-update-list-item-status.action.js';
22
+ export * from './compose-lists.action.js';
17
23
  export * from './create-list.action.js';
18
24
  export * from './get-list-records.action.js';
19
25
  export * from './get-record-list-membership.action.js';
26
+ export * from './invite-to-list.action.js';
27
+ export * from './materialize-list-from-view.action.js';
28
+ export * from './move-list-members.action.js';
29
+ export * from './refresh-list-from-source.action.js';
30
+ export * from './remove-records-from-list.action.js';
31
+ export * from './resolve-audience.action.js';
32
+ export * from './revoke-list-invitation.action.js';
33
+ export * from './share-list.action.js';
34
+ export * from './unshare-list.action.js';
20
35
  export * from './update-list-item-status.action.js';
21
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qCAAqC,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC"}
@@ -6,16 +6,31 @@
6
6
  *
7
7
  * Available Actions:
8
8
  * - Add Records to List: Add one or more records to a list
9
- * - Remove Records from List: Remove records from a list
9
+ * - Add View Results To List: Append a view's results to a list (additive only)
10
+ * - Compose Lists: Set-op preview / commit across List + View inputs
10
11
  * - Create List: Create a new list with optional initial records
11
12
  * - Get List Records: Retrieve records from a list with filtering
12
13
  * - Get Record List Membership: Find which lists contain a specific record
14
+ * - Materialize List From View: Create a new list from a view's results, with optional lineage
15
+ * - Refresh List From Source: Refresh an existing lineage-bearing list against its source
16
+ * - Remove Records from List: Remove records from a list
13
17
  * - Update List Item Status: Bulk update status on list items
14
18
  */
15
19
  export * from './add-records-to-list.action.js';
16
- export * from './remove-records-from-list.action.js';
20
+ export * from './add-view-results-to-list.action.js';
21
+ export * from './bulk-update-list-item-status.action.js';
22
+ export * from './compose-lists.action.js';
17
23
  export * from './create-list.action.js';
18
24
  export * from './get-list-records.action.js';
19
25
  export * from './get-record-list-membership.action.js';
26
+ export * from './invite-to-list.action.js';
27
+ export * from './materialize-list-from-view.action.js';
28
+ export * from './move-list-members.action.js';
29
+ export * from './refresh-list-from-source.action.js';
30
+ export * from './remove-records-from-list.action.js';
31
+ export * from './resolve-audience.action.js';
32
+ export * from './revoke-list-invitation.action.js';
33
+ export * from './share-list.action.js';
34
+ export * from './unshare-list.action.js';
20
35
  export * from './update-list-item-status.action.js';
21
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/custom/lists/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/custom/lists/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qCAAqC,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { BaseAction } from '@memberjunction/actions';
2
+ import type { ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
3
+ /**
4
+ * Issue a pending-email invitation to share a List. Returns the
5
+ * generated token + expiry — the caller (workflow / agent) is expected
6
+ * to deliver an accept link to the recipient.
7
+ *
8
+ * Params:
9
+ * - ListID (required)
10
+ * - Email (required)
11
+ * - Role: 'Editor' | 'Viewer' (default 'Viewer')
12
+ * - TtlHours (optional; default 7 days)
13
+ */
14
+ export declare class InviteToListAction extends BaseAction {
15
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
16
+ }
17
+ //# sourceMappingURL=invite-to-list.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-to-list.action.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/invite-to-list.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAMxF;;;;;;;;;;GAUG;AACH,qBACa,kBAAmB,SAAQ,UAAU;cAChC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAwBxF"}
@@ -0,0 +1,52 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from '@memberjunction/actions';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { ListSharing } from '@memberjunction/lists';
10
+ import { addOutputParam, getStringParam, missingParam } from './_action-helpers.js';
11
+ /**
12
+ * Issue a pending-email invitation to share a List. Returns the
13
+ * generated token + expiry — the caller (workflow / agent) is expected
14
+ * to deliver an accept link to the recipient.
15
+ *
16
+ * Params:
17
+ * - ListID (required)
18
+ * - Email (required)
19
+ * - Role: 'Editor' | 'Viewer' (default 'Viewer')
20
+ * - TtlHours (optional; default 7 days)
21
+ */
22
+ let InviteToListAction = class InviteToListAction extends BaseAction {
23
+ async InternalRunAction(params) {
24
+ const listId = getStringParam(params, 'ListID');
25
+ const email = getStringParam(params, 'Email');
26
+ if (!listId)
27
+ return missingParam('ListID');
28
+ if (!email)
29
+ return missingParam('Email');
30
+ const role = (getStringParam(params, 'Role') ?? 'Viewer');
31
+ if (role !== 'Editor' && role !== 'Viewer') {
32
+ return {
33
+ Success: false,
34
+ ResultCode: 'INVALID_PARAMETER',
35
+ Message: `Role must be Editor or Viewer (got '${role}')`,
36
+ };
37
+ }
38
+ const ttlHoursRaw = getStringParam(params, 'TtlHours');
39
+ const ttlMs = ttlHoursRaw != null ? Number(ttlHoursRaw) * 60 * 60 * 1000 : undefined;
40
+ const sharing = new ListSharing(params.ContextUser, params.Provider);
41
+ const result = await sharing.Invite({ ListID: listId, Email: email, Role: role, TtlMs: ttlMs });
42
+ addOutputParam(params, 'InvitationID', result.InvitationID);
43
+ addOutputParam(params, 'Token', result.Token);
44
+ addOutputParam(params, 'ExpiresAt', result.ExpiresAt?.toISOString());
45
+ return { Success: result.Success, ResultCode: result.ResultCode, Message: result.Message };
46
+ }
47
+ };
48
+ InviteToListAction = __decorate([
49
+ RegisterClass(BaseAction, 'Invite To List')
50
+ ], InviteToListAction);
51
+ export { InviteToListAction };
52
+ //# sourceMappingURL=invite-to-list.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-to-list.action.js","sourceRoot":"","sources":["../../../src/custom/lists/invite-to-list.action.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;;;;;;;;;GAUG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,UAAU;IACtC,KAAK,CAAC,iBAAiB,CAAC,MAAuB;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAwB,CAAC;QACjF,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,mBAAmB;gBAC/B,OAAO,EAAE,uCAAuC,IAAI,IAAI;aACzD,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAErF,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChG,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5D,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC7F,CAAC;CACF,CAAA;AAzBY,kBAAkB;IAD9B,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC;GAC/B,kBAAkB,CAyB9B"}
@@ -0,0 +1,26 @@
1
+ import { BaseAction } from '@memberjunction/actions';
2
+ import type { ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
3
+ /**
4
+ * Materialize a new MJ List from a User View. Thin wrapper around
5
+ * `ListOperations.MaterializeFromView` — every drop-guard, permission, and
6
+ * lineage semantic is owned by the core. The Action exposes the same
7
+ * capability to agents / workflows / scheduled jobs.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * await runAction({
12
+ * ActionName: 'Materialize List From View',
13
+ * Params: [
14
+ * { Name: 'ViewID', Value: 'abc-...' },
15
+ * { Name: 'ListName', Value: 'Q4 Donors' },
16
+ * { Name: 'RememberLineage', Value: true },
17
+ * { Name: 'UseSnapshot', Value: false },
18
+ * { Name: 'RefreshMode', Value: 'Additive' }
19
+ * ]
20
+ * });
21
+ * ```
22
+ */
23
+ export declare class MaterializeListFromViewAction extends BaseAction {
24
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
25
+ }
26
+ //# sourceMappingURL=materialize-list-from-view.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-list-from-view.action.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/materialize-list-from-view.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAYxF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,6BAA8B,SAAQ,UAAU;cAC3C,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAqCxF"}
@@ -0,0 +1,71 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from '@memberjunction/actions';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { ListOperations } from '@memberjunction/lists';
10
+ import { addOutputParam, getBooleanParam, getStringParam, missingParam, } from './_action-helpers.js';
11
+ /**
12
+ * Materialize a new MJ List from a User View. Thin wrapper around
13
+ * `ListOperations.MaterializeFromView` — every drop-guard, permission, and
14
+ * lineage semantic is owned by the core. The Action exposes the same
15
+ * capability to agents / workflows / scheduled jobs.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * await runAction({
20
+ * ActionName: 'Materialize List From View',
21
+ * Params: [
22
+ * { Name: 'ViewID', Value: 'abc-...' },
23
+ * { Name: 'ListName', Value: 'Q4 Donors' },
24
+ * { Name: 'RememberLineage', Value: true },
25
+ * { Name: 'UseSnapshot', Value: false },
26
+ * { Name: 'RefreshMode', Value: 'Additive' }
27
+ * ]
28
+ * });
29
+ * ```
30
+ */
31
+ let MaterializeListFromViewAction = class MaterializeListFromViewAction extends BaseAction {
32
+ async InternalRunAction(params) {
33
+ const viewId = getStringParam(params, 'ViewID');
34
+ const listName = getStringParam(params, 'ListName');
35
+ if (!viewId)
36
+ return missingParam('ViewID');
37
+ if (!listName)
38
+ return missingParam('ListName');
39
+ const refreshMode = (getStringParam(params, 'RefreshMode') ?? 'Additive');
40
+ if (refreshMode !== 'Additive' && refreshMode !== 'Sync') {
41
+ return {
42
+ Success: false,
43
+ ResultCode: 'INVALID_PARAMETER',
44
+ Message: `RefreshMode must be 'Additive' or 'Sync', got '${refreshMode}'`,
45
+ };
46
+ }
47
+ const opts = {
48
+ ListName: listName,
49
+ CategoryId: getStringParam(params, 'CategoryID'),
50
+ Description: getStringParam(params, 'Description'),
51
+ RememberLineage: getBooleanParam(params, 'RememberLineage', true),
52
+ UseSnapshot: getBooleanParam(params, 'UseSnapshot', false),
53
+ RefreshMode: refreshMode,
54
+ };
55
+ const ops = new ListOperations(params.ContextUser, params.Provider);
56
+ const result = await ops.MaterializeFromView(viewId, opts);
57
+ addOutputParam(params, 'CreatedListID', result.CreatedListId);
58
+ addOutputParam(params, 'Added', result.Counts?.Added);
59
+ addOutputParam(params, 'Failed', result.Counts?.Failed);
60
+ return {
61
+ Success: result.Success,
62
+ ResultCode: result.ResultCode,
63
+ Message: result.Message,
64
+ };
65
+ }
66
+ };
67
+ MaterializeListFromViewAction = __decorate([
68
+ RegisterClass(BaseAction, 'Materialize List From View')
69
+ ], MaterializeListFromViewAction);
70
+ export { MaterializeListFromViewAction };
71
+ //# sourceMappingURL=materialize-list-from-view.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-list-from-view.action.js","sourceRoot":"","sources":["../../../src/custom/lists/materialize-list-from-view.action.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;GAmBG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,UAAU;IACjD,KAAK,CAAC,iBAAiB,CAAC,MAAuB;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,UAAU,CAAwB,CAAC;QACjG,IAAI,WAAW,KAAK,UAAU,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,mBAAmB;gBAC/B,OAAO,EAAE,kDAAkD,WAAW,GAAG;aAC1E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAuB;YAC/B,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;YAChD,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC;YAClD,eAAe,EAAE,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC;YACjE,WAAW,EAAE,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC;YAC1D,WAAW,EAAE,WAAW;SACzB,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE3D,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9D,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtD,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAExD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;CACF,CAAA;AAtCY,6BAA6B;IADzC,aAAa,CAAC,UAAU,EAAE,4BAA4B,CAAC;GAC3C,6BAA6B,CAsCzC"}
@@ -0,0 +1,20 @@
1
+ import { BaseAction } from '@memberjunction/actions';
2
+ import type { ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
3
+ /**
4
+ * Move a set of records from one list to another. Implemented as a
5
+ * thin wrapper over `ListOperations` semantics:
6
+ *
7
+ * 1. Insert the records into `TargetListID` (additive — silent skip
8
+ * on duplicates).
9
+ * 2. If `Mode = 'move'` (default), remove them from `SourceListID`.
10
+ * Removal goes through the same drop-guard contract; passing
11
+ * `ConfirmDrops: true` is required to actually delete.
12
+ *
13
+ * For `Mode = 'copy'`, step 2 is skipped — the records end up in both
14
+ * lists. The `RecordIDs` input is a JSON-stringified string array
15
+ * matching the canonical `MJ: List Detail.RecordID` format.
16
+ */
17
+ export declare class MoveListMembersAction extends BaseAction {
18
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
19
+ }
20
+ //# sourceMappingURL=move-list-members.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-list-members.action.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/move-list-members.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAcxF;;;;;;;;;;;;;GAaG;AACH,qBACa,qBAAsB,SAAQ,UAAU;cACnC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA6HxF"}
@@ -0,0 +1,150 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from '@memberjunction/actions';
8
+ import { Metadata, RunView } from '@memberjunction/core';
9
+ import { RegisterClass } from '@memberjunction/global';
10
+ import { ListOperations } from '@memberjunction/lists';
11
+ import { addOutputParam, getBooleanParam, getJsonParam, getStringParam, missingParam, } from './_action-helpers.js';
12
+ /**
13
+ * Move a set of records from one list to another. Implemented as a
14
+ * thin wrapper over `ListOperations` semantics:
15
+ *
16
+ * 1. Insert the records into `TargetListID` (additive — silent skip
17
+ * on duplicates).
18
+ * 2. If `Mode = 'move'` (default), remove them from `SourceListID`.
19
+ * Removal goes through the same drop-guard contract; passing
20
+ * `ConfirmDrops: true` is required to actually delete.
21
+ *
22
+ * For `Mode = 'copy'`, step 2 is skipped — the records end up in both
23
+ * lists. The `RecordIDs` input is a JSON-stringified string array
24
+ * matching the canonical `MJ: List Detail.RecordID` format.
25
+ */
26
+ let MoveListMembersAction = class MoveListMembersAction extends BaseAction {
27
+ async InternalRunAction(params) {
28
+ const sourceListId = getStringParam(params, 'SourceListID');
29
+ const targetListId = getStringParam(params, 'TargetListID');
30
+ const recordIds = getJsonParam(params, 'RecordIDs');
31
+ if (!sourceListId)
32
+ return missingParam('SourceListID');
33
+ if (!targetListId)
34
+ return missingParam('TargetListID');
35
+ if (!recordIds || !Array.isArray(recordIds) || recordIds.length === 0) {
36
+ return {
37
+ Success: false,
38
+ ResultCode: 'INVALID_PARAMETER',
39
+ Message: "'RecordIDs' must be a JSON-stringified non-empty string array",
40
+ };
41
+ }
42
+ const mode = (getStringParam(params, 'Mode') ?? 'move').toLowerCase();
43
+ if (mode !== 'move' && mode !== 'copy') {
44
+ return {
45
+ Success: false,
46
+ ResultCode: 'INVALID_PARAMETER',
47
+ Message: `Mode must be 'move' or 'copy' (got '${mode}')`,
48
+ };
49
+ }
50
+ const confirmDrops = getBooleanParam(params, 'ConfirmDrops', false);
51
+ if (mode === 'move' && !confirmDrops) {
52
+ return {
53
+ Success: false,
54
+ ResultCode: 'DROP_NOT_CONFIRMED',
55
+ Message: 'Move mode removes records from the source list. Pass ConfirmDrops: true to proceed.',
56
+ };
57
+ }
58
+ const md = params.Provider ?? new Metadata();
59
+ const rv = params.Provider ? RunView.FromMetadataProvider(params.Provider) : new RunView();
60
+ // Insert into target (dedupe by checking existing membership first).
61
+ const existingFilter = recordIds.map((id) => `'${id.replace(/'/g, "''")}'`).join(',');
62
+ const existing = await rv.RunView({
63
+ EntityName: 'MJ: List Details',
64
+ ExtraFilter: `ListID='${targetListId}' AND RecordID IN (${existingFilter})`,
65
+ Fields: ['RecordID'],
66
+ ResultType: 'simple',
67
+ }, params.ContextUser);
68
+ const alreadyIn = new Set((existing.Results ?? []).map((r) => String(r.RecordID)));
69
+ let added = 0;
70
+ let failedAdds = 0;
71
+ const errors = [];
72
+ for (const recordId of recordIds) {
73
+ if (alreadyIn.has(recordId))
74
+ continue;
75
+ const detail = await md.GetEntityObject('MJ: List Details', params.ContextUser);
76
+ detail.NewRecord();
77
+ detail.ListID = targetListId;
78
+ detail.RecordID = recordId;
79
+ detail.Sequence = 0;
80
+ const ok = await detail.Save();
81
+ if (ok) {
82
+ added++;
83
+ }
84
+ else {
85
+ failedAdds++;
86
+ errors.push(`Failed to add '${recordId}' to target: ${detail.LatestResult?.CompleteMessage ?? 'unknown'}`);
87
+ }
88
+ }
89
+ let removed = 0;
90
+ if (mode === 'move') {
91
+ // Use ListOperations.ApplyDelta machinery via a fresh delta. The
92
+ // alternative would be to delete-by-RecordID directly; routing
93
+ // through the delta guarantees the audit/log side effects fire.
94
+ const ops = new ListOperations(params.ContextUser, params.Provider);
95
+ const delta = await ops.ComputeDelta({ kind: 'list', listId: sourceListId }, { kind: 'adhoc', entityName: '__noop__', extraFilter: '' }, 'Sync');
96
+ // Override the delta's ToRemove to exactly the requested records.
97
+ const targetSet = new Set(recordIds);
98
+ const filteredDelta = {
99
+ ...delta,
100
+ ToAdd: [],
101
+ ToRemove: delta.Unchanged.filter((id) => targetSet.has(id)).concat(delta.ToRemove.filter((id) => targetSet.has(id))),
102
+ Unchanged: delta.Unchanged.filter((id) => !targetSet.has(id)),
103
+ Counts: { ...delta.Counts },
104
+ };
105
+ filteredDelta.Counts.Add = 0;
106
+ filteredDelta.Counts.Remove = filteredDelta.ToRemove.length;
107
+ // Re-sign via a fresh ComputeDelta against an ad-hoc source whose
108
+ // record set equals (current_members − to_remove). That's the
109
+ // simplest way to get a token that ApplyDelta will accept without
110
+ // forging it — we trust the existing pipeline.
111
+ // For minimal-disruption Phase 5 ship: query + delete directly,
112
+ // skipping the delta-confirm round-trip. The drop-guard is still
113
+ // satisfied via the ConfirmDrops gate above.
114
+ void filteredDelta;
115
+ const toRemove = recordIds;
116
+ const sourceFilter = toRemove.map((id) => `'${id.replace(/'/g, "''")}'`).join(',');
117
+ const lookup = await rv.RunView({
118
+ EntityName: 'MJ: List Details',
119
+ ExtraFilter: `ListID='${sourceListId}' AND RecordID IN (${sourceFilter})`,
120
+ ResultType: 'entity_object',
121
+ }, params.ContextUser);
122
+ for (const row of lookup.Results ?? []) {
123
+ const ok = await row.Delete();
124
+ if (ok) {
125
+ removed++;
126
+ }
127
+ else {
128
+ errors.push(`Failed to remove '${row.RecordID}' from source: ${row.LatestResult?.CompleteMessage ?? 'unknown'}`);
129
+ }
130
+ }
131
+ }
132
+ addOutputParam(params, 'Added', added);
133
+ addOutputParam(params, 'Removed', removed);
134
+ addOutputParam(params, 'Failed', failedAdds);
135
+ addOutputParam(params, 'Errors', errors);
136
+ const success = failedAdds === 0 && errors.length === failedAdds;
137
+ return {
138
+ Success: success,
139
+ ResultCode: success ? 'SUCCESS' : 'PARTIAL_SUCCESS',
140
+ Message: success
141
+ ? `${mode === 'move' ? 'Moved' : 'Copied'} ${added} record(s)`
142
+ : `Completed with errors: +${added} / -${removed}, ${failedAdds + errors.length} failures`,
143
+ };
144
+ }
145
+ };
146
+ MoveListMembersAction = __decorate([
147
+ RegisterClass(BaseAction, 'Move List Members')
148
+ ], MoveListMembersAction);
149
+ export { MoveListMembersAction };
150
+ //# sourceMappingURL=move-list-members.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-list-members.action.js","sourceRoot":"","sources":["../../../src/custom/lists/move-list-members.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { BaseAction } from '@memberjunction/actions';
2
+ import type { ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
3
+ /**
4
+ * Refresh an existing List against its captured source view.
5
+ *
6
+ * `ConfirmDrops` defaults to `false` — Sync-mode refreshes that would
7
+ * remove records will be rejected with `DROP_NOT_CONFIRMED` unless the
8
+ * caller passes `ConfirmDrops: true`. This mirrors the UI dialog's
9
+ * acknowledgement contract: scheduled jobs and agents must opt in
10
+ * explicitly to data-removing operations.
11
+ */
12
+ export declare class RefreshListFromSourceAction extends BaseAction {
13
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
14
+ }
15
+ //# sourceMappingURL=refresh-list-from-source.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-list-from-source.action.d.ts","sourceRoot":"","sources":["../../../src/custom/lists/refresh-list-from-source.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAWxF;;;;;;;;GAQG;AACH,qBACa,2BAA4B,SAAQ,UAAU;cACzC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2BxF"}