@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.
Files changed (56) hide show
  1. package/dist/cli/codegen.d.ts +41 -0
  2. package/dist/cli/codegen.d.ts.map +1 -0
  3. package/dist/cli/codegen.js +247 -0
  4. package/dist/cli/codegen.js.map +1 -0
  5. package/dist/codegen/type-generator.d.ts +112 -0
  6. package/dist/codegen/type-generator.d.ts.map +1 -0
  7. package/dist/codegen/type-generator.js +302 -0
  8. package/dist/codegen/type-generator.js.map +1 -0
  9. package/dist/codegen/usage-example.d.ts +103 -0
  10. package/dist/codegen/usage-example.d.ts.map +1 -0
  11. package/dist/codegen/usage-example.js +226 -0
  12. package/dist/codegen/usage-example.js.map +1 -0
  13. package/dist/generated/graph-converter-execution.types.d.ts +177 -0
  14. package/dist/generated/graph-converter-execution.types.d.ts.map +1 -0
  15. package/dist/generated/graph-converter-execution.types.js +11 -0
  16. package/dist/generated/graph-converter-execution.types.js.map +1 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +8 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/rules/engine.d.ts.map +1 -1
  22. package/dist/rules/engine.js +153 -37
  23. package/dist/rules/engine.js.map +1 -1
  24. package/dist/telemetry/coverage.d.ts +38 -0
  25. package/dist/telemetry/coverage.d.ts.map +1 -0
  26. package/dist/telemetry/coverage.js +113 -0
  27. package/dist/telemetry/coverage.js.map +1 -0
  28. package/dist/telemetry/event-validator.d.ts +72 -0
  29. package/dist/telemetry/event-validator.d.ts.map +1 -0
  30. package/dist/telemetry/event-validator.js +153 -0
  31. package/dist/telemetry/event-validator.js.map +1 -0
  32. package/dist/types/audit.d.ts.map +1 -1
  33. package/dist/types/audit.js.map +1 -1
  34. package/dist/types/canvas.d.ts +47 -0
  35. package/dist/types/canvas.d.ts.map +1 -1
  36. package/dist/types/canvas.js.map +1 -1
  37. package/dist/utils/TraceToCanvas.d.ts +83 -0
  38. package/dist/utils/TraceToCanvas.d.ts.map +1 -0
  39. package/dist/utils/TraceToCanvas.js +335 -0
  40. package/dist/utils/TraceToCanvas.js.map +1 -0
  41. package/package.json +6 -1
  42. package/src/ValidationEngine.test.ts +347 -196
  43. package/src/cli/codegen.ts +284 -0
  44. package/src/codegen/type-generator.test.ts +224 -0
  45. package/src/codegen/type-generator.ts +414 -0
  46. package/src/codegen/usage-example.ts +356 -0
  47. package/src/generated/graph-converter-execution.types.ts +193 -0
  48. package/src/index.ts +21 -0
  49. package/src/rules/engine.ts +171 -42
  50. package/src/telemetry/coverage.ts +162 -0
  51. package/src/telemetry/event-validator.ts +195 -0
  52. package/src/types/audit.ts +1 -5
  53. package/src/types/canvas.ts +51 -0
  54. package/src/utils/GraphConverter.test.ts +327 -88
  55. package/src/utils/TraceToCanvas.test.ts +308 -0
  56. 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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"}