@rglabs/butterfly 1.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 (136) hide show
  1. package/.claude/settings.local.json +25 -0
  2. package/dist/commands/add.d.ts +21 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +301 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/download.d.ts +4 -0
  7. package/dist/commands/download.d.ts.map +1 -0
  8. package/dist/commands/download.js +309 -0
  9. package/dist/commands/download.js.map +1 -0
  10. package/dist/commands/setup.d.ts +3 -0
  11. package/dist/commands/setup.d.ts.map +1 -0
  12. package/dist/commands/setup.js +41 -0
  13. package/dist/commands/setup.js.map +1 -0
  14. package/dist/commands/start/handlers/aiTasks.d.ts +4 -0
  15. package/dist/commands/start/handlers/aiTasks.d.ts.map +1 -0
  16. package/dist/commands/start/handlers/aiTasks.js +95 -0
  17. package/dist/commands/start/handlers/aiTasks.js.map +1 -0
  18. package/dist/commands/start/handlers/cronjobs.d.ts +4 -0
  19. package/dist/commands/start/handlers/cronjobs.d.ts.map +1 -0
  20. package/dist/commands/start/handlers/cronjobs.js +80 -0
  21. package/dist/commands/start/handlers/cronjobs.js.map +1 -0
  22. package/dist/commands/start/handlers/emailLayouts.d.ts +4 -0
  23. package/dist/commands/start/handlers/emailLayouts.d.ts.map +1 -0
  24. package/dist/commands/start/handlers/emailLayouts.js +83 -0
  25. package/dist/commands/start/handlers/emailLayouts.js.map +1 -0
  26. package/dist/commands/start/handlers/emailTemplates.d.ts +4 -0
  27. package/dist/commands/start/handlers/emailTemplates.d.ts.map +1 -0
  28. package/dist/commands/start/handlers/emailTemplates.js +83 -0
  29. package/dist/commands/start/handlers/emailTemplates.js.map +1 -0
  30. package/dist/commands/start/handlers/index.d.ts +11 -0
  31. package/dist/commands/start/handlers/index.d.ts.map +1 -0
  32. package/dist/commands/start/handlers/index.js +11 -0
  33. package/dist/commands/start/handlers/index.js.map +1 -0
  34. package/dist/commands/start/handlers/objects.d.ts +8 -0
  35. package/dist/commands/start/handlers/objects.d.ts.map +1 -0
  36. package/dist/commands/start/handlers/objects.js +205 -0
  37. package/dist/commands/start/handlers/objects.js.map +1 -0
  38. package/dist/commands/start/handlers/pages.d.ts +4 -0
  39. package/dist/commands/start/handlers/pages.d.ts.map +1 -0
  40. package/dist/commands/start/handlers/pages.js +86 -0
  41. package/dist/commands/start/handlers/pages.js.map +1 -0
  42. package/dist/commands/start/handlers/pdfTemplates.d.ts +4 -0
  43. package/dist/commands/start/handlers/pdfTemplates.d.ts.map +1 -0
  44. package/dist/commands/start/handlers/pdfTemplates.js +81 -0
  45. package/dist/commands/start/handlers/pdfTemplates.js.map +1 -0
  46. package/dist/commands/start/handlers/reports.d.ts +4 -0
  47. package/dist/commands/start/handlers/reports.d.ts.map +1 -0
  48. package/dist/commands/start/handlers/reports.js +159 -0
  49. package/dist/commands/start/handlers/reports.js.map +1 -0
  50. package/dist/commands/start/handlers/stateMachines.d.ts +4 -0
  51. package/dist/commands/start/handlers/stateMachines.d.ts.map +1 -0
  52. package/dist/commands/start/handlers/stateMachines.js +549 -0
  53. package/dist/commands/start/handlers/stateMachines.js.map +1 -0
  54. package/dist/commands/start/handlers/workflows.d.ts +5 -0
  55. package/dist/commands/start/handlers/workflows.d.ts.map +1 -0
  56. package/dist/commands/start/handlers/workflows.js +277 -0
  57. package/dist/commands/start/handlers/workflows.js.map +1 -0
  58. package/dist/commands/start/index.d.ts +5 -0
  59. package/dist/commands/start/index.d.ts.map +1 -0
  60. package/dist/commands/start/index.js +304 -0
  61. package/dist/commands/start/index.js.map +1 -0
  62. package/dist/commands/start/types.d.ts +25 -0
  63. package/dist/commands/start/types.d.ts.map +1 -0
  64. package/dist/commands/start/types.js +2 -0
  65. package/dist/commands/start/types.js.map +1 -0
  66. package/dist/commands/start/utils.d.ts +10 -0
  67. package/dist/commands/start/utils.d.ts.map +1 -0
  68. package/dist/commands/start/utils.js +191 -0
  69. package/dist/commands/start/utils.js.map +1 -0
  70. package/dist/commands/start.d.ts +2 -0
  71. package/dist/commands/start.d.ts.map +1 -0
  72. package/dist/commands/start.js +2 -0
  73. package/dist/commands/start.js.map +1 -0
  74. package/dist/commands/upload.d.ts +3 -0
  75. package/dist/commands/upload.d.ts.map +1 -0
  76. package/dist/commands/upload.js +115 -0
  77. package/dist/commands/upload.js.map +1 -0
  78. package/dist/commands/workflow-info.d.ts +11 -0
  79. package/dist/commands/workflow-info.d.ts.map +1 -0
  80. package/dist/commands/workflow-info.js +159 -0
  81. package/dist/commands/workflow-info.js.map +1 -0
  82. package/dist/components/DownloadProgress.d.ts +11 -0
  83. package/dist/components/DownloadProgress.d.ts.map +1 -0
  84. package/dist/components/DownloadProgress.js +29 -0
  85. package/dist/components/DownloadProgress.js.map +1 -0
  86. package/dist/components/SetupForm.d.ts +8 -0
  87. package/dist/components/SetupForm.d.ts.map +1 -0
  88. package/dist/components/SetupForm.js +56 -0
  89. package/dist/components/SetupForm.js.map +1 -0
  90. package/dist/components/UploadProgress.d.ts +11 -0
  91. package/dist/components/UploadProgress.d.ts.map +1 -0
  92. package/dist/components/UploadProgress.js +29 -0
  93. package/dist/components/UploadProgress.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +63 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/types/index.d.ts +18 -0
  99. package/dist/types/index.d.ts.map +1 -0
  100. package/dist/types/index.js +2 -0
  101. package/dist/types/index.js.map +1 -0
  102. package/dist/utils/api.d.ts +47 -0
  103. package/dist/utils/api.d.ts.map +1 -0
  104. package/dist/utils/api.js +676 -0
  105. package/dist/utils/api.js.map +1 -0
  106. package/dist/utils/auth.d.ts +4 -0
  107. package/dist/utils/auth.d.ts.map +1 -0
  108. package/dist/utils/auth.js +22 -0
  109. package/dist/utils/auth.js.map +1 -0
  110. package/dist/utils/docs.d.ts +2 -0
  111. package/dist/utils/docs.d.ts.map +1 -0
  112. package/dist/utils/docs.js +41 -0
  113. package/dist/utils/docs.js.map +1 -0
  114. package/dist/utils/errorLogger.d.ts +6 -0
  115. package/dist/utils/errorLogger.d.ts.map +1 -0
  116. package/dist/utils/errorLogger.js +29 -0
  117. package/dist/utils/errorLogger.js.map +1 -0
  118. package/dist/utils/files.d.ts +14 -0
  119. package/dist/utils/files.d.ts.map +1 -0
  120. package/dist/utils/files.js +732 -0
  121. package/dist/utils/files.js.map +1 -0
  122. package/dist/utils/lockManager.d.ts +15 -0
  123. package/dist/utils/lockManager.d.ts.map +1 -0
  124. package/dist/utils/lockManager.js +126 -0
  125. package/dist/utils/lockManager.js.map +1 -0
  126. package/dist/utils/summaryGenerator.d.ts +2 -0
  127. package/dist/utils/summaryGenerator.d.ts.map +1 -0
  128. package/dist/utils/summaryGenerator.js +183 -0
  129. package/dist/utils/summaryGenerator.js.map +1 -0
  130. package/dist/utils/uploadHandler.d.ts +35 -0
  131. package/dist/utils/uploadHandler.d.ts.map +1 -0
  132. package/dist/utils/uploadHandler.js +706 -0
  133. package/dist/utils/uploadHandler.js.map +1 -0
  134. package/object_response.png +0 -0
  135. package/object_specs_response.png +0 -0
  136. package/package.json +56 -0
@@ -0,0 +1,81 @@
1
+ import { promises as fs } from 'fs';
2
+ import { basename, dirname } from 'path';
3
+ import { restoreTableRecordFromFiles } from '../../../utils/files.js';
4
+ export async function handlePdfTemplateFileChange(filePath, apiInstance, isNewFile, addLog) {
5
+ const fileName = basename(filePath);
6
+ try {
7
+ if (fileName === 'pdf_template.json') {
8
+ const templateData = JSON.parse(await fs.readFile(filePath, 'utf-8'));
9
+ const fileDir = dirname(filePath);
10
+ const restoredData = await restoreTableRecordFromFiles(fileDir, 'pdf_templates', templateData);
11
+ if (isNewFile) {
12
+ const { id, ...createData } = restoredData;
13
+ const formData = new URLSearchParams();
14
+ Object.entries(createData).forEach(([key, value]) => {
15
+ if (value !== null && value !== undefined) {
16
+ formData.append(key, String(value));
17
+ }
18
+ });
19
+ const response = await apiInstance.httpClient.post('/admin/ajax/cms_object/operation?do=pdf_templates__add', formData, {
20
+ headers: {
21
+ 'Content-Type': 'application/x-www-form-urlencoded',
22
+ }
23
+ });
24
+ if (response.data && response.data.success && response.data.id) {
25
+ addLog(`✓ Created PDF template (ID: ${response.data.id})`, 'success');
26
+ }
27
+ else {
28
+ const errorMsg = response.data?.error || response.data?.message || 'Unknown response format';
29
+ addLog(`✗ Failed to create PDF template: ${errorMsg}`, 'error');
30
+ }
31
+ }
32
+ else {
33
+ const formData = new URLSearchParams();
34
+ formData.append('id', restoredData.id.toString());
35
+ Object.entries(restoredData).forEach(([key, value]) => {
36
+ if (key !== 'id' && value !== null && value !== undefined) {
37
+ formData.append(key, String(value));
38
+ }
39
+ });
40
+ const response = await apiInstance.httpClient.post('/admin/ajax/cms_object/operation?do=pdf_templates__edit', formData, {
41
+ headers: {
42
+ 'Content-Type': 'application/x-www-form-urlencoded',
43
+ }
44
+ });
45
+ if (response.data && response.data.success) {
46
+ addLog(`✓ Updated PDF template (ID: ${restoredData.id})`, 'success');
47
+ }
48
+ else {
49
+ const errorMsg = response.data?.error || response.data?.message || 'Unknown response format';
50
+ addLog(`✗ Failed to update PDF template: ${errorMsg}`, 'error');
51
+ }
52
+ }
53
+ }
54
+ else if (fileName === 'template.twig') {
55
+ const templateJsonPath = dirname(filePath) + '/pdf_template.json';
56
+ const templateData = JSON.parse(await fs.readFile(templateJsonPath, 'utf-8'));
57
+ const fileDir = dirname(filePath);
58
+ const restoredData = await restoreTableRecordFromFiles(fileDir, 'pdf_templates', templateData);
59
+ const formData = new URLSearchParams();
60
+ formData.append('id', restoredData.id.toString());
61
+ if (restoredData.template !== undefined)
62
+ formData.append('template', restoredData.template);
63
+ const response = await apiInstance.httpClient.post('/admin/ajax/cms_object/operation?do=pdf_templates__edit', formData, {
64
+ headers: {
65
+ 'Content-Type': 'application/x-www-form-urlencoded',
66
+ }
67
+ });
68
+ if (response.data && response.data.success) {
69
+ addLog(`✓ Updated PDF template content (ID: ${restoredData.id})`, 'success');
70
+ }
71
+ else {
72
+ const errorMsg = response.data?.error || response.data?.message || 'Unknown response format';
73
+ addLog(`✗ Failed to update PDF template content: ${errorMsg}`, 'error');
74
+ }
75
+ }
76
+ }
77
+ catch (err) {
78
+ addLog(`✗ Error handling PDF template file: ${err instanceof Error ? err.message : 'Unknown error'}`, 'error');
79
+ }
80
+ }
81
+ //# sourceMappingURL=pdfTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfTemplates.js","sourceRoot":"","sources":["../../../../src/commands/start/handlers/pdfTemplates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ButterflyAPI } from '../../../utils/api.js';
2
+ import { AddLogFn } from '../types.js';
3
+ export declare function handleReportFileChange(filePath: string, apiInstance: ButterflyAPI, isNewFile: boolean, addLog: AddLogFn): Promise<void>;
4
+ //# sourceMappingURL=reports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../../../src/commands/start/handlers/reports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,YAAY,EACzB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,159 @@
1
+ import { promises as fs } from 'fs';
2
+ import { join, basename, dirname } from 'path';
3
+ import { restoreFieldsFromFiles } from '../../../utils/files.js';
4
+ export async function handleReportFileChange(filePath, apiInstance, isNewFile, addLog) {
5
+ const fileName = basename(filePath);
6
+ const parts = filePath.split('/');
7
+ const reportsIndex = parts.findIndex(part => part === 'reports');
8
+ if (reportsIndex === -1)
9
+ return;
10
+ try {
11
+ if (filePath.endsWith('report.json')) {
12
+ await handleReportJsonUpdate(filePath, apiInstance, isNewFile, addLog);
13
+ }
14
+ else if (filePath.includes('/specs/') && filePath.endsWith('spec.json')) {
15
+ await handleReportSpecJsonUpdate(filePath, apiInstance, isNewFile, addLog);
16
+ }
17
+ else if (filePath.includes('/specs/') && fileName === 'code.js') {
18
+ await handleReportSpecCodeUpdate(filePath, apiInstance, addLog);
19
+ }
20
+ else if (filePath.includes('/queries/') && filePath.endsWith('query.json')) {
21
+ await handleReportQueryJsonUpdate(filePath, apiInstance, isNewFile, addLog);
22
+ }
23
+ else if (filePath.includes('/queries/') && fileName === 'query_code.bfy') {
24
+ await handleReportQueryCodeUpdate(filePath, apiInstance, 'query', addLog);
25
+ }
26
+ else if (filePath.includes('/queries/') && fileName === 'script.js') {
27
+ await handleReportQueryCodeUpdate(filePath, apiInstance, 'js_code', addLog);
28
+ }
29
+ else if (fileName === 'main_query.bfy') {
30
+ await handleReportMainQueryUpdate(filePath, apiInstance, addLog);
31
+ }
32
+ }
33
+ catch (err) {
34
+ addLog(`✗ Error handling report file: ${err instanceof Error ? err.message : 'Unknown error'}`, 'error');
35
+ }
36
+ }
37
+ async function handleReportJsonUpdate(filePath, apiInstance, isNewFile, addLog) {
38
+ const reportData = JSON.parse(await fs.readFile(filePath, 'utf-8'));
39
+ const fileDir = dirname(filePath);
40
+ const restoredData = await restoreFieldsFromFiles(fileDir, reportData);
41
+ if (isNewFile) {
42
+ const { id, ...createData } = restoredData;
43
+ const response = await apiInstance.createReport(createData);
44
+ if (response && response.success && response.id) {
45
+ addLog(`✓ Created report (ID: ${response.id})`, 'success');
46
+ }
47
+ else {
48
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
49
+ addLog(`✗ Failed to create report: ${errorMsg}`, 'error');
50
+ }
51
+ }
52
+ else {
53
+ const response = await apiInstance.updateReport(restoredData.id, restoredData);
54
+ if (response && response.success) {
55
+ addLog(`✓ Updated report (ID: ${restoredData.id})`, 'success');
56
+ }
57
+ else {
58
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
59
+ addLog(`✗ Failed to update report: ${errorMsg}`, 'error');
60
+ }
61
+ }
62
+ }
63
+ async function handleReportSpecJsonUpdate(filePath, apiInstance, isNewFile, addLog) {
64
+ const specData = JSON.parse(await fs.readFile(filePath, 'utf-8'));
65
+ const fileDir = dirname(filePath);
66
+ const restoredData = await restoreFieldsFromFiles(fileDir, specData);
67
+ if (isNewFile) {
68
+ const { id, ...createData } = restoredData;
69
+ const response = await apiInstance.createReportSpec(createData);
70
+ if (response && response.success && response.id) {
71
+ addLog(`✓ Created report spec (ID: ${response.id})`, 'success');
72
+ }
73
+ else {
74
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
75
+ addLog(`✗ Failed to create report spec: ${errorMsg}`, 'error');
76
+ }
77
+ }
78
+ else {
79
+ const response = await apiInstance.updateReportSpec(restoredData.id, restoredData);
80
+ if (response && response.success) {
81
+ addLog(`✓ Updated report spec (ID: ${restoredData.id})`, 'success');
82
+ }
83
+ else {
84
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
85
+ addLog(`✗ Failed to update report spec: ${errorMsg}`, 'error');
86
+ }
87
+ }
88
+ }
89
+ async function handleReportSpecCodeUpdate(filePath, apiInstance, addLog) {
90
+ const codeContent = await fs.readFile(filePath, 'utf-8');
91
+ const specJsonPath = join(dirname(filePath), 'spec.json');
92
+ const specData = JSON.parse(await fs.readFile(specJsonPath, 'utf-8'));
93
+ const updateData = { js_code: codeContent };
94
+ const response = await apiInstance.updateReportSpec(specData.id, updateData);
95
+ if (response && response.success) {
96
+ addLog(`✓ Updated report spec js_code (ID: ${specData.id})`, 'success');
97
+ }
98
+ else {
99
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
100
+ addLog(`✗ Failed to update report spec js_code: ${errorMsg}`, 'error');
101
+ }
102
+ }
103
+ async function handleReportQueryJsonUpdate(filePath, apiInstance, isNewFile, addLog) {
104
+ const queryData = JSON.parse(await fs.readFile(filePath, 'utf-8'));
105
+ const fileDir = dirname(filePath);
106
+ const restoredData = await restoreFieldsFromFiles(fileDir, queryData);
107
+ if (isNewFile) {
108
+ const { id, ...createData } = restoredData;
109
+ const response = await apiInstance.createReportQuery(createData);
110
+ if (response && response.success && response.id) {
111
+ addLog(`✓ Created report query (ID: ${response.id})`, 'success');
112
+ }
113
+ else {
114
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
115
+ addLog(`✗ Failed to create report query: ${errorMsg}`, 'error');
116
+ }
117
+ }
118
+ else {
119
+ const response = await apiInstance.updateReportQuery(restoredData.id, restoredData);
120
+ if (response && response.success) {
121
+ addLog(`✓ Updated report query (ID: ${restoredData.id})`, 'success');
122
+ }
123
+ else {
124
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
125
+ addLog(`✗ Failed to update report query: ${errorMsg}`, 'error');
126
+ }
127
+ }
128
+ }
129
+ async function handleReportQueryCodeUpdate(filePath, apiInstance, field, addLog) {
130
+ const codeContent = await fs.readFile(filePath, 'utf-8');
131
+ const queryJsonPath = join(dirname(filePath), 'query.json');
132
+ const queryData = JSON.parse(await fs.readFile(queryJsonPath, 'utf-8'));
133
+ const updateData = { [field]: codeContent };
134
+ const response = await apiInstance.updateReportQuery(queryData.id, updateData);
135
+ if (response && response.success) {
136
+ addLog(`✓ Updated report query ${field} (ID: ${queryData.id})`, 'success');
137
+ }
138
+ else {
139
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
140
+ addLog(`✗ Failed to update report query ${field}: ${errorMsg}`, 'error');
141
+ }
142
+ }
143
+ async function handleReportMainQueryUpdate(filePath, apiInstance, addLog) {
144
+ const queryContent = await fs.readFile(filePath, 'utf-8');
145
+ const reportJsonPath = join(dirname(filePath), 'report.json');
146
+ const reportData = JSON.parse(await fs.readFile(reportJsonPath, 'utf-8'));
147
+ const fileDir = dirname(reportJsonPath);
148
+ const restoredReportData = await restoreFieldsFromFiles(fileDir, reportData);
149
+ const updateData = { query: queryContent };
150
+ const response = await apiInstance.updateReport(restoredReportData.id, updateData);
151
+ if (response && response.success) {
152
+ addLog(`✓ Updated report main query (ID: ${restoredReportData.id})`, 'success');
153
+ }
154
+ else {
155
+ const errorMsg = response?.error || response?.message || 'Unknown response format';
156
+ addLog(`✗ Failed to update report main query: ${errorMsg}`, 'error');
157
+ }
158
+ }
159
+ //# sourceMappingURL=reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../../../src/commands/start/handlers/reports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ButterflyAPI } from '../../../utils/api.js';
2
+ import { AddLogFn } from '../types.js';
3
+ export declare function handleStateMachineFileChange(filePath: string, apiInstance: ButterflyAPI, isNewFile: boolean, addLog: AddLogFn): Promise<void>;
4
+ //# sourceMappingURL=stateMachines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateMachines.d.ts","sourceRoot":"","sources":["../../../../src/commands/start/handlers/stateMachines.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,YAAY,EACzB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,IAAI,CAAC,CAyBf"}