@rglabs/butterfly 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CLAUDE.md +201 -0
  2. package/README.md +371 -0
  3. package/dist/commands/add.d.ts +23 -0
  4. package/dist/commands/add.js +303 -0
  5. package/dist/commands/code.d.ts +11 -0
  6. package/dist/commands/code.js +72 -0
  7. package/dist/commands/create-object.d.ts +6 -0
  8. package/dist/commands/create-object.js +293 -0
  9. package/dist/commands/create-report.d.ts +6 -0
  10. package/dist/commands/create-report.js +154 -0
  11. package/dist/commands/diff.d.ts +4 -0
  12. package/dist/commands/diff.js +238 -0
  13. package/dist/commands/download.d.ts +4 -0
  14. package/dist/commands/download.js +374 -0
  15. package/dist/commands/layout.d.ts +12 -0
  16. package/dist/commands/layout.js +83 -0
  17. package/dist/commands/record.d.ts +21 -0
  18. package/dist/commands/record.js +483 -0
  19. package/dist/commands/run-poc.d.ts +3 -0
  20. package/dist/commands/run-poc.js +18 -0
  21. package/dist/commands/setup.d.ts +3 -0
  22. package/dist/commands/setup.js +66 -0
  23. package/dist/commands/start-poc.d.ts +3 -0
  24. package/dist/commands/start-poc.js +55 -0
  25. package/dist/commands/sync-docs.d.ts +3 -0
  26. package/dist/commands/sync-docs.js +27 -0
  27. package/dist/commands/translate.d.ts +13 -0
  28. package/dist/commands/translate.js +401 -0
  29. package/dist/commands/upload.d.ts +3 -0
  30. package/dist/commands/upload.js +150 -0
  31. package/dist/commands/workflow-info.d.ts +13 -0
  32. package/dist/commands/workflow-info.js +161 -0
  33. package/dist/components/ConflictResolver.d.ts +12 -0
  34. package/dist/components/ConflictResolver.js +77 -0
  35. package/dist/components/DiffView.d.ts +11 -0
  36. package/dist/components/DiffView.js +101 -0
  37. package/dist/components/DownloadProgress.d.ts +11 -0
  38. package/dist/components/DownloadProgress.js +29 -0
  39. package/dist/components/RecordPreview.d.ts +11 -0
  40. package/dist/components/RecordPreview.js +91 -0
  41. package/dist/components/SetupForm.d.ts +8 -0
  42. package/dist/components/SetupForm.js +56 -0
  43. package/dist/components/UploadProgress.d.ts +13 -0
  44. package/dist/components/UploadProgress.js +42 -0
  45. package/dist/diff/adapters/index.d.ts +8 -0
  46. package/dist/diff/adapters/index.js +18 -0
  47. package/dist/diff/adapters/objectsAdapter.d.ts +13 -0
  48. package/dist/diff/adapters/objectsAdapter.js +177 -0
  49. package/dist/diff/adapters/reportsAdapter.d.ts +14 -0
  50. package/dist/diff/adapters/reportsAdapter.js +212 -0
  51. package/dist/diff/adapters/types.d.ts +19 -0
  52. package/dist/diff/adapters/types.js +2 -0
  53. package/dist/diff/engine.d.ts +19 -0
  54. package/dist/diff/engine.js +57 -0
  55. package/dist/diff/types.d.ts +34 -0
  56. package/dist/diff/types.js +110 -0
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.js +117 -0
  59. package/dist/types/index.d.ts +18 -0
  60. package/dist/types/index.js +2 -0
  61. package/dist/utils/api.d.ts +85 -0
  62. package/dist/utils/api.js +1031 -0
  63. package/dist/utils/auth.d.ts +4 -0
  64. package/dist/utils/auth.js +22 -0
  65. package/dist/utils/bfySplitter.d.ts +12 -0
  66. package/dist/utils/bfySplitter.js +151 -0
  67. package/dist/utils/docs.d.ts +16 -0
  68. package/dist/utils/docs.js +186 -0
  69. package/dist/utils/errorLogger.d.ts +6 -0
  70. package/dist/utils/errorLogger.js +29 -0
  71. package/dist/utils/files.d.ts +14 -0
  72. package/dist/utils/files.js +772 -0
  73. package/dist/utils/lockManager.d.ts +15 -0
  74. package/dist/utils/lockManager.js +126 -0
  75. package/dist/utils/resourceHandlers.d.ts +50 -0
  76. package/dist/utils/resourceHandlers.js +684 -0
  77. package/dist/utils/resourceMapping.d.ts +32 -0
  78. package/dist/utils/resourceMapping.js +210 -0
  79. package/dist/utils/singleResourceDownload.d.ts +14 -0
  80. package/dist/utils/singleResourceDownload.js +261 -0
  81. package/dist/utils/summaryGenerator.d.ts +2 -0
  82. package/dist/utils/summaryGenerator.js +183 -0
  83. package/dist/utils/uploadHandler.d.ts +31 -0
  84. package/dist/utils/uploadHandler.js +263 -0
  85. package/docs/AI_API.md +93 -0
  86. package/docs/CLAUDE.md +216 -0
  87. package/docs/PROJECT_SPECIFIC.md +1 -0
  88. package/docs/RECORD_COMMAND.md +262 -0
  89. package/docs/WORKFLOW_API.md +480 -0
  90. package/docs/bfy-splitting.md +126 -0
  91. package/docs/cli-commands.md +333 -0
  92. package/docs/examples/README.md +95 -0
  93. package/docs/examples/order-system.md +147 -0
  94. package/docs/examples/product-catalog.md +195 -0
  95. package/docs/examples/reports.md +187 -0
  96. package/docs/excel-export.md +216 -0
  97. package/docs/field-types/README.md +29 -0
  98. package/docs/field-types/calculated.md +147 -0
  99. package/docs/field-types/code-mappings.md +84 -0
  100. package/docs/field-types/custom.md +340 -0
  101. package/docs/object-specs/README.md +136 -0
  102. package/docs/object-specs/code-parameters.md +151 -0
  103. package/docs/object-specs/creating.md +203 -0
  104. package/docs/object-specs/js-code-examples.md +208 -0
  105. package/docs/object-specs/js-field-updates.md +168 -0
  106. package/docs/objects/README.md +89 -0
  107. package/docs/objects/creating.md +127 -0
  108. package/docs/page-layout.md +361 -0
  109. package/docs/permissions.md +260 -0
  110. package/docs/reports.md +197 -0
  111. package/docs/state-machines.md +544 -0
  112. package/docs/tasks/create-object.md +81 -0
  113. package/docs/translations.md +346 -0
  114. package/docs/twig-helpers.md +283 -0
  115. package/docs/webservices.md +159 -0
  116. package/docs/workspaces.md +176 -0
  117. package/package.json +59 -0
@@ -0,0 +1,303 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { render, Box, Text } from 'ink';
3
+ import { loadAuthConfig } from '../utils/auth.js';
4
+ import { ButterflyAPI } from '../utils/api.js';
5
+ import { saveWorkflowData } from '../utils/files.js';
6
+ function parseConnectFrom(spec) {
7
+ const parts = spec.split(':');
8
+ if (parts.length < 1 || parts.length > 2) {
9
+ throw new Error(`Invalid --connect-from spec "${spec}". Format: node_id[:output_key]`);
10
+ }
11
+ const nodeId = parseInt(parts[0], 10);
12
+ if (isNaN(nodeId)) {
13
+ throw new Error(`Invalid node ID in --connect-from spec "${spec}"`);
14
+ }
15
+ const outputKey = parts[1] || 'output';
16
+ return { nodeId, outputKey };
17
+ }
18
+ function parseConnectTo(spec) {
19
+ const parts = spec.split(':');
20
+ if (parts.length < 1 || parts.length > 2) {
21
+ throw new Error(`Invalid --connect-to spec "${spec}". Format: node_id[:input_key]`);
22
+ }
23
+ const nodeId = parseInt(parts[0], 10);
24
+ if (isNaN(nodeId)) {
25
+ throw new Error(`Invalid node ID in --connect-to spec "${spec}"`);
26
+ }
27
+ const inputKey = parts[1] || 'input';
28
+ return { nodeId, inputKey };
29
+ }
30
+ const AddCommand = ({ options, api }) => {
31
+ const [state, setState] = useState({ status: 'loading', message: 'Initializing...' });
32
+ useEffect(() => {
33
+ const run = async () => {
34
+ try {
35
+ const outputPath = options.output || './butterfly-resources';
36
+ if (options.type === 'workflow') {
37
+ await createWorkflow(api, options, outputPath, setState);
38
+ }
39
+ else if (options.type === 'workflow-node') {
40
+ await createWorkflowNode(api, options, outputPath, setState);
41
+ }
42
+ else if (options.type === 'workflow-connection') {
43
+ await createWorkflowConnection(api, options, outputPath, setState);
44
+ }
45
+ else {
46
+ setState({ status: 'error', message: `Unknown type: ${options.type}. Supported types: workflow, workflow-node, workflow-connection` });
47
+ }
48
+ }
49
+ catch (error) {
50
+ setState({
51
+ status: 'error',
52
+ message: error instanceof Error ? error.message : 'Unknown error occurred'
53
+ });
54
+ }
55
+ };
56
+ run();
57
+ }, []);
58
+ return (React.createElement(Box, { flexDirection: "column" },
59
+ state.status === 'loading' && React.createElement(Text, { color: "yellow" },
60
+ "\u23F3 ",
61
+ state.message),
62
+ state.status === 'creating' && React.createElement(Text, { color: "blue" },
63
+ "\uD83D\uDD04 ",
64
+ state.message),
65
+ state.status === 'downloading' && React.createElement(Text, { color: "cyan" },
66
+ "\uD83D\uDCE5 ",
67
+ state.message),
68
+ state.status === 'complete' && (React.createElement(Box, { flexDirection: "column" },
69
+ React.createElement(Text, { color: "green" },
70
+ "\u2713 ",
71
+ state.message),
72
+ state.createdId && React.createElement(Text, { color: "gray" },
73
+ " Created ID: ",
74
+ state.createdId))),
75
+ state.status === 'error' && React.createElement(Text, { color: "red" },
76
+ "\u2717 ",
77
+ state.message)));
78
+ };
79
+ async function createWorkflow(api, options, outputPath, setState) {
80
+ setState({ status: 'creating', message: 'Creating new workflow...' });
81
+ const name = options.title || 'New Workflow';
82
+ const seo = `webhook/${name.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`;
83
+ const formData = new URLSearchParams();
84
+ formData.append('name', name);
85
+ formData.append('seo', seo);
86
+ formData.append('bfy_workflow_version_id', '0');
87
+ formData.append('bfy_workflow_node_id', '0');
88
+ const response = await api.httpClient.post('/admin/ajax/cms_object/operation?do=bfy_workflows__add', formData, {
89
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
90
+ });
91
+ if (!response.data?.success || !response.data?.id) {
92
+ throw new Error(response.data?.error || response.data?.message || 'Failed to create workflow');
93
+ }
94
+ const workflowId = response.data.id;
95
+ setState({ status: 'downloading', message: `Created workflow with ID ${workflowId}. Downloading...` });
96
+ await downloadWorkflowById(api, workflowId, outputPath);
97
+ setState({
98
+ status: 'complete',
99
+ message: `Workflow "${name}" created and downloaded successfully!`,
100
+ createdId: workflowId
101
+ });
102
+ }
103
+ async function createWorkflowNode(api, options, outputPath, setState) {
104
+ if (!options.workflow) {
105
+ throw new Error('--workflow is required (workflow name or ID)');
106
+ }
107
+ setState({ status: 'loading', message: 'Finding workflow...' });
108
+ const workflows = await api.fetchTable('bfy_workflows');
109
+ let workflow = workflows.find((w) => w.id.toString() === options.workflow ||
110
+ w.name.toLowerCase() === options.workflow?.toLowerCase());
111
+ if (!workflow) {
112
+ throw new Error(`Workflow not found: ${options.workflow}`);
113
+ }
114
+ const versions = await api.fetchTable('bfy_workflow_versions');
115
+ let version;
116
+ if (options.version) {
117
+ version = versions.find((v) => v.bfy_workflow_id === workflow.id &&
118
+ (v.id.toString() === options.version || v.version_number.toString() === options.version));
119
+ }
120
+ else {
121
+ const workflowVersions = versions.filter((v) => v.bfy_workflow_id === workflow.id);
122
+ version = workflowVersions.sort((a, b) => b.version_number - a.version_number)[0];
123
+ }
124
+ if (!version) {
125
+ throw new Error(`No version found for workflow: ${options.workflow}`);
126
+ }
127
+ setState({ status: 'creating', message: `Creating node in workflow "${workflow.name}" v${version.version_number}...` });
128
+ const title = options.title || 'New Node';
129
+ const nodeGroup = options.nodeGroup || 'Code';
130
+ const nodeIdentifier = options.nodeType || 'CustomScript';
131
+ const systemName = options.systemName || title.toLowerCase().replace(/[^a-z0-9]+/g, '_');
132
+ const nodes = await api.fetchTable('bfy_workflow_nodes');
133
+ const versionNodes = nodes.filter((n) => n.bfy_workflow_version_id === version.id);
134
+ const maxX = versionNodes.reduce((max, n) => Math.max(max, parseInt(n.position_x) || 0), 0);
135
+ const positionX = maxX + 240;
136
+ const positionY = 200;
137
+ const formData = new URLSearchParams();
138
+ formData.append('bfy_workflow_id', workflow.id.toString());
139
+ formData.append('bfy_workflow_version_id', version.id.toString());
140
+ formData.append('node_group_class_name', nodeGroup);
141
+ formData.append('node_identifier_key', nodeIdentifier);
142
+ formData.append('title', title);
143
+ formData.append('system_name', systemName);
144
+ formData.append('position_x', positionX.toString());
145
+ formData.append('position_y', positionY.toString());
146
+ formData.append('params', '');
147
+ formData.append('connections', '');
148
+ formData.append('pinned_data', '');
149
+ const response = await api.httpClient.post('/admin/ajax/cms_object/operation?do=bfy_workflow_nodes__add', formData, {
150
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
151
+ });
152
+ if (!response.data?.success || !response.data?.id) {
153
+ throw new Error(response.data?.error || response.data?.message || 'Failed to create node');
154
+ }
155
+ const nodeId = response.data.id;
156
+ const connectionsCreated = [];
157
+ if (options.connectFrom) {
158
+ setState({ status: 'creating', message: `Created node ${nodeId}. Creating connection from source node...` });
159
+ const spec = parseConnectFrom(options.connectFrom);
160
+ const sourceNode = versionNodes.find((n) => n.id === spec.nodeId);
161
+ if (!sourceNode) {
162
+ throw new Error(`Source node ${spec.nodeId} not found in workflow version`);
163
+ }
164
+ const connResult = await api.createWorkflowConnection({
165
+ source_node_id: spec.nodeId,
166
+ target_node_id: nodeId,
167
+ source_output_key: spec.outputKey,
168
+ target_input_key: 'input',
169
+ connection_type: 'data'
170
+ });
171
+ if (connResult?.success) {
172
+ connectionsCreated.push(`${spec.nodeId}:${spec.outputKey} → ${nodeId}:input`);
173
+ }
174
+ }
175
+ if (options.connectTo) {
176
+ setState({ status: 'creating', message: `Created node ${nodeId}. Creating connection to target node...` });
177
+ const spec = parseConnectTo(options.connectTo);
178
+ const targetNode = versionNodes.find((n) => n.id === spec.nodeId);
179
+ if (!targetNode) {
180
+ throw new Error(`Target node ${spec.nodeId} not found in workflow version`);
181
+ }
182
+ const connResult = await api.createWorkflowConnection({
183
+ source_node_id: nodeId,
184
+ target_node_id: spec.nodeId,
185
+ source_output_key: 'output',
186
+ target_input_key: spec.inputKey,
187
+ connection_type: 'data'
188
+ });
189
+ if (connResult?.success) {
190
+ connectionsCreated.push(`${nodeId}:output → ${spec.nodeId}:${spec.inputKey}`);
191
+ }
192
+ }
193
+ setState({ status: 'downloading', message: `Created node with ID ${nodeId}. Downloading workflow...` });
194
+ await downloadWorkflowById(api, workflow.id, outputPath);
195
+ const connectionMsg = connectionsCreated.length > 0
196
+ ? ` Connections: ${connectionsCreated.join(', ')}.`
197
+ : '';
198
+ setState({
199
+ status: 'complete',
200
+ message: `Node "${title}" created in workflow "${workflow.name}" v${version.version_number}!${connectionMsg}`,
201
+ createdId: nodeId
202
+ });
203
+ }
204
+ async function createWorkflowConnection(api, options, outputPath, setState) {
205
+ if (!options.workflow) {
206
+ throw new Error('--workflow is required (workflow name or ID)');
207
+ }
208
+ if (!options.from) {
209
+ throw new Error('--from is required (source node ID)');
210
+ }
211
+ if (!options.to) {
212
+ throw new Error('--to is required (target node ID)');
213
+ }
214
+ const sourceNodeId = parseInt(options.from, 10);
215
+ const targetNodeId = parseInt(options.to, 10);
216
+ if (isNaN(sourceNodeId)) {
217
+ throw new Error(`Invalid source node ID: ${options.from}`);
218
+ }
219
+ if (isNaN(targetNodeId)) {
220
+ throw new Error(`Invalid target node ID: ${options.to}`);
221
+ }
222
+ setState({ status: 'loading', message: 'Finding workflow and validating nodes...' });
223
+ const workflows = await api.fetchTable('bfy_workflows');
224
+ const workflow = workflows.find((w) => w.id.toString() === options.workflow ||
225
+ w.name.toLowerCase() === options.workflow?.toLowerCase());
226
+ if (!workflow) {
227
+ throw new Error(`Workflow not found: ${options.workflow}`);
228
+ }
229
+ const versions = await api.fetchTable('bfy_workflow_versions');
230
+ let version;
231
+ if (options.version) {
232
+ version = versions.find((v) => v.bfy_workflow_id === workflow.id &&
233
+ (v.id.toString() === options.version || v.version_number.toString() === options.version));
234
+ }
235
+ else {
236
+ const workflowVersions = versions.filter((v) => v.bfy_workflow_id === workflow.id);
237
+ version = workflowVersions.sort((a, b) => b.version_number - a.version_number)[0];
238
+ }
239
+ if (!version) {
240
+ throw new Error(`No version found for workflow: ${options.workflow}`);
241
+ }
242
+ const nodes = await api.fetchTable('bfy_workflow_nodes');
243
+ const versionNodes = nodes.filter((n) => n.bfy_workflow_version_id === version.id);
244
+ const sourceNode = versionNodes.find((n) => n.id === sourceNodeId);
245
+ const targetNode = versionNodes.find((n) => n.id === targetNodeId);
246
+ if (!sourceNode) {
247
+ throw new Error(`Source node ${sourceNodeId} not found in workflow "${workflow.name}" v${version.version_number}`);
248
+ }
249
+ if (!targetNode) {
250
+ throw new Error(`Target node ${targetNodeId} not found in workflow "${workflow.name}" v${version.version_number}`);
251
+ }
252
+ setState({ status: 'creating', message: `Creating connection from "${sourceNode.title}" to "${targetNode.title}"...` });
253
+ const sourceOutputKey = options.fromOutput || 'output';
254
+ const targetInputKey = options.toInput || 'input';
255
+ const connResult = await api.createWorkflowConnection({
256
+ source_node_id: sourceNodeId,
257
+ target_node_id: targetNodeId,
258
+ source_output_key: sourceOutputKey,
259
+ target_input_key: targetInputKey,
260
+ connection_type: 'data'
261
+ });
262
+ if (!connResult?.success) {
263
+ throw new Error(connResult?.error || connResult?.message || 'Failed to create connection');
264
+ }
265
+ setState({ status: 'downloading', message: `Connection created. Downloading workflow...` });
266
+ await downloadWorkflowById(api, workflow.id, outputPath);
267
+ setState({
268
+ status: 'complete',
269
+ message: `Connection created: "${sourceNode.title}":${sourceOutputKey} → "${targetNode.title}":${targetInputKey}`,
270
+ createdId: connResult.id
271
+ });
272
+ }
273
+ async function downloadWorkflowById(api, workflowId, outputPath) {
274
+ const [workflows, versions, nodes, connections] = await Promise.all([
275
+ api.fetchTable('bfy_workflows'),
276
+ api.fetchTable('bfy_workflow_versions'),
277
+ api.fetchTable('bfy_workflow_nodes'),
278
+ api.fetchTable('bfy_workflow_connections')
279
+ ]);
280
+ const workflow = workflows.find((w) => w.id === workflowId);
281
+ if (!workflow) {
282
+ throw new Error(`Workflow with ID ${workflowId} not found`);
283
+ }
284
+ const relatedVersions = versions.filter((v) => v.bfy_workflow_id === workflowId);
285
+ const versionIds = relatedVersions.map((v) => v.id);
286
+ const relatedNodes = nodes.filter((n) => versionIds.includes(n.bfy_workflow_version_id));
287
+ const nodeIds = relatedNodes.map((n) => n.id);
288
+ const relatedConnections = connections.filter((c) => nodeIds.includes(c.source_node_id) || nodeIds.includes(c.target_node_id));
289
+ await saveWorkflowData(outputPath, workflow, relatedVersions, relatedNodes, relatedConnections);
290
+ }
291
+ export default async function addCommand(options) {
292
+ const config = await loadAuthConfig();
293
+ if (!config) {
294
+ console.error('No authentication configured. Run "butterfly-cli setup" first.');
295
+ process.exit(1);
296
+ }
297
+ const api = new ButterflyAPI(config);
298
+ await api.authenticate();
299
+ if (api.needs2FA)
300
+ await api.complete2FA();
301
+ render(React.createElement(AddCommand, { options: options, api: api }));
302
+ }
303
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1,11 @@
1
+ interface CodeCommandOptions {
2
+ code?: string;
3
+ file?: string;
4
+ output?: string;
5
+ vars?: boolean;
6
+ outputOnly?: boolean;
7
+ raw?: boolean;
8
+ }
9
+ export default function codeCommand(options: CodeCommandOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1,72 @@
1
+ import { promises as fs } from 'fs';
2
+ import { loadAuthConfig } from '../utils/auth.js';
3
+ import { ButterflyAPI } from '../utils/api.js';
4
+ export default async function codeCommand(options) {
5
+ try {
6
+ if (!options.code && !options.file) {
7
+ console.error('ERROR: Either --code or --file is required');
8
+ process.exit(1);
9
+ }
10
+ if (options.code && options.file) {
11
+ console.error('ERROR: Cannot use both --code and --file together');
12
+ process.exit(1);
13
+ }
14
+ let code;
15
+ if (options.file) {
16
+ try {
17
+ code = await fs.readFile(options.file, 'utf-8');
18
+ }
19
+ catch (error) {
20
+ console.error(`ERROR: Failed to read file: ${error.message}`);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ else {
25
+ code = options.code;
26
+ }
27
+ const config = await loadAuthConfig();
28
+ if (!config) {
29
+ console.error('ERROR: No authentication configured. Run "butterfly-cli setup" first.');
30
+ process.exit(1);
31
+ }
32
+ const api = new ButterflyAPI(config);
33
+ await api.authenticate();
34
+ if (api.needs2FA)
35
+ await api.complete2FA();
36
+ const result = await api.executeCode(code);
37
+ if (!result.success) {
38
+ console.error(`ERROR: ${result.error || 'Code execution failed'}`);
39
+ process.exit(1);
40
+ }
41
+ let outputData;
42
+ if (options.vars) {
43
+ outputData = result.vars;
44
+ }
45
+ else if (options.outputOnly) {
46
+ outputData = result.output;
47
+ }
48
+ else {
49
+ outputData = {
50
+ success: result.success,
51
+ vars: result.vars,
52
+ output: result.output
53
+ };
54
+ }
55
+ const outputStr = options.raw && typeof outputData === 'string'
56
+ ? outputData
57
+ : JSON.stringify(outputData, null, 2);
58
+ if (options.output) {
59
+ await fs.writeFile(options.output, outputStr, 'utf-8');
60
+ console.log(`SUCCESS: Output saved to ${options.output}`);
61
+ }
62
+ else {
63
+ console.log(outputStr);
64
+ }
65
+ process.exit(0);
66
+ }
67
+ catch (error) {
68
+ console.error(`ERROR: ${error.message}`);
69
+ process.exit(1);
70
+ }
71
+ }
72
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1,6 @@
1
+ interface CreateObjectOptions {
2
+ file: string;
3
+ }
4
+ declare const _default: (options: CreateObjectOptions) => void;
5
+ export default _default;
6
+ //# sourceMappingURL=create-object.d.ts.map