mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-27 15:24:56 +00:00
228 lines
6.0 KiB
Markdown
228 lines
6.0 KiB
Markdown
# JSON Script Runtime Executors
|
|
|
|
Complete runtime execution environment for JSON Script Specification v2.1.0, available in Lua, JavaScript (ES6), and JavaScript (CommonJS).
|
|
|
|
## Overview
|
|
|
|
Instead of compiling JSON scripts to code, these runtimes interpret and execute script.json files directly, enabling:
|
|
|
|
- 🔄 Hot reload without recompilation
|
|
- 🔒 Sandboxed execution environment
|
|
- 🌐 Cross-platform portability (Lua, Node.js, Browser)
|
|
- 📝 Easy debugging and inspection
|
|
- 🧩 Plugin systems without arbitrary code execution
|
|
|
|
## Available Runtimes
|
|
|
|
### 1. Lua Runtime (`script_executor.lua`)
|
|
For Lua/LÖVE2D environments
|
|
|
|
```lua
|
|
local executor = require("script_executor")
|
|
local result = executor.execute_function(script_json, "my_function", {arg1, arg2})
|
|
```
|
|
|
|
### 2. JavaScript ES6 Modules (`script_executor.js`, `script_executor.d.ts`)
|
|
For modern JavaScript with TypeScript support
|
|
|
|
```javascript
|
|
import { executeFunction } from './script_executor.js';
|
|
const result = executeFunction(scriptJson, 'my_function', [arg1, arg2]);
|
|
```
|
|
|
|
### 3. JavaScript CommonJS (`script_executor.cjs`)
|
|
For Node.js and legacy environments
|
|
|
|
```javascript
|
|
const { executeFunction } = require('./script_executor.cjs');
|
|
const result = executeFunction(scriptJson, 'my_function', [arg1, arg2]);
|
|
```
|
|
|
|
## Test Framework
|
|
|
|
### JSON Test Runner (`test_runner.cjs`)
|
|
```bash
|
|
node test_cli.cjs <script.json> <test-suite.json>
|
|
```
|
|
|
|
Example test results:
|
|
```
|
|
============================================================
|
|
Test Suite: Expression Tests
|
|
============================================================
|
|
✅ Binary expressions - addition (1.00ms)
|
|
✅ All operators - basic arithmetic (0.00ms)
|
|
============================================================
|
|
Results: 5/5 passed (0 failed)
|
|
🎉 All tests passed!
|
|
```
|
|
|
|
### Supported Features
|
|
|
|
- ✅ **Constants** - Global constant definitions
|
|
- ✅ **Variables** - `const`, `let` declarations
|
|
- ✅ **Functions** - Regular and async functions
|
|
- ✅ **Expressions**
|
|
- Literals (string, number, boolean, null)
|
|
- Template literals with interpolation
|
|
- Binary expressions (+, -, *, /, ==, <, >, &&, ||)
|
|
- Member access (object.property)
|
|
- Call expressions
|
|
- Object/Array literals
|
|
- ✅ **Statements**
|
|
- Variable declarations
|
|
- Assignments
|
|
- If/else conditionals
|
|
- Return statements
|
|
- Try/catch/finally
|
|
- Function calls
|
|
- ✅ **Reference Resolution** - `$ref:path.to.value` syntax
|
|
|
|
### Not Yet Implemented
|
|
|
|
- ⏳ For loops
|
|
- ⏳ While loops
|
|
- ⏳ Classes and methods
|
|
- ⏳ Async/await (returns Promise placeholders)
|
|
- ⏳ Generators
|
|
- ⏳ React hooks
|
|
- ⏳ Import resolution
|
|
|
|
## Usage
|
|
|
|
### Basic Function Execution
|
|
|
|
```lua
|
|
local script_executor = require("runtime.script_executor")
|
|
|
|
-- Execute a function from script.json
|
|
local result = script_executor.load_and_execute(
|
|
"packages/shared/seed/script.json",
|
|
"delay", -- function name
|
|
{1000} -- arguments array
|
|
)
|
|
```
|
|
|
|
### Direct Execution
|
|
|
|
```lua
|
|
local json = require("json")
|
|
local script_json = json.decode(file_content)
|
|
|
|
local result = script_executor.execute_function(
|
|
script_json,
|
|
"fetchUserData",
|
|
{"user123", {timeout = 5000}}
|
|
)
|
|
```
|
|
|
|
## Example: Delay Function
|
|
|
|
Given this JSON definition:
|
|
|
|
```json
|
|
{
|
|
"functions": [
|
|
{
|
|
"id": "delay_fn",
|
|
"name": "delay",
|
|
"params": [{"name": "ms", "type": "number"}],
|
|
"returnType": "Promise<void>",
|
|
"body": [
|
|
{
|
|
"type": "return",
|
|
"value": {
|
|
"type": "new_expression",
|
|
"callee": "Promise",
|
|
"args": [...]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
Execute with:
|
|
|
|
```lua
|
|
local promise = script_executor.execute_function(script_json, "delay", {1000})
|
|
```
|
|
|
|
## Reference Resolution
|
|
|
|
The `$ref:` syntax allows referencing other values in the context:
|
|
|
|
- `$ref:params.userId` - Function parameter
|
|
- `$ref:local.cacheKey` - Local variable
|
|
- `$ref:constants.api_base_url` - Global constant
|
|
- `$ref:imports.axios.get` - Imported function
|
|
|
|
## Context Structure
|
|
|
|
```lua
|
|
{
|
|
params = {userId = "123", options = {}},
|
|
local_vars = {cacheKey = "user_123", response = {...}},
|
|
constants = {API_BASE_URL = "https://api.example.com"},
|
|
imports = {axios = {get = function(...) end}},
|
|
functions = {delay = function(...) end}
|
|
}
|
|
```
|
|
|
|
## Testing
|
|
|
|
Run the example:
|
|
|
|
```bash
|
|
lua packages/shared/seed/scripts/runtime/example_usage.lua
|
|
```
|
|
|
|
## Future Enhancements
|
|
|
|
1. **Async/Await Support** - Integrate with Lua coroutines
|
|
2. **Class Execution** - Constructor and method invocation
|
|
3. **Import Resolution** - Load actual modules from imports
|
|
4. **Loop Constructs** - For/while loop execution
|
|
5. **Generator Support** - Yield and iteration
|
|
6. **React Hook Emulation** - useState, useEffect in Lua
|
|
7. **Performance Optimization** - Cache compiled expressions
|
|
|
|
## Integration with MetaBuilder
|
|
|
|
This executor allows packages to define their logic in portable JSON format:
|
|
|
|
```json
|
|
{
|
|
"packageId": "shared",
|
|
"exports": {
|
|
"scripts": ["permissions.check_access"]
|
|
},
|
|
"script": "seed/script.json" // References this JSON runtime
|
|
}
|
|
```
|
|
|
|
The runtime can be extended to support the full MetaBuilder package ecosystem.
|
|
|
|
## Comparison: Compiled vs Runtime
|
|
|
|
| Aspect | Compiled Approach | Runtime Approach |
|
|
|--------|------------------|-----------------|
|
|
| Speed | Fast (native code) | Slower (interpreted) |
|
|
| Debugging | Harder (generated code) | Easier (JSON visible) |
|
|
| Flexibility | Static (recompile needed) | Dynamic (hot reload) |
|
|
| Bundle Size | Larger (generated JS) | Smaller (just JSON) |
|
|
| Type Safety | TypeScript types | Runtime checks |
|
|
|
|
**Recommendation**: Use runtime execution for:
|
|
- Development and debugging
|
|
- Hot module reloading
|
|
- Dynamic plugin systems
|
|
- Configuration-driven logic
|
|
|
|
Use compilation for:
|
|
- Production builds
|
|
- Performance-critical code
|
|
- Static type checking
|
|
- Tree shaking optimization
|