@memberjunction/core-actions 2.132.0 → 3.0.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 (41) hide show
  1. package/dist/custom/ai/generate-image.action.d.ts +111 -0
  2. package/dist/custom/ai/generate-image.action.d.ts.map +1 -0
  3. package/dist/custom/ai/generate-image.action.js +339 -0
  4. package/dist/custom/ai/generate-image.action.js.map +1 -0
  5. package/dist/custom/files/excel-writer.action.d.ts +24 -11
  6. package/dist/custom/files/excel-writer.action.d.ts.map +1 -1
  7. package/dist/custom/files/excel-writer.action.js +149 -139
  8. package/dist/custom/files/excel-writer.action.js.map +1 -1
  9. package/dist/custom/lists/add-records-to-list.action.d.ts +27 -0
  10. package/dist/custom/lists/add-records-to-list.action.d.ts.map +1 -0
  11. package/dist/custom/lists/add-records-to-list.action.js +200 -0
  12. package/dist/custom/lists/add-records-to-list.action.js.map +1 -0
  13. package/dist/custom/lists/create-list.action.d.ts +27 -0
  14. package/dist/custom/lists/create-list.action.d.ts.map +1 -0
  15. package/dist/custom/lists/create-list.action.js +180 -0
  16. package/dist/custom/lists/create-list.action.js.map +1 -0
  17. package/dist/custom/lists/get-list-records.action.d.ts +42 -0
  18. package/dist/custom/lists/get-list-records.action.d.ts.map +1 -0
  19. package/dist/custom/lists/get-list-records.action.js +240 -0
  20. package/dist/custom/lists/get-list-records.action.js.map +1 -0
  21. package/dist/custom/lists/get-record-list-membership.action.d.ts +24 -0
  22. package/dist/custom/lists/get-record-list-membership.action.d.ts.map +1 -0
  23. package/dist/custom/lists/get-record-list-membership.action.js +177 -0
  24. package/dist/custom/lists/get-record-list-membership.action.js.map +1 -0
  25. package/dist/custom/lists/index.d.ts +25 -0
  26. package/dist/custom/lists/index.d.ts.map +1 -0
  27. package/dist/custom/lists/index.js +56 -0
  28. package/dist/custom/lists/index.js.map +1 -0
  29. package/dist/custom/lists/remove-records-from-list.action.d.ts +44 -0
  30. package/dist/custom/lists/remove-records-from-list.action.d.ts.map +1 -0
  31. package/dist/custom/lists/remove-records-from-list.action.js +195 -0
  32. package/dist/custom/lists/remove-records-from-list.action.js.map +1 -0
  33. package/dist/custom/lists/update-list-item-status.action.d.ts +36 -0
  34. package/dist/custom/lists/update-list-item-status.action.d.ts.map +1 -0
  35. package/dist/custom/lists/update-list-item-status.action.js +201 -0
  36. package/dist/custom/lists/update-list-item-status.action.js.map +1 -0
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +5 -0
  40. package/dist/index.js.map +1 -1
  41. package/package.json +48 -23
@@ -0,0 +1,111 @@
1
+ import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
+ import { BaseAction } from "@memberjunction/actions";
3
+ /**
4
+ * Action that generates images using AI image generation models (DALL-E, Gemini, etc.)
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // Generate a simple image
9
+ * await runAction({
10
+ * ActionName: 'Generate Image',
11
+ * Params: [{
12
+ * Name: 'Prompt',
13
+ * Value: 'A serene mountain landscape at sunset with snow-capped peaks'
14
+ * }]
15
+ * });
16
+ *
17
+ * // Generate with specific model and size
18
+ * await runAction({
19
+ * ActionName: 'Generate Image',
20
+ * Params: [{
21
+ * Name: 'Prompt',
22
+ * Value: 'A futuristic cityscape with flying vehicles'
23
+ * }, {
24
+ * Name: 'Model',
25
+ * Value: 'dall-e-3'
26
+ * }, {
27
+ * Name: 'Size',
28
+ * Value: '1792x1024'
29
+ * }, {
30
+ * Name: 'Quality',
31
+ * Value: 'hd'
32
+ * }]
33
+ * });
34
+ *
35
+ * // Generate multiple images
36
+ * await runAction({
37
+ * ActionName: 'Generate Image',
38
+ * Params: [{
39
+ * Name: 'Prompt',
40
+ * Value: 'Abstract art in vibrant colors'
41
+ * }, {
42
+ * Name: 'NumberOfImages',
43
+ * Value: 3
44
+ * }]
45
+ * });
46
+ *
47
+ * // Image-to-image editing (transform a source image)
48
+ * await runAction({
49
+ * ActionName: 'Generate Image',
50
+ * Params: [{
51
+ * Name: 'Prompt',
52
+ * Value: 'Transform this into a professional infographic with dark theme'
53
+ * }, {
54
+ * Name: 'SourceImage',
55
+ * Value: 'base64_encoded_image_or_url'
56
+ * }]
57
+ * });
58
+ * ```
59
+ */
60
+ export declare class GenerateImageAction extends BaseAction {
61
+ /**
62
+ * Generates or edits image(s) using AI image generation models.
63
+ *
64
+ * When SourceImage is provided, performs image-to-image editing (style transfer, transformation).
65
+ * When SourceImage is not provided, performs text-to-image generation.
66
+ *
67
+ * @param params - The action parameters containing:
68
+ * - Prompt: Text description of the image to generate or edit instructions (required)
69
+ * - Model: Model name/ID to use (optional, uses default if not specified)
70
+ * - NumberOfImages: Number of images to generate (optional, default: 1)
71
+ * - Size: Image size like "1024x1024" (optional)
72
+ * - Quality: Quality level - "standard" or "hd" (optional)
73
+ * - Style: Style preset - "vivid" or "natural" (optional)
74
+ * - NegativePrompt: Things to avoid in the image (optional)
75
+ * - OutputFormat: "base64" or "url" (optional, default: "base64")
76
+ * - SourceImage: Source image for image-to-image editing (optional, base64 or URL)
77
+ * - Mask: Mask image for inpainting - white/transparent areas are regenerated (optional)
78
+ *
79
+ * @returns Generated or edited image(s) as base64 or URLs
80
+ */
81
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
82
+ /**
83
+ * Prepare an image generator instance using proper metadata lookup
84
+ */
85
+ private prepareImageGenerator;
86
+ /**
87
+ * Execute text-to-image generation
88
+ */
89
+ private executeImageGeneration;
90
+ /**
91
+ * Execute image-to-image editing
92
+ */
93
+ private executeImageEdit;
94
+ /**
95
+ * Format a generated image for output as MediaOutput
96
+ */
97
+ private formatImageOutput;
98
+ /**
99
+ * Get parameter value by name (case-insensitive)
100
+ */
101
+ private getParamValue;
102
+ /**
103
+ * Get number parameter with default
104
+ */
105
+ private getNumberParam;
106
+ }
107
+ /**
108
+ * Loader function to ensure the GenerateImageAction class is included in the bundle
109
+ */
110
+ export declare function LoadGenerateImageAction(): void;
111
+ //# sourceMappingURL=generate-image.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-image.action.d.ts","sourceRoot":"","sources":["../../../src/custom/ai/generate-image.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAcrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,qBACa,mBAAoB,SAAQ,UAAU;IAE/C;;;;;;;;;;;;;;;;;;;OAmBG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgIvF;;OAEG;YACW,qBAAqB;IAuEnC;;OAEG;YACW,sBAAsB;IAkCpC;;OAEG;YACW,gBAAgB;IAgC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAMzB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,SAEtC"}
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LoadGenerateImageAction = exports.GenerateImageAction = void 0;
10
+ const global_1 = require("@memberjunction/global");
11
+ const actions_1 = require("@memberjunction/actions");
12
+ const global_2 = require("@memberjunction/global");
13
+ const ai_1 = require("@memberjunction/ai");
14
+ const ai_engine_base_1 = require("@memberjunction/ai-engine-base");
15
+ /**
16
+ * Action that generates images using AI image generation models (DALL-E, Gemini, etc.)
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // Generate a simple image
21
+ * await runAction({
22
+ * ActionName: 'Generate Image',
23
+ * Params: [{
24
+ * Name: 'Prompt',
25
+ * Value: 'A serene mountain landscape at sunset with snow-capped peaks'
26
+ * }]
27
+ * });
28
+ *
29
+ * // Generate with specific model and size
30
+ * await runAction({
31
+ * ActionName: 'Generate Image',
32
+ * Params: [{
33
+ * Name: 'Prompt',
34
+ * Value: 'A futuristic cityscape with flying vehicles'
35
+ * }, {
36
+ * Name: 'Model',
37
+ * Value: 'dall-e-3'
38
+ * }, {
39
+ * Name: 'Size',
40
+ * Value: '1792x1024'
41
+ * }, {
42
+ * Name: 'Quality',
43
+ * Value: 'hd'
44
+ * }]
45
+ * });
46
+ *
47
+ * // Generate multiple images
48
+ * await runAction({
49
+ * ActionName: 'Generate Image',
50
+ * Params: [{
51
+ * Name: 'Prompt',
52
+ * Value: 'Abstract art in vibrant colors'
53
+ * }, {
54
+ * Name: 'NumberOfImages',
55
+ * Value: 3
56
+ * }]
57
+ * });
58
+ *
59
+ * // Image-to-image editing (transform a source image)
60
+ * await runAction({
61
+ * ActionName: 'Generate Image',
62
+ * Params: [{
63
+ * Name: 'Prompt',
64
+ * Value: 'Transform this into a professional infographic with dark theme'
65
+ * }, {
66
+ * Name: 'SourceImage',
67
+ * Value: 'base64_encoded_image_or_url'
68
+ * }]
69
+ * });
70
+ * ```
71
+ */
72
+ let GenerateImageAction = class GenerateImageAction extends actions_1.BaseAction {
73
+ /**
74
+ * Generates or edits image(s) using AI image generation models.
75
+ *
76
+ * When SourceImage is provided, performs image-to-image editing (style transfer, transformation).
77
+ * When SourceImage is not provided, performs text-to-image generation.
78
+ *
79
+ * @param params - The action parameters containing:
80
+ * - Prompt: Text description of the image to generate or edit instructions (required)
81
+ * - Model: Model name/ID to use (optional, uses default if not specified)
82
+ * - NumberOfImages: Number of images to generate (optional, default: 1)
83
+ * - Size: Image size like "1024x1024" (optional)
84
+ * - Quality: Quality level - "standard" or "hd" (optional)
85
+ * - Style: Style preset - "vivid" or "natural" (optional)
86
+ * - NegativePrompt: Things to avoid in the image (optional)
87
+ * - OutputFormat: "base64" or "url" (optional, default: "base64")
88
+ * - SourceImage: Source image for image-to-image editing (optional, base64 or URL)
89
+ * - Mask: Mask image for inpainting - white/transparent areas are regenerated (optional)
90
+ *
91
+ * @returns Generated or edited image(s) as base64 or URLs
92
+ */
93
+ async InternalRunAction(params) {
94
+ try {
95
+ const prompt = this.getParamValue(params, 'prompt');
96
+ const modelName = this.getParamValue(params, 'model');
97
+ const numberOfImages = this.getNumberParam(params, 'numberofimages', 1);
98
+ const size = this.getParamValue(params, 'size') || '1024x1024';
99
+ const quality = this.getParamValue(params, 'quality');
100
+ const style = this.getParamValue(params, 'style');
101
+ const negativePrompt = this.getParamValue(params, 'negativeprompt');
102
+ const outputFormat = this.getParamValue(params, 'outputformat') || 'base64';
103
+ const sourceImage = this.getParamValue(params, 'sourceimage');
104
+ const mask = this.getParamValue(params, 'mask');
105
+ // Validate prompt
106
+ if (!prompt) {
107
+ return {
108
+ Success: false,
109
+ Message: "Prompt parameter is required",
110
+ ResultCode: "MISSING_PROMPT"
111
+ };
112
+ }
113
+ // Get image generator model and create instance
114
+ const { generator, model, apiName } = await this.prepareImageGenerator(params.ContextUser, modelName);
115
+ let result;
116
+ if (sourceImage) {
117
+ // Image-to-image: use EditImage when source image is provided
118
+ result = await this.executeImageEdit(generator, {
119
+ prompt,
120
+ apiName,
121
+ sourceImage,
122
+ mask,
123
+ numberOfImages,
124
+ size,
125
+ outputFormat,
126
+ negativePrompt
127
+ });
128
+ }
129
+ else {
130
+ // Text-to-image: use GenerateImage
131
+ result = await this.executeImageGeneration(generator, {
132
+ prompt,
133
+ apiName,
134
+ numberOfImages,
135
+ size,
136
+ outputFormat,
137
+ quality,
138
+ style,
139
+ negativePrompt
140
+ });
141
+ }
142
+ if (!result.success) {
143
+ return {
144
+ Success: false,
145
+ Message: `Image generation failed: ${result.errorMessage || 'Unknown error'}`,
146
+ ResultCode: "GENERATION_FAILED"
147
+ };
148
+ }
149
+ if (!result.images || result.images.length === 0) {
150
+ return {
151
+ Success: false,
152
+ Message: "No images were generated",
153
+ ResultCode: "NO_IMAGES"
154
+ };
155
+ }
156
+ // Format output images
157
+ const outputImages = result.images.map((img, index) => this.formatImageOutput(img, index));
158
+ // Add output parameters
159
+ params.Params.push({
160
+ Name: 'Images',
161
+ Type: 'Output',
162
+ Value: outputImages
163
+ });
164
+ params.Params.push({
165
+ Name: 'ImageCount',
166
+ Type: 'Output',
167
+ Value: result.images.length
168
+ });
169
+ if (result.revisedPrompt) {
170
+ params.Params.push({
171
+ Name: 'RevisedPrompt',
172
+ Type: 'Output',
173
+ Value: result.revisedPrompt
174
+ });
175
+ }
176
+ params.Params.push({
177
+ Name: 'ModelUsed',
178
+ Type: 'Output',
179
+ Value: model.Name
180
+ });
181
+ // Build response - NOTE: images data is in output params, not in Message
182
+ // This keeps Message lightweight for LLM context (base64 images are ~700K tokens each)
183
+ const responseData = {
184
+ message: `Successfully generated ${result.images.length} image(s)`,
185
+ model: model.Name,
186
+ imageCount: result.images.length,
187
+ // Images are available in the 'Images' output parameter
188
+ // Use the provided placeholder references in your response
189
+ revisedPrompt: result.revisedPrompt
190
+ };
191
+ return {
192
+ Success: true,
193
+ ResultCode: "IMAGES_GENERATED",
194
+ Message: JSON.stringify(responseData, null, 2)
195
+ };
196
+ }
197
+ catch (error) {
198
+ return {
199
+ Success: false,
200
+ Message: `Generate image failed: ${error instanceof Error ? error.message : String(error)}`,
201
+ ResultCode: "ACTION_FAILED"
202
+ };
203
+ }
204
+ }
205
+ /**
206
+ * Prepare an image generator instance using proper metadata lookup
207
+ */
208
+ async prepareImageGenerator(contextUser, modelName) {
209
+ // Ensure AIEngine is loaded
210
+ await ai_engine_base_1.AIEngineBase.Instance.Config(false, contextUser);
211
+ // Find image generator models
212
+ const imageGeneratorModels = ai_engine_base_1.AIEngineBase.Instance.Models.filter(m => m.AIModelType?.toLowerCase() === 'image generator' && m.IsActive);
213
+ if (imageGeneratorModels.length === 0) {
214
+ throw new Error('No active image generator models found');
215
+ }
216
+ // Select model - use specified or highest power
217
+ let model;
218
+ if (modelName) {
219
+ const foundModel = imageGeneratorModels.find(m => m.Name.toLowerCase() === modelName.toLowerCase() ||
220
+ (m.APIName && m.APIName.toLowerCase() === modelName.toLowerCase()));
221
+ if (!foundModel) {
222
+ throw new Error(`Image generator model '${modelName}' not found`);
223
+ }
224
+ model = foundModel;
225
+ }
226
+ else {
227
+ // Get highest power image generator model
228
+ model = imageGeneratorModels.reduce((best, current) => (current.PowerRank || 0) > (best.PowerRank || 0) ? current : best);
229
+ }
230
+ // Find the inference provider from ModelVendors (populated by AIEngineBase)
231
+ // Inference providers have DriverClass set
232
+ const inferenceProvider = model.ModelVendors.find(mv => mv.DriverClass && mv.DriverClass.length > 0 && mv.Status === 'Active');
233
+ if (!inferenceProvider) {
234
+ throw new Error(`No active inference provider found for model '${model.Name}'`);
235
+ }
236
+ // Get API key using the vendor's driver class
237
+ const driverClass = inferenceProvider.DriverClass;
238
+ const apiName = inferenceProvider.APIName || model.APIName || model.Name;
239
+ const apiKey = (0, ai_1.GetAIAPIKey)(driverClass);
240
+ if (!apiKey) {
241
+ // Try getting by vendor name as fallback
242
+ const vendor = ai_engine_base_1.AIEngineBase.Instance.Vendors.find(v => v.ID === inferenceProvider.VendorID);
243
+ const vendorApiKey = vendor ? (0, ai_1.GetAIAPIKey)(vendor.Name) : null;
244
+ if (!vendorApiKey) {
245
+ throw new Error(`No API key found for ${driverClass} or vendor ${vendor?.Name || 'unknown'}`);
246
+ }
247
+ }
248
+ const generator = global_2.MJGlobal.Instance.ClassFactory.CreateInstance(ai_1.BaseImageGenerator, driverClass, apiKey);
249
+ if (!generator) {
250
+ throw new Error(`Failed to create image generator instance for ${driverClass}. Ensure the provider is registered.`);
251
+ }
252
+ return { generator, model, apiName };
253
+ }
254
+ /**
255
+ * Execute text-to-image generation
256
+ */
257
+ async executeImageGeneration(generator, options) {
258
+ const genParams = {
259
+ prompt: options.prompt,
260
+ model: options.apiName,
261
+ n: options.numberOfImages,
262
+ size: options.size,
263
+ outputFormat: options.outputFormat === 'url' ? 'url' : 'b64_json'
264
+ };
265
+ if (options.quality) {
266
+ genParams.quality = options.quality;
267
+ }
268
+ if (options.style) {
269
+ genParams.style = options.style;
270
+ }
271
+ if (options.negativePrompt) {
272
+ genParams.negativePrompt = options.negativePrompt;
273
+ }
274
+ return generator.GenerateImage(genParams);
275
+ }
276
+ /**
277
+ * Execute image-to-image editing
278
+ */
279
+ async executeImageEdit(generator, options) {
280
+ const editParams = {
281
+ prompt: options.prompt,
282
+ model: options.apiName,
283
+ image: options.sourceImage,
284
+ n: options.numberOfImages,
285
+ size: options.size,
286
+ outputFormat: options.outputFormat === 'url' ? 'url' : 'b64_json'
287
+ };
288
+ if (options.mask) {
289
+ editParams.mask = options.mask;
290
+ }
291
+ if (options.negativePrompt) {
292
+ editParams.negativePrompt = options.negativePrompt;
293
+ }
294
+ return generator.EditImage(editParams);
295
+ }
296
+ /**
297
+ * Format a generated image for output as MediaOutput
298
+ */
299
+ formatImageOutput(img, index) {
300
+ return {
301
+ modality: 'Image',
302
+ mimeType: img.format ? `image/${img.format}` : 'image/png',
303
+ data: img.base64,
304
+ url: img.url,
305
+ width: img.width,
306
+ height: img.height,
307
+ label: `Generated image ${index + 1}`
308
+ };
309
+ }
310
+ /**
311
+ * Get parameter value by name (case-insensitive)
312
+ */
313
+ getParamValue(params, name) {
314
+ const param = params.Params.find(p => p.Name.toLowerCase() === name.toLowerCase());
315
+ return param?.Value;
316
+ }
317
+ /**
318
+ * Get number parameter with default
319
+ */
320
+ getNumberParam(params, name, defaultValue) {
321
+ const value = this.getParamValue(params, name);
322
+ if (value === undefined || value === null)
323
+ return defaultValue;
324
+ const num = Number(value);
325
+ return isNaN(num) ? defaultValue : num;
326
+ }
327
+ };
328
+ exports.GenerateImageAction = GenerateImageAction;
329
+ exports.GenerateImageAction = GenerateImageAction = __decorate([
330
+ (0, global_1.RegisterClass)(actions_1.BaseAction, "Generate Image")
331
+ ], GenerateImageAction);
332
+ /**
333
+ * Loader function to ensure the GenerateImageAction class is included in the bundle
334
+ */
335
+ function LoadGenerateImageAction() {
336
+ // Stub function to prevent tree shaking
337
+ }
338
+ exports.LoadGenerateImageAction = LoadGenerateImageAction;
339
+ //# sourceMappingURL=generate-image.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-image.action.js","sourceRoot":"","sources":["../../../src/custom/ai/generate-image.action.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
2
  import { BaseFileHandlerAction } from "../utilities/base-file-handler";
3
3
  /**
4
- * Action that creates Excel files from JSON data
5
- * Supports multiple sheets, formatting, and formulas
4
+ * Action that creates Excel files from JSON data using the MemberJunction export-engine.
5
+ * Supports multiple sheets, formatting, styles, and formulas.
6
6
  *
7
7
  * @example
8
8
  * ```typescript
@@ -31,12 +31,14 @@ import { BaseFileHandlerAction } from "../utilities/base-file-handler";
31
31
  * data: salesData,
32
32
  * headers: ['Product', 'Units', 'Revenue'],
33
33
  * columnWidths: [20, 10, 15],
34
- * styles: {
35
- * headerStyle: { font: { bold: true }, fill: { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF4472C4' } } }
34
+ * headerStyle: {
35
+ * font: { bold: true, color: 'FFFFFF' },
36
+ * fill: { pattern: 'solid', fgColor: '4472C4' }
36
37
  * }
37
38
  * }, {
38
39
  * name: 'Summary',
39
- * data: summaryData
40
+ * data: summaryData,
41
+ * formulas: [{ cell: 'B10', formula: 'SUM(B2:B9)' }]
40
42
  * }]
41
43
  * }]
42
44
  * });
@@ -44,7 +46,7 @@ import { BaseFileHandlerAction } from "../utilities/base-file-handler";
44
46
  */
45
47
  export declare class ExcelWriterAction extends BaseFileHandlerAction {
46
48
  /**
47
- * Creates Excel files from JSON data
49
+ * Creates Excel files from JSON data using the export-engine
48
50
  *
49
51
  * @param params - The action parameters containing:
50
52
  * - Sheets: Array of sheet definitions, each containing:
@@ -52,8 +54,11 @@ export declare class ExcelWriterAction extends BaseFileHandlerAction {
52
54
  * - data: Array of data rows (required)
53
55
  * - headers: Array of column headers (optional, derived from data if not provided)
54
56
  * - columnWidths: Array of column widths in characters (optional)
55
- * - styles: Object with style definitions (optional)
57
+ * - headerStyle: Style object for headers (optional)
58
+ * - dataStyle: Style object for data rows (optional)
56
59
  * - formulas: Array of formula definitions (optional)
60
+ * - autoFilter: Enable auto-filter (optional, boolean or range string)
61
+ * - freeze: Freeze panes configuration (optional)
57
62
  * - OutputFileID: Optional MJ Storage file ID to save to
58
63
  * - FileName: Name for the generated Excel file (default: 'workbook.xlsx')
59
64
  * - Author: Author metadata (optional)
@@ -64,13 +69,21 @@ export declare class ExcelWriterAction extends BaseFileHandlerAction {
64
69
  */
65
70
  protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
66
71
  /**
67
- * Populate worksheet with data
72
+ * Convert the input sheet definition to the export-engine SheetDefinition format
68
73
  */
69
- private populateWorksheet;
74
+ private convertToSheetDefinition;
70
75
  /**
71
- * Apply style to a row
76
+ * Convert legacy ExcelJS-style objects to export-engine CellStyle format
72
77
  */
73
- private applyRowStyle;
78
+ private convertLegacyStyle;
79
+ /**
80
+ * Extract color value from legacy format (handles both string and { argb: string } formats)
81
+ */
82
+ private extractColorValue;
83
+ /**
84
+ * Convert a legacy border side definition to export-engine BorderSide format
85
+ */
86
+ private convertBorderSide;
74
87
  }
75
88
  /**
76
89
  * Loader function to ensure the ExcelWriterAction class is included in the bundle
@@ -1 +1 @@
1
- {"version":3,"file":"excel-writer.action.d.ts","sourceRoot":"","sources":["../../../src/custom/files/excel-writer.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAKvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBACa,iBAAkB,SAAQ,qBAAqB;IAExD;;;;;;;;;;;;;;;;;;OAkBG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA+HvF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyFzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAiBxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,SAEpC"}
1
+ {"version":3,"file":"excel-writer.action.d.ts","sourceRoot":"","sources":["../../../src/custom/files/excel-writer.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAavE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBACa,iBAAkB,SAAQ,qBAAqB;IAExD;;;;;;;;;;;;;;;;;;;;;OAqBG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmIvF;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqDhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyD1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAM5B;AAqDD;;GAEG;AACH,wBAAgB,qBAAqB,SAEpC"}