@blokjs/runner 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.
- package/dist/Blok.d.ts +19 -0
- package/dist/Blok.js +184 -0
- package/dist/Blok.js.map +1 -0
- package/dist/BlokResponse.d.ts +16 -0
- package/dist/BlokResponse.js +28 -0
- package/dist/BlokResponse.js.map +1 -0
- package/dist/Configuration.d.ts +37 -0
- package/dist/Configuration.js +248 -0
- package/dist/Configuration.js.map +1 -0
- package/dist/ConfigurationResolver.d.ts +7 -0
- package/dist/ConfigurationResolver.js +15 -0
- package/dist/ConfigurationResolver.js.map +1 -0
- package/dist/DefaultLogger.d.ts +65 -0
- package/dist/DefaultLogger.js +101 -0
- package/dist/DefaultLogger.js.map +1 -0
- package/dist/LocalStorage.d.ts +7 -0
- package/dist/LocalStorage.js +56 -0
- package/dist/LocalStorage.js.map +1 -0
- package/dist/MemoryUsage.d.ts +22 -0
- package/dist/MemoryUsage.js +83 -0
- package/dist/MemoryUsage.js.map +1 -0
- package/dist/NodeMap.d.ts +7 -0
- package/dist/NodeMap.js +13 -0
- package/dist/NodeMap.js.map +1 -0
- package/dist/ResolverBase.d.ts +8 -0
- package/dist/ResolverBase.js +18 -0
- package/dist/ResolverBase.js.map +1 -0
- package/dist/Runner.d.ts +25 -0
- package/dist/Runner.js +32 -0
- package/dist/Runner.js.map +1 -0
- package/dist/RunnerNode.d.ts +9 -0
- package/dist/RunnerNode.js +8 -0
- package/dist/RunnerNode.js.map +1 -0
- package/dist/RunnerNodeBase.d.ts +4 -0
- package/dist/RunnerNodeBase.js +3 -0
- package/dist/RunnerNodeBase.js.map +1 -0
- package/dist/RunnerSteps.d.ts +14 -0
- package/dist/RunnerSteps.js +110 -0
- package/dist/RunnerSteps.js.map +1 -0
- package/dist/RuntimeAdapterNode.d.ts +19 -0
- package/dist/RuntimeAdapterNode.js +87 -0
- package/dist/RuntimeAdapterNode.js.map +1 -0
- package/dist/RuntimeRegistry.d.ts +61 -0
- package/dist/RuntimeRegistry.js +87 -0
- package/dist/RuntimeRegistry.js.map +1 -0
- package/dist/TriggerBase.d.ts +119 -0
- package/dist/TriggerBase.js +413 -0
- package/dist/TriggerBase.js.map +1 -0
- package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
- package/dist/adapters/BunRuntimeAdapter.js +169 -0
- package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
- package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
- package/dist/adapters/DockerRuntimeAdapter.js +298 -0
- package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
- package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
- package/dist/adapters/HttpRuntimeAdapter.js +152 -0
- package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
- package/dist/adapters/RuntimeAdapter.d.ts +42 -0
- package/dist/adapters/RuntimeAdapter.js +2 -0
- package/dist/adapters/RuntimeAdapter.js.map +1 -0
- package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
- package/dist/adapters/WasmRuntimeAdapter.js +279 -0
- package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
- package/dist/cache/NodeResultCache.d.ts +286 -0
- package/dist/cache/NodeResultCache.js +499 -0
- package/dist/cache/NodeResultCache.js.map +1 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cost/CostEstimator.d.ts +57 -0
- package/dist/cost/CostEstimator.js +171 -0
- package/dist/cost/CostEstimator.js.map +1 -0
- package/dist/cost/index.d.ts +4 -0
- package/dist/cost/index.js +3 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +24 -0
- package/dist/cost/pricing.js +169 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/defineNode.d.ts +155 -0
- package/dist/defineNode.js +191 -0
- package/dist/defineNode.js.map +1 -0
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
- package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
- package/dist/hmr/FileWatcher.d.ts +62 -0
- package/dist/hmr/FileWatcher.js +185 -0
- package/dist/hmr/FileWatcher.js.map +1 -0
- package/dist/hmr/HmrDevConsole.d.ts +13 -0
- package/dist/hmr/HmrDevConsole.js +46 -0
- package/dist/hmr/HmrDevConsole.js.map +1 -0
- package/dist/hmr/HotReloadManager.d.ts +84 -0
- package/dist/hmr/HotReloadManager.js +195 -0
- package/dist/hmr/HotReloadManager.js.map +1 -0
- package/dist/hmr/index.d.ts +39 -0
- package/dist/hmr/index.js +38 -0
- package/dist/hmr/index.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/APMIntegration.d.ts +141 -0
- package/dist/integrations/APMIntegration.js +212 -0
- package/dist/integrations/APMIntegration.js.map +1 -0
- package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
- package/dist/integrations/AzureMonitorIntegration.js +254 -0
- package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
- package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
- package/dist/integrations/CloudWatchIntegration.js +293 -0
- package/dist/integrations/CloudWatchIntegration.js.map +1 -0
- package/dist/integrations/SentryIntegration.d.ts +153 -0
- package/dist/integrations/SentryIntegration.js +200 -0
- package/dist/integrations/SentryIntegration.js.map +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.js +16 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
- package/dist/marketplace/RuntimeAutoScaler.js +366 -0
- package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
- package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
- package/dist/marketplace/RuntimeCatalog.js +339 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -0
- package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
- package/dist/marketplace/RuntimeDiscovery.js +219 -0
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
- package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
- package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
- package/dist/monitoring/CircuitBreaker.d.ts +107 -0
- package/dist/monitoring/CircuitBreaker.js +238 -0
- package/dist/monitoring/CircuitBreaker.js.map +1 -0
- package/dist/monitoring/DistributedTracer.d.ts +125 -0
- package/dist/monitoring/DistributedTracer.js +230 -0
- package/dist/monitoring/DistributedTracer.js.map +1 -0
- package/dist/monitoring/HealthCheck.d.ts +54 -0
- package/dist/monitoring/HealthCheck.js +102 -0
- package/dist/monitoring/HealthCheck.js.map +1 -0
- package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
- package/dist/monitoring/PerformanceProfiler.js +229 -0
- package/dist/monitoring/PerformanceProfiler.js.map +1 -0
- package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
- package/dist/monitoring/PrometheusBootstrap.js +71 -0
- package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
- package/dist/monitoring/RateLimiter.d.ts +58 -0
- package/dist/monitoring/RateLimiter.js +128 -0
- package/dist/monitoring/RateLimiter.js.map +1 -0
- package/dist/monitoring/StructuredLogger.d.ts +131 -0
- package/dist/monitoring/StructuredLogger.js +207 -0
- package/dist/monitoring/StructuredLogger.js.map +1 -0
- package/dist/monitoring/TracingBootstrap.d.ts +69 -0
- package/dist/monitoring/TracingBootstrap.js +129 -0
- package/dist/monitoring/TracingBootstrap.js.map +1 -0
- package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
- package/dist/monitoring/TriggerMetricsCollector.js +174 -0
- package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
- package/dist/monitoring/index.d.ts +9 -0
- package/dist/monitoring/index.js +10 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
- package/dist/openapi/OpenAPIGenerator.js +373 -0
- package/dist/openapi/OpenAPIGenerator.js.map +1 -0
- package/dist/openapi/index.d.ts +20 -0
- package/dist/openapi/index.js +20 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/security/ABAC.d.ts +224 -0
- package/dist/security/ABAC.js +380 -0
- package/dist/security/ABAC.js.map +1 -0
- package/dist/security/AuditLogger.d.ts +242 -0
- package/dist/security/AuditLogger.js +317 -0
- package/dist/security/AuditLogger.js.map +1 -0
- package/dist/security/AuthMiddleware.d.ts +163 -0
- package/dist/security/AuthMiddleware.js +274 -0
- package/dist/security/AuthMiddleware.js.map +1 -0
- package/dist/security/EncryptionAtRest.d.ts +206 -0
- package/dist/security/EncryptionAtRest.js +236 -0
- package/dist/security/EncryptionAtRest.js.map +1 -0
- package/dist/security/OAuthProvider.d.ts +334 -0
- package/dist/security/OAuthProvider.js +719 -0
- package/dist/security/OAuthProvider.js.map +1 -0
- package/dist/security/PIIDetector.d.ts +233 -0
- package/dist/security/PIIDetector.js +354 -0
- package/dist/security/PIIDetector.js.map +1 -0
- package/dist/security/RBAC.d.ts +143 -0
- package/dist/security/RBAC.js +285 -0
- package/dist/security/RBAC.js.map +1 -0
- package/dist/security/SecretManager.d.ts +652 -0
- package/dist/security/SecretManager.js +1146 -0
- package/dist/security/SecretManager.js.map +1 -0
- package/dist/security/TLSConfig.d.ts +305 -0
- package/dist/security/TLSConfig.js +550 -0
- package/dist/security/TLSConfig.js.map +1 -0
- package/dist/security/index.d.ts +79 -0
- package/dist/security/index.js +80 -0
- package/dist/security/index.js.map +1 -0
- package/dist/testing/TestHarness.d.ts +189 -0
- package/dist/testing/TestHarness.js +272 -0
- package/dist/testing/TestHarness.js.map +1 -0
- package/dist/testing/TestLogger.d.ts +103 -0
- package/dist/testing/TestLogger.js +153 -0
- package/dist/testing/TestLogger.js.map +1 -0
- package/dist/testing/WorkflowTestRunner.d.ts +172 -0
- package/dist/testing/WorkflowTestRunner.js +355 -0
- package/dist/testing/WorkflowTestRunner.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracing/InMemoryRunStore.d.ts +44 -0
- package/dist/tracing/InMemoryRunStore.js +341 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -0
- package/dist/tracing/PostgresRunStore.d.ts +82 -0
- package/dist/tracing/PostgresRunStore.js +640 -0
- package/dist/tracing/PostgresRunStore.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +38 -0
- package/dist/tracing/RunStore.js +2 -0
- package/dist/tracing/RunStore.js.map +1 -0
- package/dist/tracing/RunTracker.d.ts +75 -0
- package/dist/tracing/RunTracker.js +374 -0
- package/dist/tracing/RunTracker.js.map +1 -0
- package/dist/tracing/SqliteRunStore.d.ts +53 -0
- package/dist/tracing/SqliteRunStore.js +703 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -0
- package/dist/tracing/TraceRouter.d.ts +47 -0
- package/dist/tracing/TraceRouter.js +904 -0
- package/dist/tracing/TraceRouter.js.map +1 -0
- package/dist/tracing/TracingLogger.d.ts +21 -0
- package/dist/tracing/TracingLogger.js +62 -0
- package/dist/tracing/TracingLogger.js.map +1 -0
- package/dist/tracing/createStore.d.ts +30 -0
- package/dist/tracing/createStore.js +75 -0
- package/dist/tracing/createStore.js.map +1 -0
- package/dist/tracing/index.d.ts +13 -0
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/sanitize.d.ts +7 -0
- package/dist/tracing/sanitize.js +95 -0
- package/dist/tracing/sanitize.js.map +1 -0
- package/dist/tracing/types.d.ts +178 -0
- package/dist/tracing/types.js +3 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types/Average.d.ts +11 -0
- package/dist/types/Average.js +2 -0
- package/dist/types/Average.js.map +1 -0
- package/dist/types/Condition.d.ts +8 -0
- package/dist/types/Condition.js +2 -0
- package/dist/types/Condition.js.map +1 -0
- package/dist/types/Conditions.d.ts +5 -0
- package/dist/types/Conditions.js +2 -0
- package/dist/types/Conditions.js.map +1 -0
- package/dist/types/Config.d.ts +12 -0
- package/dist/types/Config.js +2 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Flow.d.ts +5 -0
- package/dist/types/Flow.js +2 -0
- package/dist/types/Flow.js.map +1 -0
- package/dist/types/GlobalOptions.d.ts +11 -0
- package/dist/types/GlobalOptions.js +2 -0
- package/dist/types/GlobalOptions.js.map +1 -0
- package/dist/types/Inputs.d.ts +5 -0
- package/dist/types/Inputs.js +2 -0
- package/dist/types/Inputs.js.map +1 -0
- package/dist/types/JsonLikeObject.d.ts +3 -0
- package/dist/types/JsonLikeObject.js +2 -0
- package/dist/types/JsonLikeObject.js.map +1 -0
- package/dist/types/Mapper.d.ts +5 -0
- package/dist/types/Mapper.js +2 -0
- package/dist/types/Mapper.js.map +1 -0
- package/dist/types/Node.d.ts +10 -0
- package/dist/types/Node.js +2 -0
- package/dist/types/Node.js.map +1 -0
- package/dist/types/ParamsDictionary.d.ts +3 -0
- package/dist/types/ParamsDictionary.js +2 -0
- package/dist/types/ParamsDictionary.js.map +1 -0
- package/dist/types/Properties.d.ts +5 -0
- package/dist/types/Properties.js +2 -0
- package/dist/types/Properties.js.map +1 -0
- package/dist/types/Targets.d.ts +5 -0
- package/dist/types/Targets.js +2 -0
- package/dist/types/Targets.js.map +1 -0
- package/dist/types/Trigger.d.ts +5 -0
- package/dist/types/Trigger.js +2 -0
- package/dist/types/Trigger.js.map +1 -0
- package/dist/types/TriggerHttp.d.ts +7 -0
- package/dist/types/TriggerHttp.js +2 -0
- package/dist/types/TriggerHttp.js.map +1 -0
- package/dist/types/TriggerResponse.d.ts +6 -0
- package/dist/types/TriggerResponse.js +2 -0
- package/dist/types/TriggerResponse.js.map +1 -0
- package/dist/types/Triggers.d.ts +5 -0
- package/dist/types/Triggers.js +2 -0
- package/dist/types/Triggers.js.map +1 -0
- package/dist/types/TryCatch.d.ts +6 -0
- package/dist/types/TryCatch.js +2 -0
- package/dist/types/TryCatch.js.map +1 -0
- package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
- package/dist/visualization/NodeDependencyGraph.js +418 -0
- package/dist/visualization/NodeDependencyGraph.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
- package/dist/visualization/WorkflowVisualizer.js +446 -0
- package/dist/visualization/WorkflowVisualizer.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { GlobalError, NodeBase } from "@blokjs/shared";
|
|
2
|
+
import BlokService from "./Blok";
|
|
3
|
+
import BlokResponse from "./BlokResponse";
|
|
4
|
+
/**
|
|
5
|
+
* FunctionNode wrapper that bridges function-first nodes to existing BlokService infrastructure
|
|
6
|
+
*
|
|
7
|
+
* This class wraps a function-first node definition and makes it compatible with the
|
|
8
|
+
* existing BlokService.run() execution model. It handles:
|
|
9
|
+
* - Zod input validation
|
|
10
|
+
* - Zod output validation
|
|
11
|
+
* - Error mapping (ZodError → GlobalError)
|
|
12
|
+
* - Response wrapping (BlokResponse)
|
|
13
|
+
*/
|
|
14
|
+
export class FunctionNode extends BlokService {
|
|
15
|
+
definition;
|
|
16
|
+
constructor(definition) {
|
|
17
|
+
super();
|
|
18
|
+
this.definition = definition;
|
|
19
|
+
this.name = definition.name;
|
|
20
|
+
// Set content type if specified (e.g. "text/html", "application/pdf")
|
|
21
|
+
if (definition.contentType) {
|
|
22
|
+
this.contentType = definition.contentType;
|
|
23
|
+
}
|
|
24
|
+
// Set flow flag for control flow nodes (e.g. if-else) that return sub-steps
|
|
25
|
+
if (definition.flow) {
|
|
26
|
+
this.flow = true;
|
|
27
|
+
}
|
|
28
|
+
// Convert Zod schemas to JSON Schema for backward compatibility
|
|
29
|
+
// This allows existing tools that expect JSON Schema to continue working
|
|
30
|
+
this.inputSchema = this.zodToJsonSchema(definition.input);
|
|
31
|
+
this.outputSchema = this.zodToJsonSchema(definition.output);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Implementation of the abstract handle() method required by BlokService
|
|
35
|
+
*
|
|
36
|
+
* This method:
|
|
37
|
+
* 1. Validates input with Zod
|
|
38
|
+
* 2. Executes the user's execute() function
|
|
39
|
+
* 3. Validates output with Zod
|
|
40
|
+
* 4. Wraps result in BlokResponse
|
|
41
|
+
* 5. Maps any errors to GlobalError
|
|
42
|
+
*/
|
|
43
|
+
async handle(ctx, inputs) {
|
|
44
|
+
const response = new BlokResponse();
|
|
45
|
+
try {
|
|
46
|
+
// Step 1: Validate input with Zod
|
|
47
|
+
const validatedInput = this.definition.input.parse(inputs);
|
|
48
|
+
// Step 2: Execute user's function
|
|
49
|
+
const result = await this.definition.execute(ctx, validatedInput);
|
|
50
|
+
// Step 3: If execute() returns an array of NodeBase instances (flow nodes
|
|
51
|
+
// like if-else), return them directly. The runner's processFlow() expects
|
|
52
|
+
// handle() to return BlokService[] for flow nodes, not a wrapped response.
|
|
53
|
+
if (Array.isArray(result) && result.length > 0 && result[0] instanceof NodeBase) {
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
// Step 4: Validate output with Zod
|
|
57
|
+
const validatedOutput = this.definition.output.parse(result);
|
|
58
|
+
// Step 5: Success!
|
|
59
|
+
response.setSuccess(validatedOutput);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
// Step 6: Map errors to GlobalError
|
|
63
|
+
const globalError = this.mapErrorToGlobalError(error);
|
|
64
|
+
response.setError(globalError);
|
|
65
|
+
}
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Maps any error to GlobalError, with special handling for ZodError
|
|
70
|
+
*
|
|
71
|
+
* ZodError produces detailed validation errors that are transformed into
|
|
72
|
+
* a user-friendly error message with all validation issues listed.
|
|
73
|
+
*
|
|
74
|
+
* @param error - Any error thrown during execution
|
|
75
|
+
* @returns GlobalError instance
|
|
76
|
+
*/
|
|
77
|
+
mapErrorToGlobalError(error) {
|
|
78
|
+
// Duck typing check for ZodError - more reliable than instanceof across module boundaries
|
|
79
|
+
// ZodError has: { name: "ZodError", issues: [...] }
|
|
80
|
+
if (error &&
|
|
81
|
+
typeof error === "object" &&
|
|
82
|
+
"issues" in error &&
|
|
83
|
+
Array.isArray(error.issues) &&
|
|
84
|
+
"name" in error &&
|
|
85
|
+
error.name === "ZodError") {
|
|
86
|
+
return this.zodErrorToGlobalError(error);
|
|
87
|
+
}
|
|
88
|
+
if (error instanceof Error) {
|
|
89
|
+
const globalError = new GlobalError(error.message);
|
|
90
|
+
globalError.setStack(error.stack);
|
|
91
|
+
globalError.setName(this.name);
|
|
92
|
+
globalError.setCode(500);
|
|
93
|
+
return globalError;
|
|
94
|
+
}
|
|
95
|
+
// Unknown error type
|
|
96
|
+
const globalError = new GlobalError(String(error));
|
|
97
|
+
globalError.setName(this.name);
|
|
98
|
+
globalError.setCode(500);
|
|
99
|
+
return globalError;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Converts ZodError to GlobalError with detailed validation messages
|
|
103
|
+
*
|
|
104
|
+
* Example output:
|
|
105
|
+
* "Validation failed: userId (expected string, received undefined),
|
|
106
|
+
* email (invalid email format)"
|
|
107
|
+
*
|
|
108
|
+
* @param zodError - Zod validation error
|
|
109
|
+
* @returns GlobalError with formatted validation messages
|
|
110
|
+
*/
|
|
111
|
+
zodErrorToGlobalError(zodError) {
|
|
112
|
+
const errorMessages = zodError.errors.map((err) => {
|
|
113
|
+
const path = err.path.join(".");
|
|
114
|
+
return `${path} (${err.message})`;
|
|
115
|
+
});
|
|
116
|
+
const message = `Validation failed: ${errorMessages.join(", ")}`;
|
|
117
|
+
const globalError = new GlobalError(message);
|
|
118
|
+
globalError.setCode(400); // Bad Request
|
|
119
|
+
globalError.setName(this.name);
|
|
120
|
+
globalError.setJson({
|
|
121
|
+
validation_errors: zodError.errors.map((err) => ({
|
|
122
|
+
path: err.path,
|
|
123
|
+
message: err.message,
|
|
124
|
+
code: err.code,
|
|
125
|
+
})),
|
|
126
|
+
});
|
|
127
|
+
return globalError;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Converts Zod schema to JSON Schema for backward compatibility
|
|
131
|
+
*
|
|
132
|
+
* This is a simplified conversion that covers basic types.
|
|
133
|
+
* For production use, consider using zod-to-json-schema library.
|
|
134
|
+
*
|
|
135
|
+
* @param zodSchema - Zod schema to convert
|
|
136
|
+
* @returns JSON Schema representation
|
|
137
|
+
*/
|
|
138
|
+
zodToJsonSchema(_zodSchema) {
|
|
139
|
+
// Return a permissive schema — the actual validation happens via Zod in handle().
|
|
140
|
+
// Using {} (no type constraint) instead of { type: "object" } so that nodes
|
|
141
|
+
// accepting arrays (e.g. if-else conditions) also pass the JSON Schema pre-check.
|
|
142
|
+
return {};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Define a function-first node with Zod schema validation
|
|
147
|
+
*
|
|
148
|
+
* This is the main API for creating modern, type-safe nodes in Blok.
|
|
149
|
+
*
|
|
150
|
+
* Benefits over class-based nodes:
|
|
151
|
+
* - 60%+ less boilerplate code
|
|
152
|
+
* - Type-safe inputs and outputs via Zod
|
|
153
|
+
* - Automatic validation
|
|
154
|
+
* - Better AI generation success rates
|
|
155
|
+
* - Easier to test and maintain
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* import { defineNode } from "@blokjs/runner";
|
|
160
|
+
* import { z } from "zod";
|
|
161
|
+
*
|
|
162
|
+
* export default defineNode({
|
|
163
|
+
* name: "fetch-user",
|
|
164
|
+
* description: "Fetches user by ID from database",
|
|
165
|
+
*
|
|
166
|
+
* input: z.object({
|
|
167
|
+
* userId: z.string().uuid(),
|
|
168
|
+
* }),
|
|
169
|
+
*
|
|
170
|
+
* output: z.object({
|
|
171
|
+
* user: z.object({
|
|
172
|
+
* id: z.string(),
|
|
173
|
+
* name: z.string(),
|
|
174
|
+
* email: z.string().email(),
|
|
175
|
+
* }),
|
|
176
|
+
* }),
|
|
177
|
+
*
|
|
178
|
+
* async execute(ctx, input) {
|
|
179
|
+
* const user = await db.users.findById(input.userId);
|
|
180
|
+
* return { user };
|
|
181
|
+
* },
|
|
182
|
+
* });
|
|
183
|
+
* ```
|
|
184
|
+
*
|
|
185
|
+
* @param definition - Node definition with Zod schemas
|
|
186
|
+
* @returns FunctionNode instance compatible with existing runner
|
|
187
|
+
*/
|
|
188
|
+
export function defineNode(definition) {
|
|
189
|
+
return new FunctionNode(definition);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=defineNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineNode.js","sourceRoot":"","sources":["../src/defineNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Schema Generator for Blok Workflows
|
|
3
|
+
*
|
|
4
|
+
* Automatically generates GraphQL schema definitions (SDL) from workflow definitions.
|
|
5
|
+
* Introspects HTTP trigger configurations and node structures to produce
|
|
6
|
+
* Query/Mutation types with appropriate input/output types.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const generator = new GraphQLSchemaGenerator({
|
|
11
|
+
* schemaName: "BlokAPI",
|
|
12
|
+
* includeSubscriptions: true,
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* generator.addWorkflow({
|
|
16
|
+
* name: "get-user",
|
|
17
|
+
* version: "1.0.0",
|
|
18
|
+
* trigger: { http: { method: "GET", path: "/users/:id" } },
|
|
19
|
+
* steps: [{ name: "fetch", node: "db-query", type: "local" }],
|
|
20
|
+
* nodes: { "db-query": {} },
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* console.log(generator.generate());
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export interface GraphQLGeneratorConfig {
|
|
27
|
+
/** Schema name used in documentation */
|
|
28
|
+
schemaName?: string;
|
|
29
|
+
/** Description for the schema */
|
|
30
|
+
description?: string;
|
|
31
|
+
/** Include subscription types for WebSocket/SSE workflows */
|
|
32
|
+
includeSubscriptions?: boolean;
|
|
33
|
+
/** Include workflow metadata in type descriptions */
|
|
34
|
+
includeMetadata?: boolean;
|
|
35
|
+
/** Custom scalar definitions */
|
|
36
|
+
customScalars?: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
}>;
|
|
40
|
+
}
|
|
41
|
+
export interface GqlWorkflowDefinition {
|
|
42
|
+
name: string;
|
|
43
|
+
version: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
trigger: {
|
|
46
|
+
http?: {
|
|
47
|
+
method: string;
|
|
48
|
+
path: string;
|
|
49
|
+
};
|
|
50
|
+
grpc?: {
|
|
51
|
+
service: string;
|
|
52
|
+
method: string;
|
|
53
|
+
};
|
|
54
|
+
websocket?: {
|
|
55
|
+
path?: string;
|
|
56
|
+
};
|
|
57
|
+
sse?: {
|
|
58
|
+
path?: string;
|
|
59
|
+
};
|
|
60
|
+
[key: string]: unknown;
|
|
61
|
+
};
|
|
62
|
+
steps: Array<{
|
|
63
|
+
name: string;
|
|
64
|
+
node: string;
|
|
65
|
+
type?: string;
|
|
66
|
+
runtime?: string;
|
|
67
|
+
}>;
|
|
68
|
+
nodes: Record<string, unknown>;
|
|
69
|
+
inputs?: Record<string, GqlFieldDef>;
|
|
70
|
+
outputs?: Record<string, GqlFieldDef>;
|
|
71
|
+
}
|
|
72
|
+
export interface GqlFieldDef {
|
|
73
|
+
type: string;
|
|
74
|
+
required?: boolean;
|
|
75
|
+
description?: string;
|
|
76
|
+
items?: GqlFieldDef;
|
|
77
|
+
fields?: Record<string, GqlFieldDef>;
|
|
78
|
+
}
|
|
79
|
+
export declare class GraphQLSchemaGenerator {
|
|
80
|
+
private config;
|
|
81
|
+
private workflows;
|
|
82
|
+
private customTypes;
|
|
83
|
+
constructor(config?: GraphQLGeneratorConfig);
|
|
84
|
+
addWorkflow(workflow: GqlWorkflowDefinition): void;
|
|
85
|
+
addWorkflows(workflows: GqlWorkflowDefinition[]): void;
|
|
86
|
+
addCustomType(name: string, definition: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Generate GraphQL Schema Definition Language (SDL)
|
|
89
|
+
*/
|
|
90
|
+
generate(): string;
|
|
91
|
+
/**
|
|
92
|
+
* Generate an introspection-friendly JSON representation
|
|
93
|
+
*/
|
|
94
|
+
toJSON(): GraphQLSchemaJSON;
|
|
95
|
+
private resolveWorkflow;
|
|
96
|
+
private generateInputType;
|
|
97
|
+
private generateOutputType;
|
|
98
|
+
private generateFieldDefinition;
|
|
99
|
+
private generateSubscriptionField;
|
|
100
|
+
private inferOutputFields;
|
|
101
|
+
private inferInputFields;
|
|
102
|
+
private fieldDefToGraphQLType;
|
|
103
|
+
private getTriggerType;
|
|
104
|
+
private extractPathParams;
|
|
105
|
+
private toPascalCase;
|
|
106
|
+
private toFieldName;
|
|
107
|
+
private emptySchema;
|
|
108
|
+
}
|
|
109
|
+
export interface GraphQLSchemaJSON {
|
|
110
|
+
schemaName: string;
|
|
111
|
+
types: GraphQLTypeInfo[];
|
|
112
|
+
queries: GraphQLFieldInfo[];
|
|
113
|
+
mutations: GraphQLFieldInfo[];
|
|
114
|
+
subscriptions: GraphQLFieldInfo[];
|
|
115
|
+
}
|
|
116
|
+
export interface GraphQLTypeInfo {
|
|
117
|
+
name: string;
|
|
118
|
+
kind: "OBJECT" | "INPUT_OBJECT" | "ENUM" | "SCALAR";
|
|
119
|
+
fields: GraphQLFieldInfo[];
|
|
120
|
+
}
|
|
121
|
+
export interface GraphQLFieldInfo {
|
|
122
|
+
name: string;
|
|
123
|
+
type: string;
|
|
124
|
+
description?: string;
|
|
125
|
+
args?: Array<{
|
|
126
|
+
name: string;
|
|
127
|
+
type: string;
|
|
128
|
+
}>;
|
|
129
|
+
}
|