@principal-ai/principal-view-core 0.5.14 → 0.5.16
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 +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -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/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 +17 -0
- package/src/rules/engine.ts +171 -42
- 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 +248 -88
- package/src/utils/TraceToCanvas.test.ts +308 -0
- package/src/utils/TraceToCanvas.ts +514 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Code Generation CLI
|
|
4
|
+
*
|
|
5
|
+
* Generate types from canvas files.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx @principal-ai/principal-view-core codegen my-flow.canvas
|
|
9
|
+
* npx @principal-ai/principal-view-core codegen --lang typescript --output types/ my-flow.canvas
|
|
10
|
+
*
|
|
11
|
+
* Similar to:
|
|
12
|
+
* - graphql-codegen (GraphQL)
|
|
13
|
+
* - openapi-generator (OpenAPI)
|
|
14
|
+
* - protoc (Protobuf)
|
|
15
|
+
*/
|
|
16
|
+
interface CliOptions {
|
|
17
|
+
language: 'typescript' | 'python' | 'go' | 'rust';
|
|
18
|
+
output?: string;
|
|
19
|
+
readonly?: boolean;
|
|
20
|
+
strictNullChecks?: boolean;
|
|
21
|
+
includeDocComments?: boolean;
|
|
22
|
+
namespace?: string;
|
|
23
|
+
watch?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse command line arguments
|
|
27
|
+
*/
|
|
28
|
+
declare function parseArgs(args: string[]): {
|
|
29
|
+
options: CliOptions;
|
|
30
|
+
canvasFiles: string[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Generate types for a canvas file
|
|
34
|
+
*/
|
|
35
|
+
declare function generateTypesForFile(canvasPath: string, options: CliOptions): string;
|
|
36
|
+
/**
|
|
37
|
+
* Main entry point
|
|
38
|
+
*/
|
|
39
|
+
declare function main(): void;
|
|
40
|
+
export { main, parseArgs, generateTypesForFile };
|
|
41
|
+
//# sourceMappingURL=codegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/cli/codegen.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAQH,UAAU,UAAU;IAClB,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAqDjF;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,UA2DpE;AAkED;;GAEG;AACH,iBAAS,IAAI,SAuDZ;AAOD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Code Generation CLI
|
|
4
|
+
*
|
|
5
|
+
* Generate types from canvas files.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx @principal-ai/principal-view-core codegen my-flow.canvas
|
|
9
|
+
* npx @principal-ai/principal-view-core codegen --lang typescript --output types/ my-flow.canvas
|
|
10
|
+
*
|
|
11
|
+
* Similar to:
|
|
12
|
+
* - graphql-codegen (GraphQL)
|
|
13
|
+
* - openapi-generator (OpenAPI)
|
|
14
|
+
* - protoc (Protobuf)
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import { generateTypes, generatorRegistry } from '../codegen/type-generator';
|
|
19
|
+
/**
|
|
20
|
+
* Parse command line arguments
|
|
21
|
+
*/
|
|
22
|
+
function parseArgs(args) {
|
|
23
|
+
const options = {
|
|
24
|
+
language: 'typescript',
|
|
25
|
+
includeDocComments: true,
|
|
26
|
+
strictNullChecks: true,
|
|
27
|
+
};
|
|
28
|
+
const canvasFiles = [];
|
|
29
|
+
for (let i = 0; i < args.length; i++) {
|
|
30
|
+
const arg = args[i];
|
|
31
|
+
switch (arg) {
|
|
32
|
+
case '--lang':
|
|
33
|
+
case '-l':
|
|
34
|
+
options.language = args[++i];
|
|
35
|
+
break;
|
|
36
|
+
case '--output':
|
|
37
|
+
case '-o':
|
|
38
|
+
options.output = args[++i];
|
|
39
|
+
break;
|
|
40
|
+
case '--readonly':
|
|
41
|
+
options.readonly = true;
|
|
42
|
+
break;
|
|
43
|
+
case '--no-strict-null-checks':
|
|
44
|
+
options.strictNullChecks = false;
|
|
45
|
+
break;
|
|
46
|
+
case '--no-doc-comments':
|
|
47
|
+
options.includeDocComments = false;
|
|
48
|
+
break;
|
|
49
|
+
case '--namespace':
|
|
50
|
+
case '-n':
|
|
51
|
+
options.namespace = args[++i];
|
|
52
|
+
break;
|
|
53
|
+
case '--watch':
|
|
54
|
+
case '-w':
|
|
55
|
+
options.watch = true;
|
|
56
|
+
break;
|
|
57
|
+
case '--help':
|
|
58
|
+
case '-h':
|
|
59
|
+
printHelp();
|
|
60
|
+
process.exit(0);
|
|
61
|
+
case '--list-generators':
|
|
62
|
+
listGenerators();
|
|
63
|
+
process.exit(0);
|
|
64
|
+
default:
|
|
65
|
+
if (!arg.startsWith('--')) {
|
|
66
|
+
canvasFiles.push(arg);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { options, canvasFiles };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate types for a canvas file
|
|
74
|
+
*/
|
|
75
|
+
function generateTypesForFile(canvasPath, options) {
|
|
76
|
+
console.log(`📝 Generating types from ${canvasPath}...`);
|
|
77
|
+
// Read canvas file
|
|
78
|
+
const canvas = JSON.parse(fs.readFileSync(canvasPath, 'utf-8'));
|
|
79
|
+
// Generate types
|
|
80
|
+
const codegenOptions = {
|
|
81
|
+
language: options.language,
|
|
82
|
+
style: {
|
|
83
|
+
readonly: options.readonly,
|
|
84
|
+
strictNullChecks: options.strictNullChecks,
|
|
85
|
+
includeDocComments: options.includeDocComments,
|
|
86
|
+
},
|
|
87
|
+
namespace: options.namespace,
|
|
88
|
+
};
|
|
89
|
+
const result = generateTypes(canvas, codegenOptions);
|
|
90
|
+
// Determine output path
|
|
91
|
+
let outputPath;
|
|
92
|
+
if (options.output) {
|
|
93
|
+
// If output is a directory, use generated filename
|
|
94
|
+
if (fs.existsSync(options.output) && fs.statSync(options.output).isDirectory()) {
|
|
95
|
+
outputPath = path.join(options.output, result.filename);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
outputPath = options.output;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Default: packages/core/src/generated/ for .principal-views canvases
|
|
103
|
+
// This keeps canvas files in .principal-views/ but generates types to idiomatic locations
|
|
104
|
+
const canvasDir = path.dirname(canvasPath);
|
|
105
|
+
const canvasAbsPath = path.resolve(canvasPath);
|
|
106
|
+
if (canvasAbsPath.includes('.principal-views')) {
|
|
107
|
+
// Canvas is in .principal-views/, output to packages/core/src/generated/
|
|
108
|
+
const repoRoot = canvasAbsPath.split('.principal-views')[0];
|
|
109
|
+
const generatedDir = path.join(repoRoot, 'packages', 'core', 'src', 'generated');
|
|
110
|
+
outputPath = path.join(generatedDir, result.filename);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Canvas is elsewhere, use same directory
|
|
114
|
+
outputPath = path.join(canvasDir, result.filename);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Ensure output directory exists
|
|
118
|
+
const outputDir = path.dirname(outputPath);
|
|
119
|
+
if (!fs.existsSync(outputDir)) {
|
|
120
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
121
|
+
}
|
|
122
|
+
// Write types file
|
|
123
|
+
fs.writeFileSync(outputPath, result.code);
|
|
124
|
+
console.log(`✅ Generated ${outputPath}`);
|
|
125
|
+
console.log(` Language: ${options.language}`);
|
|
126
|
+
console.log(` Size: ${result.code.length} bytes`);
|
|
127
|
+
return outputPath;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Print help message
|
|
131
|
+
*/
|
|
132
|
+
function printHelp() {
|
|
133
|
+
console.log(`
|
|
134
|
+
Code Generation CLI - Generate types from canvas files
|
|
135
|
+
|
|
136
|
+
USAGE:
|
|
137
|
+
npx @principal-ai/principal-view-core codegen [OPTIONS] <canvas-files...>
|
|
138
|
+
|
|
139
|
+
OPTIONS:
|
|
140
|
+
-l, --lang <language> Target language (typescript|python|go|rust) [default: typescript]
|
|
141
|
+
-o, --output <path> Output file or directory [default: same as canvas]
|
|
142
|
+
-n, --namespace <name> Wrap types in a namespace
|
|
143
|
+
--readonly Use readonly modifiers (TypeScript)
|
|
144
|
+
--no-strict-null-checks Disable strict null checks
|
|
145
|
+
--no-doc-comments Omit JSDoc comments
|
|
146
|
+
-w, --watch Watch for changes and regenerate
|
|
147
|
+
--list-generators List available code generators
|
|
148
|
+
-h, --help Show this help message
|
|
149
|
+
|
|
150
|
+
EXAMPLES:
|
|
151
|
+
# Generate TypeScript types
|
|
152
|
+
npx @principal-ai/principal-view-core codegen my-flow.canvas
|
|
153
|
+
|
|
154
|
+
# Generate with namespace
|
|
155
|
+
npx @principal-ai/principal-view-core codegen --namespace Events my-flow.canvas
|
|
156
|
+
|
|
157
|
+
# Generate to specific output directory
|
|
158
|
+
npx @principal-ai/principal-view-core codegen --output src/types/ my-flow.canvas
|
|
159
|
+
|
|
160
|
+
# Generate multiple files
|
|
161
|
+
npx @principal-ai/principal-view-core codegen *.canvas
|
|
162
|
+
|
|
163
|
+
# Watch mode (future)
|
|
164
|
+
npx @principal-ai/principal-view-core codegen --watch my-flow.canvas
|
|
165
|
+
|
|
166
|
+
PRECEDENTS:
|
|
167
|
+
This tool follows patterns from:
|
|
168
|
+
- GraphQL Code Generator (graphql-code-generator.com)
|
|
169
|
+
- OpenAPI Generator (openapi-generator.tech)
|
|
170
|
+
- Protobuf Compiler (protoc)
|
|
171
|
+
|
|
172
|
+
Like these tools, it generates type-safe code from declarative schemas.
|
|
173
|
+
`);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* List available generators
|
|
177
|
+
*/
|
|
178
|
+
function listGenerators() {
|
|
179
|
+
console.log('\nAvailable Code Generators:\n');
|
|
180
|
+
const languages = generatorRegistry.list();
|
|
181
|
+
for (const lang of languages) {
|
|
182
|
+
const generator = generatorRegistry.get(lang);
|
|
183
|
+
console.log(` • ${lang.padEnd(15)} ${generator ? '✓' : '✗'}`);
|
|
184
|
+
}
|
|
185
|
+
console.log('\nTo add support for more languages, implement the CodeGenerator interface.');
|
|
186
|
+
console.log('See: packages/core/src/codegen/type-generator.ts\n');
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Main entry point
|
|
190
|
+
*/
|
|
191
|
+
function main() {
|
|
192
|
+
const { options, canvasFiles } = parseArgs(process.argv.slice(2));
|
|
193
|
+
if (canvasFiles.length === 0) {
|
|
194
|
+
console.error('❌ Error: No canvas files specified\n');
|
|
195
|
+
printHelp();
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
// Validate language
|
|
199
|
+
const availableLanguages = generatorRegistry.list();
|
|
200
|
+
if (!availableLanguages.includes(options.language)) {
|
|
201
|
+
console.error(`❌ Error: Unsupported language '${options.language}'`);
|
|
202
|
+
console.error(` Available: ${availableLanguages.join(', ')}\n`);
|
|
203
|
+
listGenerators();
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
// Generate types for each file
|
|
207
|
+
const outputFiles = [];
|
|
208
|
+
for (const canvasFile of canvasFiles) {
|
|
209
|
+
try {
|
|
210
|
+
// Check if file exists
|
|
211
|
+
if (!fs.existsSync(canvasFile)) {
|
|
212
|
+
console.error(`❌ Error: File not found: ${canvasFile}`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const outputPath = generateTypesForFile(canvasFile, options);
|
|
216
|
+
outputFiles.push(outputPath);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error(`❌ Error processing ${canvasFile}:`, error);
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
console.log(`\n✨ Successfully generated ${outputFiles.length} type file(s)\n`);
|
|
224
|
+
// Watch mode
|
|
225
|
+
if (options.watch) {
|
|
226
|
+
console.log('👀 Watching for changes...');
|
|
227
|
+
for (const canvasFile of canvasFiles) {
|
|
228
|
+
fs.watch(canvasFile, (eventType) => {
|
|
229
|
+
if (eventType === 'change') {
|
|
230
|
+
console.log(`\n🔄 ${canvasFile} changed, regenerating...`);
|
|
231
|
+
try {
|
|
232
|
+
generateTypesForFile(canvasFile, options);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.error('❌ Error:', error);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Run CLI if executed directly
|
|
243
|
+
if (require.main === module) {
|
|
244
|
+
main();
|
|
245
|
+
}
|
|
246
|
+
export { main, parseArgs, generateTypesForFile };
|
|
247
|
+
//# sourceMappingURL=codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/cli/codegen.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAc7E;;GAEG;AACH,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAe;QAC1B,QAAQ,EAAE,YAAY;QACtB,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,IAAI;KACvB,CAAC;IAEF,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAA2B,CAAC;gBACvD,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACxB,MAAM;YACR,KAAK,yBAAyB;gBAC5B,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBACjC,MAAM;YACR,KAAK,mBAAmB;gBACtB,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBACnC,MAAM;YACR,KAAK,aAAa,CAAC;YACnB,KAAK,IAAI;gBACP,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,IAAI;gBACP,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,KAAK,mBAAmB;gBACtB,cAAc,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB;gBACE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,UAAkB,EAAE,OAAmB;IACnE,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,KAAK,CAAC,CAAC;IAEzD,mBAAmB;IACnB,MAAM,MAAM,GAAmB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhF,iBAAiB;IACjB,MAAM,cAAc,GAAmB;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C;QACD,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;IAEF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAErD,wBAAwB;IACxB,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,mDAAmD;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/E,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,0FAA0F;QAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE/C,IAAI,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC/C,yEAAyE;YACzE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACjF,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;IACnB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC;IAEpD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCb,CAAC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,IAAI;IACX,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,kCAAkC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,uBAAuB;YACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;gBACxD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC7D,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAE/E,aAAa;IACb,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;gBACjC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,2BAA2B,CAAC,CAAC;oBAC3D,IAAI,CAAC;wBACH,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAC5C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,+BAA+B;AAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC;AACT,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|
+
import type { ExtendedCanvas } from '../types/canvas';
|
|
15
|
+
/**
|
|
16
|
+
* Code generation options
|
|
17
|
+
*/
|
|
18
|
+
export interface CodegenOptions {
|
|
19
|
+
/** Output language (extensible for future languages) */
|
|
20
|
+
language: 'typescript' | 'python' | 'go' | 'rust';
|
|
21
|
+
/** Style preferences */
|
|
22
|
+
style?: {
|
|
23
|
+
/** Use readonly for immutable types */
|
|
24
|
+
readonly?: boolean;
|
|
25
|
+
/** Use strict null checks */
|
|
26
|
+
strictNullChecks?: boolean;
|
|
27
|
+
/** Generate JSDoc comments */
|
|
28
|
+
includeDocComments?: boolean;
|
|
29
|
+
};
|
|
30
|
+
/** Namespace/module name */
|
|
31
|
+
namespace?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generated code result
|
|
35
|
+
*/
|
|
36
|
+
export interface CodegenResult {
|
|
37
|
+
/** Generated code content */
|
|
38
|
+
code: string;
|
|
39
|
+
/** File extension for the language */
|
|
40
|
+
extension: string;
|
|
41
|
+
/** Suggested filename */
|
|
42
|
+
filename: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Abstract code generator interface
|
|
46
|
+
*
|
|
47
|
+
* This allows us to implement generators for different languages
|
|
48
|
+
* following the same pattern as OpenAPI generators.
|
|
49
|
+
*/
|
|
50
|
+
export interface CodeGenerator {
|
|
51
|
+
/** Target language */
|
|
52
|
+
language: string;
|
|
53
|
+
/** Generate code from canvas */
|
|
54
|
+
generate(canvas: ExtendedCanvas, options?: CodegenOptions): CodegenResult;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* TypeScript Type Generator
|
|
58
|
+
*
|
|
59
|
+
* Generates TypeScript types from canvas event schemas.
|
|
60
|
+
* Similar to GraphQL Code Generator but for canvas schemas.
|
|
61
|
+
*/
|
|
62
|
+
export declare class TypeScriptGenerator implements CodeGenerator {
|
|
63
|
+
language: string;
|
|
64
|
+
generate(canvas: ExtendedCanvas, options?: CodegenOptions): CodegenResult;
|
|
65
|
+
private generateNodeTypes;
|
|
66
|
+
private generateEventInterface;
|
|
67
|
+
private generateEventNameUnion;
|
|
68
|
+
private generateEmitterTypes;
|
|
69
|
+
private nodeIdToTypeName;
|
|
70
|
+
private eventNameToTypeName;
|
|
71
|
+
private fieldTypeToTsType;
|
|
72
|
+
private generateFilename;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate types from canvas
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* import fs from 'fs';
|
|
80
|
+
* import { generateTypes } from '@principal-ai/principal-view-core';
|
|
81
|
+
*
|
|
82
|
+
* const canvas = JSON.parse(fs.readFileSync('my-flow.canvas', 'utf-8'));
|
|
83
|
+
* const result = generateTypes(canvas, { language: 'typescript' });
|
|
84
|
+
*
|
|
85
|
+
* fs.writeFileSync(result.filename, result.code);
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function generateTypes(canvas: ExtendedCanvas, options?: CodegenOptions): CodegenResult;
|
|
89
|
+
/**
|
|
90
|
+
* Registry of available generators
|
|
91
|
+
*
|
|
92
|
+
* This allows external packages to register custom generators:
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* import { generatorRegistry } from '@principal-ai/principal-view-core';
|
|
97
|
+
*
|
|
98
|
+
* class PythonGenerator implements CodeGenerator {
|
|
99
|
+
* language = 'python';
|
|
100
|
+
* generate(canvas, options) { ... }
|
|
101
|
+
* }
|
|
102
|
+
*
|
|
103
|
+
* generatorRegistry.register(new PythonGenerator());
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare const generatorRegistry: {
|
|
107
|
+
generators: Map<string, CodeGenerator>;
|
|
108
|
+
register(generator: CodeGenerator): void;
|
|
109
|
+
get(language: string): CodeGenerator | undefined;
|
|
110
|
+
list(): string[];
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=type-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../src/codegen/type-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAqC,MAAM,iBAAiB,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;IAClD,wBAAwB;IACxB,KAAK,CAAC,EAAE;QACN,uCAAuC;QACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,6BAA6B;QAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,8BAA8B;QAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;CAC3E;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,SAAgB;IAExB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IA2DzE,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,oBAAoB;IAoD5B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,gBAAgB;CASzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,cAA2C,GACnD,aAAa,CAGf;AAuBD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB;;wBAKR,aAAa;kBAInB,MAAM,GAAG,aAAa,GAAG,SAAS;YAIxC,MAAM,EAAE;CAGjB,CAAC"}
|