@n8n-as-code/transformer 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.
Files changed (70) hide show
  1. package/README.md +215 -0
  2. package/dist/compiler/index.d.ts +6 -0
  3. package/dist/compiler/index.d.ts.map +1 -0
  4. package/dist/compiler/index.js +6 -0
  5. package/dist/compiler/index.js.map +1 -0
  6. package/dist/compiler/typescript-parser.d.ts +87 -0
  7. package/dist/compiler/typescript-parser.d.ts.map +1 -0
  8. package/dist/compiler/typescript-parser.js +379 -0
  9. package/dist/compiler/typescript-parser.js.map +1 -0
  10. package/dist/compiler/workflow-builder.d.ts +48 -0
  11. package/dist/compiler/workflow-builder.d.ts.map +1 -0
  12. package/dist/compiler/workflow-builder.js +231 -0
  13. package/dist/compiler/workflow-builder.js.map +1 -0
  14. package/dist/decorators/helpers.d.ts +27 -0
  15. package/dist/decorators/helpers.d.ts.map +1 -0
  16. package/dist/decorators/helpers.js +97 -0
  17. package/dist/decorators/helpers.js.map +1 -0
  18. package/dist/decorators/index.d.ts +11 -0
  19. package/dist/decorators/index.d.ts.map +1 -0
  20. package/dist/decorators/index.js +10 -0
  21. package/dist/decorators/index.js.map +1 -0
  22. package/dist/decorators/links.d.ts +70 -0
  23. package/dist/decorators/links.d.ts.map +1 -0
  24. package/dist/decorators/links.js +85 -0
  25. package/dist/decorators/links.js.map +1 -0
  26. package/dist/decorators/node.d.ts +32 -0
  27. package/dist/decorators/node.d.ts.map +1 -0
  28. package/dist/decorators/node.js +43 -0
  29. package/dist/decorators/node.js.map +1 -0
  30. package/dist/decorators/types.d.ts +122 -0
  31. package/dist/decorators/types.d.ts.map +1 -0
  32. package/dist/decorators/types.js +13 -0
  33. package/dist/decorators/types.js.map +1 -0
  34. package/dist/decorators/workflow.d.ts +32 -0
  35. package/dist/decorators/workflow.d.ts.map +1 -0
  36. package/dist/decorators/workflow.js +38 -0
  37. package/dist/decorators/workflow.js.map +1 -0
  38. package/dist/index.d.ts +14 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/parser/ast-to-typescript.d.ts +55 -0
  43. package/dist/parser/ast-to-typescript.d.ts.map +1 -0
  44. package/dist/parser/ast-to-typescript.js +337 -0
  45. package/dist/parser/ast-to-typescript.js.map +1 -0
  46. package/dist/parser/index.d.ts +6 -0
  47. package/dist/parser/index.d.ts.map +1 -0
  48. package/dist/parser/index.js +6 -0
  49. package/dist/parser/index.js.map +1 -0
  50. package/dist/parser/json-to-ast.d.ts +61 -0
  51. package/dist/parser/json-to-ast.d.ts.map +1 -0
  52. package/dist/parser/json-to-ast.js +222 -0
  53. package/dist/parser/json-to-ast.js.map +1 -0
  54. package/dist/types.d.ts +227 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +7 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/utils/formatting.d.ts +33 -0
  59. package/dist/utils/formatting.d.ts.map +1 -0
  60. package/dist/utils/formatting.js +83 -0
  61. package/dist/utils/formatting.js.map +1 -0
  62. package/dist/utils/index.d.ts +6 -0
  63. package/dist/utils/index.d.ts.map +1 -0
  64. package/dist/utils/index.js +6 -0
  65. package/dist/utils/index.js.map +1 -0
  66. package/dist/utils/naming.d.ts +39 -0
  67. package/dist/utils/naming.d.ts.map +1 -0
  68. package/dist/utils/naming.js +161 -0
  69. package/dist/utils/naming.js.map +1 -0
  70. package/package.json +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-to-ast.js","sourceRoot":"","sources":["../../src/parser/json-to-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Core Types for n8n Workflow Transformer
3
+ *
4
+ * Bidirectional transformation: n8n JSON ↔ TypeScript
5
+ */
6
+ /**
7
+ * Intermediate AST representation of a workflow
8
+ * Used as bridge between JSON and TypeScript
9
+ */
10
+ export interface WorkflowAST {
11
+ metadata: WorkflowMetadata;
12
+ nodes: NodeAST[];
13
+ connections: ConnectionAST[];
14
+ }
15
+ /**
16
+ * Workflow metadata (from @workflow decorator)
17
+ */
18
+ export interface WorkflowMetadata {
19
+ id: string;
20
+ name: string;
21
+ active: boolean;
22
+ settings?: WorkflowSettings;
23
+ projectId?: string;
24
+ projectName?: string;
25
+ homeProject?: {
26
+ id: string;
27
+ name: string;
28
+ type: string;
29
+ };
30
+ isArchived?: boolean;
31
+ }
32
+ /**
33
+ * Workflow settings
34
+ */
35
+ export interface WorkflowSettings {
36
+ executionOrder?: 'v0' | 'v1' | 'v2';
37
+ timeSavedMode?: 'fixed' | 'calculated';
38
+ errorWorkflow?: string;
39
+ timezone?: string;
40
+ saveManualExecutions?: boolean;
41
+ saveDataErrorExecution?: 'all' | 'none';
42
+ saveExecutionProgress?: boolean;
43
+ }
44
+ /**
45
+ * Node in AST representation
46
+ */
47
+ export interface NodeAST {
48
+ propertyName: string;
49
+ displayName: string;
50
+ type: string;
51
+ version: number;
52
+ position: [number, number];
53
+ credentials?: Record<string, CredentialReference>;
54
+ onError?: 'continueErrorOutput' | 'continueRegularOutput' | 'stopWorkflow';
55
+ parameters: Record<string, any>;
56
+ aiDependencies?: AIDependencies;
57
+ }
58
+ /**
59
+ * Credential reference
60
+ */
61
+ export interface CredentialReference {
62
+ id: string;
63
+ name: string;
64
+ }
65
+ /**
66
+ * AI node dependencies (langchain sub-nodes)
67
+ */
68
+ export interface AIDependencies {
69
+ ai_languageModel?: string;
70
+ ai_memory?: string;
71
+ ai_outputParser?: string;
72
+ ai_tool?: string[];
73
+ ai_agent?: string;
74
+ ai_chain?: string;
75
+ ai_document?: string[];
76
+ ai_textSplitter?: string;
77
+ ai_embedding?: string;
78
+ ai_retriever?: string;
79
+ ai_reranker?: string;
80
+ ai_vectorStore?: string;
81
+ }
82
+ /**
83
+ * Connection between nodes
84
+ */
85
+ export interface ConnectionAST {
86
+ from: {
87
+ node: string;
88
+ output: number;
89
+ isError?: boolean;
90
+ };
91
+ to: {
92
+ node: string;
93
+ input: number;
94
+ };
95
+ }
96
+ /**
97
+ * n8n workflow JSON structure
98
+ */
99
+ export interface N8nWorkflow {
100
+ id: string;
101
+ name: string;
102
+ active: boolean;
103
+ nodes: N8nNode[];
104
+ connections: N8nConnections;
105
+ settings?: WorkflowSettings;
106
+ tags?: string[];
107
+ projectId?: string;
108
+ projectName?: string;
109
+ homeProject?: {
110
+ id: string;
111
+ name: string;
112
+ type: string;
113
+ };
114
+ isArchived?: boolean;
115
+ versionId?: string;
116
+ activeVersionId?: string;
117
+ versionCounter?: number;
118
+ pinData?: any;
119
+ }
120
+ /**
121
+ * n8n node JSON structure
122
+ */
123
+ export interface N8nNode {
124
+ id?: string;
125
+ name: string;
126
+ type: string;
127
+ typeVersion?: number;
128
+ position: [number, number];
129
+ parameters: Record<string, any>;
130
+ credentials?: Record<string, CredentialReference>;
131
+ onError?: 'continueErrorOutput' | 'continueRegularOutput' | 'stopWorkflow';
132
+ }
133
+ /**
134
+ * n8n connections structure
135
+ *
136
+ * Format: { [sourceNodeName]: { [outputType]: [ [{ node, type, index }] ] } }
137
+ */
138
+ export interface N8nConnections {
139
+ [sourceNodeName: string]: {
140
+ [outputType: string]: Array<Array<{
141
+ node: string;
142
+ type: string;
143
+ index: number;
144
+ }>>;
145
+ };
146
+ }
147
+ /**
148
+ * Options for JSON → TypeScript transformation
149
+ */
150
+ export interface JsonToTypeScriptOptions {
151
+ /** Apply Prettier formatting to generated code */
152
+ format?: boolean;
153
+ /** Comment style for generated code */
154
+ commentStyle?: 'minimal' | 'verbose';
155
+ /** Group nodes by type in comments */
156
+ groupNodes?: boolean;
157
+ /** Auto-layout positions (for AI-generated workflows) */
158
+ autoLayout?: boolean;
159
+ /** Class name (if not derived from workflow name) */
160
+ className?: string;
161
+ }
162
+ /**
163
+ * Options for TypeScript → JSON transformation
164
+ */
165
+ export interface TypeScriptToJsonOptions {
166
+ /** Validate against n8n schema */
167
+ validate?: boolean;
168
+ /** Generate deterministic node IDs (for testing) */
169
+ deterministicIds?: boolean;
170
+ }
171
+ /**
172
+ * Validation result
173
+ */
174
+ export interface ValidationResult {
175
+ valid: boolean;
176
+ errors: ValidationError[];
177
+ warnings?: ValidationWarning[];
178
+ }
179
+ /**
180
+ * Validation error
181
+ */
182
+ export interface ValidationError {
183
+ type: 'syntax' | 'structure' | 'reference' | 'schema';
184
+ message: string;
185
+ location?: {
186
+ file?: string;
187
+ line?: number;
188
+ column?: number;
189
+ node?: string;
190
+ };
191
+ }
192
+ /**
193
+ * Validation warning
194
+ */
195
+ export interface ValidationWarning {
196
+ type: 'deprecated' | 'performance' | 'best-practice';
197
+ message: string;
198
+ location?: {
199
+ node?: string;
200
+ };
201
+ }
202
+ /**
203
+ * Property name generation context
204
+ * Tracks used names to avoid collisions
205
+ */
206
+ export interface PropertyNameContext {
207
+ usedNames: Set<string>;
208
+ collisionCounter: Map<string, number>;
209
+ }
210
+ /**
211
+ * Position for auto-layout
212
+ */
213
+ export interface LayoutPosition {
214
+ x: number;
215
+ y: number;
216
+ }
217
+ /**
218
+ * Auto-layout configuration
219
+ */
220
+ export interface AutoLayoutConfig {
221
+ startX: number;
222
+ startY: number;
223
+ horizontalSpacing: number;
224
+ verticalSpacing: number;
225
+ columnWidth: number;
226
+ }
227
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core Types for n8n Workflow Transformer
3
+ *
4
+ * Bidirectional transformation: n8n JSON ↔ TypeScript
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Code formatting utilities
3
+ *
4
+ * Handles:
5
+ * - Prettier integration
6
+ * - Comment generation
7
+ * - Code structure formatting
8
+ */
9
+ /**
10
+ * Format TypeScript code with Prettier
11
+ */
12
+ export declare function formatTypeScript(code: string): Promise<string>;
13
+ /**
14
+ * Generate section comment
15
+ */
16
+ export declare function generateSectionComment(title: string, style?: 'minimal' | 'verbose'): string;
17
+ /**
18
+ * Generate inline comment
19
+ */
20
+ export declare function generateInlineComment(text: string): string;
21
+ /**
22
+ * Indent code block
23
+ */
24
+ export declare function indent(code: string, level?: number, spaces?: number): string;
25
+ /**
26
+ * Generate import statement
27
+ */
28
+ export declare function generateImportStatement(items: string[], from: string): string;
29
+ /**
30
+ * Wrap object in braces with proper formatting
31
+ */
32
+ export declare function formatObject(obj: Record<string, any>, inline?: boolean): string;
33
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAepE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,GAAG,SAAqB,GAAG,MAAM,CAOtG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAMlF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAE,OAAe,GAAG,MAAM,CAqBtF"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Code formatting utilities
3
+ *
4
+ * Handles:
5
+ * - Prettier integration
6
+ * - Comment generation
7
+ * - Code structure formatting
8
+ */
9
+ import * as prettier from 'prettier';
10
+ /**
11
+ * Format TypeScript code with Prettier
12
+ */
13
+ export async function formatTypeScript(code) {
14
+ try {
15
+ return await prettier.format(code, {
16
+ parser: 'typescript',
17
+ singleQuote: true,
18
+ trailingComma: 'es5',
19
+ tabWidth: 4,
20
+ printWidth: 120,
21
+ semi: true,
22
+ arrowParens: 'always',
23
+ });
24
+ }
25
+ catch (error) {
26
+ console.warn('Prettier formatting failed, returning unformatted code:', error);
27
+ return code;
28
+ }
29
+ }
30
+ /**
31
+ * Generate section comment
32
+ */
33
+ export function generateSectionComment(title, style = 'verbose') {
34
+ if (style === 'minimal') {
35
+ return `// ${title}`;
36
+ }
37
+ const separator = '='.repeat(69);
38
+ return `// ${separator}\n// ${title}\n// ${separator}`;
39
+ }
40
+ /**
41
+ * Generate inline comment
42
+ */
43
+ export function generateInlineComment(text) {
44
+ return `// ${text}`;
45
+ }
46
+ /**
47
+ * Indent code block
48
+ */
49
+ export function indent(code, level = 1, spaces = 4) {
50
+ const indentation = ' '.repeat(level * spaces);
51
+ return code
52
+ .split('\n')
53
+ .map(line => line.length > 0 ? indentation + line : line)
54
+ .join('\n');
55
+ }
56
+ /**
57
+ * Generate import statement
58
+ */
59
+ export function generateImportStatement(items, from) {
60
+ return `import { ${items.join(', ')} } from '${from}';`;
61
+ }
62
+ /**
63
+ * Wrap object in braces with proper formatting
64
+ */
65
+ export function formatObject(obj, inline = false) {
66
+ if (Object.keys(obj).length === 0) {
67
+ return '{}';
68
+ }
69
+ if (inline && Object.keys(obj).length === 1) {
70
+ const [key, value] = Object.entries(obj)[0];
71
+ return `{ ${key}: ${JSON.stringify(value)} }`;
72
+ }
73
+ // Multi-line format
74
+ const entries = Object.entries(obj).map(([key, value]) => {
75
+ const formattedValue = JSON.stringify(value, null, 4)
76
+ .split('\n')
77
+ .map((line, i) => i === 0 ? line : ' ' + line)
78
+ .join('\n');
79
+ return ` ${key}: ${formattedValue}`;
80
+ });
81
+ return `{\n${entries.join(',\n')}\n}`;
82
+ }
83
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export { createPropertyNameContext, generatePropertyName, generateClassName } from './naming.js';
5
+ export { formatTypeScript, generateSectionComment, generateInlineComment, generateImportStatement, indent, formatObject } from './formatting.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,MAAM,EACN,YAAY,EACf,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export { createPropertyNameContext, generatePropertyName, generateClassName } from './naming.js';
5
+ export { formatTypeScript, generateSectionComment, generateInlineComment, generateImportStatement, indent, formatObject } from './formatting.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,MAAM,EACN,YAAY,EACf,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Name generation utilities
3
+ *
4
+ * Handles:
5
+ * - Convert display names to valid TypeScript identifiers
6
+ * - Handle name collisions (HttpRequest1, HttpRequest2, ...)
7
+ * - Sanitize special characters
8
+ */
9
+ import { PropertyNameContext } from '../types.js';
10
+ /**
11
+ * Create a property name context for tracking used names
12
+ */
13
+ export declare function createPropertyNameContext(): PropertyNameContext;
14
+ /**
15
+ * Generate a valid TypeScript property name from a node display name
16
+ *
17
+ * Rules:
18
+ * - Remove emojis and special characters
19
+ * - Convert to PascalCase
20
+ * - Handle collisions with numeric suffix (HttpRequest1, HttpRequest2)
21
+ * - Ensure valid JavaScript identifier
22
+ *
23
+ * @example
24
+ * "🕘 Schedule Trigger" → "ScheduleTrigger"
25
+ * "HTTP Request" → "HttpRequest"
26
+ * "HTTP Request" (2nd) → "HttpRequest1"
27
+ * "⚙️ Configuration" → "Configuration"
28
+ * "⚙️ Configuration" (2nd) → "Configuration1"
29
+ */
30
+ export declare function generatePropertyName(displayName: string, context: PropertyNameContext): string;
31
+ /**
32
+ * Generate a unique class name from workflow name
33
+ *
34
+ * @example
35
+ * "Job Application Assistant" → "JobApplicationAssistantWorkflow"
36
+ * "My Workflow" → "MyWorkflowWorkflow"
37
+ */
38
+ export declare function generateClassName(workflowName: string): string;
39
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CAK/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,mBAAmB,GAC7B,MAAM,CA4BR;AAwGD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAS9D"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Name generation utilities
3
+ *
4
+ * Handles:
5
+ * - Convert display names to valid TypeScript identifiers
6
+ * - Handle name collisions (HttpRequest1, HttpRequest2, ...)
7
+ * - Sanitize special characters
8
+ */
9
+ /**
10
+ * Create a property name context for tracking used names
11
+ */
12
+ export function createPropertyNameContext() {
13
+ return {
14
+ usedNames: new Set(),
15
+ collisionCounter: new Map()
16
+ };
17
+ }
18
+ /**
19
+ * Generate a valid TypeScript property name from a node display name
20
+ *
21
+ * Rules:
22
+ * - Remove emojis and special characters
23
+ * - Convert to PascalCase
24
+ * - Handle collisions with numeric suffix (HttpRequest1, HttpRequest2)
25
+ * - Ensure valid JavaScript identifier
26
+ *
27
+ * @example
28
+ * "🕘 Schedule Trigger" → "ScheduleTrigger"
29
+ * "HTTP Request" → "HttpRequest"
30
+ * "HTTP Request" (2nd) → "HttpRequest1"
31
+ * "⚙️ Configuration" → "Configuration"
32
+ * "⚙️ Configuration" (2nd) → "Configuration1"
33
+ */
34
+ export function generatePropertyName(displayName, context) {
35
+ // Step 1: Clean the name (remove emojis, special chars)
36
+ let cleaned = cleanDisplayName(displayName);
37
+ // Step 2: Convert to PascalCase
38
+ let baseName = toPascalCase(cleaned);
39
+ // Step 3: Ensure valid identifier
40
+ baseName = ensureValidIdentifier(baseName);
41
+ // Step 4: Handle collisions
42
+ let finalName = baseName;
43
+ if (context.usedNames.has(baseName)) {
44
+ // Get or initialize counter for this base name
45
+ const currentCount = context.collisionCounter.get(baseName) || 0;
46
+ const nextCount = currentCount + 1;
47
+ // Use numeric suffix (Agent → Agent1)
48
+ finalName = `${baseName}${nextCount}`;
49
+ context.collisionCounter.set(baseName, nextCount);
50
+ }
51
+ // Step 5: Register the final name
52
+ context.usedNames.add(finalName);
53
+ return finalName;
54
+ }
55
+ /**
56
+ * Clean display name: remove emojis, trim, normalize spaces
57
+ */
58
+ function cleanDisplayName(displayName) {
59
+ return displayName
60
+ // Remove emojis (Unicode emoji ranges)
61
+ .replace(/[\u{1F300}-\u{1F9FF}]/gu, '')
62
+ // Remove other special Unicode symbols
63
+ .replace(/[\u{2600}-\u{26FF}]/gu, '')
64
+ .replace(/[\u{2700}-\u{27BF}]/gu, '')
65
+ // Remove colons (common separator after emojis)
66
+ .replace(/^[\s:]+/, '')
67
+ // Normalize whitespace
68
+ .replace(/\s+/g, ' ')
69
+ .trim();
70
+ }
71
+ /**
72
+ * Convert string to PascalCase
73
+ *
74
+ * @example
75
+ * "schedule trigger" → "ScheduleTrigger"
76
+ * "HTTP Request" → "HttpRequest"
77
+ * "split in batches" → "SplitInBatches"
78
+ */
79
+ function toPascalCase(str) {
80
+ return str
81
+ // Split on spaces, hyphens, underscores
82
+ .split(/[\s\-_]+/)
83
+ // Capitalize first letter of each word
84
+ .map(word => {
85
+ if (word.length === 0)
86
+ return '';
87
+ // Preserve acronyms (HTTP, AI, etc.)
88
+ if (word === word.toUpperCase() && word.length > 1) {
89
+ return word.charAt(0) + word.slice(1).toLowerCase();
90
+ }
91
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
92
+ })
93
+ .join('');
94
+ }
95
+ /**
96
+ * Transliterate accented/diacritic characters to their ASCII base equivalent
97
+ *
98
+ * @example
99
+ * "Mémoire" → "Memoire"
100
+ * "Ärger" → "Arger"
101
+ * "naïve" → "naive"
102
+ */
103
+ function transliterate(str) {
104
+ // NFD decomposes accented chars into base + combining diacritic, then strip diacritics
105
+ return str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
106
+ }
107
+ /**
108
+ * Ensure string is a valid JavaScript identifier
109
+ *
110
+ * - Must start with letter, $, or _
111
+ * - Can contain letters, digits, $, _
112
+ * - Cannot be a reserved word
113
+ */
114
+ function ensureValidIdentifier(name) {
115
+ // Transliterate accented characters before stripping (é→e, à→a, ü→u, …)
116
+ let cleaned = transliterate(name).replace(/[^a-zA-Z0-9_$]/g, '');
117
+ // If starts with number, prefix with underscore
118
+ if (/^\d/.test(cleaned)) {
119
+ cleaned = '_' + cleaned;
120
+ }
121
+ // If empty, use default name
122
+ if (cleaned.length === 0) {
123
+ cleaned = 'Node';
124
+ }
125
+ // If reserved word, append underscore
126
+ if (isReservedWord(cleaned)) {
127
+ cleaned = cleaned + '_';
128
+ }
129
+ return cleaned;
130
+ }
131
+ /**
132
+ * Check if string is a JavaScript reserved word
133
+ */
134
+ function isReservedWord(name) {
135
+ const reserved = new Set([
136
+ 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger',
137
+ 'default', 'delete', 'do', 'else', 'enum', 'export', 'extends',
138
+ 'false', 'finally', 'for', 'function', 'if', 'import', 'in',
139
+ 'instanceof', 'new', 'null', 'return', 'super', 'switch', 'this',
140
+ 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while', 'with',
141
+ 'yield', 'let', 'static', 'implements', 'interface', 'package',
142
+ 'private', 'protected', 'public'
143
+ ]);
144
+ return reserved.has(name.toLowerCase());
145
+ }
146
+ /**
147
+ * Generate a unique class name from workflow name
148
+ *
149
+ * @example
150
+ * "Job Application Assistant" → "JobApplicationAssistantWorkflow"
151
+ * "My Workflow" → "MyWorkflowWorkflow"
152
+ */
153
+ export function generateClassName(workflowName) {
154
+ const baseName = toPascalCase(cleanDisplayName(workflowName));
155
+ // Ensure ends with "Workflow" suffix
156
+ if (!baseName.endsWith('Workflow')) {
157
+ return `${baseName}Workflow`;
158
+ }
159
+ return baseName;
160
+ }
161
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@n8n-as-code/transformer",
3
+ "version": "0.2.0",
4
+ "description": "Bidirectional transformer: n8n JSON workflows ↔ TypeScript",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc -b",
10
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
11
+ "test": "vitest",
12
+ "test:watch": "vitest --watch",
13
+ "typecheck": "tsc --noEmit"
14
+ },
15
+ "dependencies": {
16
+ "reflect-metadata": "^0.2.1",
17
+ "ts-morph": "^21.0.1",
18
+ "prettier": "^3.2.5",
19
+ "uuid": "^9.0.1"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^20.10.0",
23
+ "@types/uuid": "^9.0.7",
24
+ "typescript": "^5.3.3",
25
+ "vitest": "^1.2.0"
26
+ },
27
+ "files": [
28
+ "dist/"
29
+ ],
30
+ "publishConfig": {
31
+ "access": "public"
32
+ }
33
+ }