@fnet/cli 0.133.0 → 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 (182) hide show
  1. package/dist/fbin/index.js +14 -1
  2. package/dist/fnet/index.0jcm9pn5.js +1 -0
  3. package/dist/fnet/index.2084z2ed.js +2 -0
  4. package/dist/fnet/index.33f1ggpr.js +1 -0
  5. package/dist/fnet/index.3exge2js.js +1 -0
  6. package/dist/fnet/index.3kfx538h.js +1 -0
  7. package/dist/fnet/index.490y87nc.js +1 -0
  8. package/dist/fnet/index.4g9yezkq.js +1 -0
  9. package/dist/fnet/index.4jkat7r4.js +1 -0
  10. package/dist/fnet/index.7crx8ky1.js +1 -0
  11. package/dist/fnet/index.7vw06nrn.js +1 -0
  12. package/dist/fnet/index.9567fa9x.js +1 -0
  13. package/dist/fnet/index.gh75wt1m.js +1 -0
  14. package/dist/fnet/index.hzsfswvp.js +1 -0
  15. package/dist/fnet/index.jgpc3grc.js +1 -0
  16. package/dist/fnet/index.js +19 -1
  17. package/dist/fnet/index.p0zb7e1b.js +1 -0
  18. package/dist/fnet/index.r19p3bpa.js +2 -0
  19. package/dist/fnet/index.r82rtnmz.js +1 -0
  20. package/dist/fnet/index.s662t98v.js +1 -0
  21. package/dist/fnet/index.w74dpnpn.js +1 -0
  22. package/dist/fnet/index.xeaw5xa9.js +1 -0
  23. package/dist/fnet/index.zm4kesg6.js +1 -0
  24. package/dist/fnode/index.05n3mvs9.js +2 -0
  25. package/dist/fnode/index.2hc9tbyx.js +1 -0
  26. package/dist/fnode/index.2pnjg6dc.js +1 -0
  27. package/dist/fnode/index.9qgtmxq3.js +2 -0
  28. package/dist/fnode/index.b1q7y05p.js +1 -0
  29. package/dist/fnode/index.bhapgrs7.js +1 -0
  30. package/dist/fnode/index.cvxrf34y.js +2 -0
  31. package/dist/fnode/index.dp9wyahp.js +1 -0
  32. package/dist/fnode/index.eqxmcpdc.js +1 -0
  33. package/dist/fnode/index.f2tb0x3t.js +1 -0
  34. package/dist/fnode/index.fbzv6wwf.js +1 -0
  35. package/dist/fnode/index.gazd9raq.js +1 -0
  36. package/dist/fnode/index.hv4s25f0.js +3 -0
  37. package/dist/fnode/index.j5z7dtsx.js +1 -0
  38. package/dist/fnode/index.js +9 -1
  39. package/dist/fnode/index.kb4e4bxf.js +1 -0
  40. package/dist/fnode/index.qn0schqp.js +1 -0
  41. package/dist/fnode/index.rht29phd.js +1 -0
  42. package/dist/fnode/index.rzsfmek6.js +3 -0
  43. package/dist/fnode/index.s0nk6cv8.js +4 -0
  44. package/dist/fnode/index.s66v6wt4.js +1 -0
  45. package/dist/fnode/index.sv7v0y60.js +1 -0
  46. package/dist/fnode/index.tgkhgnrp.js +1 -0
  47. package/dist/fnode/index.vq706f75.js +1 -0
  48. package/dist/fnode/index.y8pvdcny.js +1 -0
  49. package/dist/fnode/index.z4vz93ww.js +1 -0
  50. package/dist/frun/index.js +1 -1
  51. package/dist/fservice/index.js +18 -1
  52. package/dist/fservice/index.q01yvaz0.js +2 -0
  53. package/package.json +21 -18
  54. package/readme.md +62 -15
  55. package/template/fnet/core/object.js +10 -10
  56. package/template/fnet/node/package.json.njk +6 -3
  57. package/template/fnet/node/src/cli/index.js.njk +5 -315
  58. package/template/fnet/node/src/cli/index.js.v1.njk +318 -0
  59. package/template/fnet/node/src/cli/v2/core/args-parser.njk +10 -0
  60. package/template/fnet/node/src/cli/v2/core/imports.njk +31 -0
  61. package/template/fnet/node/src/cli/v2/core/run-wrapper.njk +25 -0
  62. package/template/fnet/node/src/cli/v2/index.js.njk +184 -0
  63. package/template/fnet/node/src/cli/v2/modes/default/extend.njk +11 -0
  64. package/template/fnet/node/src/cli/v2/modes/default/standard.njk +20 -0
  65. package/template/fnet/node/src/cli/v2/modes/http/builtin.njk +66 -0
  66. package/template/fnet/node/src/cli/v2/modes/http/imports.njk +9 -0
  67. package/template/fnet/node/src/cli/v2/modes/http/index.njk +12 -0
  68. package/template/fnet/node/src/cli/v2/modes/mcp/imports.njk +33 -0
  69. package/template/fnet/node/src/cli/v2/modes/mcp/index.njk +30 -0
  70. package/template/fnet/node/src/cli/v2/modes/mcp/server-setup.njk +15 -0
  71. package/template/fnet/node/src/cli/v2/modes/mcp/tool-handlers.njk +46 -0
  72. package/template/fnet/node/src/cli/v2/modes/mcp/transport-http.njk +222 -0
  73. package/template/fnet/node/src/cli/v2/modes/mcp/transport-stdio.njk +9 -0
  74. package/template/fnet/node/src/cli/v2/modes/pipeline/imports.njk +9 -0
  75. package/template/fnet/node/src/cli/v2/modes/pipeline/index.njk +113 -0
  76. package/template/fnet/node/src/cli/v2/modes/webhook/imports.njk +9 -0
  77. package/template/fnet/node/src/cli/v2/modes/webhook/index.njk +127 -0
  78. package/template/fnet/node/src/cli/v2/modes/websocket/imports.njk +15 -0
  79. package/template/fnet/node/src/cli/v2/modes/websocket/index.njk +104 -0
  80. package/template/fnet/node/src/default/blocks/assign.js.njk +10 -48
  81. package/template/fnet/node/src/default/blocks/call.js.njk +110 -156
  82. package/template/fnet/node/src/default/blocks/for.js.njk +58 -74
  83. package/template/fnet/node/src/default/blocks/form.js.njk +21 -59
  84. package/template/fnet/node/src/default/blocks/http.js.njk +135 -0
  85. package/template/fnet/node/src/default/blocks/modules.js.njk +10 -52
  86. package/template/fnet/node/src/default/blocks/new.js.njk +40 -85
  87. package/template/fnet/node/src/default/blocks/next.js.njk +10 -32
  88. package/template/fnet/node/src/default/blocks/output.js.njk +10 -48
  89. package/template/fnet/node/src/default/blocks/parallel.js.njk +64 -0
  90. package/template/fnet/node/src/default/blocks/pipeline.js.njk +109 -0
  91. package/template/fnet/node/src/default/blocks/raise.js.njk +9 -25
  92. package/template/fnet/node/src/default/blocks/retry.js.njk +70 -0
  93. package/template/fnet/node/src/default/blocks/return.js.njk +13 -25
  94. package/template/fnet/node/src/default/blocks/schedule.js.njk +66 -0
  95. package/template/fnet/node/src/default/blocks/signal.js.njk +10 -32
  96. package/template/fnet/node/src/default/blocks/steps.js.njk +32 -48
  97. package/template/fnet/node/src/default/blocks/switch.js.njk +37 -67
  98. package/template/fnet/node/src/default/blocks/tryexcept.js.njk +58 -52
  99. package/template/fnet/node/src/default/blocks/wait.js.njk +10 -30
  100. package/template/fnet/node/src/default/input.args.js.njk +5 -2
  101. package/template/fnet/node/src/default/macros/block-body-header.js.njk +1 -1
  102. package/template/fnet/node/src/default/macros/block-header.js.njk +0 -3
  103. package/template/fnet/node/src/default/macros/block-next.js.njk +1 -1
  104. package/template/fnet/node/src/default/macros/block-run-footer.js.njk +1 -1
  105. package/template/fnet/node/src/default/macros/block-run-header.js.njk +14 -2
  106. package/template/fnet/node/src/default/macros/page.js.njk +1 -1
  107. package/template/fnet/node/src/default/types/block.js.njk +133 -0
  108. package/template/fnet/node/src/default/workflow.js.njk +8 -6
  109. package/template/fnode/node/package.json.njk +5 -4
  110. package/template/fnode/node/src/cli/index.js.njk +3 -397
  111. package/template/fnode/node/src/cli/index.js.v1.njk +464 -0
  112. package/template/fnode/node/src/cli/v2/core/args-parser.njk +10 -0
  113. package/template/fnode/node/src/cli/v2/core/imports.njk +29 -0
  114. package/template/fnode/node/src/cli/v2/core/run-wrapper.njk +25 -0
  115. package/template/fnode/node/src/cli/v2/index.js.njk +184 -0
  116. package/template/fnode/node/src/cli/v2/modes/default/extend.njk +11 -0
  117. package/template/fnode/node/src/cli/v2/modes/default/standard.njk +19 -0
  118. package/template/fnode/node/src/cli/v2/modes/http/builtin.njk +61 -0
  119. package/template/fnode/node/src/cli/v2/modes/http/imports.njk +9 -0
  120. package/template/fnode/node/src/cli/v2/modes/http/index.njk +12 -0
  121. package/template/fnode/node/src/cli/v2/modes/mcp/imports.njk +33 -0
  122. package/template/fnode/node/src/cli/v2/modes/mcp/index.njk +30 -0
  123. package/template/fnode/node/src/cli/v2/modes/mcp/server-setup.njk +15 -0
  124. package/template/fnode/node/src/cli/v2/modes/mcp/tool-handlers.njk +41 -0
  125. package/template/fnode/node/src/cli/v2/modes/mcp/transport-http.njk +212 -0
  126. package/template/fnode/node/src/cli/v2/modes/mcp/transport-stdio.njk +9 -0
  127. package/template/fnode/node/src/cli/v2/modes/pipeline/imports.njk +9 -0
  128. package/template/fnode/node/src/cli/v2/modes/pipeline/index.njk +103 -0
  129. package/template/fnode/node/src/cli/v2/modes/webhook/imports.njk +9 -0
  130. package/template/fnode/node/src/cli/v2/modes/webhook/index.njk +122 -0
  131. package/template/fnode/node/src/cli/v2/modes/websocket/imports.njk +15 -0
  132. package/template/fnode/node/src/cli/v2/modes/websocket/index.njk +99 -0
  133. package/template/fnode/node/src/default/input.args.js.njk +6 -2
  134. package/dist/fnet/index.-SGbq2cI.js +0 -1
  135. package/dist/fnet/index.B5XE4ChJ.js +0 -1
  136. package/dist/fnet/index.Bft2w7m3.js +0 -1
  137. package/dist/fnet/index.BuYxdKtK.js +0 -1
  138. package/dist/fnet/index.C0YpfQ5j.js +0 -1
  139. package/dist/fnet/index.C2S9JYhS.js +0 -1
  140. package/dist/fnet/index.C7saWH6d.js +0 -1
  141. package/dist/fnet/index.CDct_kkF.js +0 -1
  142. package/dist/fnet/index.CMC8mlye.js +0 -1
  143. package/dist/fnet/index.CmMM-Ek9.js +0 -1
  144. package/dist/fnet/index.CuMyez3E.js +0 -1
  145. package/dist/fnet/index.CzAV0S36.js +0 -1
  146. package/dist/fnet/index.D2N9YZmA.js +0 -1
  147. package/dist/fnet/index.D3p7pncT.js +0 -1
  148. package/dist/fnet/index.DG8TqL-1.js +0 -1
  149. package/dist/fnet/index.DI3yyTtl.js +0 -1
  150. package/dist/fnet/index.DOYkqsYT.js +0 -1
  151. package/dist/fnet/index.DWpw12No.js +0 -1
  152. package/dist/fnet/index.DrwlOzAe.js +0 -1
  153. package/dist/fnet/index.Q-CYRcna.js +0 -1
  154. package/dist/fnet/index.W6RYgypK.js +0 -1
  155. package/dist/fnet/index.xd8c7XMr.js +0 -1
  156. package/dist/fnode/index.-SGbq2cI.js +0 -1
  157. package/dist/fnode/index.B5XE4ChJ.js +0 -1
  158. package/dist/fnode/index.B8gal9up.js +0 -1
  159. package/dist/fnode/index.BU1440aO.js +0 -1
  160. package/dist/fnode/index.BcGYSPne.js +0 -1
  161. package/dist/fnode/index.Bft2w7m3.js +0 -1
  162. package/dist/fnode/index.BuYxdKtK.js +0 -1
  163. package/dist/fnode/index.C2S9JYhS.js +0 -1
  164. package/dist/fnode/index.C7saWH6d.js +0 -1
  165. package/dist/fnode/index.CDct_kkF.js +0 -1
  166. package/dist/fnode/index.CMC8mlye.js +0 -1
  167. package/dist/fnode/index.CmMM-Ek9.js +0 -1
  168. package/dist/fnode/index.CuMyez3E.js +0 -1
  169. package/dist/fnode/index.CzAV0S36.js +0 -1
  170. package/dist/fnode/index.D2N9YZmA.js +0 -1
  171. package/dist/fnode/index.D3p7pncT.js +0 -1
  172. package/dist/fnode/index.DG8TqL-1.js +0 -1
  173. package/dist/fnode/index.DI3yyTtl.js +0 -1
  174. package/dist/fnode/index.DWpw12No.js +0 -1
  175. package/dist/fnode/index.DrwlOzAe.js +0 -1
  176. package/dist/fnode/index.N_a5FdgA.js +0 -1
  177. package/dist/fnode/index.Q-CYRcna.js +0 -1
  178. package/dist/fnode/index.UNoFg95r.js +0 -1
  179. package/dist/fnode/index.W6RYgypK.js +0 -1
  180. package/dist/fnode/index.xd8c7XMr.js +0 -1
  181. package/template/fnet/core/print.js +0 -1
  182. package/template/fnet/node/src/default/macros/workflow-header.js.njk +0 -7
@@ -0,0 +1,103 @@
1
+ {# ============================================================================
2
+ PIPELINE MODE - MAIN
3
+ ============================================================================
4
+ Unix pipeline integration via stdin/stdout
5
+ Supports line-by-line processing and full input mode
6
+ ============================================================================ #}
7
+
8
+ if (cliMode === 'pipeline') {
9
+ // Pipeline mode code
10
+ const pipelineMode = args['pipeline-mode'] || args.pipeline_mode || 'lines';
11
+ const pipelineFormat = args['pipeline-format'] || args.pipeline_format || 'json';
12
+
13
+ if (pipelineMode === 'lines') {
14
+ // Line-by-line processing (default)
15
+ {% if atom.doc.features.project.format==='esm' %}
16
+ const readline = await import('readline');
17
+ {% elif atom.doc.features.project.format==='cjs' %}
18
+ const readline = require('readline');
19
+ {% endif %}
20
+ const rl = readline.createInterface({
21
+ input: process.stdin,
22
+ output: process.stdout,
23
+ terminal: false
24
+ });
25
+
26
+ rl.on('line', async (line) => {
27
+ try {
28
+ // Parse input based on format
29
+ let input;
30
+ if (pipelineFormat === 'json') {
31
+ input = JSON.parse(line);
32
+ } else {
33
+ input = { data: line };
34
+ }
35
+
36
+ // Validate input
37
+ // TODO: Add schema validation if needed
38
+
39
+ // Process with Core
40
+ const result = await Node(input);
41
+
42
+ // Output result
43
+ if (pipelineFormat === 'json') {
44
+ console.log(JSON.stringify(result));
45
+ } else {
46
+ console.log(result);
47
+ }
48
+ } catch (error) {
49
+ console.error(`Error processing line: ${error.message}`);
50
+ }
51
+ });
52
+
53
+ rl.on('close', () => {
54
+ process.exit(0);
55
+ });
56
+
57
+ } else if (pipelineMode === 'full') {
58
+ // Full input processing
59
+ let inputData = '';
60
+
61
+ process.stdin.on('data', (chunk) => {
62
+ inputData += chunk;
63
+ });
64
+
65
+ process.stdin.on('end', async () => {
66
+ try {
67
+ // Parse input based on format
68
+ let input;
69
+ if (pipelineFormat === 'json') {
70
+ input = JSON.parse(inputData);
71
+ } else {
72
+ input = { data: inputData };
73
+ }
74
+
75
+ // Validate input
76
+ // TODO: Add schema validation if needed
77
+
78
+ // Process with Core
79
+ const result = await Node(input);
80
+
81
+ // Output result
82
+ if (pipelineFormat === 'json') {
83
+ console.log(JSON.stringify(result, null, 2));
84
+ } else {
85
+ console.log(result);
86
+ }
87
+
88
+ process.exit(0);
89
+ } catch (error) {
90
+ console.error(`Error processing input: ${error.message}`);
91
+ process.exit(1);
92
+ }
93
+ });
94
+
95
+ } else {
96
+ console.error(`Unknown pipeline mode: ${pipelineMode}`);
97
+ console.error(`Supported modes: lines, full`);
98
+ process.exit(1);
99
+ }
100
+
101
+ return;
102
+ }
103
+
@@ -0,0 +1,9 @@
1
+ {# ============================================================================
2
+ WEBHOOK MODE - IMPORTS
3
+ ============================================================================
4
+ No mode-specific imports needed
5
+ http and crypto modules are imported in shared imports section
6
+ ============================================================================ #}
7
+
8
+ {# http and crypto modules imported in shared section #}
9
+
@@ -0,0 +1,122 @@
1
+ {# ============================================================================
2
+ WEBHOOK MODE - IMPLEMENTATION
3
+ ============================================================================
4
+ Event-driven HTTP webhook server with HMAC signature verification
5
+ ============================================================================ #}
6
+
7
+ if (cliMode === 'webhook') {
8
+ const port = args['cli-port'] || args.cli_port || 3000;
9
+ const webhookPath = args['webhook-path'] || args.webhook_path || '/webhook';
10
+ const webhookSecret = args['webhook-secret'] || args.webhook_secret || process.env.WEBHOOK_SECRET;
11
+ const signatureHeader = args['webhook-signature-header'] || args.webhook_signature_header || 'x-hub-signature-256';
12
+
13
+ const server = http.createServer(async (req, res) => {
14
+ // CORS headers
15
+ res.setHeader('Access-Control-Allow-Origin', '*');
16
+ res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
17
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, ' + signatureHeader);
18
+
19
+ // Handle OPTIONS preflight
20
+ if (req.method === 'OPTIONS') {
21
+ res.writeHead(200);
22
+ res.end();
23
+ return;
24
+ }
25
+
26
+ // Only accept POST requests
27
+ if (req.method !== 'POST') {
28
+ res.writeHead(405, { 'Content-Type': 'application/json' });
29
+ res.end(JSON.stringify({ error: 'Method not allowed. Use POST.' }));
30
+ return;
31
+ }
32
+
33
+ // Only accept webhook path
34
+ if (req.url !== webhookPath) {
35
+ res.writeHead(404, { 'Content-Type': 'application/json' });
36
+ res.end(JSON.stringify({ error: 'Not found. Use ' + webhookPath }));
37
+ return;
38
+ }
39
+
40
+ // Read request body
41
+ let body = '';
42
+ req.on('data', chunk => {
43
+ body += chunk.toString();
44
+ });
45
+
46
+ req.on('end', async () => {
47
+ try {
48
+ // Verify signature if secret is provided
49
+ if (webhookSecret) {
50
+ const signature = req.headers[signatureHeader.toLowerCase()];
51
+
52
+ if (!signature) {
53
+ res.writeHead(401, { 'Content-Type': 'application/json' });
54
+ res.end(JSON.stringify({ error: 'Missing signature header: ' + signatureHeader }));
55
+ return;
56
+ }
57
+
58
+ // Calculate expected signature (HMAC-SHA256)
59
+ const hmac = crypto.createHmac('sha256', webhookSecret);
60
+ hmac.update(body);
61
+ const expectedSignature = 'sha256=' + hmac.digest('hex');
62
+
63
+ // Compare signatures (timing-safe)
64
+ const signatureBuffer = Buffer.from(signature);
65
+ const expectedBuffer = Buffer.from(expectedSignature);
66
+
67
+ if (signatureBuffer.length !== expectedBuffer.length ||
68
+ !crypto.timingSafeEqual(signatureBuffer, expectedBuffer)) {
69
+ res.writeHead(401, { 'Content-Type': 'application/json' });
70
+ res.end(JSON.stringify({ error: 'Invalid signature' }));
71
+ return;
72
+ }
73
+ }
74
+
75
+ // Parse JSON payload
76
+ let payload;
77
+ try {
78
+ payload = JSON.parse(body);
79
+ } catch (e) {
80
+ res.writeHead(400, { 'Content-Type': 'application/json' });
81
+ res.end(JSON.stringify({ error: 'Invalid JSON payload' }));
82
+ return;
83
+ }
84
+
85
+ // Process webhook with Core
86
+ const result = await Node(payload);
87
+
88
+ // Send response
89
+ res.writeHead(200, { 'Content-Type': 'application/json' });
90
+ res.end(JSON.stringify(result));
91
+
92
+ } catch (error) {
93
+ res.writeHead(500, { 'Content-Type': 'application/json' });
94
+ res.end(JSON.stringify({
95
+ error: error.message,
96
+ type: 'processing_error'
97
+ }));
98
+ }
99
+ });
100
+
101
+ req.on('error', (error) => {
102
+ res.writeHead(500, { 'Content-Type': 'application/json' });
103
+ res.end(JSON.stringify({
104
+ error: error.message,
105
+ type: 'request_error'
106
+ }));
107
+ });
108
+ });
109
+
110
+ server.listen(port, () => {
111
+ console.log(`Webhook server started on port ${port}`);
112
+ console.log(`Webhook endpoint: ${webhookPath}`);
113
+ if (webhookSecret) {
114
+ console.log(`Signature verification: enabled (header: ${signatureHeader})`);
115
+ } else {
116
+ console.log(`Signature verification: disabled (no secret provided)`);
117
+ }
118
+ });
119
+
120
+ return;
121
+ }
122
+
@@ -0,0 +1,15 @@
1
+ {# ============================================================================
2
+ WEBSOCKET MODE - IMPORTS
3
+ ============================================================================
4
+ WebSocket server dependencies using 'ws' library
5
+ Supports both ESM and CJS formats
6
+ ============================================================================ #}
7
+
8
+ {% if atom.doc.features.project.format==='esm' %}
9
+ // Using ws library for WebSocket mode
10
+ import { WebSocketServer } from 'ws';
11
+ {% elif atom.doc.features.project.format==='cjs' %}
12
+ // Using ws library for WebSocket mode
13
+ const { WebSocketServer } = require('ws');
14
+ {% endif %}
15
+
@@ -0,0 +1,99 @@
1
+ {# ============================================================================
2
+ WEBSOCKET MODE - MAIN
3
+ ============================================================================
4
+ WebSocket server for real-time bidirectional communication
5
+ Supports connection handling, message processing, and heartbeat
6
+ ============================================================================ #}
7
+
8
+ if (cliMode === 'websocket') {
9
+ // WebSocket mode code
10
+ const port = args['cli-port'] || args.cli_port || 3000;
11
+ const heartbeat = args['ws-heartbeat'] || args.ws_heartbeat || 30000; // 30 seconds default
12
+
13
+ const wss = new WebSocketServer({ port });
14
+
15
+ // Store active connections
16
+ const clients = new Set();
17
+
18
+ wss.on('connection', (ws) => {
19
+ console.log('WebSocket client connected');
20
+ clients.add(ws);
21
+
22
+ // Set up heartbeat
23
+ ws.isAlive = true;
24
+ ws.on('pong', () => {
25
+ ws.isAlive = true;
26
+ });
27
+
28
+ // Handle incoming messages
29
+ ws.on('message', async (data) => {
30
+ try {
31
+ // Parse message
32
+ const message = data.toString();
33
+ let input;
34
+
35
+ try {
36
+ input = JSON.parse(message);
37
+ } catch (e) {
38
+ // If not JSON, wrap in object
39
+ input = { data: message };
40
+ }
41
+
42
+ // Validate input
43
+ // TODO: Add schema validation if needed
44
+
45
+ // Process with Core
46
+ const result = await Node(input);
47
+
48
+ // Send response back to client
49
+ ws.send(JSON.stringify(result));
50
+
51
+ } catch (error) {
52
+ // Send error to client
53
+ ws.send(JSON.stringify({
54
+ error: error.message,
55
+ type: 'processing_error'
56
+ }));
57
+ }
58
+ });
59
+
60
+ // Handle client disconnect
61
+ ws.on('close', () => {
62
+ console.log('WebSocket client disconnected');
63
+ clients.delete(ws);
64
+ });
65
+
66
+ // Handle errors
67
+ ws.on('error', (error) => {
68
+ console.error('WebSocket error:', error.message);
69
+ clients.delete(ws);
70
+ });
71
+ });
72
+
73
+ // Heartbeat interval
74
+ if (heartbeat > 0) {
75
+ const interval = setInterval(() => {
76
+ wss.clients.forEach((ws) => {
77
+ if (ws.isAlive === false) {
78
+ console.log('Terminating inactive client');
79
+ return ws.terminate();
80
+ }
81
+
82
+ ws.isAlive = false;
83
+ ws.ping();
84
+ });
85
+ }, heartbeat);
86
+
87
+ wss.on('close', () => {
88
+ clearInterval(interval);
89
+ });
90
+ }
91
+
92
+ console.log(`WebSocket server started on port ${port}`);
93
+ if (heartbeat > 0) {
94
+ console.log(`Heartbeat interval: ${heartbeat}ms`);
95
+ }
96
+
97
+ return;
98
+ }
99
+
@@ -1,9 +1,9 @@
1
1
  {% if atom.doc.features.project.format === 'esm' %}
2
- import fnetArgs from '@fnet/args';
2
+ import fnetArgs,{argsParser} from '@fnet/args';
3
3
  import validate,{schema as inputSchema} from "./validate_input";
4
4
 
5
5
  {% elif atom.doc.features.project.format === 'cjs' %}
6
- const fnetArgs = require('@fnet/args');
6
+ const {default:fnetArgs,argsParser} = require('@fnet/args');
7
7
  const validate,{schema as inputSchema} = require("./validate_input");
8
8
  {% endif %}
9
9
 
@@ -75,6 +75,8 @@
75
75
  return await fnetArgs({schema,initial,validate,packageCallback});
76
76
  };
77
77
 
78
+ export { argsParser };
79
+
78
80
  {% elif atom.doc.features.project.format === 'cjs' %}
79
81
 
80
82
  module.exports = async () => {
@@ -119,4 +121,6 @@
119
121
 
120
122
  return await fnetArgs({schema,initial,validate,packageCallback});
121
123
  };
124
+
125
+ module.exports.argsParser = argsParser;
122
126
  {% endif %}
@@ -1 +0,0 @@
1
- import t from"cli-table3";import r from"chalk";function e(e,o={}){const a={chars:{top:"─","top-mid":"─","top-left":" ","top-right":" ",bottom:"─","bottom-mid":"─","bottom-left":" ","bottom-right":" ",left:" ","left-mid":" ",mid:"─","mid-mid":"─",right:" ","right-mid":" ",middle:" "},style:{head:[],border:[],compact:!0},wordWrap:!0,...o,head:e.map((t=>r.bold(t)))};return new t(a)}function o(t,r,o={}){const a=e(t,o);return Array.isArray(r)&&r.forEach((t=>{a.push(t)})),a.toString()}function a(t){switch(t){case"running":return r.green;case"stopped":return r.yellow;case"failed":return r.red;case"registered":return r.blue;default:return r.gray}}var i={createTable:e,createTableWithData:o,getStatusColor:a};export{e as createTable,o as createTableWithData,i as default,a as getStatusColor};
@@ -1 +0,0 @@
1
- import o from"@fnet/config";import e from"@flownet/lib-to-ios-app";import a from"lodash.clonedeep";import t from"semver";async function n({atom:n,target:r,onProgress:i,projectDir:s,dependencies:p,context:c,yamlTarget:m}){i&&await i({message:"Deploying it as ios-app package."});const f=r?.config?await o({name:r.config,dir:s,optional:!0,transferEnv:!1,tags:c.tags}):void 0,g=t.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,m.set("version",g);const d=a(r.params);d.dependencies=a(p);const l={atom:n,params:d,config:f?.config,src:s,dest:s};return{deployer:await e(l)}}export{n as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import r from"semver";import a from"@fnet/shelljs";import n from"@fnet/config";async function i({setProgress:i,context:o,deploymentProject:s,deploymentProjectTarget:c,registerToPackageManager:m,yamlTarget:p}){await i({message:"Deploying it as gcs package."});const l=o.projectDir,d=t.resolve(l,"package.json"),g=e.readFileSync(d),f=JSON.parse(g);f.name=c.params.name,f.version=r.inc(c.version,"patch"),delete f.scripts,delete f.devDependencies,e.writeFileSync(d,JSON.stringify(f,null,"\t"));const{file:v,data:y}=await n({name:c.config||"gcs",dir:o.projectDir,tags:o.tags});let u="fnet-files-to-gcs";u+=` --projectId='${y.env.GCS_PROJECT_ID}'`,u+=` --bucketName='${y.env.GCS_BUCKET_NAME}'`,u+=` --keyFilename='${t.resolve(t.dirname(v),y.env.GCS_UPLOADER_KEY_FILE)}'`,u+=` --dir='${l}'`,u+=" --pattern='dist/**/**'",u+=" --pattern='bin/**/**'",u+=" --pattern='test/**/**'",u+=" --pattern='*.html'",u+=` --destDir='${f.name}/${f.version}'`,u+=" --metadata.cacheControl='public, max-age=31536000, immutable'",console.log(u),y.env.DOMAIN&&(u+=` --domain='${y.env.DOMAIN}'`),!0!==c.dry_run&&!0!==c.params.dry_run||(u+=" --dryRun"),await a(u),e.writeFileSync(d,g),!0!==c.dryRun&&(s.isDirty=!0,c.version=f.version,p.set("version",f.version),await m({target:c,packageJSON:f}))}export{i as default};
@@ -1 +0,0 @@
1
- import r from"semver";import e from"@fnet/config";import o from"node:fs";import t from"@fnet/shelljs";import n from"form-data";async function i({setProgress:i,context:s,deploymentProject:a,deploymentProjectTarget:f,yamlTarget:c}){await i({message:"Deploying it as fnet flow."});const{file:p,data:w}=await e({name:f.config||"fnet-flow",dir:s.project.projectDir,tags:s.tags});if(!w.env.ATOM_API_URL)throw new Error(`ATOM_API_URL is required in ${p}`);if(!w.env.ATOM_API_USERNAME)throw new Error(`ATOM_API_USERNAME is required in ${p}`);if(!w.env.ATOM_API_PASSWORD)throw new Error(`ATOM_API_PASSWORD is required in ${p}`);const d=`${w.env.ATOM_API_URL}/v1/auth/token`,m=w.env.ATOM_API_USERNAME,l=w.env.ATOM_API_PASSWORD,A=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:m,password:l})});if(!A.ok)throw new Error(`Failed to fetch token: ${A.statusText}`);const h=await A.json(),_=h?.access_token;if(!_)throw new Error(`Invalid access_token from ${d}`);a.isDirty=!0;const u=r.inc(f.version,"patch");f.params.version=u,f.version=u,c.set("version",u);const v=`${w.env.ATOM_API_URL}/v1/service/fnet-flow/publish`,T=await fetch(v,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${_}`},body:JSON.stringify({name:f.params.name,version:f.params.version,docs:f.params.docs,configs:f.params.configs})});if(!T.ok)throw new Error(`Error publishing fnet flow: ${T.statusText}`);const E=await T.json();if(E?.error)throw new Error("Error publishing fnet flow.");const O=E?.upload.id;let P="fnet-dir-zipper";P+=` --sourceDir='${s.project.projectDir}'`,P+=" --pattern=**/*",P+=" --stdout_format=json";const g=await t(P);if(0!==g.code)throw new Error(g.stderr);const S=JSON.parse(g.stdout).path;let M=new n;M.append("file",o.createReadStream(S));const $=await fetch(`${w.env.ATOM_API_URL}/v1/service/upload/single/${O}`,{method:"POST",headers:{...M.getHeaders(),Authorization:`Bearer ${_}`},body:M});if(!$.ok)throw new Error(`Error uploading fnet flow: ${$.statusText}`);const j=await $.json();if(j?.error)throw new Error("Error uploading fnet flow.")}export{i as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import r from"semver";import o from"@fnet/shelljs";import i from"@fnet/config";import n from"@fnet/object-from-schema";import s from"yaml";import{r as p,w as m}from"./index.js";import{fileURLToPath as a}from"node:url";import"yargs";import"chalk";import"node:util";import"tree-kill";import"node:child_process";import"node:os";import"@flownet/lib-render-templates-dir";import"@fnet/yaml";import"nunjucks";import"lodash.clonedeep";import"isobject";import"redis";import"@flownet/lib-is-redis-online";import"node:crypto";import"@flownet/lib-atom-api-js";import"lodash.merge";import"@flownet/lib-parse-imports-js";import"@fnet/npm-list-versions";import"@fnet/npm-pick-versions";import"object-hash";import"ajv/dist/2020.js";import"ajv/dist/standalone/index.js";import"ajv-formats";import"@flownet/lib-parse-node-url";import"bpmn-moddle";import"dagre";import"@fnet/expression";import"@fnet/list-files";import"@fnet/key-value-transformer";import"@flownet/lib-parse-npm-path";import"@fnet/prompt";async function l({atom:a,setProgress:l,context:c,deploymentProject:d,deploymentProjectTarget:f,yamlTarget:y}){await l({message:"Deploying it as npm package."});const b=c.projectDir,w=t.resolve(b,"package.json"),j=e.readFileSync(w),u=JSON.parse(j);u.name=f.params.name,u.version=r.inc(f.version,"patch");const g=f.params.bin?.name||f.params.bin;!1!==f.params.bin?.enabled&&g&&"string"==typeof g&&(u.bin={[g]:"dist/cli/esm/index.js"}),delete u.scripts,delete u.devDependencies,u.scripts={serve:"npx serve ."},e.writeFileSync(w,JSON.stringify(u,null,"\t"));const v=f.config||"npm";let h=(await i({name:v,dir:c.projectDir,tags:c.tags,optional:!0}))?.data;if(!h){const r=p("./template/schemas/to-npm.yaml"),o=await n({schema:r,tags:c.tags}),i=c.project.projectDir,m=t.resolve(i,".fnet");e.existsSync(m)||e.mkdirSync(m),e.writeFileSync(t.resolve(m,`${v}.fnet`),s.stringify(o)),h=o}if(e.writeFileSync(t.resolve(b,".npmrc"),`//registry.npmjs.org/:_authToken=${h.env.NPM_TOKEN}`),!0!==f.dryRun){if(m("bun")){if(0!==(await o("bun publish --access public",{cwd:b})).code)throw new Error("Couldnt publish to npm")}else{if(0!==(await o("npm publish --access public",{cwd:b})).code)throw new Error("Couldnt publish to npm")}e.writeFileSync(w,j),d.isDirty=!0,f.version=u.version,y.set("version",u.version)}}t.dirname(a(import.meta.url)),process.cwd();export{l as default};
@@ -1 +0,0 @@
1
- import e from"semver";import r from"@fnet/config";import o from"node:fs";import t from"@fnet/shelljs";import n from"form-data";async function i({setProgress:i,context:s,deploymentProject:a,deploymentProjectTarget:d,yamlTarget:c}){await i({message:"Deploying it as fnet node."});const{file:f,data:p}=await r({name:d.config||"fnet-node",dir:s.project.projectDir,tags:s.tags});if(!p.env.ATOM_API_URL)throw new Error(`ATOM_API_URL is required in ${f}`);if(!p.env.ATOM_API_USERNAME)throw new Error(`ATOM_API_USERNAME is required in ${f}`);if(!p.env.ATOM_API_PASSWORD)throw new Error(`ATOM_API_PASSWORD is required in ${f}`);const m=`${p.env.ATOM_API_URL}/v1/auth/token`,w=p.env.ATOM_API_USERNAME,A=p.env.ATOM_API_PASSWORD,h=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:w,password:A})});if(!h.ok)throw new Error(`Failed to fetch token: ${h.statusText}`);const _=await h.json(),l=_?.access_token;if(!l)throw new Error(`Invalid access_token from ${m}`);a.isDirty=!0;const u=e.inc(d.version,"patch");d.params.version=u,d.version=u,c.set("version",u);const v=`${p.env.ATOM_API_URL}/v1/service/fnet-node/publish`,T=await fetch(v,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${l}`},body:JSON.stringify({name:d.params.name,version:d.params.version,docs:d.params.docs,configs:d.params.configs})});if(!T.ok)throw new Error(`Error publishing fnet node: ${T.statusText}`);const E=await T.json();if(E?.error)throw new Error("Error publishing fnet node.");const O=E?.upload.id;let P="fnet-dir-zipper";P+=` --sourceDir='${s.project.projectDir}'`,P+=" --pattern=**/*",P+=" --stdout_format=json";const g=await t(P);if(0!==g.code)throw new Error(g.stderr);const S=JSON.parse(g.stdout).path;let M=new n;M.append("file",o.createReadStream(S));const $=await fetch(`${p.env.ATOM_API_URL}/v1/service/upload/single/${O}`,{method:"POST",headers:{...M.getHeaders(),Authorization:`Bearer ${l}`},body:M});if(!$.ok)throw new Error(`Error uploading fnet node: ${$.statusText}`);const j=await $.json();if(j?.error)throw new Error("Error uploading fnet node.")}export{i as default};
@@ -1 +0,0 @@
1
- import e from"@fnet/config";import o from"@fnet/to-pyip";import t from"lodash.clonedeep";import a from"semver";async function n({atom:n,target:r,onProgress:i,projectDir:s,dependencies:p,context:c,yamlTarget:m}){i&&await i({message:"Deploying it as pypi package."});const f=r?.config?await e({name:r.config,dir:s,optional:!0,transferEnv:!1,tags:c.tags}):void 0,g=a.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,m.set("version",g);const d=t(r.params);d.dependencies=t(p);const l={atom:n,params:d,config:f?.config,src:s,dest:s};return{deployer:await o(l)}}export{n as default};
@@ -1 +0,0 @@
1
- import e from"@fnet/config";import o from"@flownet/lib-to-nextjs";import t from"lodash.clonedeep";import n from"semver";async function a({atom:a,target:r,onProgress:s,projectDir:i,dependencies:c,context:m,yamlTarget:p}){s&&await s({message:"Deploying it as nextjs package."});const f=r?.config?await e({name:r.config,dir:i,optional:!0,transferEnv:!1,tags:m.tags}):void 0,g=n.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,p.set("version",g);const d=t(r.params);d.dependencies=t(c);const l={atom:a,params:d,config:f?.config,src:i,dest:i};return{deployer:await o(l)}}export{a as default};
@@ -1 +0,0 @@
1
- import e from"@fnet/config";import o from"@flownet/lib-to-webos";import t from"lodash.clonedeep";import a from"semver";async function n({atom:n,target:r,onProgress:s,projectDir:i,dependencies:c,context:m,yamlTarget:p}){s&&await s({message:"Deploying it as webos package."});const f=r?.config?await e({name:r.config,dir:i,optional:!0,transferEnv:!1,tags:m.tags}):void 0,g=a.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,p.set("version",g);const d=t(r.params);d.dependencies=t(c);const l={atom:n,params:d,config:f?.config,src:i,dest:i};return{deployer:await o(l)}}export{n as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import a from"node:os";import d from"nunjucks";import o from"@node-red/util";import i from"@fnet/config";async function n({atom:n,setProgress:l,context:r,deploymentProject:p,deploymentProjectTarget:s,buildId:c,packageDependencies:m,njEnv:f}){await l({message:"Deploying it as node-red flow."});const y=r.projectDir,u=r.templateDir,g="workflow"===n.type?"WF":"LIB";let h;if("simple"===s.deploy.template)h={atom:n,packageDependencies:m,red:{tab:{id:s.deploy.id||o.util.generateId(),label:`${g}/${n.id?n.id:a.hostname()}/${n.name}/${s.deploy.name||s.deploy.template}`},function:{id:o.util.generateId(),name:n.doc.name,initialize:{content:e.readFileSync(t.resolve(y,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:n.doc.bundleName}},inject:{id:o.util.generateId(),...s.params?.inject,payload:"json"===s.params?.inject?.payloadType?`'${JSON.stringify(s.params?.inject?.payload)}'`:s.params?.inject?.payload},debug:{id:o.util.generateId()}}};else if("cronjob"===s.deploy.template){let d=s.params?.schedules?cloneDeep(s.params?.schedules):void 0;d?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),h={atom:n,packageDependencies:m,red:{tab:{id:s.deploy.id||o.util.generateId(),label:`${g}/${n.id?n.id:a.hostname()}/${s.deploy.name||s.deploy.template}`},function:{id:o.util.generateId(),name:n.doc.name,initialize:{content:e.readFileSync(t.resolve(y,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:n.doc.bundleName}},cronjob:{id:o.util.generateId(),schedules:d},debug:{id:o.util.generateId()}}}}else{if("http"!==s.deploy.template)return;h={atom:n,packageDependencies:m,red:{tab:{id:s.deploy.id||o.util.generateId(),label:`${g}/${n.id?n.id:a.hostname()}/${s.deploy.name||s.deploy.template}`},function:{id:o.util.generateId(),name:n.doc.name,initialize:{content:e.readFileSync(t.resolve(y,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:n.doc.bundleName}},httpin:{id:o.util.generateId(),method:s.params.method||"get",url:s.params.url},httpout:{id:o.util.generateId()},debug:{id:o.util.generateId()}}}}let j=d.compile(e.readFileSync(t.resolve(u,`deploy/node-red/${s.deploy.template}.yaml.njk`),"utf8"),f).render(h);if(e.writeFileSync(t.resolve(y,"node-red.yaml"),j),j=yaml.load(j),!0===s.dryRun)return;p.isDirty=!0;const w=(await i({name:r.redConfig||"red",dir:r.projectDir,tags:r.tags}))?.data,$=s.deploy.url||w.env.RED_URL,b={};if(!1!==s.deploy.auth&&(b.Authorization="Bearer "+atomAccessToken),s.deploy.id)if(!0===s.actions?.delete){const e=await fetch(`${$}/flow/${s.deploy.id}`,{method:"DELETE",headers:b});if(!e.ok)throw new Error(`Failed to delete flow: ${e.statusText}`);delete s.actions.delete,delete s.deploy.id,s.enabled=!1}else{const e=await fetch(`${$}/flow/${s.deploy.id}`,{method:"PUT",headers:{...b,"Content-Type":"application/json"},body:JSON.stringify(j)});if(!e.ok)throw new Error(`Failed to update flow: ${e.statusText}`)}else{const e=await fetch(`${$}/flow`,{method:"POST",headers:{...b,"Content-Type":"application/json"},body:JSON.stringify(j)});if(!e.ok)throw new Error(`Failed to create flow: ${e.statusText}`);const t=await e.json();s.deploy.id=t.id}}export{n as default};
@@ -1 +0,0 @@
1
- async function r(r){return{projectDir:process.cwd(),tags:r.ftag}}export{r as createContext};
@@ -1 +0,0 @@
1
- import e from"@fnet/config";import o from"@fnet/to-rust";import t from"lodash.clonedeep";import a from"semver";async function n({atom:n,target:r,onProgress:s,projectDir:i,dependencies:c,context:m,yamlTarget:p}){s&&await s({message:"Deploying it as Rust package."});const f=r?.config?await e({name:r.config,dir:i,optional:!0,transferEnv:!1,tags:m.tags}):void 0,g=a.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,p.set("version",g);const d=t(r.params);d.dependencies=t(c);const l={atom:n,params:d,config:f?.config,src:i,dest:i};return{deployer:await o(l)}}export{n as default};
@@ -1 +0,0 @@
1
- import e from"@fnet/config";import o from"@flownet/lib-to-docker";import t from"lodash.clonedeep";import r from"semver";async function a({atom:a,target:n,onProgress:i,projectDir:s,dependencies:c,context:m,yamlTarget:p}){i&&await i({message:"Deploying it as docker package."});const f=n?.config?await e({name:n.config,dir:s,optional:!0,transferEnv:!1,tags:m.tags}):void 0,d=r.inc(n.version||"0.1.0","patch");n.params.version=d,n.version=d,p.set("version",d);const g=t(n.params);g.dependencies=t(c);const l={atom:a,params:g,config:f?.config,src:s,dest:s};return{deployer:await o(l)}}export{a as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import r from"semver";import n from"@fnet/shelljs";import o from"@fnet/config";async function a({setProgress:a,context:i,deploymentProject:s,deploymentProjectTarget:c,yamlTarget:p}){await a({message:"Deploying it as fnet package."});const d=i.projectDir,m=t.resolve(d,"package.json"),f=e.readFileSync(m),l=JSON.parse(f);l.name=c.params.name,l.version=r.inc(c.version,"patch"),delete l.scripts,delete l.devDependencies,e.writeFileSync(m,JSON.stringify(l,null,"\t"));const{file:A,data:_}=await o({name:c.config||"fnet-package",dir:i.projectDir,tags:i.tags});if(!_.env.ATOM_API_URL)throw new Error(`ATOM_API_URL is required in ${A}`);if(!_.env.ATOM_API_USERNAME)throw new Error(`ATOM_API_USERNAME is required in ${A}`);if(!_.env.ATOM_API_PASSWORD)throw new Error(`ATOM_API_PASSWORD is required in ${A}`);const v=`${_.env.ATOM_API_URL}/v1/auth/token`,h=_.env.ATOM_API_USERNAME,w=_.env.ATOM_API_PASSWORD,O=await fetch(v,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:h,password:w})});if(!O.ok)throw new Error(`Failed to fetch token: ${O.statusText}`);const g=await O.json(),u=g?.access_token;if(!u)throw new Error(`Invalid access_token from ${v}`);let y="fnet-files-to-gcs";if(y+=` --projectId='${_.env.GCS_PROJECT_ID}'`,y+=` --bucketName='${_.env.GCS_BUCKET_NAME}'`,y+=` --keyFilename='${t.resolve(t.dirname(A),_.env.GCS_UPLOADER_KEY_FILE)}'`,y+=` --dir='${d}'`,y+=" --pattern='dist/**/**'",y+=" --pattern='bin/**/**'",y+=" --pattern='test/**/**'",y+=" --pattern='*.html'",y+=` --destDir='${l.name}/${l.version}'`,y+=" --metadata.cacheControl='public, max-age=31536000, immutable'",_.env.DOMAIN&&(y+=` --domain='${_.env.DOMAIN}'`),!0!==c.dry_run&&!0!==c.params.dry_run||(y+=" --dryRun"),await n(y),e.writeFileSync(m,f),!0===c.dryRun)return;s.isDirty=!0,c.version=l.version,p.set("version",l.version);const S=`${_.env.ATOM_API_URL}/v1/service/fnet-package/publish`,P=await fetch(S,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${u}`},body:JSON.stringify({name:l.name,version:l.version,version_domain:_.env.DOMAIN,docs:c.params.docs,configs:c.params.configs})});if(!P.ok)throw new Error(`Failed to publish fnet package: ${P.statusText}`);const T=await P.json();if(T?.error)throw new Error("Failed to publish fnet package.")}export{a as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import o from"@fnet/config";async function n({atom:n,Atom:i,setProgress:r,context:a,packageDependencies:d,deploymentProject:c,deploymentProjectTarget:l}){await r({message:"Deploying it as workflow lib."});const s=(await o({name:"atom",dir:a.projectDir,tags:a.tags}))?.data;let f,p,y,m=l.deploy.name.split("/");if(1===m.length)p=s.env.ATOM_LIBRARIES_ID,y=l.deploy.name;else{if(2!==m.length)throw new Error("Wrong name path.");{const e=await i.first({where:{name:m[0],parent_id:s.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");p=e.id,y=m[1]}}if(!0===l.dryRun)return;if(c.isDirty=!0,l.deploy.id){if(f=await i.get({id:l.deploy.id}),!f)return}else{if(f=await i.create({parent_id:p,doc:{name:y,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!f)return;l.deploy.id=f.id}const w=a.projectDir;f.doc.contents=[{content:e.readFileSync(t.resolve(w,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:e.readFileSync(t.resolve(w,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:e.readFileSync(t.resolve(w,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],f.doc.name=y,f.doc.dependencies=d,"workflow.lib"===n.type?f.doc.subtype="library":"workflow"===n.type&&(f.doc.subtype="workflow"),f=await i.update(f,{id:f.id})}export{n as default};
@@ -1 +0,0 @@
1
- import t from"@fnet/shelljs";import a from"@fnet/config";async function e({setProgress:e,context:o,deploymentProject:r,deploymentProjectTarget:i,buildId:n}){await e({message:"Deploying it as gitlab project."});const s=o.projectDir;let l="fnet-to-gitlab";const c=i.params.config||"gitlab",g=await a({name:c,dir:o.projectDir,tags:o.tags});if(!g)throw new Error(`Couldnt load config ${c}`);const{data:p}=g.data;l+=` --projectGroupId=${p.projectGroupId}`,l+=` --projectPath='${s}'`,l+=` --projectName='${i.params.name}'`,l+=` --projectBranch='${i.params.branch||"main"}'`,l+=` --gitlabHost='${p.gitlabHost}'`,l+=` --gitlabToken='${p.gitlabToken}'`,l+=` --gitlabUsername='${p.gitlabUsername}'`,l+=` --gitlabUserEmail='${p.gitlabUserEmail}'`,!0!==i.dryRun&&(await t(l),r.isDirty=!0)}export{e as default};
@@ -1 +0,0 @@
1
- import e from"node:path";import t from"node:fs";import o from"@fnet/yaml";import r from"yaml";import{r as i}from"./index.js";import"yargs";import"chalk";import"node:util";import"tree-kill";import"node:url";import"node:child_process";import"@fnet/config";import"node:os";import"@flownet/lib-render-templates-dir";import"@fnet/shelljs";import"nunjucks";import"lodash.clonedeep";import"isobject";import"redis";import"@flownet/lib-is-redis-online";import"node:crypto";import"@flownet/lib-atom-api-js";import"lodash.merge";import"@flownet/lib-parse-imports-js";import"@fnet/npm-list-versions";import"@fnet/npm-pick-versions";import"object-hash";import"ajv/dist/2020.js";import"ajv/dist/standalone/index.js";import"ajv-formats";import"@flownet/lib-parse-node-url";import"bpmn-moddle";import"dagre";import"@fnet/expression";import"@fnet/list-files";import"@fnet/key-value-transformer";import"@flownet/lib-parse-npm-path";import"@fnet/prompt";async function n(n){if(n.id)return{id:n.id,buildId:n.buildId,mode:n.mode,protocol:n.protocol||"ac:",templateDir:i("./template/fnode/node"),projectDir:e.resolve(process.cwd(),`./.output/${n.id}`),tags:n.ftag,dev:n.dev};try{const s=await async function({tags:i}){let n=function(o){const r=e.resolve(o,"node.yaml"),i=e.resolve(o,"fnode.yaml");if(t.existsSync(i))return i;if(t.existsSync(r))try{const e=t.readFileSync(r,"utf8");return t.writeFileSync(i,e,"utf8"),t.unlinkSync(r),console.log(`Migrated node.yaml to fnode.yaml in ${o}`),i}catch(e){return console.error(`Error migrating node.yaml to fnode.yaml: ${e.message}`),r}return i}(process.cwd());if(!t.existsSync(n))throw new Error("fnode.yaml file not found in current directory.");const{raw:s,parsed:m}=await o({file:n,tags:i}),p=e.dirname(n);m.features=m.features||{};const l=m.features;l.runtime=l.runtime||{},l.runtime.type=l.runtime.type||"node","python"===l.runtime.type?l.runtime.template=l.runtime.template||"python":(l.runtime.type,l.runtime.template=l.runtime.template||"node");const a={libraryAtom:{doc:{...m},fileName:"index"},projectDir:p,projectFilePath:n,projectFileContent:s,projectFileParsed:m,runtime:l.runtime};let c=e.resolve(p,"fnet/targets.yaml");if(!t.existsSync(c)&&(c=e.resolve(p,"node.devops.yaml"),t.existsSync(c))){const o=e.resolve(p,"fnet");t.existsSync(o)||t.mkdirSync(o),t.copyFileSync(c,e.resolve(p,"fnet/targets.yaml")),t.unlinkSync(c)}if(t.existsSync(c)){const{raw:e,parsed:n}=await o({file:c,tags:i}),s=r.parseDocument(e);a.devops={filePath:c,fileContent:e,yamlDocument:s,doc:{...n},type:"library.deploy",save:async()=>{t.writeFileSync(a.devops.filePath,s.toString())}}}const d=e.resolve(p,"readme.md");if(t.existsSync(d)){const e=t.readFileSync(d,"utf8");a.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return a}({tags:n.ftag}),m="bun"===s.runtime.type?"node":s.runtime.type;return{buildId:n.buildId,mode:n.mode,protocol:n.protocol||"local:",templateDir:i(`./template/fnode/${m}`),projectDir:e.resolve(s.projectDir,"./.workspace"),projectSrcDir:e.resolve(s.projectDir,"./src"),project:s,tags:n.ftag,dev:n.dev}}catch(e){return console.warn(`Warning: Could not load project: ${e.message}`),{projectDir:process.cwd(),tags:n.ftag}}}export{n as createContext};
@@ -1 +0,0 @@
1
- import r from"node:path";import{fileURLToPath as n}from"node:url";import e from"node:os";import i from"node:fs";async function t(n){const t=function(){const n=e.homedir(),t=r.join(n,".fnet","bin");return i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),t}(),o=function(){const n=e.homedir(),t=r.join(n,".fnet");return i.existsSync(t)||i.mkdirSync(t,{recursive:!0}),r.join(t,"bin-registry.json")}();let s={};if(i.existsSync(o))try{const r=i.readFileSync(o,"utf8");s=JSON.parse(r)}catch(r){console.warn(`Warning: Could not parse bin registry: ${r.message}`)}return{binDir:t,registryPath:o,registry:s,args:n}}r.dirname(n(import.meta.url));export{t as createContext};
@@ -1 +0,0 @@
1
- import e from"fs";import r from"path";import n from"@fnet/yaml";import t from"@fnet/shell-flow";async function o({projectType:e,group:r,tags:o,args:f,argv:i}){try{const m=await a(e),{parsed:s}=await n({file:m.path,tags:o}),c=s.commands;if(!c)throw new Error(`Commands section not found in ${m.name}`);const y=c[r];if(!y)throw new Error(`Command group '${r}' not found in ${m.name}`);await t({commands:y,context:{args:f,argv:i,projectType:m.type}})}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}async function a(n){const t=process.cwd(),o=r.resolve(t,"fnode.yaml"),a=r.resolve(t,"fnet.yaml");if("fnode"===n){if(e.existsSync(o))return{path:o,name:"fnode.yaml",type:"fnode"};throw new Error("fnode.yaml file not found in current directory")}if("fnet"===n){if(e.existsSync(a))return{path:a,name:"fnet.yaml",type:"fnet"};throw new Error("fnet.yaml file not found in current directory")}if(e.existsSync(o))return{path:o,name:"fnode.yaml",type:"fnode"};if(e.existsSync(a))return{path:a,name:"fnet.yaml",type:"fnet"};throw new Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}export{a as detectProjectFile,o as runCommandGroup};
@@ -1 +0,0 @@
1
- import r from"semver";import e from"@fnet/config";async function o({setProgress:o,context:t,deploymentProject:n,deploymentProjectTarget:i,yamlTarget:s}){await o({message:"Deploying it as fnet form."});const{file:a,data:f}=await e({name:i.config||"fnet-form",dir:t.projectDir,tags:t.tags});if(!f.env.ATOM_API_URL)throw new Error(`ATOM_API_URL is required in ${a}`);if(!f.env.ATOM_API_USERNAME)throw new Error(`ATOM_API_USERNAME is required in ${a}`);if(!f.env.ATOM_API_PASSWORD)throw new Error(`ATOM_API_PASSWORD is required in ${a}`);const c=`${f.env.ATOM_API_URL}/v1/auth/token`,A=f.env.ATOM_API_USERNAME,m=f.env.ATOM_API_PASSWORD,p=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:A,password:m})});if(!p.ok)throw new Error(`Failed to fetch token: ${p.statusText}`);const _=await p.json(),w=_?.access_token;if(!w)throw new Error(`Invalid access_token from ${c}`);n.isDirty=!0;const h=r.inc(i.version,"patch");i.params.version=h,i.version=h,s.set("version",h);const d=`${f.env.ATOM_API_URL}/v1/service/fnet-form/publish`,v=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${w}`},body:JSON.stringify({name:i.params.name,version:i.params.version,docs:i.params.docs,configs:i.params.configs})});if(!v.ok)throw new Error(`Error publishing fnet form: ${v.statusText}`);const P=await v.json();if(P?.error)throw new Error("Error publishing fnet form.")}export{o as default};
@@ -1 +0,0 @@
1
- import o from"@fnet/config";import e from"@flownet/lib-to-macos-app";import a from"lodash.clonedeep";import t from"semver";async function n({atom:n,target:r,onProgress:s,projectDir:i,dependencies:c,context:p,yamlTarget:m}){s&&await s({message:"Deploying it as macos-app package."});const f=r?.config?await o({name:r.config,dir:i,optional:!0,transferEnv:!1,tags:p.tags}):void 0,g=t.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,m.set("version",g);const d=a(r.params);d.dependencies=a(c);const l={atom:n,params:d,config:f?.config,src:i,dest:i};return{deployer:await e(l)}}export{n as default};
@@ -1 +0,0 @@
1
- import e from"@fnet/config";import o from"@flownet/lib-to-electron";import t from"lodash.clonedeep";import n from"semver";async function r({atom:r,target:a,onProgress:i,projectDir:s,dependencies:c,context:m,yamlTarget:p}){i&&await i({message:"Deploying it as electron package."});const f=a?.config?await e({name:a.config,dir:s,optional:!0,transferEnv:!1,tags:m.tags}):void 0,g=n.inc(a.version||"0.1.0","patch");a.version=g,p.set("version",g);const d=t(a.params);d.dependencies=t(c);const l={atom:r,params:d,config:f?.config,src:s,dest:s};return{deployer:await o(l)}}export{r as default};
@@ -1 +0,0 @@
1
- import t from"cli-table3";import r from"chalk";function e(e,o={}){const a={chars:{top:"─","top-mid":"─","top-left":" ","top-right":" ",bottom:"─","bottom-mid":"─","bottom-left":" ","bottom-right":" ",left:" ","left-mid":" ",mid:"─","mid-mid":"─",right:" ","right-mid":" ",middle:" "},style:{head:[],border:[],compact:!0},wordWrap:!0,...o,head:e.map((t=>r.bold(t)))};return new t(a)}function o(t,r,o={}){const a=e(t,o);return Array.isArray(r)&&r.forEach((t=>{a.push(t)})),a.toString()}function a(t){switch(t){case"running":return r.green;case"stopped":return r.yellow;case"failed":return r.red;case"registered":return r.blue;default:return r.gray}}var i={createTable:e,createTableWithData:o,getStatusColor:a};export{e as createTable,o as createTableWithData,i as default,a as getStatusColor};
@@ -1 +0,0 @@
1
- import o from"@fnet/config";import e from"@flownet/lib-to-ios-app";import a from"lodash.clonedeep";import t from"semver";async function n({atom:n,target:r,onProgress:i,projectDir:s,dependencies:p,context:c,yamlTarget:m}){i&&await i({message:"Deploying it as ios-app package."});const f=r?.config?await o({name:r.config,dir:s,optional:!0,transferEnv:!1,tags:c.tags}):void 0,g=t.inc(r.version||"0.1.0","patch");r.params.version=g,r.version=g,m.set("version",g);const d=a(r.params);d.dependencies=a(p);const l={atom:n,params:d,config:f?.config,src:s,dest:s};return{deployer:await e(l)}}export{n as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import i from"node:os";import a from"@fnet/list-files";import{B as s,c as n,a as r}from"./index.BcGYSPne.js";import o from"@flownet/lib-render-templates-dir";import c from"@fnet/auto-conda-env";import"node:crypto";import"yaml";import"nunjucks";import"chalk";import"@flownet/lib-atom-api-js";import"@fnet/config";import"redis";import"@flownet/lib-is-redis-online";import"@fnet/yaml";class p extends s{async initRuntime(){await async function(e){const{atom:t,context:i,setProgress:a}=e;a("Initializing features..."),t.doc.features=t.doc.features||{};const s=t.doc.features;!1===s.cli?s.cli={enabled:!1}:(s.cli,s.cli={enabled:!0}),s.cli.enabled=!0===s.cli.enabled&&(!1===t.doc.features.form_enabled||!0===s.cli.extend||!0===s.cli.enabled)}(this.apiContext),await async function({atom:e,packageDependencies:t,packageDevDependencies:i,setProgress:a}){a("Initializing dependencies")}(this.apiContext),await this.initLibraryDirPython(),await this.initNunjucks(),await this.initLibsPython()}async initLibraryDirPython(){this.setProgress({message:"Initializing library directory."});const s=this.context.projectDir;this.setProgress({message:"Cleaning project directory."});const n=a({dir:s,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const t of n)e.rmSync(t,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."});let r=s;e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),r=t.join(s,"src"),e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),r=t.join(s,"src","default");const o=this.context.projectSrcDir;if(!e.existsSync(r))try{"win32"===i.platform()?e.symlinkSync(o,r,"junction"):e.symlinkSync(o,r,"dir")}catch(e){throw new Error(`Couldn't create symlink. Error: ${e.message}`)}}async initLibsPython(){this.setProgress({message:"Initializing external libs."});const e=this.atom;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id,atom:e}];this.libs=t}async createAtomLibFilesPython({libs:i}){await this.setProgress({message:"Creating external lib files."});const a=i.filter((e=>"atom"===e.type));for(let i=0;i<a.length;i++){const s=a[i].atom;if("local:"===s.protocol){const i=t.resolve(this.context.projectSrcDir,`${s.fileName||s.name}.py`);if(!e.existsSync(i)){e.mkdirSync(t.dirname(i),{recursive:!0});let a="def default():\n";a+=' print("Hello world!")\n',e.writeFileSync(i,a,"utf8")}}}}async build(){try{this.fileMode&&(await this.createAtomLibFilesPython({libs:this.libs}),await this.createProjectYaml(),await n(this.apiContext),await r(this.apiContext),await async function({atom:i,setProgress:a,context:s,packageDependencies:n}){if(!0!==i.doc.features.cli.enabled)return;await a({message:"Creating cli."});const r={atom:i,packageDependencies:n},c=s.templateDir,p=t.join(s.projectDir,"src","cli");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),await o({pattern:["index.py.njk","__init__.py.njk"],dir:t.join(c,"src","cli"),outDir:p,context:r})}(this.apiContext),this.buildMode&&(await async function(e){const{setProgress:i,atom:a,context:s}=e;i({message:"Installing Python packages"});const n=s.projectDir,r=await c({pythonVersion:"3.12",packages:[{package:"fnet-import-parser",version:"0.1.9"}]}),{errors:p,result:l}=await r.runBin("fnet_import_parser",["--entry_file",t.join(n,"src","default","index.py")],{captureName:"result"});if(p)throw new Error(p.format());const d=JSON.parse(l.items[0].stdout),m=d.required["third-party"]?.map((e=>({package:e.metadata?.package||e.path,version:e.metadata?.version||void 0,channel:e.metadata?.channel||void 0})))||[],y=a.doc.dependencies||[];for(const e of m)y.some((t=>t.package===e.package))||y.push(e);const f=t.join(n,".conda"),h=await c({envDir:f,pythonVersion:a.doc.features.runtime.version||"3.12",packages:y});s.pythonEnv=h,e.packageDependencies=y;const u=a.doc.features.render?.dirs||[];for(const e of u)e.dir=t.resolve(n,e.dir),e.outDir=t.resolve(n,e.outDir),await o(e);let g={params:{}};g.params.package_name=a.doc.name,g.params.version="0.1.0",g.params.bin_name=a.doc.name,g.params.python_requires=a.doc.features.runtime.version||">=3.12",g.params.dependencies=y,g.params.scripts=JSON.stringify({cli:`PYTHONPATH='${t.join("src")}' '${t.relative(s.projectDir,h.pythonBin)}' '${t.join("src","cli","index.py")}'`}),await o({pattern:["setup.py.njk","package.json.njk","pyproject.toml.njk"],dir:s.templateDir,outDir:s.projectDir,context:g})}(this.apiContext),this.deployMode&&await this.deploy())),await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.buildKey,{status:"FAILED",message:e.message||e}),console.log(e),e}}}export{p as default};
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import a from"nunjucks";import s from"@flownet/lib-parse-imports-js";import o from"@flownet/lib-parse-node-url";import{B as n,c as r,a as i}from"./index.BcGYSPne.js";import p from"lodash.merge";import c from"@fnet/npm-list-versions";import l from"@flownet/lib-render-templates-dir";import u from"@fnet/npm-pick-versions";import d from"object-hash";import f from"ajv/dist/2020.js";import m from"ajv/dist/standalone/index.js";import g from"ajv-formats";import b from"@fnet/shelljs";import{w as h}from"./index.js";import"node:crypto";import"yaml";import"chalk";import"@flownet/lib-atom-api-js";import"@fnet/config";import"@fnet/list-files";import"redis";import"@flownet/lib-is-redis-online";import"@fnet/yaml";import"yargs";import"node:util";import"tree-kill";import"node:url";import"node:child_process";import"node:os";import"@fnet/prompt";function y({feature:e,features:t,packageDevDependencies:a}){const{name:s,packages:o,options:n,extraCheck:r,explicit:i}=e,c=`${s}_enabled`,l=t.rollup_output||{},u=Object.keys(l);let d=n||{};const f=t[s]?.options;f&&(d=p(d,f));const m=!t[s]||!1===t[s]?.enabled;u.forEach((e=>{const a=t.rollup_output[e];if(a){if(Reflect.has(a,s)){if(m||!a[s]||!1===a[s]?.enabled)return void delete a[s];!0===a[s]&&(a[s]={enabled:!0,options:d})}else{if(m||i||!1===t[c])return;a[s]={enabled:!0}}a[s]=a[s]||{},a[s].options={...d,...a[s].options}}}));let g=u.some((e=>!0===t.rollup_output[e][s]?.enabled));r&&(g=r()&&g),t[c]=g,g&&o.forEach((e=>a.push({package:e[0],version:e[1]})))}function w({dir:a,name:s="index"}){let o=t.resolve(a,`./${s}.tsx`);if(e.existsSync(o)||(o=t.resolve(a,`./${s}.ts`)),e.existsSync(o)||(o=t.resolve(a,`./${s}.jsx`)),e.existsSync(o)||(o=t.resolve(a,`./${s}.js`)),!e.existsSync(o))return{};const n=o,r=t.extname(o);return{file:n,ext:r,ts:".ts"===r||".tsx"===r,name:s}}async function k(e){const{atom:a,context:o,setProgress:n}=e;n("Initializing features..."),a.doc.features=a.doc.features||{};const r=a.doc.features;r.project=r.project||{},r.project.format=r.project.format||r.project_format||"esm",r.project_format=r.project.format,r.dts_enabled=!0===r.dts||void 0!==r.dts&&!1!==r.dts;const i=t.resolve(o.project.projectDir),c=w({dir:t.resolve(i,"./app")});if(c.file){n("Parsing app entry imports...");let e=await s({file:c.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.app_uses_jsx=t,r.app_has_entry=!0,e=await s({file:c.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.app_entry_uses_jsx=t,r.app_entry_is_ts=c.ts,r.app_entry_ext=c.ext}const l=w({dir:t.resolve(i,"./cli")});if(l.file){n("Parsing cli entry imports...");let e=await s({file:l.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.cli_uses_jsx=t,r.cli_has_entry=!0,e=await s({file:l.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.cli_entry_uses_jsx=t,r.cli_entry_is_ts=l.ts,r.cli_entry_ext=l.ext}if("workflow.lib"===a.type){const e=w({dir:t.resolve(i,"./src")});if(e.file){n("Parsing src entry imports...");let t=await s({file:e.file,recursive:!0}),a=t.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.src_uses_jsx=a,r.src_has_entry=!0,t=await s({file:e.file}),a=t.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.src_entry_uses_jsx=a,r.src_entry_is_ts=e.ts,r.src_entry_ext=e.ext}}const u=Reflect.has(r,"app_entry_uses_jsx")?!0===r.app_entry_uses_jsx:!0===r.src_entry_uses_jsx,d=Reflect.has(r,"cli_entry_uses_jsx")?!0===r.cli_entry_uses_jsx:!0===r.src_entry_uses_jsx;r.form_enabled=u||d||!0===r.form||!0===r.form?.enabled,r.multiple_enabled=r.multiple_enabled||!0===r.multiple||!0===r.multiple?.enabled,!1===r.app?r.app={enabled:!1}:!0===r.app?r.app={enabled:!0,extend:!0===r.app_has_entry,export:!0,react:u}:r.app={enabled:!0,extend:!0===r.app_has_entry,export:!0,react:u,...r.app||{}},r.app.enabled=!0===r.app.enabled&&(!0===a.doc.features.form_enabled||!0===r.app.extend||!0===r.app.enabled),r.app.format=r.app.format||"esm",r.app.folder=r.app.folder||r.app.format||"default",!1===r.cli?r.cli={enabled:!1}:!0===r.cli?r.cli={enabled:!0,extend:!0===r.cli_has_entry,export:!0,react:d}:r.cli={enabled:!0,extend:!0===r.cli_has_entry,export:!0,react:d,...r.cli||{}},r.cli.enabled=!0===r.cli.enabled&&(!1===a.doc.features.form_enabled||!0===r.cli.extend||!0===r.cli.enabled),r.cli.format=r.cli.format||"esm",r.cli.folder=r.cli.folder||r.cli.folder||"esm",r.cli.node_options=r.cli.node?.options||r.cli.node_options||"",r.cli.bin=r.cli.bin||a.doc.name,r.cli.installable=!0===r.cli.installable,r.cli.enabled&&(a.doc["npm::bin"]=r.cli.bin),r.json=r.cli.enabled||r.json;const f={cjs:{format:"cjs",context:r.form_enabled?"window":"global",babel:!0===r.src_uses_jsx||!1,browser:!1,replace:!0,terser:!0,enabled:!1!==r.cjs,copy:!1},esm:{format:"esm",context:r.form_enabled?"window":"global",babel:!0===r.src_uses_jsx||!1,browser:!1,replace:!0,terser:!1,enabled:!1!==r.esm,copy:!0},iife:{format:"iife",context:r.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0===r.iife,terser:!0,copy:!1}};!0===r.webos&&(f.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,input:"./src/app/index.js",output_dir:"./dist/app/webos",copy:!1,babel_options:{targets:{chrome:"79"}}}),!0===r.electron&&(f.electron={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/electron"}),!0===r.nextjs&&(f.nextjs={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/nextjs"}),!0===r.ios&&(f.ios={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/ios"}),!0===r.macos&&(f.macos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/macos"}),!0===r.app.enabled&&(r.app.dir=`./dist/app/${r.app.folder}`,r.app.output={file:`./dist/app/${r.app.folder}/index.js`,dir:`./dist/app/${r.app.folder}/`,...r.app.output||{}},r.app.input={file:"./src/app/index.js",dir:"./src/app/",...r.app.input||{}},f.app={format:r.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:r.app.input.file,output_dir:r.app.dir,terser:!0,output_exports:!1===r.app.export?"none":"auto",browsersync:!0}),!0===r.cli.enabled&&(r.cli.dir=`./dist/cli/${r.cli.folder}`,r.cli.output={file:`./dist/cli/${r.cli.folder}/index.js`,dir:`./dist/cli/${r.cli.folder}/`,...r.cli.output||{}},r.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...r.cli.input||{}},f.cli={format:r.cli.format,context:"global",babel:!0===r.src_uses_jsx||!0===r.cli_uses_jsx||!1,browser:!1,replace:!0,enabled:!0,input:r.cli.input.file,output_dir:r.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===r.cli.export?"none":"auto"});const m={server:".",startPath:`${t.normalize(r.app.dir||".")}`,files:[t.normalize("./dist/**/*")],cors:!0,open:!1};r.babel_options=p({targets:{browsers:"last 9 versions, not dead",node:"18"}},r.babel_options||r.babel?.options),r.browsersync_options=p(m,r.browsersync_options||r.browsersync?.options||{}),r.replace_options=p({},r.replace_options||r.replace?.options||{}),Reflect.has(r.browsersync_options,"proxy")&&delete r.browsersync_options.server,r.rollup=r.rollup||{},r.rollup_output=p(f,r.rollup_output||r.rollup?.output||{}),r.preact_enabled=!0===r.preact||r.preact&&!1!==r.preact?.enabled;let g=Object.keys(f);for(const e of g){const t=f[e];t&&(!1!==r.rollup[e]?(t.babel_options=t.babel_options||r.babel_options,t.browsersync_options=p(r.browsersync_options,t.browsersync_options),t.replace_options=p(r.replace_options,t.replace_options),r.preact_enabled&&(t.alias_enabled=!0,t.alias=t.alias||{},t.alias.entries=t.alias.entries||{},t.alias.entries.react="preact/compat",t.alias.entries["react-dom"]="preact/compat"),(r.form_enabled||r.babel)&&(t.babel=!0)):delete r.rollup_output[e])}g=Object.keys(r.rollup_output),r.babel_enabled=g.some((e=>!0===r.rollup_output[e].babel)),r.browser_enabled=g.some((e=>!0===r.rollup_output[e].babel)),r.browsersync_enabled=!1!==r.browsersync&&g.some((e=>!0===r.rollup_output[e].browsersync)),r.browsersync_enabled=r.browsersync_enabled&&r.app.enabled,r.dependency_auto_enabled=!1!==r.dependency_auto&&!1!==r.dependency_auto?.enabled,r.npm_install_flags=r.npm_install_flags||"",r.react_version=r.react_version||r.react?.version||18,function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features,o=s.css&&!1!==s.css.enabled;let n=[];o&&(n.push(["rollup-plugin-postcss","^4"]),n.push(["sass","^1.66"]),(s.css?.options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":n.push(["postcss-import","^15"]);break;case"postcss-url":n.push(["postcss-url","^10"]);break;case"postcss-preset-env":n.push(["postcss-preset-env","^9"]);break;case"autoprefixer":n.push(["autoprefixer","^10"]);break;case"cssnano":n.push(["cssnano","^6"])}})));y({feature:{name:"css",packages:n},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features;if("bun"===s.runtime.type)return;const o={};!0===s.app?.enabled&&(o.targets=o.targets||[],o.targets.push({src:"./src/app/index.html",dest:s.app.dir}),Reflect.has(s.app,"copy")||Reflect.has(s,"copy")||(s.copy=!0)),y({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:o},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features;"bun"!==s.runtime.type&&y({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"workbox",packages:[["rollup-plugin-workbox","^8"]],options:{generate:{swDest:"dist/app/esm/sw.js",globDirectory:"dist/app/esm",globPatterns:["**/*.{html,js,css,png,jpg}"],skipWaiting:!0,clientsClaim:!0}},explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e)}async function v({projectDir:a,name:s,setProgress:o,count:n=1}){let r;const i=d(["npm-pick-versions",s,n]),p=t.join(a,".cache"),c=t.join(p,i+".json");return e.existsSync(c)?(o&&o(`Picking npm version of ${s} from cache ...`),r=JSON.parse(e.readFileSync(c,"utf8"))):(o&&o(`Picking npm version of ${s} ...`),r=await u({name:s,count:n}),e.mkdirSync(p,{recursive:!0}),e.writeFileSync(c,JSON.stringify(r),"utf8")),r}class _ extends n{async initRuntime(){await k(this.apiContext);"bun"===this.apiContext.context.project.runtime.type?await async function({atom:e,packageDependencies:t,packageDevDependencies:a,setProgress:s}){s("Initializing dependencies for Bun");const o=e.doc.dependencies||[];if(o.filter((e=>!e.dev)).forEach((e=>t.push(e))),o.filter((e=>e.dev)).forEach((e=>a.push(e))),"workflow"===e.type&&(t.push({package:"get-value",version:"^3"}),t.push({package:"set-value",version:"^4"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let a="^18.2";s("Fetching React versions"),a=`^${(await c({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:a}),t.push({package:"react-dom",version:a}),"workflow"===e.type&&(t.push({package:"@fnet/react-app",version:"^0.1"}),t.push({package:"@fnet/react-app-state",version:"^0.1"}))}e.doc.features.preact_enabled&&t.push({package:"preact",version:"^10"}),!0===e.doc.features.cli.enabled&&(t.push({package:"@fnet/args",version:"^0.1"}),t.push({package:"yargs-parser",version:"^22.0"}),e.doc.features.cli.fargs&&!1!==e.doc.features.cli.fargs?.enabled&&t.push({package:"@fnet/config",version:"0.2.21"}),e.doc.features.cli.mcp&&!0===e.doc.features.cli.mcp.enabled&&(t.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),t.push({package:"express",version:"^4.18"}))),e.doc.features.render&&!1!==e.doc.features.render.enabled&&a.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"})}(this.apiContext):await async function({atom:e,packageDependencies:t,packageDevDependencies:a,setProgress:s}){s("Initializing dependencies");const o=e.doc.dependencies||[];if(o.filter((e=>!e.dev)).forEach((e=>t.push(e))),o.filter((e=>e.dev)).forEach((e=>a.push(e))),"workflow"===e.type&&(t.push({package:"get-value",version:"^3"}),t.push({package:"set-value",version:"^4"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let a="^18.2";s("Fetching React versions"),a=`^${(await c({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:a}),t.push({package:"react-dom",version:a}),"workflow"===e.type&&(t.push({package:"@fnet/react-app",version:"^0.1"}),t.push({package:"@fnet/react-app-state",version:"^0.1"}))}e.doc.features.preact_enabled&&t.push({package:"preact",version:"^10"}),!0===e.doc.features.cli.enabled&&(t.push({package:"@fnet/args",version:"^0.1"}),t.push({package:"yargs-parser",version:"^22.0"}),e.doc.features.cli.fargs&&!1!==e.doc.features.cli.fargs?.enabled&&t.push({package:"@fnet/config",version:"0.2.21"}),e.doc.features.cli.mcp&&!0===e.doc.features.cli.mcp.enabled&&(t.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),t.push({package:"express",version:"^4.18"}))),e.doc.features.render&&!1!==e.doc.features.render.enabled&&a.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"}),a.push({package:"@babel/core",version:"^7"}),a.push({package:"@rollup/plugin-commonjs",version:"^28"}),a.push({package:"@rollup/plugin-node-resolve",version:"^16"}),a.push({package:"@rollup/plugin-replace",version:"^6"}),a.push({package:"rollup",version:"^4"}),e.doc.features.dts_enabled&&a.push({package:"rollup-plugin-dts",version:"^6"}),a.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),a.push({package:"@rollup/plugin-alias",version:"^5"}),a.push({package:"fs-extra",version:"^11"}),e.doc.features.babel_enabled&&(a.push({package:"@rollup/plugin-babel",version:"^6"}),a.push({package:"@babel/preset-env",version:"^7"}),a.push({package:"@babel/preset-react",version:"^7"}),e.doc.features.babel?.options?.plugins?.forEach((e=>{switch(e[0]){case"@babel/plugin-proposal-decorators":a.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":a.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":a.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":a.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":a.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"})}}))),a.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),e.doc.features.browsersync_enabled&&a.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}(this.apiContext),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}async initLibs(){this.setProgress({message:"Initializing external libs."});const e=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id}];this.libs=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.apiContext.packageDependencies})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const a=e.filter((e=>"atom"===e.type));for(let e=0;e<a.length;e++){const s=a[e],o=await this.findAtomLibrary({url:s.name});s.atom=o;const n=o.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));n?.forEach((e=>{const a=t.find((t=>t.package===e.package));a?"string"==typeof e.path?(a.path||[]).some((t=>t===e.path))||(a.path=a.path||[],a.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(a.path||[]).some((t=>t===e))||(a.path=a.path||[],a.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const a=o({url:e});if(!a)throw new Error(`Invalid package name: ${e}`);if(a.protocol||(a.protocol=this.context.protocol),"ac:"===a.protocol){const t=a.pathname.split("/");if(1===t.length)return await this.apiContext.Atom.first({where:{name:e,parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===t.length){const e=await this.apiContext.Atom.first({where:{name:t[0],parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"folder"}});return await this.apiContext.Atom.first({where:{name:t[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===a.protocol){const e=this.atom;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const a=t.resolve(this.context.projectSrcDir,"index.js"),o=await s({file:a,recursive:!0}),n=e.doc.dependencies,r=o.all;for await(const e of r){if("npm"!==e.type)continue;if(n.find((t=>t.package===e.package)))continue;const t=await v({name:e.package,projectDir:this.context.projectDir,setProgress:this.apiContext.setProgress});n.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:a}){await this.setProgress({message:"Creating external lib files."}),this.atom.typesDir="./types";const s=a.filter((e=>"atom"===e.type));for(let a=0;a<s.length;a++){const o=s[a].atom,n=this.context.projectDir;if("local:"===o.protocol){const a=t.resolve(this.context.projectSrcDir,`${o.fileName||o.name}.js`),s=t.relative(t.join(this.context.projectDir,"src","default"),a);if(!e.existsSync(a)){e.mkdirSync(t.dirname(a),{recursive:!0});let s="export default async (input)=>{\n";s+="}",e.writeFileSync(a,s,"utf8")}o.relativePath=s.split(t.sep).join("/"),this.atom.typesDir=`./types/${t.basename(n)}/src`}else{const a=t.join(n,"src","libs",`${o.id}.js`),s=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;e.writeFileSync(a,s.content,"utf8")}}}async createEngine(){await this.setProgress({message:"Creating engine file."});const s={libs:this.libs.filter((e=>"atom"===e.type)),libraryAtom:this.atom,atom:this.atom},o=this.context.templateDir,n=a.compile(e.readFileSync(t.resolve(o,t.join("src","default","engine.js.njk")),"utf8"),this.apiContext.njEnv).render(s),r=this.context.projectDir,i=t.resolve(r,t.join("src","default","index.js"));e.writeFileSync(i,n,"utf8")}async build(){try{if(this.fileMode){const o=this.apiContext.context.project;await this.createAtomLibFiles({libs:this.libs}),await this.createEngine(),await this.createProjectYaml(),await r(this.apiContext),await async function({atom:s,setProgress:o,context:n,packageDependencies:r}){await o({message:"Creating tsconfig.json."});const i={atom:s,packageDependencies:r},p=n.templateDir,c=a.compile(e.readFileSync(t.resolve(p,"tsconfig.json.njk"),"utf8"),a.configure(p)).render(i),l=n.projectDir,u=t.resolve(l,"tsconfig.json");e.writeFileSync(u,c,"utf8")}(this.apiContext),await i(this.apiContext),await async function({atom:s,setProgress:o,context:n,njEnv:r}){if(!0!==s.doc.features.cli.enabled)return;await o({message:"Creating input args."});let i={};if(i=s.doc.input?s.doc.input:{type:"object",properties:{},required:[]},s.doc.features.cli.fargs&&!1!==s.doc.features.cli.fargs?.enabled){const e=s.doc.features.cli.fargs;Reflect.has(e,"default")&&e.default}const p={imports:[],atom:s},c=n.templateDir,l=a.compile(e.readFileSync(t.resolve(c,"src/default/input.args.js.njk"),"utf8"),r).render(p),u=n.projectDir,d=t.resolve(u,"src/default/input.args.js");e.writeFileSync(d,l,"utf8");const b=new f({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});g(b);const h=b.compile(i),y=m(b,h)+"\nexport { schema31 as schema };";e.writeFileSync(t.resolve(u,"src/default/validate_input.js"),y,"utf8")}(this.apiContext),await async function({atom:a,setProgress:s,context:o,packageDependencies:n}){if(!0!==a.doc.features.cli.enabled)return;await s({message:"Creating cli."});const r={atom:a,packageDependencies:n},i=o.templateDir,p=t.resolve(o.projectDir,"src/cli");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),await l({pattern:["index.js.njk"],dir:t.resolve(i,"src/cli"),outDir:p,context:r})}(this.apiContext),await async function({atom:a,setProgress:s,context:o,packageDependencies:n}){if(!0!==a.doc.features.app.enabled)return;await s({message:"Creating app folder"});const r={atom:a,packageDependencies:n,ts:Date.now()},i=o.templateDir,p=t.resolve(o.projectDir,"src/app");e.existsSync(p)||e.mkdirSync(p,{recursive:!0});let c=["index.js.njk"];!1!==a.doc.features.app.html&&c.push("index.html.njk"),await l({pattern:c,dir:t.resolve(i,"src/app"),outDir:p,context:r})}(this.apiContext),"bun"===o.runtime.type?await async function({atom:s,setProgress:o,context:n,packageDependencies:r}){await o({message:"Creating build.js file."});const i={atom:s,packageDependencies:r},p=n.templateDir,c=a.compile(e.readFileSync(t.resolve(p,"build.js.njk"),"utf8"),a.configure(p)).render(i),l=n.projectDir,u=t.resolve(l,"build.js");e.writeFileSync(u,c,"utf8"),e.chmodSync(u,"755")}(this.apiContext):await async function({atom:o,setProgress:n,context:r,packageDependencies:i}){await n({message:"Creating rollup file."});const p={atom:o,packageDependencies:i},c=t.resolve(r.projectDir,"src","default/index.js");if(!e.existsSync(c))throw new Error(`Entry file not found: ${c}`);const l=(await s({file:c,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),u=o.doc.features.rollup_output,d=Object.keys(u);for(let e=0;e<d.length;e++){const t=u[d[e]];if(!0===t.browser&&l.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(l.map((e=>({key:e,value:e})))),t.alias_enabled=!0,t.alias=t.alias||{},t.alias.entries=t.alias.entries||{};for(let e=0;e<l.length;e++){const a=l[e];t.alias.entries[a]=`node:${a}`,t.alias.entries[`node:${a}`]=a}t.external_enabled=!0,t.external=t.external||[],t.external=t.external.concat(l)}}const f=r.templateDir;let m=a.compile(e.readFileSync(t.resolve(f,"rollup.config.mjs.njk"),"utf8"),a.configure(f)).render(p);const g=r.projectDir;let b=t.resolve(g,"rollup.config.mjs");e.writeFileSync(b,m,"utf8")}(this.apiContext),await async function({atom:o,context:n,packageDependencies:r,packageDevDependencies:i,setProgress:p}){await p({message:"Creating package.json."}),r.filter((e=>!0===e.dev)).forEach((e=>{i.find((t=>t.package===e.package))||i.push(e);const t=r.findIndex((t=>t.package===e.package));r.splice(t,1)}));const c=r.find((e=>"react"===e.package)),l=r.find((e=>"react-dom"===e.package));c&&!l?r.push({package:"react-dom",version:c.version}):c&&l&&(l.version=c.version),c&&o.doc.features.react_version>=17&&(r.find((e=>"@emotion/react"===e.package))||r.push({package:"@emotion/react",version:"^11"}),r.find((e=>"@emotion/styled"===e.package))||r.push({package:"@emotion/styled",version:"^11"}));const u=[];!0===o.doc.features.app.enabled&&u.push({file:t.resolve(n.projectDir,"src/app/index.js"),dev:!1!==o.doc.features.app.dev}),!0===o.doc.features.cli.enabled&&u.push({file:t.resolve(n.projectDir,"src/cli/index.js"),dev:!1!==o.doc.features.cli.dev});for await(const t of u){const a=t.file;if(!e.existsSync(a))throw new Error(`App file not found: ${a}`);const o=(await s({file:a,recursive:!0,verbose:!1})).all;for await(const e of o){if("npm"!==e.type)continue;if(r.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const a=await v({name:e.package,projectDir:n.projectDir,setProgress:p});(!0===t.dev?i:r).push({package:e.package,subpath:e.subpath,version:a.minorRange,type:"npm"})}}const d={atom:o,packageDependencies:r,packageDevDependencies:i},f=n.templateDir,m=a.compile(e.readFileSync(t.resolve(f,"package.json.njk"),"utf8"),a.configure(f)).render(d),g=n.projectDir,b=t.resolve(g,"package.json");e.writeFileSync(b,m,"utf8");const h=t.resolve(n.project.projectDir,"fnet");if(e.existsSync(h)){const a=t.resolve(n.projectDir,"fnet");e.existsSync(a)||e.mkdirSync(a);const s=e.readdirSync(h);for(const o of s){const s=t.resolve(h,o);if(!e.lstatSync(s).isFile())continue;const n=t.resolve(a,o);e.copyFileSync(s,n)}}}(this.apiContext),await async function({setProgress:e,context:a}){const s=a.projectDir;await e({message:"Prettifiying source files."});let o=t.join("src","**","*");if(h("bun")){const e=await b(`prettier --write ${o} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:s});if(0!==e.code)throw new Error(e.stderr)}else{const e=await b(`prettier --write ${o} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:s});if(0!==e.code)throw new Error(e.stderr)}}(this.apiContext),await async function({atom:e,setProgress:t,context:a}){if(!e.doc.features.dts_enabled)return;const s=a.projectDir;if(await t({message:"Creating .d.ts"}),0!==(await b("tsc",{cwd:s})).code)throw new Error("Couldnt create .d.ts files.")}(this.apiContext),this.buildMode&&(await async function({setProgress:e,atom:t,context:a}){const s=a.projectDir;if(await e({message:"Installing npm packages."}),h("bun")){if(0!==(await b(`bun install ${t.doc.features.npm_install_flags}`,{cwd:s})).code)throw new Error("Couldnt install npm packages.")}else if(0!==(await b(`npm install ${t.doc.features.npm_install_flags}`,{cwd:s})).code)throw new Error("Couldnt install npm packages.")}(this.apiContext),await async function({setProgress:e,context:t}){const a=t.projectDir;if(await e({message:"Building main project."}),h("bun")){if(0!==(await b(t.dev?"bun run build:dev":"bun run build",{cwd:a})).code)throw new Error("Couldnt build project.")}else if(0!==(await b(t.dev?"npm run build:dev":"npm run build",{cwd:a})).code)throw new Error("Couldnt build project.")}(this.apiContext),this.deployMode&&await this.deploy())}await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.buildKey,{status:"FAILED",message:e.message||e}),console.log(e),e}}}export{_ as default};