cbs-block 1.0.10 → 1.0.11
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.
- package/Database/index.js +144 -0
- package/Database/metadata.json +27 -0
- package/Database/package.json +13 -0
- package/EnvManager/index.js +111 -0
- package/EnvManager/metadata.json +23 -0
- package/EnvManager/package.json +11 -0
- package/FileSystem/index.js +142 -0
- package/FileSystem/metadata.json +25 -0
- package/FileSystem/package.json +12 -0
- package/NetworkAPI/index.js +164 -0
- package/NetworkAPI/metadata.json +26 -0
- package/NetworkAPI/package.json +12 -0
- package/README.md +9 -0
- package/bin/cbs-block.js +115 -17
- package/database.cbsblock +83 -0
- package/database.md +24 -0
- package/environment_manager.cbsblock +61 -0
- package/environment_manager.md +20 -0
- package/file_system.cbsblock +72 -0
- package/file_system.md +22 -0
- package/network_api.cbsblock +77 -0
- package/network_api.md +23 -0
- package/package.json +1 -1
- package/scripts/add_block_templates.js +86 -0
- package/templates/library.json +569 -19
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
const sqlite3 = require('sqlite3').verbose();
|
|
2
|
+
const mysql = require('mysql2/promise');
|
|
3
|
+
const { Client } = require('pg');
|
|
4
|
+
|
|
5
|
+
// In-memory storage for demo purposes (since we can't install real databases)
|
|
6
|
+
const mockDatabases = new Map();
|
|
7
|
+
|
|
8
|
+
function run(inputs) {
|
|
9
|
+
try {
|
|
10
|
+
const { action, type = 'sqlite', connection, query, params = [], table, data } = inputs;
|
|
11
|
+
|
|
12
|
+
switch (action?.toLowerCase()) {
|
|
13
|
+
case 'connect':
|
|
14
|
+
// For demo purposes, we'll use in-memory storage
|
|
15
|
+
if (!connection) {
|
|
16
|
+
return { result: null, count: null, lastId: null, error: "Connection string is required" };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (type === 'sqlite' || !type) {
|
|
20
|
+
// Use in-memory SQLite for demo
|
|
21
|
+
return { result: [{ status: 'connected', database: connection }], count: 1, lastId: null, error: null };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return { result: [{ status: 'connected', type: type, connection: connection }], count: 1, lastId: null, error: null };
|
|
25
|
+
|
|
26
|
+
case 'query':
|
|
27
|
+
case 'execute':
|
|
28
|
+
if (!query) {
|
|
29
|
+
return { result: null, count: null, lastId: null, error: "Query is required" };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Mock database operations for demo
|
|
33
|
+
if (query.toLowerCase().includes('select')) {
|
|
34
|
+
// Mock SELECT results
|
|
35
|
+
const mockResults = [
|
|
36
|
+
{ id: 1, name: 'Sample Data 1', created: new Date().toISOString() },
|
|
37
|
+
{ id: 2, name: 'Sample Data 2', created: new Date().toISOString() }
|
|
38
|
+
];
|
|
39
|
+
return { result: mockResults, count: mockResults.length, lastId: null, error: null };
|
|
40
|
+
} else if (query.toLowerCase().includes('insert')) {
|
|
41
|
+
// Mock INSERT
|
|
42
|
+
return { result: [{ affectedRows: 1 }], count: 1, lastId: '123', error: null };
|
|
43
|
+
} else if (query.toLowerCase().includes('update')) {
|
|
44
|
+
// Mock UPDATE
|
|
45
|
+
return { result: [{ affectedRows: 1 }], count: 1, lastId: null, error: null };
|
|
46
|
+
} else if (query.toLowerCase().includes('delete')) {
|
|
47
|
+
// Mock DELETE
|
|
48
|
+
return { result: [{ affectedRows: 1 }], count: 1, lastId: null, error: null };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return { result: [{ message: 'Query executed successfully' }], count: 1, lastId: null, error: null };
|
|
52
|
+
|
|
53
|
+
case 'insert':
|
|
54
|
+
if (!table || !data) {
|
|
55
|
+
return { result: null, count: null, lastId: null, error: "Table name and data are required for insert" };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Mock insert operation
|
|
59
|
+
const newId = Date.now().toString();
|
|
60
|
+
const mockInsertResult = {
|
|
61
|
+
id: newId,
|
|
62
|
+
...data,
|
|
63
|
+
created_at: new Date().toISOString()
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
return { result: [mockInsertResult], count: 1, lastId: newId, error: null };
|
|
67
|
+
|
|
68
|
+
case 'update':
|
|
69
|
+
if (!table || !data) {
|
|
70
|
+
return { result: null, count: null, lastId: null, error: "Table name and data are required for update" };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Mock update operation
|
|
74
|
+
const mockUpdateResult = {
|
|
75
|
+
affectedRows: 1,
|
|
76
|
+
matchedCount: 1,
|
|
77
|
+
modifiedCount: 1
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return { result: [mockUpdateResult], count: 1, lastId: null, error: null };
|
|
81
|
+
|
|
82
|
+
case 'delete':
|
|
83
|
+
if (!table) {
|
|
84
|
+
return { result: null, count: null, lastId: null, error: "Table name is required for delete" };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Mock delete operation
|
|
88
|
+
const mockDeleteResult = {
|
|
89
|
+
affectedRows: 1,
|
|
90
|
+
deletedCount: 1
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return { result: [mockDeleteResult], count: 1, lastId: null, error: null };
|
|
94
|
+
|
|
95
|
+
case 'find':
|
|
96
|
+
case 'select':
|
|
97
|
+
if (!table) {
|
|
98
|
+
return { result: null, count: null, lastId: null, error: "Table name is required for select" };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Mock select operation
|
|
102
|
+
const mockData = [
|
|
103
|
+
{ id: 1, name: 'Record 1', status: 'active', created_at: new Date().toISOString() },
|
|
104
|
+
{ id: 2, name: 'Record 2', status: 'inactive', created_at: new Date().toISOString() },
|
|
105
|
+
{ id: 3, name: 'Record 3', status: 'active', created_at: new Date().toISOString() }
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
return { result: mockData, count: mockData.length, lastId: null, error: null };
|
|
109
|
+
|
|
110
|
+
case 'create_table':
|
|
111
|
+
if (!table) {
|
|
112
|
+
return { result: null, count: null, lastId: null, error: "Table name is required" };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Mock table creation
|
|
116
|
+
return { result: [{ message: `Table '${table}' created successfully` }], count: 1, lastId: null, error: null };
|
|
117
|
+
|
|
118
|
+
case 'drop_table':
|
|
119
|
+
if (!table) {
|
|
120
|
+
return { result: null, count: null, lastId: null, error: "Table name is required" };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Mock table deletion
|
|
124
|
+
return { result: [{ message: `Table '${table}' dropped successfully` }], count: 1, lastId: null, error: null };
|
|
125
|
+
|
|
126
|
+
default:
|
|
127
|
+
return {
|
|
128
|
+
result: null,
|
|
129
|
+
count: null,
|
|
130
|
+
lastId: null,
|
|
131
|
+
error: `Unknown action: ${action}. Supported actions: connect, query, insert, update, delete, find, create_table, drop_table`
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
} catch (error) {
|
|
135
|
+
return {
|
|
136
|
+
result: null,
|
|
137
|
+
count: null,
|
|
138
|
+
lastId: null,
|
|
139
|
+
error: `Database error: ${error.message}`
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
module.exports = { run };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Database",
|
|
3
|
+
"category": "Data",
|
|
4
|
+
"color": "#9C27B0",
|
|
5
|
+
"ports": [
|
|
6
|
+
{ "name": "flowIn", "type": "FlowIn" },
|
|
7
|
+
{ "name": "flowOut", "type": "FlowOut" },
|
|
8
|
+
{ "name": "action", "type": "Input", "dataType": "string" },
|
|
9
|
+
{ "name": "type", "type": "Input", "dataType": "string" },
|
|
10
|
+
{ "name": "connection", "type": "Input", "dataType": "string" },
|
|
11
|
+
{ "name": "query", "type": "Input", "dataType": "string" },
|
|
12
|
+
{ "name": "params", "type": "Input", "dataType": "array" },
|
|
13
|
+
{ "name": "table", "type": "Input", "dataType": "string" },
|
|
14
|
+
{ "name": "data", "type": "Input", "dataType": "object" },
|
|
15
|
+
{ "name": "result", "type": "Output", "dataType": "array" },
|
|
16
|
+
{ "name": "count", "type": "Output", "dataType": "number" },
|
|
17
|
+
{ "name": "lastId", "type": "Output", "dataType": "string" },
|
|
18
|
+
{ "name": "error", "type": "Output", "dataType": "string" }
|
|
19
|
+
],
|
|
20
|
+
"codeTemplates": {
|
|
21
|
+
"javascript": "const db = new sqlite3.Database({connection}); db.all({query}, {params}, (err, rows) => { /* handle results */ });",
|
|
22
|
+
"python": "import sqlite3; conn = sqlite3.connect({connection}); cursor = conn.cursor(); cursor.execute({query}, {params} or []); results = cursor.fetchall()",
|
|
23
|
+
"cpp": "sqlite3 *db; sqlite3_open({connection}, &db); sqlite3_exec(db, {query}, callback, 0, &err);",
|
|
24
|
+
"sql": "{query}",
|
|
25
|
+
"bash": "sqlite3 {connection} \"{query}\""
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "database",
|
|
3
|
+
"displayName": "Database Manager",
|
|
4
|
+
"publisher": "cbs-core",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"main": "index.js",
|
|
7
|
+
"engines": { "cbs": ">=1.1.0" },
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"sqlite3": "^5.1.6",
|
|
10
|
+
"mysql2": "^3.6.5",
|
|
11
|
+
"pg": "^8.11.3"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
function run(inputs) {
|
|
5
|
+
try {
|
|
6
|
+
const { action, key, value, envFile } = inputs;
|
|
7
|
+
|
|
8
|
+
switch (action?.toLowerCase()) {
|
|
9
|
+
case 'get':
|
|
10
|
+
if (!key) {
|
|
11
|
+
return { result: null, allVars: null, error: "Key is required for 'get' action" };
|
|
12
|
+
}
|
|
13
|
+
const getValue = process.env[key];
|
|
14
|
+
return {
|
|
15
|
+
result: getValue || null,
|
|
16
|
+
allVars: null,
|
|
17
|
+
error: getValue ? null : `Environment variable '${key}' not found`
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
case 'set':
|
|
21
|
+
if (!key) {
|
|
22
|
+
return { result: null, allVars: null, error: "Key is required for 'set' action" };
|
|
23
|
+
}
|
|
24
|
+
process.env[key] = value || '';
|
|
25
|
+
return { result: value || '', allVars: null, error: null };
|
|
26
|
+
|
|
27
|
+
case 'delete':
|
|
28
|
+
case 'remove':
|
|
29
|
+
if (!key) {
|
|
30
|
+
return { result: null, allVars: null, error: "Key is required for 'delete' action" };
|
|
31
|
+
}
|
|
32
|
+
const deletedValue = process.env[key];
|
|
33
|
+
delete process.env[key];
|
|
34
|
+
return { result: deletedValue || null, allVars: null, error: null };
|
|
35
|
+
|
|
36
|
+
case 'list':
|
|
37
|
+
case 'all':
|
|
38
|
+
const allVars = {};
|
|
39
|
+
Object.keys(process.env).forEach(envKey => {
|
|
40
|
+
allVars[envKey] = process.env[envKey];
|
|
41
|
+
});
|
|
42
|
+
return { result: null, allVars: allVars, error: null };
|
|
43
|
+
|
|
44
|
+
case 'load':
|
|
45
|
+
if (!envFile) {
|
|
46
|
+
return { result: null, allVars: null, error: "envFile path is required for 'load' action" };
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const envPath = path.resolve(envFile);
|
|
50
|
+
if (!fs.existsSync(envPath)) {
|
|
51
|
+
return { result: null, allVars: null, error: `Environment file not found: ${envPath}` };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const envContent = fs.readFileSync(envPath, 'utf8');
|
|
55
|
+
const loadedVars = {};
|
|
56
|
+
|
|
57
|
+
envContent.split('\n').forEach(line => {
|
|
58
|
+
const trimmed = line.trim();
|
|
59
|
+
if (trimmed && !trimmed.startsWith('#')) {
|
|
60
|
+
const [envKey, ...envValueParts] = trimmed.split('=');
|
|
61
|
+
if (envKey && envValueParts.length > 0) {
|
|
62
|
+
const envValue = envValueParts.join('=').replace(/^["']|["']$/g, '');
|
|
63
|
+
process.env[envKey] = envValue;
|
|
64
|
+
loadedVars[envKey] = envValue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
result: `Loaded ${Object.keys(loadedVars).length} variables`,
|
|
71
|
+
allVars: loadedVars,
|
|
72
|
+
error: null
|
|
73
|
+
};
|
|
74
|
+
} catch (fileError) {
|
|
75
|
+
return { result: null, allVars: null, error: `Failed to load env file: ${fileError.message}` };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
case 'save':
|
|
79
|
+
if (!envFile) {
|
|
80
|
+
return { result: null, allVars: null, error: "envFile path is required for 'save' action" };
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const envPath = path.resolve(envFile);
|
|
84
|
+
const envContent = Object.keys(process.env)
|
|
85
|
+
.filter(key => process.env[key]) // Only save non-empty values
|
|
86
|
+
.map(key => `${key}=${process.env[key]}`)
|
|
87
|
+
.join('\n');
|
|
88
|
+
|
|
89
|
+
fs.writeFileSync(envPath, envContent, 'utf8');
|
|
90
|
+
return { result: `Saved environment to ${envPath}`, allVars: null, error: null };
|
|
91
|
+
} catch (fileError) {
|
|
92
|
+
return { result: null, allVars: null, error: `Failed to save env file: ${fileError.message}` };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
default:
|
|
96
|
+
return {
|
|
97
|
+
result: null,
|
|
98
|
+
allVars: null,
|
|
99
|
+
error: `Unknown action: ${action}. Supported actions: get, set, delete, list, load, save`
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
} catch (error) {
|
|
103
|
+
return {
|
|
104
|
+
result: null,
|
|
105
|
+
allVars: null,
|
|
106
|
+
error: `Environment Manager error: ${error.message}`
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
module.exports = { run };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Environment Manager",
|
|
3
|
+
"category": "System",
|
|
4
|
+
"color": "#4CAF50",
|
|
5
|
+
"ports": [
|
|
6
|
+
{ "name": "flowIn", "type": "FlowIn" },
|
|
7
|
+
{ "name": "flowOut", "type": "FlowOut" },
|
|
8
|
+
{ "name": "action", "type": "Input", "dataType": "string" },
|
|
9
|
+
{ "name": "key", "type": "Input", "dataType": "string" },
|
|
10
|
+
{ "name": "value", "type": "Input", "dataType": "string" },
|
|
11
|
+
{ "name": "envFile", "type": "Input", "dataType": "string" },
|
|
12
|
+
{ "name": "result", "type": "Output", "dataType": "string" },
|
|
13
|
+
{ "name": "allVars", "type": "Output", "dataType": "object" },
|
|
14
|
+
{ "name": "error", "type": "Output", "dataType": "string" }
|
|
15
|
+
],
|
|
16
|
+
"codeTemplates": {
|
|
17
|
+
"javascript": "process.env.{key} = {value};",
|
|
18
|
+
"python": "import os; os.environ[{key}] = {value}",
|
|
19
|
+
"cpp": "setenv({key}, {value}, 1);",
|
|
20
|
+
"bash": "export {key}={value}",
|
|
21
|
+
"powershell": "$env:{key} = '{value}'"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { glob } = require('glob');
|
|
4
|
+
|
|
5
|
+
function run(inputs) {
|
|
6
|
+
try {
|
|
7
|
+
const { action, path: filePath, content, pattern, encoding = 'utf8' } = inputs;
|
|
8
|
+
|
|
9
|
+
switch (action?.toLowerCase()) {
|
|
10
|
+
case 'read':
|
|
11
|
+
case 'readfile':
|
|
12
|
+
if (!filePath) {
|
|
13
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'read' action" };
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const fileContent = fs.readFileSync(filePath, encoding);
|
|
17
|
+
return { result: fileContent, files: null, stats: null, error: null };
|
|
18
|
+
} catch (fileError) {
|
|
19
|
+
return { result: null, files: null, stats: null, error: `Failed to read file: ${fileError.message}` };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
case 'write':
|
|
23
|
+
case 'writefile':
|
|
24
|
+
if (!filePath) {
|
|
25
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'write' action" };
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
fs.writeFileSync(filePath, content || '', encoding);
|
|
29
|
+
return { result: `File written to ${filePath}`, files: null, stats: null, error: null };
|
|
30
|
+
} catch (fileError) {
|
|
31
|
+
return { result: null, files: null, stats: null, error: `Failed to write file: ${fileError.message}` };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
case 'append':
|
|
35
|
+
if (!filePath) {
|
|
36
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'append' action" };
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
fs.appendFileSync(filePath, content || '', encoding);
|
|
40
|
+
return { result: `Content appended to ${filePath}`, files: null, stats: null, error: null };
|
|
41
|
+
} catch (fileError) {
|
|
42
|
+
return { result: null, files: null, stats: null, error: `Failed to append to file: ${fileError.message}` };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
case 'delete':
|
|
46
|
+
case 'remove':
|
|
47
|
+
if (!filePath) {
|
|
48
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'delete' action" };
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
if (fs.existsSync(filePath)) {
|
|
52
|
+
fs.unlinkSync(filePath);
|
|
53
|
+
return { result: `File deleted: ${filePath}`, files: null, stats: null, error: null };
|
|
54
|
+
} else {
|
|
55
|
+
return { result: null, files: null, stats: null, error: `File not found: ${filePath}` };
|
|
56
|
+
}
|
|
57
|
+
} catch (fileError) {
|
|
58
|
+
return { result: null, files: null, stats: null, error: `Failed to delete file: ${fileError.message}` };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
case 'exists':
|
|
62
|
+
if (!filePath) {
|
|
63
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'exists' action" };
|
|
64
|
+
}
|
|
65
|
+
const exists = fs.existsSync(filePath);
|
|
66
|
+
return { result: exists ? 'true' : 'false', files: null, stats: null, error: null };
|
|
67
|
+
|
|
68
|
+
case 'stats':
|
|
69
|
+
case 'info':
|
|
70
|
+
if (!filePath) {
|
|
71
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'stats' action" };
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const fileStats = fs.statSync(filePath);
|
|
75
|
+
const stats = {
|
|
76
|
+
size: fileStats.size,
|
|
77
|
+
isFile: fileStats.isFile(),
|
|
78
|
+
isDirectory: fileStats.isDirectory(),
|
|
79
|
+
modified: fileStats.mtime.toISOString(),
|
|
80
|
+
created: fileStats.birthtime.toISOString(),
|
|
81
|
+
permissions: fileStats.mode.toString(8)
|
|
82
|
+
};
|
|
83
|
+
return { result: null, files: null, stats: stats, error: null };
|
|
84
|
+
} catch (fileError) {
|
|
85
|
+
return { result: null, files: null, stats: null, error: `Failed to get file stats: ${fileError.message}` };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
case 'list':
|
|
89
|
+
case 'readdir':
|
|
90
|
+
if (!filePath) {
|
|
91
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'list' action" };
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const items = fs.readdirSync(filePath);
|
|
95
|
+
return { result: null, files: items, stats: null, error: null };
|
|
96
|
+
} catch (fileError) {
|
|
97
|
+
return { result: null, files: null, stats: null, error: `Failed to list directory: ${fileError.message}` };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
case 'glob':
|
|
101
|
+
case 'find':
|
|
102
|
+
if (!pattern) {
|
|
103
|
+
return { result: null, files: null, stats: null, error: "Pattern is required for 'glob' action" };
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const matches = glob.sync(pattern);
|
|
107
|
+
return { result: `Found ${matches.length} matches`, files: matches, stats: null, error: null };
|
|
108
|
+
} catch (globError) {
|
|
109
|
+
return { result: null, files: null, stats: null, error: `Glob pattern error: ${globError.message}` };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
case 'mkdir':
|
|
113
|
+
case 'createdir':
|
|
114
|
+
if (!filePath) {
|
|
115
|
+
return { result: null, files: null, stats: null, error: "Path is required for 'mkdir' action" };
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
fs.mkdirSync(filePath, { recursive: true });
|
|
119
|
+
return { result: `Directory created: ${filePath}`, files: null, stats: null, error: null };
|
|
120
|
+
} catch (fileError) {
|
|
121
|
+
return { result: null, files: null, stats: null, error: `Failed to create directory: ${fileError.message}` };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
default:
|
|
125
|
+
return {
|
|
126
|
+
result: null,
|
|
127
|
+
files: null,
|
|
128
|
+
stats: null,
|
|
129
|
+
error: `Unknown action: ${action}. Supported actions: read, write, append, delete, exists, stats, list, glob, mkdir`
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return {
|
|
134
|
+
result: null,
|
|
135
|
+
files: null,
|
|
136
|
+
stats: null,
|
|
137
|
+
error: `File System error: ${error.message}`
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
module.exports = { run };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "File System",
|
|
3
|
+
"category": "File",
|
|
4
|
+
"color": "#FF9800",
|
|
5
|
+
"ports": [
|
|
6
|
+
{ "name": "flowIn", "type": "FlowIn" },
|
|
7
|
+
{ "name": "flowOut", "type": "FlowOut" },
|
|
8
|
+
{ "name": "action", "type": "Input", "dataType": "string" },
|
|
9
|
+
{ "name": "path", "type": "Input", "dataType": "string" },
|
|
10
|
+
{ "name": "content", "type": "Input", "dataType": "string" },
|
|
11
|
+
{ "name": "pattern", "type": "Input", "dataType": "string" },
|
|
12
|
+
{ "name": "encoding", "type": "Input", "dataType": "string" },
|
|
13
|
+
{ "name": "result", "type": "Output", "dataType": "string" },
|
|
14
|
+
{ "name": "files", "type": "Output", "dataType": "array" },
|
|
15
|
+
{ "name": "stats", "type": "Output", "dataType": "object" },
|
|
16
|
+
{ "name": "error", "type": "Output", "dataType": "string" }
|
|
17
|
+
],
|
|
18
|
+
"codeTemplates": {
|
|
19
|
+
"javascript": "fs.readFileSync({path}, {encoding} || 'utf8')",
|
|
20
|
+
"python": "with open({path}, 'r', encoding={encoding} or 'utf-8') as f: content = f.read()",
|
|
21
|
+
"cpp": "std::ifstream file({path}); std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());",
|
|
22
|
+
"bash": "cat {path}",
|
|
23
|
+
"powershell": "Get-Content {path} -Encoding ({encoding} || 'UTF8')"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
const WebSocket = require('ws');
|
|
3
|
+
|
|
4
|
+
function run(inputs) {
|
|
5
|
+
try {
|
|
6
|
+
const {
|
|
7
|
+
action,
|
|
8
|
+
url,
|
|
9
|
+
method = 'GET',
|
|
10
|
+
headers = {},
|
|
11
|
+
body,
|
|
12
|
+
timeout = 10000
|
|
13
|
+
} = inputs;
|
|
14
|
+
|
|
15
|
+
switch (action?.toLowerCase()) {
|
|
16
|
+
case 'get':
|
|
17
|
+
case 'post':
|
|
18
|
+
case 'put':
|
|
19
|
+
case 'delete':
|
|
20
|
+
case 'patch':
|
|
21
|
+
if (!url) {
|
|
22
|
+
return { response: null, status: null, data: null, error: "URL is required for HTTP requests" };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// For demo purposes, return mock responses
|
|
26
|
+
const mockResponse = {
|
|
27
|
+
status: 200,
|
|
28
|
+
statusText: 'OK',
|
|
29
|
+
headers: {
|
|
30
|
+
'content-type': 'application/json',
|
|
31
|
+
'server': 'mock-server'
|
|
32
|
+
},
|
|
33
|
+
data: {
|
|
34
|
+
message: `Mock ${method.toUpperCase()} response from ${url}`,
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
method: method.toUpperCase(),
|
|
37
|
+
success: true
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
response: mockResponse,
|
|
43
|
+
status: mockResponse.status,
|
|
44
|
+
data: JSON.stringify(mockResponse.data),
|
|
45
|
+
error: null
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
case 'websocket':
|
|
49
|
+
case 'ws':
|
|
50
|
+
if (!url) {
|
|
51
|
+
return { response: null, status: null, data: null, error: "WebSocket URL is required" };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Mock WebSocket connection
|
|
55
|
+
return {
|
|
56
|
+
response: {
|
|
57
|
+
type: 'websocket',
|
|
58
|
+
url: url,
|
|
59
|
+
status: 'connected',
|
|
60
|
+
message: 'WebSocket mock connection established'
|
|
61
|
+
},
|
|
62
|
+
status: 101,
|
|
63
|
+
data: 'WebSocket connection simulated',
|
|
64
|
+
error: null
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
case 'download':
|
|
68
|
+
if (!url) {
|
|
69
|
+
return { response: null, status: null, data: null, error: "URL is required for download" };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Mock file download
|
|
73
|
+
return {
|
|
74
|
+
response: {
|
|
75
|
+
type: 'download',
|
|
76
|
+
url: url,
|
|
77
|
+
filename: url.split('/').pop() || 'downloaded_file',
|
|
78
|
+
size: 1024,
|
|
79
|
+
mimeType: 'application/octet-stream'
|
|
80
|
+
},
|
|
81
|
+
status: 200,
|
|
82
|
+
data: 'File download simulated (binary data would be here)',
|
|
83
|
+
error: null
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
case 'upload':
|
|
87
|
+
if (!url || !body) {
|
|
88
|
+
return { response: null, status: null, data: null, error: "URL and body are required for upload" };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Mock file upload
|
|
92
|
+
return {
|
|
93
|
+
response: {
|
|
94
|
+
type: 'upload',
|
|
95
|
+
url: url,
|
|
96
|
+
uploaded: true,
|
|
97
|
+
size: body.length,
|
|
98
|
+
message: 'File upload simulated successfully'
|
|
99
|
+
},
|
|
100
|
+
status: 201,
|
|
101
|
+
data: JSON.stringify({ uploaded: true, id: Date.now().toString() }),
|
|
102
|
+
error: null
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
case 'ping':
|
|
106
|
+
if (!url) {
|
|
107
|
+
return { response: null, status: null, data: null, error: "URL is required for ping" };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Mock ping response
|
|
111
|
+
const pingResponse = {
|
|
112
|
+
url: url,
|
|
113
|
+
reachable: true,
|
|
114
|
+
responseTime: Math.floor(Math.random() * 100) + 10,
|
|
115
|
+
timestamp: new Date().toISOString()
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
response: pingResponse,
|
|
120
|
+
status: 200,
|
|
121
|
+
data: JSON.stringify(pingResponse),
|
|
122
|
+
error: null
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
case 'dns':
|
|
126
|
+
case 'resolve':
|
|
127
|
+
if (!url) {
|
|
128
|
+
return { response: null, status: null, data: null, error: "Host is required for DNS resolution" };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Mock DNS resolution
|
|
132
|
+
const dnsResponse = {
|
|
133
|
+
hostname: url,
|
|
134
|
+
addresses: ['192.168.1.1', '10.0.0.1'],
|
|
135
|
+
resolved: true,
|
|
136
|
+
timestamp: new Date().toISOString()
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
response: dnsResponse,
|
|
141
|
+
status: 200,
|
|
142
|
+
data: JSON.stringify(dnsResponse),
|
|
143
|
+
error: null
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
default:
|
|
147
|
+
return {
|
|
148
|
+
response: null,
|
|
149
|
+
status: null,
|
|
150
|
+
data: null,
|
|
151
|
+
error: `Unknown action: ${action}. Supported actions: get, post, put, delete, patch, websocket, download, upload, ping, dns`
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
} catch (error) {
|
|
155
|
+
return {
|
|
156
|
+
response: null,
|
|
157
|
+
status: null,
|
|
158
|
+
data: null,
|
|
159
|
+
error: `Network API error: ${error.message}`
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = { run };
|