@memberjunction/core-actions 2.53.0 → 2.55.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 (118) hide show
  1. package/dist/custom/ai/execute-ai-prompt.action.d.ts +94 -0
  2. package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -0
  3. package/dist/custom/ai/execute-ai-prompt.action.js +274 -0
  4. package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -0
  5. package/dist/custom/communication/slack-webhook.action.d.ts +101 -0
  6. package/dist/custom/communication/slack-webhook.action.d.ts.map +1 -0
  7. package/dist/custom/communication/slack-webhook.action.js +269 -0
  8. package/dist/custom/communication/slack-webhook.action.js.map +1 -0
  9. package/dist/custom/communication/teams-webhook.action.d.ts +96 -0
  10. package/dist/custom/communication/teams-webhook.action.d.ts.map +1 -0
  11. package/dist/custom/communication/teams-webhook.action.js +275 -0
  12. package/dist/custom/communication/teams-webhook.action.js.map +1 -0
  13. package/dist/custom/data/aggregate-data.action.d.ts +91 -0
  14. package/dist/custom/data/aggregate-data.action.d.ts.map +1 -0
  15. package/dist/custom/data/aggregate-data.action.js +333 -0
  16. package/dist/custom/data/aggregate-data.action.js.map +1 -0
  17. package/dist/custom/data/csv-parser.action.d.ts +68 -0
  18. package/dist/custom/data/csv-parser.action.d.ts.map +1 -0
  19. package/dist/custom/data/csv-parser.action.js +184 -0
  20. package/dist/custom/data/csv-parser.action.js.map +1 -0
  21. package/dist/custom/data/data-mapper.action.d.ts +89 -0
  22. package/dist/custom/data/data-mapper.action.d.ts.map +1 -0
  23. package/dist/custom/data/data-mapper.action.js +325 -0
  24. package/dist/custom/data/data-mapper.action.js.map +1 -0
  25. package/dist/custom/data/json-transform.action.d.ts +57 -0
  26. package/dist/custom/data/json-transform.action.d.ts.map +1 -0
  27. package/dist/custom/data/json-transform.action.js +205 -0
  28. package/dist/custom/data/json-transform.action.js.map +1 -0
  29. package/dist/custom/data/xml-parser.action.d.ts +85 -0
  30. package/dist/custom/data/xml-parser.action.d.ts.map +1 -0
  31. package/dist/custom/data/xml-parser.action.js +326 -0
  32. package/dist/custom/data/xml-parser.action.js.map +1 -0
  33. package/dist/custom/files/excel-reader.action.d.ts +86 -0
  34. package/dist/custom/files/excel-reader.action.d.ts.map +1 -0
  35. package/dist/custom/files/excel-reader.action.js +348 -0
  36. package/dist/custom/files/excel-reader.action.js.map +1 -0
  37. package/dist/custom/files/excel-writer.action.d.ts +79 -0
  38. package/dist/custom/files/excel-writer.action.d.ts.map +1 -0
  39. package/dist/custom/files/excel-writer.action.js +325 -0
  40. package/dist/custom/files/excel-writer.action.js.map +1 -0
  41. package/dist/custom/files/file-compress.action.d.ts +90 -0
  42. package/dist/custom/files/file-compress.action.d.ts.map +1 -0
  43. package/dist/custom/files/file-compress.action.js +346 -0
  44. package/dist/custom/files/file-compress.action.js.map +1 -0
  45. package/dist/custom/files/pdf-extractor.action.d.ts +86 -0
  46. package/dist/custom/files/pdf-extractor.action.d.ts.map +1 -0
  47. package/dist/custom/files/pdf-extractor.action.js +247 -0
  48. package/dist/custom/files/pdf-extractor.action.js.map +1 -0
  49. package/dist/custom/files/pdf-generator.action.d.ts +70 -0
  50. package/dist/custom/files/pdf-generator.action.d.ts.map +1 -0
  51. package/dist/custom/files/pdf-generator.action.js +286 -0
  52. package/dist/custom/files/pdf-generator.action.js.map +1 -0
  53. package/dist/custom/integration/api-rate-limiter.action.d.ts +88 -0
  54. package/dist/custom/integration/api-rate-limiter.action.d.ts.map +1 -0
  55. package/dist/custom/integration/api-rate-limiter.action.js +363 -0
  56. package/dist/custom/integration/api-rate-limiter.action.js.map +1 -0
  57. package/dist/custom/integration/graphql-query.action.d.ts +92 -0
  58. package/dist/custom/integration/graphql-query.action.d.ts.map +1 -0
  59. package/dist/custom/integration/graphql-query.action.js +251 -0
  60. package/dist/custom/integration/graphql-query.action.js.map +1 -0
  61. package/dist/custom/integration/http-request.action.d.ts +96 -0
  62. package/dist/custom/integration/http-request.action.d.ts.map +1 -0
  63. package/dist/custom/integration/http-request.action.js +316 -0
  64. package/dist/custom/integration/http-request.action.js.map +1 -0
  65. package/dist/custom/integration/oauth-flow.action.d.ts +130 -0
  66. package/dist/custom/integration/oauth-flow.action.d.ts.map +1 -0
  67. package/dist/custom/integration/oauth-flow.action.js +624 -0
  68. package/dist/custom/integration/oauth-flow.action.js.map +1 -0
  69. package/dist/custom/security/password-strength.action.d.ts +129 -0
  70. package/dist/custom/security/password-strength.action.d.ts.map +1 -0
  71. package/dist/custom/security/password-strength.action.js +463 -0
  72. package/dist/custom/security/password-strength.action.js.map +1 -0
  73. package/dist/custom/utilities/base-file-handler.d.ts +54 -0
  74. package/dist/custom/utilities/base-file-handler.d.ts.map +1 -0
  75. package/dist/custom/utilities/base-file-handler.js +167 -0
  76. package/dist/custom/utilities/base-file-handler.js.map +1 -0
  77. package/dist/custom/utilities/index.d.ts +3 -0
  78. package/dist/custom/utilities/index.d.ts.map +1 -0
  79. package/dist/custom/utilities/index.js +19 -0
  80. package/dist/custom/utilities/index.js.map +1 -0
  81. package/dist/custom/utilities/json-param-helper.d.ts +33 -0
  82. package/dist/custom/utilities/json-param-helper.d.ts.map +1 -0
  83. package/dist/custom/utilities/json-param-helper.js +66 -0
  84. package/dist/custom/utilities/json-param-helper.js.map +1 -0
  85. package/dist/custom/web/duckduckgo-rate-limiter.d.ts +72 -0
  86. package/dist/custom/web/duckduckgo-rate-limiter.d.ts.map +1 -0
  87. package/dist/custom/web/duckduckgo-rate-limiter.js +175 -0
  88. package/dist/custom/web/duckduckgo-rate-limiter.js.map +1 -0
  89. package/dist/custom/web/web-search.action.d.ts +1 -0
  90. package/dist/custom/web/web-search.action.d.ts.map +1 -1
  91. package/dist/custom/web/web-search.action.js +48 -20
  92. package/dist/custom/web/web-search.action.js.map +1 -1
  93. package/dist/custom/workflow/conditional.action.d.ts +94 -0
  94. package/dist/custom/workflow/conditional.action.d.ts.map +1 -0
  95. package/dist/custom/workflow/conditional.action.js +274 -0
  96. package/dist/custom/workflow/conditional.action.js.map +1 -0
  97. package/dist/custom/workflow/delay.action.d.ts +76 -0
  98. package/dist/custom/workflow/delay.action.d.ts.map +1 -0
  99. package/dist/custom/workflow/delay.action.js +187 -0
  100. package/dist/custom/workflow/delay.action.js.map +1 -0
  101. package/dist/custom/workflow/loop.action.d.ts +112 -0
  102. package/dist/custom/workflow/loop.action.d.ts.map +1 -0
  103. package/dist/custom/workflow/loop.action.js +380 -0
  104. package/dist/custom/workflow/loop.action.js.map +1 -0
  105. package/dist/custom/workflow/parallel-execute.action.d.ts +105 -0
  106. package/dist/custom/workflow/parallel-execute.action.d.ts.map +1 -0
  107. package/dist/custom/workflow/parallel-execute.action.js +457 -0
  108. package/dist/custom/workflow/parallel-execute.action.js.map +1 -0
  109. package/dist/custom/workflow/retry.action.d.ts +90 -0
  110. package/dist/custom/workflow/retry.action.d.ts.map +1 -0
  111. package/dist/custom/workflow/retry.action.js +378 -0
  112. package/dist/custom/workflow/retry.action.js.map +1 -0
  113. package/dist/index.d.ts +23 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +75 -0
  116. package/dist/index.js.map +1 -1
  117. package/package.json +25 -10
  118. package/readme.md +11270 -101
@@ -0,0 +1,247 @@
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.LoadPDFExtractorAction = exports.PDFExtractorAction = void 0;
10
+ const global_1 = require("@memberjunction/global");
11
+ const base_file_handler_1 = require("../utilities/base-file-handler");
12
+ const pdfParse = require('pdf-parse');
13
+ /**
14
+ * Action that extracts content from PDF files
15
+ * Can extract text, metadata, or specific pages
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Extract all text from PDF
20
+ * await runAction({
21
+ * ActionName: 'PDF Extractor',
22
+ * Params: [{
23
+ * Name: 'FileURL',
24
+ * Value: 'https://example.com/document.pdf'
25
+ * }, {
26
+ * Name: 'ExtractType',
27
+ * Value: 'text'
28
+ * }]
29
+ * });
30
+ *
31
+ * // Extract metadata from PDF
32
+ * await runAction({
33
+ * ActionName: 'PDF Extractor',
34
+ * Params: [{
35
+ * Name: 'PDFData',
36
+ * Value: base64PdfData
37
+ * }, {
38
+ * Name: 'ExtractType',
39
+ * Value: 'metadata'
40
+ * }]
41
+ * });
42
+ *
43
+ * // Extract specific pages
44
+ * await runAction({
45
+ * ActionName: 'PDF Extractor',
46
+ * Params: [{
47
+ * Name: 'FileID',
48
+ * Value: 'uuid-of-pdf-file'
49
+ * }, {
50
+ * Name: 'ExtractType',
51
+ * Value: 'pages'
52
+ * }, {
53
+ * Name: 'PageNumbers',
54
+ * Value: [1, 3, 5]
55
+ * }]
56
+ * });
57
+ * ```
58
+ */
59
+ let PDFExtractorAction = class PDFExtractorAction extends base_file_handler_1.BaseFileHandlerAction {
60
+ /**
61
+ * Extracts content from PDF files
62
+ *
63
+ * @param params - The action parameters containing:
64
+ * - FileID: UUID of MJ Storage file (optional)
65
+ * - FileURL: URL of PDF file (optional)
66
+ * - PDFData: Base64 encoded PDF data (optional)
67
+ * - ExtractType: "text" | "metadata" | "pages" (default: "text")
68
+ * - PageNumbers: Array of page numbers to extract (for pages extraction)
69
+ * - MergePages: Boolean - merge text from all pages (default: true)
70
+ * - IncludePageBreaks: Boolean - add page break markers (default: false)
71
+ *
72
+ * @returns Extracted content based on extraction type
73
+ */
74
+ async InternalRunAction(params) {
75
+ try {
76
+ // Get file content
77
+ const fileContent = await this.getFileContent(params, 'pdfdata', 'fileid', 'fileurl');
78
+ // Get extraction parameters
79
+ const extractType = (this.getParamValue(params, 'extracttype') || 'text').toLowerCase();
80
+ const pageNumbersParam = this.getParamValue(params, 'pagenumbers');
81
+ const mergePages = this.getBooleanParam(params, 'mergepages', true);
82
+ const includePageBreaks = this.getBooleanParam(params, 'includepagebreaks', false);
83
+ // Convert to Buffer if base64
84
+ let pdfBuffer;
85
+ if (typeof fileContent.content === 'string') {
86
+ // Check if it's base64
87
+ if (fileContent.source === 'direct' && this.isBase64(fileContent.content)) {
88
+ pdfBuffer = Buffer.from(fileContent.content, 'base64');
89
+ }
90
+ else {
91
+ // Assume it's raw PDF data as string
92
+ pdfBuffer = Buffer.from(fileContent.content, 'binary');
93
+ }
94
+ }
95
+ else {
96
+ pdfBuffer = fileContent.content;
97
+ }
98
+ // Parse PDF
99
+ const pdfData = await pdfParse(pdfBuffer);
100
+ let result;
101
+ switch (extractType) {
102
+ case 'metadata':
103
+ result = await this.extractMetadata(pdfData);
104
+ break;
105
+ case 'pages':
106
+ result = await this.extractPages(pdfData, pageNumbersParam, mergePages, includePageBreaks);
107
+ break;
108
+ case 'text':
109
+ default:
110
+ result = await this.extractText(pdfData, mergePages, includePageBreaks);
111
+ break;
112
+ }
113
+ // Add output parameters
114
+ if (extractType === 'text' || extractType === 'pages') {
115
+ params.Params.push({
116
+ Name: 'ExtractedText',
117
+ Type: 'Output',
118
+ Value: result.text
119
+ });
120
+ }
121
+ return {
122
+ Success: true,
123
+ ResultCode: "SUCCESS",
124
+ Message: JSON.stringify({
125
+ extractType: extractType,
126
+ source: fileContent.source,
127
+ fileName: fileContent.fileName,
128
+ ...result
129
+ }, null, 2)
130
+ };
131
+ }
132
+ catch (error) {
133
+ return {
134
+ Success: false,
135
+ Message: `Failed to extract PDF content: ${error instanceof Error ? error.message : String(error)}`,
136
+ ResultCode: "EXTRACTION_FAILED"
137
+ };
138
+ }
139
+ }
140
+ /**
141
+ * Check if string is base64 encoded
142
+ */
143
+ isBase64(str) {
144
+ try {
145
+ return Buffer.from(str, 'base64').toString('base64') === str;
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * Extract text from PDF
153
+ */
154
+ async extractText(pdfData, mergePages, includePageBreaks) {
155
+ let text = pdfData.text;
156
+ if (includePageBreaks && pdfData.text) {
157
+ // Add page break markers if requested
158
+ const pages = pdfData.text.split('\n\n');
159
+ text = pages.join('\n\n--- PAGE BREAK ---\n\n');
160
+ }
161
+ return {
162
+ text: text,
163
+ totalPages: pdfData.numpages,
164
+ textLength: text.length,
165
+ info: {
166
+ title: pdfData.info?.Title,
167
+ author: pdfData.info?.Author,
168
+ subject: pdfData.info?.Subject,
169
+ creator: pdfData.info?.Creator
170
+ }
171
+ };
172
+ }
173
+ /**
174
+ * Extract metadata from PDF
175
+ */
176
+ async extractMetadata(pdfData) {
177
+ return {
178
+ metadata: {
179
+ ...pdfData.info,
180
+ pageCount: pdfData.numpages,
181
+ version: pdfData.version,
182
+ isEncrypted: pdfData.isEncrypted || false,
183
+ permissions: pdfData.permissions || null
184
+ },
185
+ documentInfo: {
186
+ title: pdfData.info?.Title || null,
187
+ author: pdfData.info?.Author || null,
188
+ subject: pdfData.info?.Subject || null,
189
+ keywords: pdfData.info?.Keywords || null,
190
+ creator: pdfData.info?.Creator || null,
191
+ producer: pdfData.info?.Producer || null,
192
+ creationDate: pdfData.info?.CreationDate || null,
193
+ modificationDate: pdfData.info?.ModDate || null
194
+ },
195
+ statistics: {
196
+ totalPages: pdfData.numpages,
197
+ totalTextLength: pdfData.text?.length || 0
198
+ }
199
+ };
200
+ }
201
+ /**
202
+ * Extract specific pages from PDF
203
+ */
204
+ async extractPages(pdfData, pageNumbersParam, mergePages, includePageBreaks) {
205
+ // Parse page numbers
206
+ let pageNumbers = [];
207
+ if (pageNumbersParam) {
208
+ if (Array.isArray(pageNumbersParam)) {
209
+ pageNumbers = pageNumbersParam.map(n => parseInt(n.toString()));
210
+ }
211
+ else if (typeof pageNumbersParam === 'string') {
212
+ // Support comma-separated list
213
+ pageNumbers = pageNumbersParam.split(',').map(n => parseInt(n.trim()));
214
+ }
215
+ else {
216
+ pageNumbers = [parseInt(pageNumbersParam.toString())];
217
+ }
218
+ }
219
+ // Validate page numbers
220
+ pageNumbers = pageNumbers.filter(n => !isNaN(n) && n > 0 && n <= pdfData.numpages);
221
+ if (pageNumbers.length === 0) {
222
+ throw new Error('No valid page numbers specified');
223
+ }
224
+ // Note: pdf-parse doesn't support page-by-page extraction natively
225
+ // This would require a more advanced PDF library like pdf-lib
226
+ // For now, we'll return all text with a note about the limitation
227
+ return {
228
+ text: pdfData.text,
229
+ requestedPages: pageNumbers,
230
+ totalPages: pdfData.numpages,
231
+ note: 'Page-specific extraction requires advanced PDF processing. Currently returning all text.',
232
+ textLength: pdfData.text.length
233
+ };
234
+ }
235
+ };
236
+ exports.PDFExtractorAction = PDFExtractorAction;
237
+ exports.PDFExtractorAction = PDFExtractorAction = __decorate([
238
+ (0, global_1.RegisterClass)(base_file_handler_1.BaseFileHandlerAction, "PDF Extractor")
239
+ ], PDFExtractorAction);
240
+ /**
241
+ * Loader function to ensure the PDFExtractorAction class is included in the bundle
242
+ */
243
+ function LoadPDFExtractorAction() {
244
+ // Stub function to prevent tree shaking
245
+ }
246
+ exports.LoadPDFExtractorAction = LoadPDFExtractorAction;
247
+ //# sourceMappingURL=pdf-extractor.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-extractor.action.js","sourceRoot":"","sources":["../../../src/custom/files/pdf-extractor.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
+ import { BaseFileHandlerAction } from "../utilities/base-file-handler";
3
+ /**
4
+ * Action that generates PDF files from HTML or Markdown content
5
+ * Supports various formatting options and can save to MJ Storage
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Generate PDF from Markdown
10
+ * await runAction({
11
+ * ActionName: 'PDF Generator',
12
+ * Params: [{
13
+ * Name: 'Content',
14
+ * Value: '# Report Title\n\nThis is the report content...'
15
+ * }, {
16
+ * Name: 'ContentType',
17
+ * Value: 'markdown'
18
+ * }]
19
+ * });
20
+ *
21
+ * // Generate PDF from HTML with custom options
22
+ * await runAction({
23
+ * ActionName: 'PDF Generator',
24
+ * Params: [{
25
+ * Name: 'Content',
26
+ * Value: '<h1>Report</h1><p>Content here...</p>'
27
+ * }, {
28
+ * Name: 'Options',
29
+ * Value: {
30
+ * margin: { top: 50, bottom: 50, left: 72, right: 72 },
31
+ * fontSize: 12,
32
+ * font: 'Helvetica'
33
+ * }
34
+ * }]
35
+ * });
36
+ * ```
37
+ */
38
+ export declare class PDFGeneratorAction extends BaseFileHandlerAction {
39
+ /**
40
+ * Generates a PDF from HTML or Markdown content
41
+ *
42
+ * @param params - The action parameters containing:
43
+ * - Content: HTML or Markdown string to convert to PDF
44
+ * - ContentType: "html" | "markdown" (default: "html")
45
+ * - Options: PDF generation options object containing:
46
+ * - margin: { top, bottom, left, right } in points (default: 72)
47
+ * - fontSize: Base font size (default: 12)
48
+ * - font: Font family (default: 'Helvetica')
49
+ * - orientation: 'portrait' | 'landscape' (default: 'portrait')
50
+ * - size: Paper size like 'A4', 'Letter', etc. (default: 'Letter')
51
+ * - OutputFileID: Optional MJ Storage file ID to save to
52
+ * - FileName: Name for the generated PDF (default: 'document.pdf')
53
+ *
54
+ * @returns Base64 encoded PDF data or FileID if saved to storage
55
+ */
56
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
57
+ /**
58
+ * Generate PDF from HTML content
59
+ */
60
+ private generatePDF;
61
+ /**
62
+ * Simple HTML parser (for demonstration - real implementation would use proper HTML parser)
63
+ */
64
+ private parseHTMLToLines;
65
+ }
66
+ /**
67
+ * Loader function to ensure the PDFGeneratorAction class is included in the bundle
68
+ */
69
+ export declare function LoadPDFGeneratorAction(): void;
70
+ //# sourceMappingURL=pdf-generator.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.action.d.ts","sourceRoot":"","sources":["../../../src/custom/files/pdf-generator.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAKvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBACa,kBAAmB,SAAQ,qBAAqB;IAEzD;;;;;;;;;;;;;;;;OAgBG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwGvF;;OAEG;YACW,WAAW;IA4DzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAoC3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,SAErC"}
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.LoadPDFGeneratorAction = exports.PDFGeneratorAction = void 0;
33
+ const global_1 = require("@memberjunction/global");
34
+ const base_file_handler_1 = require("../utilities/base-file-handler");
35
+ const PDFDocument = __importStar(require("pdfkit"));
36
+ const marked_1 = require("marked");
37
+ const json_param_helper_1 = require("../utilities/json-param-helper");
38
+ /**
39
+ * Action that generates PDF files from HTML or Markdown content
40
+ * Supports various formatting options and can save to MJ Storage
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // Generate PDF from Markdown
45
+ * await runAction({
46
+ * ActionName: 'PDF Generator',
47
+ * Params: [{
48
+ * Name: 'Content',
49
+ * Value: '# Report Title\n\nThis is the report content...'
50
+ * }, {
51
+ * Name: 'ContentType',
52
+ * Value: 'markdown'
53
+ * }]
54
+ * });
55
+ *
56
+ * // Generate PDF from HTML with custom options
57
+ * await runAction({
58
+ * ActionName: 'PDF Generator',
59
+ * Params: [{
60
+ * Name: 'Content',
61
+ * Value: '<h1>Report</h1><p>Content here...</p>'
62
+ * }, {
63
+ * Name: 'Options',
64
+ * Value: {
65
+ * margin: { top: 50, bottom: 50, left: 72, right: 72 },
66
+ * fontSize: 12,
67
+ * font: 'Helvetica'
68
+ * }
69
+ * }]
70
+ * });
71
+ * ```
72
+ */
73
+ let PDFGeneratorAction = class PDFGeneratorAction extends base_file_handler_1.BaseFileHandlerAction {
74
+ /**
75
+ * Generates a PDF from HTML or Markdown content
76
+ *
77
+ * @param params - The action parameters containing:
78
+ * - Content: HTML or Markdown string to convert to PDF
79
+ * - ContentType: "html" | "markdown" (default: "html")
80
+ * - Options: PDF generation options object containing:
81
+ * - margin: { top, bottom, left, right } in points (default: 72)
82
+ * - fontSize: Base font size (default: 12)
83
+ * - font: Font family (default: 'Helvetica')
84
+ * - orientation: 'portrait' | 'landscape' (default: 'portrait')
85
+ * - size: Paper size like 'A4', 'Letter', etc. (default: 'Letter')
86
+ * - OutputFileID: Optional MJ Storage file ID to save to
87
+ * - FileName: Name for the generated PDF (default: 'document.pdf')
88
+ *
89
+ * @returns Base64 encoded PDF data or FileID if saved to storage
90
+ */
91
+ async InternalRunAction(params) {
92
+ try {
93
+ // Extract parameters
94
+ const content = this.getParamValue(params, 'content');
95
+ const contentType = (this.getParamValue(params, 'contenttype') || 'html').toLowerCase();
96
+ const outputFileId = this.getParamValue(params, 'outputfileid');
97
+ const fileName = this.getParamValue(params, 'filename') || 'document.pdf';
98
+ // Validate content
99
+ if (!content) {
100
+ return {
101
+ Success: false,
102
+ Message: "Content parameter is required",
103
+ ResultCode: "MISSING_CONTENT"
104
+ };
105
+ }
106
+ // Parse options
107
+ let options = {
108
+ margin: { top: 72, bottom: 72, left: 72, right: 72 },
109
+ fontSize: 12,
110
+ font: 'Helvetica',
111
+ orientation: 'portrait',
112
+ size: 'Letter'
113
+ };
114
+ const customOptions = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'options');
115
+ if (customOptions) {
116
+ options = { ...options, ...customOptions };
117
+ }
118
+ // Convert content if needed
119
+ let htmlContent = content.toString();
120
+ if (contentType === 'markdown') {
121
+ // Convert markdown to HTML
122
+ htmlContent = await (0, marked_1.marked)(htmlContent);
123
+ }
124
+ // Generate PDF
125
+ const pdfBuffer = await this.generatePDF(htmlContent, options);
126
+ // Save to storage if requested
127
+ if (outputFileId) {
128
+ try {
129
+ const fileId = await this.saveToMJStorage(pdfBuffer, fileName, 'application/pdf', params);
130
+ // Add output parameter
131
+ params.Params.push({
132
+ Name: 'GeneratedFileID',
133
+ Type: 'Output',
134
+ Value: fileId
135
+ });
136
+ return {
137
+ Success: true,
138
+ ResultCode: "SUCCESS_SAVED",
139
+ Message: JSON.stringify({
140
+ message: "PDF generated and saved successfully",
141
+ fileId: fileId,
142
+ fileName: fileName,
143
+ sizeBytes: pdfBuffer.length
144
+ }, null, 2)
145
+ };
146
+ }
147
+ catch (error) {
148
+ // If save fails, still return the PDF data
149
+ console.error('Failed to save to storage:', error);
150
+ }
151
+ }
152
+ // Return as base64
153
+ const base64Data = pdfBuffer.toString('base64');
154
+ // Add output parameter
155
+ params.Params.push({
156
+ Name: 'PDFData',
157
+ Type: 'Output',
158
+ Value: base64Data
159
+ });
160
+ return {
161
+ Success: true,
162
+ ResultCode: "SUCCESS",
163
+ Message: JSON.stringify({
164
+ message: "PDF generated successfully",
165
+ fileName: fileName,
166
+ sizeBytes: pdfBuffer.length,
167
+ base64Length: base64Data.length
168
+ }, null, 2)
169
+ };
170
+ }
171
+ catch (error) {
172
+ return {
173
+ Success: false,
174
+ Message: `Failed to generate PDF: ${error instanceof Error ? error.message : String(error)}`,
175
+ ResultCode: "GENERATION_FAILED"
176
+ };
177
+ }
178
+ }
179
+ /**
180
+ * Generate PDF from HTML content
181
+ */
182
+ async generatePDF(htmlContent, options) {
183
+ return new Promise((resolve, reject) => {
184
+ try {
185
+ // Create PDF document
186
+ const doc = new PDFDocument({
187
+ size: options.size,
188
+ layout: options.orientation,
189
+ margins: options.margin,
190
+ info: {
191
+ Title: 'Generated Document',
192
+ Author: 'MemberJunction',
193
+ Creator: 'PDF Generator Action'
194
+ }
195
+ });
196
+ // Collect PDF data
197
+ const chunks = [];
198
+ doc.on('data', (chunk) => chunks.push(chunk));
199
+ doc.on('end', () => resolve(Buffer.concat(chunks)));
200
+ doc.on('error', reject);
201
+ // Set default font
202
+ doc.font(options.font || 'Helvetica');
203
+ doc.fontSize(options.fontSize || 12);
204
+ // Parse and render HTML (simplified - real implementation would need proper HTML parsing)
205
+ const lines = this.parseHTMLToLines(htmlContent);
206
+ for (const line of lines) {
207
+ if (line.type === 'heading') {
208
+ doc.fontSize(line.size || 16).text(line.text, {
209
+ align: line.align || 'left',
210
+ continued: false
211
+ });
212
+ doc.fontSize(options.fontSize || 12);
213
+ }
214
+ else if (line.type === 'paragraph') {
215
+ doc.text(line.text, {
216
+ align: line.align || 'left',
217
+ continued: false
218
+ });
219
+ }
220
+ else if (line.type === 'list') {
221
+ doc.list([line.text], {
222
+ bulletRadius: 2,
223
+ textIndent: 20,
224
+ bulletIndent: 10
225
+ });
226
+ }
227
+ // Add spacing between elements
228
+ doc.moveDown(0.5);
229
+ }
230
+ // Finalize PDF
231
+ doc.end();
232
+ }
233
+ catch (error) {
234
+ reject(error);
235
+ }
236
+ });
237
+ }
238
+ /**
239
+ * Simple HTML parser (for demonstration - real implementation would use proper HTML parser)
240
+ */
241
+ parseHTMLToLines(html) {
242
+ const lines = [];
243
+ // Remove HTML tags but preserve structure
244
+ const text = html
245
+ .replace(/<h1[^>]*>(.*?)<\/h1>/gi, (match, content) => {
246
+ lines.push({ type: 'heading', text: content.trim(), size: 24 });
247
+ return '';
248
+ })
249
+ .replace(/<h2[^>]*>(.*?)<\/h2>/gi, (match, content) => {
250
+ lines.push({ type: 'heading', text: content.trim(), size: 20 });
251
+ return '';
252
+ })
253
+ .replace(/<h3[^>]*>(.*?)<\/h3>/gi, (match, content) => {
254
+ lines.push({ type: 'heading', text: content.trim(), size: 16 });
255
+ return '';
256
+ })
257
+ .replace(/<p[^>]*>(.*?)<\/p>/gi, (match, content) => {
258
+ lines.push({ type: 'paragraph', text: content.trim() });
259
+ return '';
260
+ })
261
+ .replace(/<li[^>]*>(.*?)<\/li>/gi, (match, content) => {
262
+ lines.push({ type: 'list', text: content.trim() });
263
+ return '';
264
+ })
265
+ .replace(/<br\s*\/?>/gi, '\n')
266
+ .replace(/<[^>]+>/g, '');
267
+ // Add any remaining text
268
+ const remainingText = text.trim();
269
+ if (remainingText) {
270
+ lines.push({ type: 'paragraph', text: remainingText });
271
+ }
272
+ return lines;
273
+ }
274
+ };
275
+ exports.PDFGeneratorAction = PDFGeneratorAction;
276
+ exports.PDFGeneratorAction = PDFGeneratorAction = __decorate([
277
+ (0, global_1.RegisterClass)(base_file_handler_1.BaseFileHandlerAction, "PDF Generator")
278
+ ], PDFGeneratorAction);
279
+ /**
280
+ * Loader function to ensure the PDFGeneratorAction class is included in the bundle
281
+ */
282
+ function LoadPDFGeneratorAction() {
283
+ // Stub function to prevent tree shaking
284
+ }
285
+ exports.LoadPDFGeneratorAction = LoadPDFGeneratorAction;
286
+ //# sourceMappingURL=pdf-generator.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.action.js","sourceRoot":"","sources":["../../../src/custom/files/pdf-generator.action.ts"],"names":[],"mappings":"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"}