@fnet/cli 0.2.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 (133) hide show
  1. package/dist/fbin/index.js +2 -0
  2. package/dist/fnet/index.-SGbq2cI.js +1 -0
  3. package/dist/fnet/index.B0TQiWy6.js +1 -0
  4. package/dist/fnet/index.B5XE4ChJ.js +1 -0
  5. package/dist/fnet/index.Bft2w7m3.js +1 -0
  6. package/dist/fnet/index.BuYxdKtK.js +1 -0
  7. package/dist/fnet/index.C2S9JYhS.js +1 -0
  8. package/dist/fnet/index.C7saWH6d.js +1 -0
  9. package/dist/fnet/index.CDct_kkF.js +1 -0
  10. package/dist/fnet/index.CMC8mlye.js +1 -0
  11. package/dist/fnet/index.CmMM-Ek9.js +1 -0
  12. package/dist/fnet/index.CuMyez3E.js +1 -0
  13. package/dist/fnet/index.CzAV0S36.js +1 -0
  14. package/dist/fnet/index.D2N9YZmA.js +1 -0
  15. package/dist/fnet/index.D3p7pncT.js +1 -0
  16. package/dist/fnet/index.DG8TqL-1.js +1 -0
  17. package/dist/fnet/index.DI3yyTtl.js +1 -0
  18. package/dist/fnet/index.DWpw12No.js +1 -0
  19. package/dist/fnet/index.DrwlOzAe.js +1 -0
  20. package/dist/fnet/index.Q-CYRcna.js +1 -0
  21. package/dist/fnet/index.W6RYgypK.js +1 -0
  22. package/dist/fnet/index.js +2 -0
  23. package/dist/fnet/index.rSKuKke7.js +1 -0
  24. package/dist/fnet/index.xd8c7XMr.js +1 -0
  25. package/dist/fnode/index.-SGbq2cI.js +1 -0
  26. package/dist/fnode/index.1IxoA5DY.js +1 -0
  27. package/dist/fnode/index.B5XE4ChJ.js +1 -0
  28. package/dist/fnode/index.Bft2w7m3.js +1 -0
  29. package/dist/fnode/index.BuYxdKtK.js +1 -0
  30. package/dist/fnode/index.C2S9JYhS.js +1 -0
  31. package/dist/fnode/index.C7saWH6d.js +1 -0
  32. package/dist/fnode/index.CDct_kkF.js +1 -0
  33. package/dist/fnode/index.CJ4EhqPO.js +1 -0
  34. package/dist/fnode/index.CMC8mlye.js +1 -0
  35. package/dist/fnode/index.CmMM-Ek9.js +1 -0
  36. package/dist/fnode/index.CuMyez3E.js +1 -0
  37. package/dist/fnode/index.CzAV0S36.js +1 -0
  38. package/dist/fnode/index.D2N9YZmA.js +1 -0
  39. package/dist/fnode/index.D3p7pncT.js +1 -0
  40. package/dist/fnode/index.DG8TqL-1.js +1 -0
  41. package/dist/fnode/index.DI3yyTtl.js +1 -0
  42. package/dist/fnode/index.DWpw12No.js +1 -0
  43. package/dist/fnode/index.DrwlOzAe.js +1 -0
  44. package/dist/fnode/index.N_a5FdgA.js +1 -0
  45. package/dist/fnode/index.Q-CYRcna.js +1 -0
  46. package/dist/fnode/index.UNoFg95r.js +1 -0
  47. package/dist/fnode/index.W6RYgypK.js +1 -0
  48. package/dist/fnode/index.js +2 -0
  49. package/dist/fnode/index.tq-9YxMP.js +1 -0
  50. package/dist/fnode/index.xd8c7XMr.js +1 -0
  51. package/dist/frun/index.js +2 -0
  52. package/dist/fservice/index.js +2 -0
  53. package/package.json +89 -0
  54. package/readme.md +251 -0
  55. package/template/fnet/core/assert.js +6 -0
  56. package/template/fnet/core/message.js +3 -0
  57. package/template/fnet/core/object.js +47 -0
  58. package/template/fnet/core/print.js +1 -0
  59. package/template/fnet/core/sleep.js +5 -0
  60. package/template/fnet/node/.gitignore.njk +9 -0
  61. package/template/fnet/node/build.js.njk +153 -0
  62. package/template/fnet/node/package.json.njk +118 -0
  63. package/template/fnet/node/readme.md.njk +21 -0
  64. package/template/fnet/node/rollup.config.mjs.njk +498 -0
  65. package/template/fnet/node/src/app/index.html.njk +67 -0
  66. package/template/fnet/node/src/app/index.js.njk +36 -0
  67. package/template/fnet/node/src/cli/index.js.njk +319 -0
  68. package/template/fnet/node/src/default/blocks/assign.js.njk +53 -0
  69. package/template/fnet/node/src/default/blocks/call.js.njk +156 -0
  70. package/template/fnet/node/src/default/blocks/for.js.njk +87 -0
  71. package/template/fnet/node/src/default/blocks/form.js.njk +69 -0
  72. package/template/fnet/node/src/default/blocks/modules.js.njk +57 -0
  73. package/template/fnet/node/src/default/blocks/new.js.njk +87 -0
  74. package/template/fnet/node/src/default/blocks/next.js.njk +37 -0
  75. package/template/fnet/node/src/default/blocks/output.js.njk +53 -0
  76. package/template/fnet/node/src/default/blocks/raise.js.njk +31 -0
  77. package/template/fnet/node/src/default/blocks/return.js.njk +33 -0
  78. package/template/fnet/node/src/default/blocks/signal.js.njk +37 -0
  79. package/template/fnet/node/src/default/blocks/steps.js.njk +63 -0
  80. package/template/fnet/node/src/default/blocks/switch.js.njk +79 -0
  81. package/template/fnet/node/src/default/blocks/tryexcept.js.njk +74 -0
  82. package/template/fnet/node/src/default/blocks/wait.js.njk +34 -0
  83. package/template/fnet/node/src/default/engine.js.njk +79 -0
  84. package/template/fnet/node/src/default/input.args.js.njk +122 -0
  85. package/template/fnet/node/src/default/macros/block-assign.js.njk +3 -0
  86. package/template/fnet/node/src/default/macros/block-body-header.js.njk +7 -0
  87. package/template/fnet/node/src/default/macros/block-entry-args.js.njk +2 -0
  88. package/template/fnet/node/src/default/macros/block-footer.js.njk +3 -0
  89. package/template/fnet/node/src/default/macros/block-header.js.njk +14 -0
  90. package/template/fnet/node/src/default/macros/block-library-header.js.njk +43 -0
  91. package/template/fnet/node/src/default/macros/block-modules-header.js.njk +8 -0
  92. package/template/fnet/node/src/default/macros/block-modules.js.njk +29 -0
  93. package/template/fnet/node/src/default/macros/block-next-header.js.njk +6 -0
  94. package/template/fnet/node/src/default/macros/block-next.js.njk +21 -0
  95. package/template/fnet/node/src/default/macros/block-run-footer.js.njk +7 -0
  96. package/template/fnet/node/src/default/macros/block-run-form.js.njk +32 -0
  97. package/template/fnet/node/src/default/macros/block-run-header.js.njk +31 -0
  98. package/template/fnet/node/src/default/macros/block-signal.js.njk +3 -0
  99. package/template/fnet/node/src/default/macros/page.js.njk +8 -0
  100. package/template/fnet/node/src/default/macros/workflow-header.js.njk +7 -0
  101. package/template/fnet/node/src/default/workflow.js.njk +123 -0
  102. package/template/fnet/node/tsconfig.json.njk +16 -0
  103. package/template/fnet/project/.gitignore.njk +7 -0
  104. package/template/fnet/project/.vscode/launch.json.njk +41 -0
  105. package/template/fnet/project/.vscode/tasks.json.njk +46 -0
  106. package/template/fnet/project/fnet/flows.yaml.njk +4 -0
  107. package/template/fnet/project/fnet/targets.yaml.njk +7 -0
  108. package/template/fnet/project/fnet.yaml.njk +3 -0
  109. package/template/fnode/node/.gitignore.njk +9 -0
  110. package/template/fnode/node/build.js.njk +149 -0
  111. package/template/fnode/node/package.json.njk +120 -0
  112. package/template/fnode/node/readme.md.njk +21 -0
  113. package/template/fnode/node/rollup.config.mjs.njk +498 -0
  114. package/template/fnode/node/src/app/index-js-with-react-host.njk +50 -0
  115. package/template/fnode/node/src/app/index-js-without-react-host.njk +23 -0
  116. package/template/fnode/node/src/app/index.html.njk +67 -0
  117. package/template/fnode/node/src/app/index.js.njk +9 -0
  118. package/template/fnode/node/src/cli/index.js.njk +403 -0
  119. package/template/fnode/node/src/default/engine.js.njk +17 -0
  120. package/template/fnode/node/src/default/input.args.js.njk +122 -0
  121. package/template/fnode/node/tsconfig.json.njk +16 -0
  122. package/template/fnode/project/.gitignore.njk +11 -0
  123. package/template/fnode/project/.vscode/launch.json.njk +78 -0
  124. package/template/fnode/project/.vscode/tasks.json.njk +46 -0
  125. package/template/fnode/project/fnet/targets.yaml.njk +25 -0
  126. package/template/fnode/project/fnode.yaml.njk +12 -0
  127. package/template/fnode/python/.gitignore.njk +7 -0
  128. package/template/fnode/python/package.json.njk +4 -0
  129. package/template/fnode/python/pyproject.toml.njk +3 -0
  130. package/template/fnode/python/readme.md.njk +12 -0
  131. package/template/fnode/python/setup.py.njk +19 -0
  132. package/template/fnode/python/src/cli/index.py.njk +25 -0
  133. package/template/schemas/to-npm.yaml +14 -0
@@ -0,0 +1,319 @@
1
+ {% if atom.doc.features.cli.enabled===true %}
2
+
3
+ {# Define macros for reusable code blocks #}
4
+ {% macro importMcpDependencies() %}
5
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
+ import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
7
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
9
+ import express from "express";
10
+ {% endmacro %}
11
+
12
+ {% macro mcpModeCodeExtended(runFn) %}
13
+ if (cliMode === 'mcp') {
14
+ // MCP mode code
15
+ const server = new Server({
16
+ name: "{{atom.doc.features.cli.mcp.name or atom.doc.name}}",
17
+ version: "{{atom.doc.version or '0.0.1'}}"
18
+ }, {
19
+ capabilities: {
20
+ tools: {}
21
+ }
22
+ });
23
+
24
+ // Define available tools
25
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
26
+ return {
27
+ tools: [{
28
+ name: "{{atom.doc.features.cli.mcp.tool.name or atom.doc.name}}",
29
+ description: "{{atom.doc.features.cli.mcp.tool.description or atom.doc.description}}",
30
+ inputSchema: inputSchema,
31
+ }]
32
+ };
33
+ });
34
+
35
+ // Handle tool execution
36
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
37
+ if (request.params.name === "{{atom.doc.features.cli.mcp.tool.name or atom.doc.name}}") {
38
+ try {
39
+ const result = await {{ runFn }}(request.params.arguments, { Engine });
40
+ return {
41
+ content: [{
42
+ type: "text",
43
+ text: JSON.stringify(result)
44
+ }]
45
+ };
46
+ } catch (error) {
47
+ return {
48
+ content: [{
49
+ type: "text",
50
+ text: `Error: ${error.message}`
51
+ }],
52
+ isError: true
53
+ };
54
+ }
55
+ }
56
+ throw new Error("Tool not found");
57
+ });
58
+
59
+ // Get transport type from arguments
60
+ const transportType = args['mcp-transport'] || args.mcp_transport || 'stdio';
61
+ let transport;
62
+
63
+ if (transportType === 'stdio') {
64
+ // Use stdio transport
65
+ transport = new StdioServerTransport();
66
+ } else if (transportType === 'sse') {
67
+ // Use SSE transport
68
+ const app = express();
69
+ app.use(express.json());
70
+
71
+ const port = args['cli-port'] || args.cli_port || 3000;
72
+ const server = app.listen(port, () => {
73
+ console.log(`MCP server started with SSE transport on port ${port}`);
74
+ });
75
+
76
+ transport = new StreamableHTTPServerTransport({
77
+ sessionIdGenerator: () => Math.random().toString(36).substring(2, 15),
78
+ });
79
+
80
+ app.post('/sse', async (req, res) => {
81
+ await transport.handleRequest(req, res, req.body);
82
+ });
83
+
84
+ app.get('/sse', async (req, res) => {
85
+ await transport.handleRequest(req, res);
86
+ });
87
+
88
+ app.delete('/sse', async (req, res) => {
89
+ await transport.handleRequest(req, res);
90
+ });
91
+ } else {
92
+ console.error(`Unknown MCP transport type: ${transportType}`);
93
+ console.error(`Supported types: stdio, sse`);
94
+ process.exit(1);
95
+ }
96
+
97
+ await server.connect(transport);
98
+ return;
99
+ }
100
+ {% endmacro %}
101
+
102
+ {% macro mcpModeCodeEngine(engineVar) %}
103
+ if (cliMode === 'mcp') {
104
+ // MCP mode code
105
+ const server = new Server({
106
+ name: "{{atom.doc.features.cli.mcp.name or atom.doc.name}}",
107
+ version: "{{atom.doc.version or '0.0.1'}}"
108
+ }, {
109
+ capabilities: {
110
+ tools: {}
111
+ }
112
+ });
113
+
114
+ // Define available tools
115
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
116
+ return {
117
+ tools: [{
118
+ name: "{{atom.doc.features.cli.mcp.tool.name or atom.doc.name}}",
119
+ description: "{{atom.doc.features.cli.mcp.tool.description or atom.doc.description}}",
120
+ inputSchema: inputSchema,
121
+ }]
122
+ };
123
+ });
124
+
125
+ // Handle tool execution
126
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
127
+ if (request.params.name === "{{atom.doc.features.cli.mcp.tool.name or atom.doc.name}}") {
128
+ try {
129
+ const result = await {{ engineVar }}.run(request.params.arguments);
130
+ return {
131
+ content: [{
132
+ type: "text",
133
+ text: JSON.stringify(result)
134
+ }]
135
+ };
136
+ } catch (error) {
137
+ return {
138
+ content: [{
139
+ type: "text",
140
+ text: `Error: ${error.message}`
141
+ }],
142
+ isError: true
143
+ };
144
+ }
145
+ }
146
+ throw new Error("Tool not found");
147
+ });
148
+
149
+ // Note: Direct access to workflow nodes is not implemented in this version
150
+ // In a future version, we could expose workflow nodes as separate MCP tools
151
+
152
+ // Get transport type from arguments
153
+ const transportType = args['mcp-transport'] || args.mcp_transport || 'stdio';
154
+ let transport;
155
+
156
+ if (transportType === 'stdio') {
157
+ // Use stdio transport
158
+ transport = new StdioServerTransport();
159
+ } else if (transportType === 'sse') {
160
+ // Use SSE transport
161
+ const app = express();
162
+ app.use(express.json());
163
+
164
+ const port = args['cli-port'] || args.cli_port || 3000;
165
+ const server = app.listen(port, () => {
166
+ console.log(`MCP server started with SSE transport on port ${port}`);
167
+ });
168
+
169
+ transport = new StreamableHTTPServerTransport({
170
+ sessionIdGenerator: () => Math.random().toString(36).substring(2, 15),
171
+ });
172
+
173
+ app.post('/sse', async (req, res) => {
174
+ await transport.handleRequest(req, res, req.body);
175
+ });
176
+
177
+ app.get('/sse', async (req, res) => {
178
+ await transport.handleRequest(req, res);
179
+ });
180
+
181
+ app.delete('/sse', async (req, res) => {
182
+ await transport.handleRequest(req, res);
183
+ });
184
+ } else {
185
+ console.error(`Unknown MCP transport type: ${transportType}`);
186
+ console.error(`Supported types: stdio, sse`);
187
+ process.exit(1);
188
+ }
189
+
190
+ await server.connect(transport);
191
+ return;
192
+ }
193
+ {% endmacro %}
194
+
195
+ {% macro httpModeCodeExpress(runFn, engineParam) %}
196
+ if (cliMode === 'http') {
197
+ // HTTP mode code using Express
198
+ const app = express();
199
+ app.use(express.json());
200
+
201
+ app.post('/{{atom.doc.features.cli.http.path or atom.doc.name}}', async (req, res) => {
202
+ try {
203
+ const result = await {{ runFn }}(req.body{{ engineParam }});
204
+ res.json(result);
205
+ } catch (error) {
206
+ res.status(500).json({ error: error.message });
207
+ }
208
+ });
209
+
210
+ const port = args['cli-port'] || args.cli_port || 3000;
211
+ app.listen(port, () => {
212
+ console.log(`HTTP server started on port ${port}`);
213
+ });
214
+ return;
215
+ }
216
+ {% endmacro %}
217
+
218
+ {% macro defaultModeExtended() %}
219
+ if (cliMode === 'default') {
220
+ // Default mode code
221
+ return await runExtended(await argv(), { Engine });
222
+ }
223
+ {% endmacro %}
224
+
225
+ {% macro defaultModeEngine(engineVar) %}
226
+ if (cliMode === 'default') {
227
+ // Default mode code
228
+ const result = await {{ engineVar }}.run(await argv());
229
+
230
+ if (typeof result !== 'undefined') {
231
+ const stdout_format = args['stdout-format'] || args.stdout_format || null;
232
+
233
+ if (stdout_format === 'json') console.log(JSON.stringify(result, null, 2));
234
+ else console.log(result);
235
+ }
236
+ return;
237
+ }
238
+ {% endmacro %}
239
+
240
+ {% macro runWithCatch() %}
241
+ run()
242
+ .catch((error) => {
243
+ console.error(error.message);
244
+ process.exit(1);
245
+ });
246
+ {% endmacro %}
247
+
248
+ {% macro runWithThenCatch() %}
249
+ run()
250
+ .then(() => {
251
+ {# process.exit(0); #}
252
+ })
253
+ .catch((error) => {
254
+ console.error(error.message);
255
+ process.exit(1);
256
+ });
257
+ {% endmacro %}
258
+
259
+ {# Main template starts here #}
260
+ import argv from '../default/input.args.js';
261
+ import { schema as inputSchema } from '../default/validate_input.js';
262
+ import { default as Engine } from '../default/{{atom.doc.features.cli_default_entry_file or atom.doc.features.main_default_entry_file}}';
263
+
264
+ {% if atom.doc.features.cli.mcp.enabled===true %}
265
+ {{ importMcpDependencies() }}
266
+ {% elif atom.doc.features.cli.http.enabled===true %}
267
+ // Using express for HTTP mode
268
+ import express from 'express';
269
+ {% endif %}
270
+
271
+ {% if atom.doc.features.cli.extend===true %}
272
+ {# TYPE 1 #}
273
+ import { default as runExtended } from '../../../cli/index.js';
274
+ import argsParser from 'yargs-parser';
275
+
276
+ const run = async () => {
277
+ const args = argsParser(process.argv.slice(2));
278
+ const cliMode = args['cli-mode'] || args.cli_mode || 'default';
279
+
280
+ {{ defaultModeExtended() }}
281
+
282
+ {% if atom.doc.features.cli.mcp.enabled===true %}
283
+ {{ mcpModeCodeExtended('runExtended') }}
284
+ {% endif %}
285
+
286
+ {% if atom.doc.features.cli.http.enabled===true %}
287
+ {{ httpModeCodeExpress('runExtended', ', { Engine }') }}
288
+ {% endif %}
289
+
290
+ console.error(`Unknown CLI mode: ${cliMode}`);
291
+ process.exit(1);
292
+ };
293
+
294
+ {{ runWithThenCatch() }}
295
+ {% else %}
296
+ {# TYPE 2 #}
297
+ import argsParser from 'yargs-parser';
298
+ const run = async () => {
299
+ const args =argsParser(process.argv.slice(2));
300
+ const cliMode = args['cli-mode'] || args.cli_mode || 'default';
301
+ const engine = new Engine();
302
+
303
+ {{ defaultModeEngine('engine') }}
304
+
305
+ {% if atom.doc.features.cli.mcp.enabled===true %}
306
+ {{ mcpModeCodeEngine('engine') }}
307
+ {% endif %}
308
+
309
+ {% if atom.doc.features.cli.http.enabled===true %}
310
+ {{ httpModeCodeExpress('engine.run', '') }}
311
+ {% endif %}
312
+
313
+ console.error(`Unknown CLI mode: ${cliMode}`);
314
+ process.exit(1);
315
+ };
316
+
317
+ {{ runWithCatch() }}
318
+ {% endif %}
319
+ {% endif %}
@@ -0,0 +1,53 @@
1
+ {% include "src/default/macros/block-header.js.njk" %}
2
+
3
+ {% include "src/default/macros/block-next-header.js.njk" %}
4
+
5
+ {% include "src/default/macros/block-modules-header.js.njk" %}
6
+
7
+ export default function Block(context){
8
+
9
+ {% include "src/default/macros/block-body-header.js.njk" %}
10
+
11
+ this.run= function (){
12
+
13
+ {% include "src/default/macros/block-entry-args.js.njk" %}
14
+
15
+ return new Promise(async (resolve,reject)=>{
16
+
17
+ {% include "src/default/macros/block-run-header.js.njk" %}
18
+
19
+ {% include "src/default/macros/page.js.njk" %}
20
+
21
+ {% include "src/default/macros/block-modules.js.njk" %}
22
+
23
+ {% if context.next and context.transform.wait==='next' %}
24
+ flow.waitForNext({
25
+ key:'{{indexKey}}',
26
+ next: async () => {
27
+ {% include "src/default/macros/block-next.js.njk" %}
28
+ }
29
+ });
30
+ {% endif %}
31
+
32
+ {% for assign in context.transform.assign %}
33
+ flow.set({{assign.key | safe}},{{assign.value | safe}});
34
+ {% endfor%}
35
+
36
+ {% include "src/default/macros/block-signal.js.njk" %}
37
+
38
+ {% if context.transform.return %}
39
+ resolve({type:'return',value: {{context.transform.return | safe}}});
40
+ {% elseif context.next and context.transform.wait!=='next'%}
41
+ {% include "src/default/macros/block-next.js.njk" %}
42
+ {% elseif not context.next%}
43
+ resolve();
44
+ {% endif %}
45
+
46
+ {% include "src/default/macros/block-run-footer.js.njk" %}
47
+ });
48
+ }
49
+
50
+ Object.freeze(this);
51
+ }
52
+
53
+ {% include "src/default/macros/block-footer.js.njk" %}
@@ -0,0 +1,156 @@
1
+ {% include "src/default/macros/block-header.js.njk" %}
2
+
3
+ {% include "src/default/macros/block-next-header.js.njk" %}
4
+
5
+ {% include "src/default/macros/block-library-header.js.njk" %}
6
+
7
+ {% include "src/default/macros/block-modules-header.js.njk" %}
8
+
9
+ export default function Block(context){
10
+
11
+ {% include "src/default/macros/block-body-header.js.njk" %}
12
+
13
+ this.run= function (){
14
+
15
+ {% include "src/default/macros/block-entry-args.js.njk" %}
16
+
17
+ return new Promise(async (resolve,reject)=>{
18
+
19
+
20
+ try{
21
+ {% include "src/default/macros/block-run-header.js.njk" %}
22
+
23
+ {% include "src/default/macros/page.js.njk" %}
24
+
25
+ {% include "src/default/macros/block-modules.js.njk" %}
26
+
27
+ {% if context.next and context.transform.wait==='next' %}
28
+ flow.waitForNext({
29
+ key:'{{indexKey}}',
30
+ next: async () => {
31
+ {% include "src/default/macros/block-next.js.njk" %}
32
+ }
33
+ });
34
+ {% endif %}
35
+
36
+ {# NEW: Check if 'new' keyword is present for constructor call #}
37
+ {% if context.transform.new !== undefined %}
38
+ {# Constructor instantiation with 'new' keyword #}
39
+ {% if context.lib.type==='atom' and context.lib.atom.protocol!=='use:' %}
40
+ const LibClass=LIBRARY;
41
+ {% elseif context.lib.atom.protocol==='use:' %}
42
+ {# For use:e:: protocol, call value is the class name (e.g., use:e::Map → Map) #}
43
+ const LibClass={{context.transform.import}};
44
+ if(!LibClass) throw new Error('[use] Couldnt find class.');
45
+ {% else %}
46
+ throw new Error('Cannot instantiate: unsupported lib type.');
47
+ {% endif %}
48
+
49
+ {# Create instance with constructor args #}
50
+ {% if context.transform.new %}
51
+ const constructorArgs = {{ context.transform.new | safe }};
52
+ const instance = Array.isArray(constructorArgs) ? new LibClass(...constructorArgs) : new LibClass(constructorArgs);
53
+ {% else %}
54
+ const instance = new LibClass();
55
+ {% endif %}
56
+
57
+ {# If 'call' is specified, get the method from instance #}
58
+ {% if context.transform.call %}
59
+ const callLib = instance.{{context.transform.call}};
60
+ {% else %}
61
+ {# No method call, just return the instance #}
62
+ const callLib = () => instance;
63
+ {% endif %}
64
+
65
+ {% else %}
66
+ {# EXISTING: Normal function/method call (no 'new') #}
67
+ {% if context.lib.type==='atom'%}
68
+ {% if context.transform.libExp %}
69
+ const lib={{context.transform.libExp}};
70
+ {% else %}
71
+ const lib=LIBRARY;
72
+ {% endif %}
73
+ {% elseif context.lib.type==='subworkflow' %}
74
+ const lib={{context.lib.codeKey}};
75
+ {% elseif target.atom.protocol==='use:' %}
76
+ const lib={{context.transform.call}};
77
+ if(!lib) throw new Error('[use] Couldnt find lib.');
78
+ {% else %}
79
+ const lib=undefined;
80
+ throw new Error('Couldn file lib.');
81
+ {% endif %}
82
+
83
+ {% if context.lib.atom.doc.subtype==='workflow'%}
84
+ const Workflow=lib;
85
+ const workflow=new Workflow({app:engine.app,caller:c});
86
+ const callLib = workflow.run.bind(workflow);
87
+ {% elseif context.lib.type==='subworkflow'%}
88
+ const Workflow=lib;
89
+ const workflow=new Workflow({engine,flow,caller:c});
90
+ const callLib = workflow.run.bind(workflow);
91
+ {% else %}
92
+ const callLib = lib;
93
+ {% endif %}
94
+ {% endif %}
95
+
96
+ {# Execute the call #}
97
+ {% if context.transform.args %}
98
+ {% if context.lib.type==='subworkflow' %}
99
+ const callArgs ={ params: {{ context.transform.args | safe }} };
100
+ {% else %}
101
+ const callArgs ={{ context.transform.args | safe }} ;
102
+ {% endif %}
103
+
104
+ {% if context.transform.new !== undefined %}
105
+ {# For constructor calls, use instance as context #}
106
+ const result = Array.isArray(callArgs)? await callLib.apply(instance,callArgs): await callLib.call(instance,callArgs);
107
+ {% else %}
108
+ {# For regular calls, use _this as context #}
109
+ {% if context.transform.context !== undefined %}
110
+ const result = Array.isArray(callArgs)? await callLib.apply({{context.transform.context | safe}},callArgs): await callLib.call({{context.transform.context | safe}},callArgs);
111
+ {% else %}
112
+ const result = Array.isArray(callArgs)? await callLib.apply(_this,callArgs): await callLib.call(_this,callArgs);
113
+ {% endif %}
114
+
115
+ {% endif %}
116
+
117
+ {% else %}
118
+ {% if context.transform.new !== undefined %}
119
+ const result = await callLib.call(instance);
120
+ {% else %}
121
+ {% if context.transform.context !== undefined %}
122
+ const result = await callLib.call({{context.transform.context | safe}});
123
+ {% else %}
124
+ const result = await callLib.call(_this);
125
+ {% endif %}
126
+ {% endif %}
127
+ {% endif %}
128
+
129
+ {% for assign in context.transform.result %}
130
+ flow.set({{assign.key | safe}},{{assign.value | safe}});
131
+ {% endfor%}
132
+
133
+ {% include "src/default/macros/block-assign.js.njk" %}
134
+
135
+ {% include "src/default/macros/block-signal.js.njk" %}
136
+
137
+ {% if context.transform.return %}
138
+ resolve({type:'return',value: {{context.transform.return | safe}}});
139
+ {% elseif context.next and context.transform.wait!=='next'%}
140
+ {% include "src/default/macros/block-next.js.njk" %}
141
+ {% elseif not context.next%}
142
+ resolve();
143
+ {% endif %}
144
+
145
+ {% include "src/default/macros/block-run-footer.js.njk" %}
146
+ }
147
+ catch(error){
148
+ onError? onError(error) : reject(error);
149
+ }
150
+ });
151
+ }
152
+
153
+ Object.freeze(this);
154
+ }
155
+
156
+ {% include "src/default/macros/block-footer.js.njk" %}
@@ -0,0 +1,87 @@
1
+
2
+ {% include "src/default/macros/block-header.js.njk" %}
3
+
4
+ {% include "src/default/macros/block-next-header.js.njk" %}
5
+
6
+ {% include "src/default/macros/block-modules-header.js.njk" %}
7
+
8
+ {% if childs.length %}
9
+ {% if not childs[0].definition.dynamic %}
10
+ // FIRST CHILD: {{childs[0].indexKey}}
11
+ import {{childs[0].codeKey}} from "./{{childs[0].codeKey}}.js";
12
+ {% endif %}
13
+ {% endif%}
14
+
15
+ export default function Block(context) {
16
+
17
+ {% include "src/default/macros/block-body-header.js.njk" %}
18
+
19
+ this.run= function (){
20
+
21
+ {% include "src/default/macros/block-entry-args.js.njk" %}
22
+
23
+ return new Promise(async (resolve,reject)=>{
24
+
25
+ {% include "src/default/macros/block-run-header.js.njk" %}
26
+
27
+ {% include "src/default/macros/page.js.njk" %}
28
+
29
+ {% include "src/default/macros/block-modules.js.njk" %}
30
+
31
+ {% if childs.length %}
32
+ {% if childs[0].definition.dynamic %}
33
+ // FIRST CHILD: {{childs[0].indexKey}}
34
+ const { default: {{childs[0].codeKey}} } = await import("./{{childs[0].codeKey}}.js");
35
+ {% endif %}
36
+ {% endif%}
37
+
38
+ for await(const {{context.transform.for.value | safe}} of {{context.transform.for.in | safe}}){
39
+ c.for={ {{context.transform.for.value | safe}} };
40
+
41
+ {% if childs.length %}
42
+ let current= new {{childs[0].codeKey}}({ parent:_this, engine, flow, caller:c });
43
+ let currentArgs=args;
44
+
45
+ do {
46
+
47
+ {% if workflow.parent.context.atom.doc.features.print_runners %}
48
+ console.log(new Date().toLocaleString(),' * ',_this.constructor.IndexKey,' -> ',current.constructor.IndexKey);
49
+ {% endif %}
50
+
51
+ const nextBlock= typeof currentArgs==='undefined'? await current.run()
52
+ : Array.isArray(currentArgs)? await current.run.apply(current,currentArgs) : await current.run.call(current, currentArgs) ;
53
+
54
+ if(nextBlock?.type==='return') return resolve(nextBlock);
55
+ else if(nextBlock?.type!=='block') break;
56
+
57
+ if(nextBlock.toType.ParentTypeId!==_this.constructor.TypeId)
58
+ return resolve(nextBlock);
59
+
60
+ current=new nextBlock.toType({ parent:_this, engine, flow, caller:c, onError, error });
61
+ currentArgs=nextBlock.input;
62
+
63
+ } while(true);
64
+
65
+ {% endif %}
66
+ }
67
+
68
+ {% include "src/default/macros/block-assign.js.njk" %}
69
+
70
+ {% include "src/default/macros/block-signal.js.njk" %}
71
+
72
+ {% if context.transform.return %}
73
+ resolve({type:'return',value: {{context.transform.return | safe}}});
74
+ {% elseif context.next %}
75
+ {% include "src/default/macros/block-next.js.njk" %}
76
+ {% else %}
77
+ resolve();
78
+ {% endif %}
79
+
80
+ {% include "src/default/macros/block-run-footer.js.njk" %}
81
+ });
82
+ }
83
+
84
+ Object.freeze(this);
85
+ }
86
+
87
+ {% include "src/default/macros/block-footer.js.njk" %}
@@ -0,0 +1,69 @@
1
+ import React from "react";
2
+
3
+ {% include "src/default/macros/block-header.js.njk" %}
4
+
5
+ {% include "src/default/macros/block-next-header.js.njk" %}
6
+
7
+ {% include "src/default/macros/block-library-header.js.njk" %}
8
+
9
+ {% include "src/default/macros/block-modules-header.js.njk" %}
10
+
11
+ export default function Block(context){
12
+
13
+ {% include "src/default/macros/block-body-header.js.njk" %}
14
+
15
+ this.run= function (){
16
+
17
+ {% include "src/default/macros/block-entry-args.js.njk" %}
18
+
19
+ return new Promise(async (resolve,reject)=>{
20
+
21
+
22
+ try{
23
+ {% include "src/default/macros/block-run-header.js.njk" %}
24
+
25
+ {% include "src/default/macros/page.js.njk" %}
26
+
27
+ {% include "src/default/macros/block-modules.js.njk" %}
28
+
29
+ flow.waitForNext({
30
+ key:'{{indexKey}}',
31
+ next: async () => {
32
+ {% if context.transform.return %}
33
+ resolve({type:'return',value: {{context.transform.return | safe}}});
34
+ {% elseif context.next %}
35
+ {% include "src/default/macros/block-next.js.njk" %}
36
+ {% else %}
37
+ resolve();
38
+ {% endif %}
39
+ }
40
+ });
41
+
42
+ {% if context.lib.type==='atom'%}
43
+ const formLib=LIBRARY;
44
+ {% elseif context.lib.type==='subworkflow' %}
45
+ const formLib={{context.lib.codeKey}};
46
+ {% else %}
47
+ const formLib=undefined;
48
+ throw new Error('Couldnt find form.');
49
+ {% endif %}
50
+
51
+ {% include "src/default/macros/block-run-form.js.njk" %}
52
+
53
+ {% include "src/default/macros/block-assign.js.njk" %}
54
+
55
+ {% include "src/default/macros/block-signal.js.njk" %}
56
+
57
+ {% include "src/default/macros/block-run-footer.js.njk" %}
58
+ }
59
+ catch(error){
60
+ reject(error);
61
+ }
62
+
63
+ });
64
+ }
65
+
66
+ Object.freeze(this);
67
+ }
68
+
69
+ {% include "src/default/macros/block-footer.js.njk" %}