@principal-ai/principal-view-core 0.5.15 → 0.5.17
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/cli/codegen.d.ts +41 -0
- package/dist/cli/codegen.d.ts.map +1 -0
- package/dist/cli/codegen.js +247 -0
- package/dist/cli/codegen.js.map +1 -0
- package/dist/codegen/type-generator.d.ts +112 -0
- package/dist/codegen/type-generator.d.ts.map +1 -0
- package/dist/codegen/type-generator.js +302 -0
- package/dist/codegen/type-generator.js.map +1 -0
- package/dist/codegen/usage-example.d.ts +103 -0
- package/dist/codegen/usage-example.d.ts.map +1 -0
- package/dist/codegen/usage-example.js +226 -0
- package/dist/codegen/usage-example.js.map +1 -0
- package/dist/generated/graph-converter-execution.types.d.ts +177 -0
- package/dist/generated/graph-converter-execution.types.d.ts.map +1 -0
- package/dist/generated/graph-converter-execution.types.js +11 -0
- package/dist/generated/graph-converter-execution.types.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/engine.d.ts.map +1 -1
- package/dist/rules/engine.js +153 -37
- package/dist/rules/engine.js.map +1 -1
- package/dist/telemetry/coverage.d.ts +38 -0
- package/dist/telemetry/coverage.d.ts.map +1 -0
- package/dist/telemetry/coverage.js +113 -0
- package/dist/telemetry/coverage.js.map +1 -0
- package/dist/telemetry/event-validator.d.ts +72 -0
- package/dist/telemetry/event-validator.d.ts.map +1 -0
- package/dist/telemetry/event-validator.js +153 -0
- package/dist/telemetry/event-validator.js.map +1 -0
- package/dist/types/audit.d.ts.map +1 -1
- package/dist/types/audit.js.map +1 -1
- package/dist/types/canvas.d.ts +47 -0
- package/dist/types/canvas.d.ts.map +1 -1
- package/dist/types/canvas.js.map +1 -1
- package/dist/utils/TraceToCanvas.d.ts +83 -0
- package/dist/utils/TraceToCanvas.d.ts.map +1 -0
- package/dist/utils/TraceToCanvas.js +335 -0
- package/dist/utils/TraceToCanvas.js.map +1 -0
- package/package.json +6 -1
- package/src/ValidationEngine.test.ts +347 -196
- package/src/cli/codegen.ts +284 -0
- package/src/codegen/type-generator.test.ts +224 -0
- package/src/codegen/type-generator.ts +414 -0
- package/src/codegen/usage-example.ts +356 -0
- package/src/generated/graph-converter-execution.types.ts +193 -0
- package/src/index.ts +21 -0
- package/src/rules/engine.ts +171 -42
- package/src/telemetry/coverage.ts +162 -0
- package/src/telemetry/event-validator.ts +195 -0
- package/src/types/audit.ts +1 -5
- package/src/types/canvas.ts +51 -0
- package/src/utils/GraphConverter.test.ts +327 -88
- package/src/utils/TraceToCanvas.test.ts +308 -0
- package/src/utils/TraceToCanvas.ts +514 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeScript types from canvas event schemas.
|
|
5
|
+
* Similar to how GraphQL Code Generator works for GraphQL schemas,
|
|
6
|
+
* or how OpenAPI generators work for API specs.
|
|
7
|
+
*
|
|
8
|
+
* Precedents:
|
|
9
|
+
* - GraphQL Code Generator: graphql-code-generator.com
|
|
10
|
+
* - OpenAPI Generator: openapi-generator.tech
|
|
11
|
+
* - Protobuf: generates code from .proto files
|
|
12
|
+
* - Zod: runtime validation with TypeScript inference
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* TypeScript Type Generator
|
|
16
|
+
*
|
|
17
|
+
* Generates TypeScript types from canvas event schemas.
|
|
18
|
+
* Similar to GraphQL Code Generator but for canvas schemas.
|
|
19
|
+
*/
|
|
20
|
+
export class TypeScriptGenerator {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.language = 'typescript';
|
|
23
|
+
}
|
|
24
|
+
generate(canvas, options) {
|
|
25
|
+
const opts = {
|
|
26
|
+
readonly: options?.style?.readonly ?? false,
|
|
27
|
+
strictNullChecks: options?.style?.strictNullChecks ?? true,
|
|
28
|
+
includeDocComments: options?.style?.includeDocComments ?? true,
|
|
29
|
+
namespace: options?.namespace,
|
|
30
|
+
};
|
|
31
|
+
const lines = [];
|
|
32
|
+
// File header
|
|
33
|
+
lines.push('/**');
|
|
34
|
+
lines.push(` * Generated types from canvas: ${canvas.pv?.name || 'Untitled'}`);
|
|
35
|
+
lines.push(' *');
|
|
36
|
+
lines.push(' * DO NOT EDIT MANUALLY - This file is auto-generated');
|
|
37
|
+
lines.push(' * Generated by @principal-ai/principal-view-core');
|
|
38
|
+
lines.push(' *');
|
|
39
|
+
lines.push(` * Canvas: ${canvas.pv?.description || 'No description'}`);
|
|
40
|
+
lines.push(` * Version: ${canvas.pv?.version || '1.0.0'}`);
|
|
41
|
+
lines.push(' */');
|
|
42
|
+
lines.push('');
|
|
43
|
+
// Namespace (if specified)
|
|
44
|
+
if (opts.namespace) {
|
|
45
|
+
lines.push(`export namespace ${opts.namespace} {`);
|
|
46
|
+
}
|
|
47
|
+
// Generate types for each node with event schemas
|
|
48
|
+
if (canvas.nodes) {
|
|
49
|
+
for (const node of canvas.nodes) {
|
|
50
|
+
if (node.pv?.events) {
|
|
51
|
+
lines.push(...this.generateNodeTypes(node.id, node.pv.events, opts));
|
|
52
|
+
lines.push('');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Generate union type of all event names
|
|
57
|
+
lines.push(...this.generateEventNameUnion(canvas, opts));
|
|
58
|
+
lines.push('');
|
|
59
|
+
// Generate event emitter helper type
|
|
60
|
+
lines.push(...this.generateEmitterTypes(canvas, opts));
|
|
61
|
+
// Close namespace
|
|
62
|
+
if (opts.namespace) {
|
|
63
|
+
lines.push('}');
|
|
64
|
+
}
|
|
65
|
+
const code = lines.join('\n');
|
|
66
|
+
const filename = this.generateFilename(canvas);
|
|
67
|
+
return {
|
|
68
|
+
code,
|
|
69
|
+
extension: 'ts',
|
|
70
|
+
filename,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
generateNodeTypes(nodeId, events, opts) {
|
|
74
|
+
const lines = [];
|
|
75
|
+
const typeName = this.nodeIdToTypeName(nodeId);
|
|
76
|
+
if (opts.includeDocComments) {
|
|
77
|
+
lines.push(`/**`);
|
|
78
|
+
lines.push(` * Event types for node: ${nodeId}`);
|
|
79
|
+
lines.push(` */`);
|
|
80
|
+
}
|
|
81
|
+
lines.push(`export namespace ${typeName} {`);
|
|
82
|
+
// Generate interface for each event
|
|
83
|
+
for (const [eventName, eventSchema] of Object.entries(events)) {
|
|
84
|
+
lines.push(...this.generateEventInterface(eventName, eventSchema, opts));
|
|
85
|
+
lines.push('');
|
|
86
|
+
}
|
|
87
|
+
// Generate union type of all events
|
|
88
|
+
const eventNames = Object.keys(events);
|
|
89
|
+
const interfaceNames = eventNames.map(name => this.eventNameToTypeName(name));
|
|
90
|
+
lines.push(' /**');
|
|
91
|
+
lines.push(` * Union of all event types for ${nodeId}`);
|
|
92
|
+
lines.push(' */');
|
|
93
|
+
lines.push(` export type Event = ${interfaceNames.join(' | ')};`);
|
|
94
|
+
lines.push('');
|
|
95
|
+
// Generate event name literal union
|
|
96
|
+
lines.push(' /**');
|
|
97
|
+
lines.push(` * Literal union of event names for ${nodeId}`);
|
|
98
|
+
lines.push(' */');
|
|
99
|
+
lines.push(` export type EventName = ${eventNames.map(n => `'${n}'`).join(' | ')};`);
|
|
100
|
+
lines.push('}');
|
|
101
|
+
return lines;
|
|
102
|
+
}
|
|
103
|
+
generateEventInterface(eventName, schema, opts) {
|
|
104
|
+
const lines = [];
|
|
105
|
+
const interfaceName = this.eventNameToTypeName(eventName);
|
|
106
|
+
const readonly = opts.readonly ? 'readonly ' : '';
|
|
107
|
+
if (opts.includeDocComments) {
|
|
108
|
+
lines.push(' /**');
|
|
109
|
+
lines.push(` * ${schema.description}`);
|
|
110
|
+
lines.push(' */');
|
|
111
|
+
}
|
|
112
|
+
lines.push(` export interface ${interfaceName} {`);
|
|
113
|
+
// Event name as literal type
|
|
114
|
+
lines.push(` ${readonly}name: '${eventName}';`);
|
|
115
|
+
// Attributes
|
|
116
|
+
lines.push(` ${readonly}attributes: {`);
|
|
117
|
+
for (const [fieldName, fieldSchema] of Object.entries(schema.attributes)) {
|
|
118
|
+
const optional = !fieldSchema.required && opts.strictNullChecks ? '?' : '';
|
|
119
|
+
const type = this.fieldTypeToTsType(fieldSchema);
|
|
120
|
+
if (opts.includeDocComments && fieldSchema.description) {
|
|
121
|
+
lines.push(` /** ${fieldSchema.description} */`);
|
|
122
|
+
}
|
|
123
|
+
lines.push(` ${readonly}'${fieldName}'${optional}: ${type};`);
|
|
124
|
+
}
|
|
125
|
+
lines.push(' };');
|
|
126
|
+
lines.push(' }');
|
|
127
|
+
return lines;
|
|
128
|
+
}
|
|
129
|
+
generateEventNameUnion(canvas, opts) {
|
|
130
|
+
const lines = [];
|
|
131
|
+
const allEventNames = new Set();
|
|
132
|
+
if (canvas.nodes) {
|
|
133
|
+
for (const node of canvas.nodes) {
|
|
134
|
+
if (node.pv?.events) {
|
|
135
|
+
Object.keys(node.pv.events).forEach(name => allEventNames.add(name));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (allEventNames.size === 0) {
|
|
140
|
+
return lines;
|
|
141
|
+
}
|
|
142
|
+
if (opts.includeDocComments) {
|
|
143
|
+
lines.push('/**');
|
|
144
|
+
lines.push(' * Union of all event names in the canvas');
|
|
145
|
+
lines.push(' */');
|
|
146
|
+
}
|
|
147
|
+
lines.push(`export type AllEventNames = ${Array.from(allEventNames).map(n => `'${n}'`).join(' | ')};`);
|
|
148
|
+
return lines;
|
|
149
|
+
}
|
|
150
|
+
generateEmitterTypes(canvas, opts) {
|
|
151
|
+
const lines = [];
|
|
152
|
+
if (opts.includeDocComments) {
|
|
153
|
+
lines.push('/**');
|
|
154
|
+
lines.push(' * Type-safe event emitter for a specific node');
|
|
155
|
+
lines.push(' *');
|
|
156
|
+
lines.push(' * @example');
|
|
157
|
+
lines.push(' * ```typescript');
|
|
158
|
+
lines.push(' * const emit: NodeEmitter<GraphConverter.EventName, GraphConverter.Event> = ...');
|
|
159
|
+
lines.push(" * emit('conversion.started', {");
|
|
160
|
+
lines.push(" * name: 'conversion.started',");
|
|
161
|
+
lines.push(' * attributes: { ... }');
|
|
162
|
+
lines.push(' * });');
|
|
163
|
+
lines.push(' * ```');
|
|
164
|
+
lines.push(' */');
|
|
165
|
+
}
|
|
166
|
+
lines.push('export type NodeEmitter<');
|
|
167
|
+
lines.push(' TEventName extends string,');
|
|
168
|
+
lines.push(' TEvent extends { name: TEventName; attributes: Record<string, any> }');
|
|
169
|
+
lines.push('> = (event: TEvent) => void;');
|
|
170
|
+
lines.push('');
|
|
171
|
+
if (opts.includeDocComments) {
|
|
172
|
+
lines.push('/**');
|
|
173
|
+
lines.push(' * Type-safe event emitter by event name');
|
|
174
|
+
lines.push(' *');
|
|
175
|
+
lines.push(' * @example');
|
|
176
|
+
lines.push(' * ```typescript');
|
|
177
|
+
lines.push(' * const emit: NodeEmitterByName<GraphConverter.Event> = ...');
|
|
178
|
+
lines.push(" * emit('conversion.started', {");
|
|
179
|
+
lines.push(" * 'config.nodeTypes': 2,");
|
|
180
|
+
lines.push(" * 'config.edgeTypes': 1");
|
|
181
|
+
lines.push(' * });');
|
|
182
|
+
lines.push(' * ```');
|
|
183
|
+
lines.push(' */');
|
|
184
|
+
}
|
|
185
|
+
lines.push('export type NodeEmitterByName<');
|
|
186
|
+
lines.push(' TEvent extends { name: string; attributes: Record<string, any> }');
|
|
187
|
+
lines.push('> = <TName extends TEvent[\'name\']>(');
|
|
188
|
+
lines.push(' eventName: TName,');
|
|
189
|
+
lines.push(' attributes: Extract<TEvent, { name: TName }>[\'attributes\']');
|
|
190
|
+
lines.push(') => void;');
|
|
191
|
+
return lines;
|
|
192
|
+
}
|
|
193
|
+
nodeIdToTypeName(nodeId) {
|
|
194
|
+
// Convert kebab-case or snake_case to PascalCase
|
|
195
|
+
return nodeId
|
|
196
|
+
.split(/[-_]/)
|
|
197
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
198
|
+
.join('');
|
|
199
|
+
}
|
|
200
|
+
eventNameToTypeName(eventName) {
|
|
201
|
+
// Convert "conversion.started" to "ConversionStarted"
|
|
202
|
+
return eventName
|
|
203
|
+
.split('.')
|
|
204
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
205
|
+
.join('');
|
|
206
|
+
}
|
|
207
|
+
fieldTypeToTsType(fieldSchema) {
|
|
208
|
+
switch (fieldSchema.type) {
|
|
209
|
+
case 'string':
|
|
210
|
+
return 'string';
|
|
211
|
+
case 'number':
|
|
212
|
+
return 'number';
|
|
213
|
+
case 'boolean':
|
|
214
|
+
return 'boolean';
|
|
215
|
+
case 'array':
|
|
216
|
+
return 'any[]';
|
|
217
|
+
case 'object':
|
|
218
|
+
return 'Record<string, any>';
|
|
219
|
+
default:
|
|
220
|
+
return 'any';
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
generateFilename(canvas) {
|
|
224
|
+
const name = canvas.pv?.name || 'canvas';
|
|
225
|
+
// Convert to kebab-case
|
|
226
|
+
const kebab = name
|
|
227
|
+
.toLowerCase()
|
|
228
|
+
.replace(/\s+/g, '-')
|
|
229
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
230
|
+
return `${kebab}.types.ts`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Generate types from canvas
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* import fs from 'fs';
|
|
239
|
+
* import { generateTypes } from '@principal-ai/principal-view-core';
|
|
240
|
+
*
|
|
241
|
+
* const canvas = JSON.parse(fs.readFileSync('my-flow.canvas', 'utf-8'));
|
|
242
|
+
* const result = generateTypes(canvas, { language: 'typescript' });
|
|
243
|
+
*
|
|
244
|
+
* fs.writeFileSync(result.filename, result.code);
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export function generateTypes(canvas, options = { language: 'typescript' }) {
|
|
248
|
+
const generator = getGenerator(options.language);
|
|
249
|
+
return generator.generate(canvas, options);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get code generator for a language
|
|
253
|
+
*/
|
|
254
|
+
function getGenerator(language) {
|
|
255
|
+
switch (language) {
|
|
256
|
+
case 'typescript':
|
|
257
|
+
return new TypeScriptGenerator();
|
|
258
|
+
case 'python':
|
|
259
|
+
// TODO: Implement Python generator
|
|
260
|
+
throw new Error('Python generator not yet implemented. See TypeScriptGenerator as reference.');
|
|
261
|
+
case 'go':
|
|
262
|
+
// TODO: Implement Go generator
|
|
263
|
+
throw new Error('Go generator not yet implemented. See TypeScriptGenerator as reference.');
|
|
264
|
+
case 'rust':
|
|
265
|
+
// TODO: Implement Rust generator
|
|
266
|
+
throw new Error('Rust generator not yet implemented. See TypeScriptGenerator as reference.');
|
|
267
|
+
default:
|
|
268
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Registry of available generators
|
|
273
|
+
*
|
|
274
|
+
* This allows external packages to register custom generators:
|
|
275
|
+
*
|
|
276
|
+
* @example
|
|
277
|
+
* ```typescript
|
|
278
|
+
* import { generatorRegistry } from '@principal-ai/principal-view-core';
|
|
279
|
+
*
|
|
280
|
+
* class PythonGenerator implements CodeGenerator {
|
|
281
|
+
* language = 'python';
|
|
282
|
+
* generate(canvas, options) { ... }
|
|
283
|
+
* }
|
|
284
|
+
*
|
|
285
|
+
* generatorRegistry.register(new PythonGenerator());
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
export const generatorRegistry = {
|
|
289
|
+
generators: new Map([
|
|
290
|
+
['typescript', new TypeScriptGenerator()],
|
|
291
|
+
]),
|
|
292
|
+
register(generator) {
|
|
293
|
+
this.generators.set(generator.language, generator);
|
|
294
|
+
},
|
|
295
|
+
get(language) {
|
|
296
|
+
return this.generators.get(language);
|
|
297
|
+
},
|
|
298
|
+
list() {
|
|
299
|
+
return Array.from(this.generators.keys());
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
//# sourceMappingURL=type-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../src/codegen/type-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Using Generated Types
|
|
3
|
+
*
|
|
4
|
+
* This demonstrates how to use generated types for type-safe event emission.
|
|
5
|
+
* Types are generated from canvas schemas using the type generator.
|
|
6
|
+
*
|
|
7
|
+
* Similar to:
|
|
8
|
+
* - GraphQL Code Generator usage
|
|
9
|
+
* - OpenAPI generated client usage
|
|
10
|
+
* - Protobuf generated message usage
|
|
11
|
+
*
|
|
12
|
+
* NOTE: In real code, you would import from the generated types file:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import type {
|
|
15
|
+
* GraphConverter,
|
|
16
|
+
* Validation,
|
|
17
|
+
* NodeEmitterByName,
|
|
18
|
+
* } from '@generated/graph-converter-execution.types';
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* For this example file, we define the types inline to avoid import errors.
|
|
22
|
+
*/
|
|
23
|
+
declare namespace GraphConverter {
|
|
24
|
+
interface ConversionStarted {
|
|
25
|
+
name: 'conversion.started';
|
|
26
|
+
attributes: {
|
|
27
|
+
'config.nodeTypes': number;
|
|
28
|
+
'config.edgeTypes': number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
interface ConversionComplete {
|
|
32
|
+
name: 'conversion.complete';
|
|
33
|
+
attributes: {
|
|
34
|
+
'result.nodes.count': number;
|
|
35
|
+
'result.edges.count': number;
|
|
36
|
+
'duration.ms'?: number;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
interface ConversionError {
|
|
40
|
+
name: 'conversion.error';
|
|
41
|
+
attributes: {
|
|
42
|
+
'error.message': string;
|
|
43
|
+
'error.phase'?: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface ConversionProcessingNodes {
|
|
47
|
+
name: 'conversion.processingNodes';
|
|
48
|
+
attributes: {
|
|
49
|
+
'nodes.count': number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
interface ConversionProcessingEdges {
|
|
53
|
+
name: 'conversion.processingEdges';
|
|
54
|
+
attributes: {
|
|
55
|
+
'edges.count': number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
type Event = ConversionStarted | ConversionComplete | ConversionError | ConversionProcessingNodes | ConversionProcessingEdges;
|
|
59
|
+
type EventName = 'conversion.started' | 'conversion.processingNodes' | 'conversion.processingEdges' | 'conversion.complete' | 'conversion.error';
|
|
60
|
+
}
|
|
61
|
+
type NodeEmitterByName<TEvent extends {
|
|
62
|
+
name: string;
|
|
63
|
+
attributes: Record<string, any>;
|
|
64
|
+
}> = <TName extends TEvent['name']>(eventName: TName, attributes: Extract<TEvent, {
|
|
65
|
+
name: TName;
|
|
66
|
+
}>['attributes']) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Example 1: Type-safe event emitter with full event objects
|
|
69
|
+
*/
|
|
70
|
+
declare function exampleFullEventEmitter(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Example 2: Type-safe event emitter by name (more ergonomic)
|
|
73
|
+
*/
|
|
74
|
+
declare function exampleEventEmitterByName(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Example 3: Production service with type-safe telemetry
|
|
77
|
+
*/
|
|
78
|
+
declare class GraphConverterService {
|
|
79
|
+
private emit;
|
|
80
|
+
constructor(emitter: NodeEmitterByName<GraphConverter.Event>);
|
|
81
|
+
convert(config: {
|
|
82
|
+
nodeTypes: string[];
|
|
83
|
+
edgeTypes: string[];
|
|
84
|
+
}): void;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Example 4: Multiple node types
|
|
88
|
+
*/
|
|
89
|
+
declare function exampleMultipleNodes(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Example 5: Generic event handler with type narrowing
|
|
92
|
+
*/
|
|
93
|
+
declare function exampleEventHandler(event: GraphConverter.Event): void;
|
|
94
|
+
/**
|
|
95
|
+
* Example 6: Type-safe event name checking
|
|
96
|
+
*/
|
|
97
|
+
declare function exampleEventNameChecking(eventName: string): void;
|
|
98
|
+
/**
|
|
99
|
+
* Example 7: Integration with event validator
|
|
100
|
+
*/
|
|
101
|
+
declare function exampleWithValidator(): Promise<void>;
|
|
102
|
+
export { exampleFullEventEmitter, exampleEventEmitterByName, GraphConverterService, exampleMultipleNodes, exampleEventHandler, exampleEventNameChecking, exampleWithValidator, };
|
|
103
|
+
//# sourceMappingURL=usage-example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-example.d.ts","sourceRoot":"","sources":["../../src/codegen/usage-example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,kBAAU,cAAc,CAAC;IACvB,UAAiB,iBAAiB;QAChC,IAAI,EAAE,oBAAoB,CAAC;QAC3B,UAAU,EAAE;YACV,kBAAkB,EAAE,MAAM,CAAC;YAC3B,kBAAkB,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH;IAED,UAAiB,kBAAkB;QACjC,IAAI,EAAE,qBAAqB,CAAC;QAC5B,UAAU,EAAE;YACV,oBAAoB,EAAE,MAAM,CAAC;YAC7B,oBAAoB,EAAE,MAAM,CAAC;YAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;KACH;IAED,UAAiB,eAAe;QAC9B,IAAI,EAAE,kBAAkB,CAAC;QACzB,UAAU,EAAE;YACV,eAAe,EAAE,MAAM,CAAC;YACxB,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;KACH;IAED,UAAiB,yBAAyB;QACxC,IAAI,EAAE,4BAA4B,CAAC;QACnC,UAAU,EAAE;YACV,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;KACH;IAED,UAAiB,yBAAyB;QACxC,IAAI,EAAE,4BAA4B,CAAC;QACnC,UAAU,EAAE;YACV,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;KACH;IAED,KAAY,KAAK,GACb,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,GACf,yBAAyB,GACzB,yBAAyB,CAAC;IAE9B,KAAY,SAAS,GACjB,oBAAoB,GACpB,4BAA4B,GAC5B,4BAA4B,GAC5B,qBAAqB,GACrB,kBAAkB,CAAC;CACxB;AAsBD,KAAK,iBAAiB,CAAC,MAAM,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,IAAI,CACzF,KAAK,SAAS,MAAM,CAAC,MAAM,CAAC,EAE5B,SAAS,EAAE,KAAK,EAChB,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC,YAAY,CAAC,KACvD,IAAI,CAAC;AAEV;;GAEG;AACH,iBAAS,uBAAuB,SAiD/B;AAED;;GAEG;AACH,iBAAS,yBAAyB,SAiCjC;AAED;;GAEG;AACH,cAAM,qBAAqB;IACzB,OAAO,CAAC,IAAI,CAA0C;gBAE1C,OAAO,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC;IAI5D,OAAO,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;CAuB7D;AAED;;GAEG;AACH,iBAAS,oBAAoB,SAwB5B;AAED;;GAEG;AACH,iBAAS,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,QAsBvD;AAED;;GAEG;AACH,iBAAS,wBAAwB,CAAC,SAAS,EAAE,MAAM,QAMlD;AAaD;;GAEG;AACH,iBAAe,oBAAoB,kBA+BlC;AAED,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,GACrB,CAAC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Using Generated Types
|
|
3
|
+
*
|
|
4
|
+
* This demonstrates how to use generated types for type-safe event emission.
|
|
5
|
+
* Types are generated from canvas schemas using the type generator.
|
|
6
|
+
*
|
|
7
|
+
* Similar to:
|
|
8
|
+
* - GraphQL Code Generator usage
|
|
9
|
+
* - OpenAPI generated client usage
|
|
10
|
+
* - Protobuf generated message usage
|
|
11
|
+
*
|
|
12
|
+
* NOTE: In real code, you would import from the generated types file:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import type {
|
|
15
|
+
* GraphConverter,
|
|
16
|
+
* Validation,
|
|
17
|
+
* NodeEmitterByName,
|
|
18
|
+
* } from '@generated/graph-converter-execution.types';
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* For this example file, we define the types inline to avoid import errors.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Example 1: Type-safe event emitter with full event objects
|
|
25
|
+
*/
|
|
26
|
+
function exampleFullEventEmitter() {
|
|
27
|
+
// Define an emitter that accepts GraphConverter events
|
|
28
|
+
const emit = (event) => {
|
|
29
|
+
console.log('Event:', event.name);
|
|
30
|
+
console.log('Attributes:', event.attributes);
|
|
31
|
+
};
|
|
32
|
+
// ✅ Valid: all required fields present
|
|
33
|
+
emit({
|
|
34
|
+
name: 'conversion.started',
|
|
35
|
+
attributes: {
|
|
36
|
+
'config.nodeTypes': 2,
|
|
37
|
+
'config.edgeTypes': 1,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
// ✅ Valid: optional field included
|
|
41
|
+
emit({
|
|
42
|
+
name: 'conversion.complete',
|
|
43
|
+
attributes: {
|
|
44
|
+
'result.nodes.count': 5,
|
|
45
|
+
'result.edges.count': 3,
|
|
46
|
+
'duration.ms': 150, // Optional field
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
// ❌ TypeScript error: missing required field
|
|
50
|
+
// emit({
|
|
51
|
+
// name: 'conversion.started',
|
|
52
|
+
// attributes: {
|
|
53
|
+
// 'config.nodeTypes': 2,
|
|
54
|
+
// // Missing 'config.edgeTypes' - TypeScript error!
|
|
55
|
+
// },
|
|
56
|
+
// });
|
|
57
|
+
// ❌ TypeScript error: wrong field type
|
|
58
|
+
// emit({
|
|
59
|
+
// name: 'conversion.started',
|
|
60
|
+
// attributes: {
|
|
61
|
+
// 'config.nodeTypes': 'two', // Should be number! TypeScript error!
|
|
62
|
+
// 'config.edgeTypes': 1,
|
|
63
|
+
// },
|
|
64
|
+
// });
|
|
65
|
+
// ❌ TypeScript error: invalid event name
|
|
66
|
+
// emit({
|
|
67
|
+
// name: 'conversion.unknown', // Not a valid event! TypeScript error!
|
|
68
|
+
// attributes: {},
|
|
69
|
+
// });
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Example 2: Type-safe event emitter by name (more ergonomic)
|
|
73
|
+
*/
|
|
74
|
+
function exampleEventEmitterByName() {
|
|
75
|
+
// Define an emitter that accepts event name + attributes
|
|
76
|
+
const emit = ((eventName, attributes) => {
|
|
77
|
+
console.log('Event:', eventName);
|
|
78
|
+
console.log('Attributes:', attributes);
|
|
79
|
+
});
|
|
80
|
+
// ✅ Valid: TypeScript infers the attributes type based on event name
|
|
81
|
+
emit('conversion.started', {
|
|
82
|
+
'config.nodeTypes': 2,
|
|
83
|
+
'config.edgeTypes': 1,
|
|
84
|
+
});
|
|
85
|
+
// ✅ Valid: TypeScript knows 'duration.ms' is optional for 'conversion.complete'
|
|
86
|
+
emit('conversion.complete', {
|
|
87
|
+
'result.nodes.count': 5,
|
|
88
|
+
'result.edges.count': 3,
|
|
89
|
+
});
|
|
90
|
+
// ✅ Valid: optional field included
|
|
91
|
+
emit('conversion.complete', {
|
|
92
|
+
'result.nodes.count': 5,
|
|
93
|
+
'result.edges.count': 3,
|
|
94
|
+
'duration.ms': 150,
|
|
95
|
+
});
|
|
96
|
+
// ❌ TypeScript error: wrong attributes for this event
|
|
97
|
+
// emit('conversion.started', {
|
|
98
|
+
// 'result.nodes.count': 5, // Wrong attributes! TypeScript error!
|
|
99
|
+
// });
|
|
100
|
+
// ❌ TypeScript error: invalid event name
|
|
101
|
+
// emit('unknown.event', {});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Example 3: Production service with type-safe telemetry
|
|
105
|
+
*/
|
|
106
|
+
class GraphConverterService {
|
|
107
|
+
constructor(emitter) {
|
|
108
|
+
this.emit = emitter;
|
|
109
|
+
}
|
|
110
|
+
convert(config) {
|
|
111
|
+
// ✅ Type-safe event emission
|
|
112
|
+
this.emit('conversion.started', {
|
|
113
|
+
'config.nodeTypes': config.nodeTypes.length,
|
|
114
|
+
'config.edgeTypes': config.edgeTypes.length,
|
|
115
|
+
});
|
|
116
|
+
try {
|
|
117
|
+
// ... conversion logic
|
|
118
|
+
// ✅ TypeScript ensures all required fields are present
|
|
119
|
+
this.emit('conversion.complete', {
|
|
120
|
+
'result.nodes.count': 10,
|
|
121
|
+
'result.edges.count': 5,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// ✅ Type-safe error event
|
|
126
|
+
this.emit('conversion.error', {
|
|
127
|
+
'error.message': error.message,
|
|
128
|
+
'error.phase': 'conversion', // Optional field
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Example 4: Multiple node types
|
|
135
|
+
*/
|
|
136
|
+
function exampleMultipleNodes() {
|
|
137
|
+
// Can use different event types for different nodes
|
|
138
|
+
const emitValidation = ((name, attrs) => {
|
|
139
|
+
console.log('Validation:', name, attrs);
|
|
140
|
+
});
|
|
141
|
+
const emitConverter = ((name, attrs) => {
|
|
142
|
+
console.log('Converter:', name, attrs);
|
|
143
|
+
});
|
|
144
|
+
// ✅ Each emitter is type-safe to its node's events
|
|
145
|
+
emitValidation('validation.started', {
|
|
146
|
+
'config.size': 100,
|
|
147
|
+
});
|
|
148
|
+
emitConverter('conversion.started', {
|
|
149
|
+
'config.nodeTypes': 2,
|
|
150
|
+
'config.edgeTypes': 1,
|
|
151
|
+
});
|
|
152
|
+
// ❌ TypeScript error: can't use validation events with converter emitter
|
|
153
|
+
// emitConverter('validation.started', {
|
|
154
|
+
// 'config.size': 100,
|
|
155
|
+
// });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Example 5: Generic event handler with type narrowing
|
|
159
|
+
*/
|
|
160
|
+
function exampleEventHandler(event) {
|
|
161
|
+
// TypeScript knows the structure based on event name
|
|
162
|
+
switch (event.name) {
|
|
163
|
+
case 'conversion.started':
|
|
164
|
+
// TypeScript knows event.attributes has 'config.nodeTypes' and 'config.edgeTypes'
|
|
165
|
+
console.log(`Starting conversion with ${event.attributes['config.nodeTypes']} node types`);
|
|
166
|
+
break;
|
|
167
|
+
case 'conversion.complete':
|
|
168
|
+
// TypeScript knows event.attributes has 'result.nodes.count' and 'result.edges.count'
|
|
169
|
+
console.log(`Completed: ${event.attributes['result.nodes.count']} nodes`);
|
|
170
|
+
// TypeScript knows 'duration.ms' might be undefined
|
|
171
|
+
if (event.attributes['duration.ms']) {
|
|
172
|
+
console.log(`Duration: ${event.attributes['duration.ms']}ms`);
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case 'conversion.error':
|
|
176
|
+
// TypeScript knows event.attributes has 'error.message'
|
|
177
|
+
console.error(`Error: ${event.attributes['error.message']}`);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Example 6: Type-safe event name checking
|
|
183
|
+
*/
|
|
184
|
+
function exampleEventNameChecking(eventName) {
|
|
185
|
+
// Type-safe event name validation
|
|
186
|
+
if (isConverterEvent(eventName)) {
|
|
187
|
+
// TypeScript knows eventName is GraphConverter.EventName
|
|
188
|
+
console.log('Valid converter event:', eventName);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function isConverterEvent(name) {
|
|
192
|
+
const validNames = [
|
|
193
|
+
'conversion.started',
|
|
194
|
+
'conversion.processingNodes',
|
|
195
|
+
'conversion.processingEdges',
|
|
196
|
+
'conversion.complete',
|
|
197
|
+
'conversion.error',
|
|
198
|
+
];
|
|
199
|
+
return validNames.includes(name);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Example 7: Integration with event validator
|
|
203
|
+
*/
|
|
204
|
+
async function exampleWithValidator() {
|
|
205
|
+
const { EventValidator, createValidatedEmitter } = await import('../telemetry/event-validator');
|
|
206
|
+
const fs = await import('fs');
|
|
207
|
+
// Load canvas with schema
|
|
208
|
+
const canvas = JSON.parse(fs.readFileSync('.principal-views/graph-converter-execution.otel.canvas', 'utf-8'));
|
|
209
|
+
const validator = new EventValidator(canvas);
|
|
210
|
+
// Create validated emitter with generated types
|
|
211
|
+
const emit = createValidatedEmitter(validator, 'graph-converter', (eventName, attributes) => {
|
|
212
|
+
console.log('Validated event:', eventName, attributes);
|
|
213
|
+
});
|
|
214
|
+
// ✅ Both type-safe (TypeScript) AND runtime validated (EventValidator)
|
|
215
|
+
emit('conversion.started', {
|
|
216
|
+
'config.nodeTypes': 2,
|
|
217
|
+
'config.edgeTypes': 1,
|
|
218
|
+
});
|
|
219
|
+
// ❌ TypeScript error at compile-time
|
|
220
|
+
// ❌ Runtime validation error
|
|
221
|
+
// emit('conversion.started', {
|
|
222
|
+
// 'config.nodeTypes': 'wrong', // TypeScript + runtime error!
|
|
223
|
+
// });
|
|
224
|
+
}
|
|
225
|
+
export { exampleFullEventEmitter, exampleEventEmitterByName, GraphConverterService, exampleMultipleNodes, exampleEventHandler, exampleEventNameChecking, exampleWithValidator, };
|
|
226
|
+
//# sourceMappingURL=usage-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-example.js","sourceRoot":"","sources":["../../src/codegen/usage-example.ts"],"names":[],"mappings":"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"}
|