glasswork 0.10.0 → 0.11.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 (93) hide show
  1. package/dist/email/compiler/code-generator.d.ts +11 -0
  2. package/dist/email/compiler/code-generator.d.ts.map +1 -0
  3. package/dist/email/compiler/code-generator.js +319 -0
  4. package/dist/email/compiler/code-generator.js.map +1 -0
  5. package/dist/email/compiler/compile-templates.d.ts +68 -0
  6. package/dist/email/compiler/compile-templates.d.ts.map +1 -0
  7. package/dist/email/compiler/compile-templates.js +156 -0
  8. package/dist/email/compiler/compile-templates.js.map +1 -0
  9. package/dist/email/compiler/compiler.d.ts +30 -0
  10. package/dist/email/compiler/compiler.d.ts.map +1 -0
  11. package/dist/email/compiler/compiler.js +510 -0
  12. package/dist/email/compiler/compiler.js.map +1 -0
  13. package/dist/email/compiler/index.d.ts +4 -0
  14. package/dist/email/compiler/index.d.ts.map +1 -0
  15. package/dist/email/compiler/index.js +3 -0
  16. package/dist/email/compiler/index.js.map +1 -0
  17. package/dist/email/compiler/tokenizer.d.ts +7 -0
  18. package/dist/email/compiler/tokenizer.d.ts.map +1 -0
  19. package/dist/email/compiler/tokenizer.js +154 -0
  20. package/dist/email/compiler/tokenizer.js.map +1 -0
  21. package/dist/email/compiler/type-extractor.d.ts +11 -0
  22. package/dist/email/compiler/type-extractor.d.ts.map +1 -0
  23. package/dist/email/compiler/type-extractor.js +296 -0
  24. package/dist/email/compiler/type-extractor.js.map +1 -0
  25. package/dist/email/compiler/types.d.ts +108 -0
  26. package/dist/email/compiler/types.d.ts.map +1 -0
  27. package/dist/email/compiler/types.js +2 -0
  28. package/dist/email/compiler/types.js.map +1 -0
  29. package/dist/email/config.d.ts +89 -0
  30. package/dist/email/config.d.ts.map +1 -0
  31. package/dist/email/config.js +55 -0
  32. package/dist/email/config.js.map +1 -0
  33. package/dist/email/email-service.d.ts +54 -0
  34. package/dist/email/email-service.d.ts.map +1 -0
  35. package/dist/email/email-service.js +94 -0
  36. package/dist/email/email-service.js.map +1 -0
  37. package/dist/email/index.d.ts +12 -0
  38. package/dist/email/index.d.ts.map +1 -0
  39. package/dist/email/index.js +23 -0
  40. package/dist/email/index.js.map +1 -0
  41. package/dist/email/template-registry.d.ts +83 -0
  42. package/dist/email/template-registry.d.ts.map +1 -0
  43. package/dist/email/template-registry.js +85 -0
  44. package/dist/email/template-registry.js.map +1 -0
  45. package/dist/email/templated-email-service.d.ts +59 -0
  46. package/dist/email/templated-email-service.d.ts.map +1 -0
  47. package/dist/email/templated-email-service.js +63 -0
  48. package/dist/email/templated-email-service.js.map +1 -0
  49. package/dist/email/transports/index.d.ts +3 -0
  50. package/dist/email/transports/index.d.ts.map +1 -0
  51. package/dist/email/transports/index.js +3 -0
  52. package/dist/email/transports/index.js.map +1 -0
  53. package/dist/email/transports/mock-transport.d.ts +74 -0
  54. package/dist/email/transports/mock-transport.d.ts.map +1 -0
  55. package/dist/email/transports/mock-transport.js +102 -0
  56. package/dist/email/transports/mock-transport.js.map +1 -0
  57. package/dist/email/transports/ses-transport.d.ts +65 -0
  58. package/dist/email/transports/ses-transport.d.ts.map +1 -0
  59. package/dist/email/transports/ses-transport.js +290 -0
  60. package/dist/email/transports/ses-transport.js.map +1 -0
  61. package/dist/email/types.d.ts +128 -0
  62. package/dist/email/types.d.ts.map +1 -0
  63. package/dist/email/types.js +2 -0
  64. package/dist/email/types.js.map +1 -0
  65. package/dist/email/webhooks/handler-factory.d.ts +41 -0
  66. package/dist/email/webhooks/handler-factory.d.ts.map +1 -0
  67. package/dist/email/webhooks/handler-factory.js +136 -0
  68. package/dist/email/webhooks/handler-factory.js.map +1 -0
  69. package/dist/email/webhooks/index.d.ts +6 -0
  70. package/dist/email/webhooks/index.d.ts.map +1 -0
  71. package/dist/email/webhooks/index.js +9 -0
  72. package/dist/email/webhooks/index.js.map +1 -0
  73. package/dist/email/webhooks/notification-parser.d.ts +45 -0
  74. package/dist/email/webhooks/notification-parser.d.ts.map +1 -0
  75. package/dist/email/webhooks/notification-parser.js +150 -0
  76. package/dist/email/webhooks/notification-parser.js.map +1 -0
  77. package/dist/email/webhooks/signature-verification.d.ts +38 -0
  78. package/dist/email/webhooks/signature-verification.d.ts.map +1 -0
  79. package/dist/email/webhooks/signature-verification.js +179 -0
  80. package/dist/email/webhooks/signature-verification.js.map +1 -0
  81. package/dist/email/webhooks/subscription-handler.d.ts +37 -0
  82. package/dist/email/webhooks/subscription-handler.d.ts.map +1 -0
  83. package/dist/email/webhooks/subscription-handler.js +99 -0
  84. package/dist/email/webhooks/subscription-handler.js.map +1 -0
  85. package/dist/email/webhooks/types.d.ts +187 -0
  86. package/dist/email/webhooks/types.d.ts.map +1 -0
  87. package/dist/email/webhooks/types.js +5 -0
  88. package/dist/email/webhooks/types.js.map +1 -0
  89. package/dist/index.d.ts +9 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +22 -0
  92. package/dist/index.js.map +1 -1
  93. package/package.json +10 -2
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Regex patterns for tokenizing templates
3
+ */
4
+ const PATTERNS = {
5
+ // Control flow markers in HTML comments
6
+ control: /<!--\s*@(if|elseif|else|each|end)(?:\s+([^-]*?))?\s*-->/g,
7
+ // Variable interpolation
8
+ variable: /\{\{([^}]+)\}\}/g,
9
+ };
10
+ /**
11
+ * Tokenizes a template string into a stream of tokens.
12
+ * Handles both control flow markers (<!-- @if -->) and variable interpolation ({{var}}).
13
+ */
14
+ export function tokenize(input) {
15
+ const tokens = [];
16
+ let lastIndex = 0;
17
+ // Find all control flow markers and variables
18
+ const allMatches = [];
19
+ // Collect control flow matches
20
+ const controlRegex = new RegExp(PATTERNS.control.source, 'g');
21
+ let match = controlRegex.exec(input);
22
+ while (match !== null) {
23
+ allMatches.push({ match, type: 'control' });
24
+ match = controlRegex.exec(input);
25
+ }
26
+ // Collect variable matches
27
+ const variableRegex = new RegExp(PATTERNS.variable.source, 'g');
28
+ match = variableRegex.exec(input);
29
+ while (match !== null) {
30
+ allMatches.push({ match, type: 'variable' });
31
+ match = variableRegex.exec(input);
32
+ }
33
+ // Sort by position
34
+ allMatches.sort((a, b) => a.match.index - b.match.index);
35
+ // Process matches in order
36
+ for (const { match, type } of allMatches) {
37
+ const start = match.index;
38
+ const end = start + match[0].length;
39
+ // Skip if this match is inside a previous match
40
+ if (start < lastIndex) {
41
+ continue;
42
+ }
43
+ // Add text token for content before this match
44
+ if (start > lastIndex) {
45
+ tokens.push(createTextToken(input, lastIndex, start));
46
+ }
47
+ if (type === 'control') {
48
+ tokens.push(createControlToken(match));
49
+ }
50
+ else {
51
+ tokens.push(createVariableToken(match));
52
+ }
53
+ lastIndex = end;
54
+ }
55
+ // Add remaining text
56
+ if (lastIndex < input.length) {
57
+ tokens.push(createTextToken(input, lastIndex, input.length));
58
+ }
59
+ return tokens;
60
+ }
61
+ function createTextToken(input, start, end) {
62
+ return {
63
+ type: 'text',
64
+ raw: input.slice(start, end),
65
+ content: input.slice(start, end),
66
+ start,
67
+ end,
68
+ };
69
+ }
70
+ function createControlToken(match) {
71
+ const [raw, directive, args] = match;
72
+ const start = match.index;
73
+ const end = start + raw.length;
74
+ const trimmedArgs = args?.trim();
75
+ switch (directive) {
76
+ case 'if':
77
+ return {
78
+ type: 'if',
79
+ raw,
80
+ start,
81
+ end,
82
+ condition: trimmedArgs || '',
83
+ };
84
+ case 'elseif':
85
+ return {
86
+ type: 'elseif',
87
+ raw,
88
+ start,
89
+ end,
90
+ condition: trimmedArgs || '',
91
+ };
92
+ case 'else':
93
+ return {
94
+ type: 'else',
95
+ raw,
96
+ start,
97
+ end,
98
+ };
99
+ case 'each':
100
+ return parseEachToken(raw, trimmedArgs || '', start, end);
101
+ case 'end':
102
+ return {
103
+ type: 'end',
104
+ raw,
105
+ start,
106
+ end,
107
+ };
108
+ default:
109
+ throw new Error(`Unknown directive: ${directive}`);
110
+ }
111
+ }
112
+ function parseEachToken(raw, args, start, end) {
113
+ // Parse: "items as item" or "items as item, index"
114
+ const eachMatch = args.match(/^(\S+)\s+as\s+(\w+)(?:\s*,\s*(\w+))?$/);
115
+ if (!eachMatch) {
116
+ throw new Error(`Invalid @each syntax: "${args}". Expected: "array as item" or "array as item, index"`);
117
+ }
118
+ return {
119
+ type: 'each',
120
+ raw,
121
+ start,
122
+ end,
123
+ arrayPath: eachMatch[1],
124
+ itemName: eachMatch[2],
125
+ indexName: eachMatch[3],
126
+ };
127
+ }
128
+ function createVariableToken(match) {
129
+ const [raw, expression] = match;
130
+ const start = match.index;
131
+ const end = start + raw.length;
132
+ const trimmedExpr = expression.trim();
133
+ // Check for default value: {{name ?? 'default'}}
134
+ const defaultMatch = trimmedExpr.match(/^(.+?)\s*\?\?\s*['"]([^'"]*)['"]\s*$/);
135
+ let path;
136
+ let defaultValue;
137
+ if (defaultMatch) {
138
+ path = defaultMatch[1].trim();
139
+ defaultValue = defaultMatch[2];
140
+ }
141
+ else {
142
+ path = trimmedExpr;
143
+ }
144
+ return {
145
+ type: 'variable',
146
+ raw,
147
+ start,
148
+ end,
149
+ expression: trimmedExpr,
150
+ path: path.split('.'),
151
+ defaultValue,
152
+ };
153
+ }
154
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/email/compiler/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { InferredType, Token } from './types.js';
2
+ /**
3
+ * Extracts and infers TypeScript types from template tokens.
4
+ * Analyzes variable usage to build a context interface.
5
+ */
6
+ export declare function extractTypes(tokens: Token[]): Map<string, InferredType>;
7
+ /**
8
+ * Generates a TypeScript interface from extracted types
9
+ */
10
+ export declare function generateInterface(name: string, types: Map<string, InferredType>): string;
11
+ //# sourceMappingURL=type-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-extractor.d.ts","sourceRoot":"","sources":["../../../src/email/compiler/type-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,YAAY,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AAEzF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAiCvE;AA+SD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,CASxF"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Extracts and infers TypeScript types from template tokens.
3
+ * Analyzes variable usage to build a context interface.
4
+ */
5
+ export function extractTypes(tokens) {
6
+ const types = new Map();
7
+ const loopContext = [];
8
+ for (const token of tokens) {
9
+ switch (token.type) {
10
+ case 'variable':
11
+ processVariable(token, types, loopContext);
12
+ break;
13
+ case 'if':
14
+ case 'elseif':
15
+ processCondition(token, types, loopContext);
16
+ break;
17
+ case 'each':
18
+ processEachStart(token, types);
19
+ loopContext.push({
20
+ itemName: token.itemName,
21
+ indexName: token.indexName,
22
+ arrayPath: token.arrayPath,
23
+ });
24
+ break;
25
+ case 'end':
26
+ // Check if we're ending a loop
27
+ if (loopContext.length > 0) {
28
+ // Only pop if the last context item was a loop
29
+ // We need smarter tracking for nested if/each, but for spike this works
30
+ loopContext.pop();
31
+ }
32
+ break;
33
+ }
34
+ }
35
+ return types;
36
+ }
37
+ function processVariable(token, types, loopContext) {
38
+ const path = token.path;
39
+ if (path.length === 0)
40
+ return;
41
+ const rootName = path[0];
42
+ // Skip loop context variables (@index, @first, @last, @length)
43
+ if (rootName.startsWith('@')) {
44
+ return;
45
+ }
46
+ // Check if this is a loop item reference
47
+ const loopCtx = loopContext.find((ctx) => ctx.itemName === rootName || ctx.indexName === rootName);
48
+ if (loopCtx && rootName === loopCtx.itemName) {
49
+ // This is accessing a loop item - add properties to the item type
50
+ addLoopItemProperty(loopCtx.arrayPath, path.slice(1), types, token);
51
+ return;
52
+ }
53
+ if (loopCtx && rootName === loopCtx.indexName) {
54
+ // Index is always a number, no need to track
55
+ return;
56
+ }
57
+ // Regular variable access
58
+ addNestedType(path, types, token.defaultValue !== undefined);
59
+ }
60
+ function ensureArrayType(rootName, types) {
61
+ if (!types.has(rootName)) {
62
+ types.set(rootName, {
63
+ name: rootName,
64
+ type: 'array',
65
+ optional: false,
66
+ itemType: { name: 'item', type: 'object', optional: false, properties: {} },
67
+ });
68
+ }
69
+ return types.get(rootName) || null;
70
+ }
71
+ function navigateToArrayType(rootType, arrayPathParts) {
72
+ let currentType = rootType;
73
+ for (let i = 1; i < arrayPathParts.length; i++) {
74
+ if (!currentType.properties) {
75
+ currentType.properties = {};
76
+ }
77
+ const propName = arrayPathParts[i];
78
+ if (!currentType.properties[propName]) {
79
+ currentType.properties[propName] = {
80
+ name: propName,
81
+ type: 'array',
82
+ optional: false,
83
+ itemType: { name: 'item', type: 'object', optional: false, properties: {} },
84
+ };
85
+ }
86
+ currentType = currentType.properties[propName];
87
+ }
88
+ // Ensure it's an array type
89
+ if (currentType.type !== 'array') {
90
+ currentType.type = 'array';
91
+ currentType.itemType = { name: 'item', type: 'object', optional: false, properties: {} };
92
+ }
93
+ return currentType;
94
+ }
95
+ function ensurePropertyExists(itemType, propName, isLast, token) {
96
+ if (!itemType.properties) {
97
+ itemType.properties = {};
98
+ }
99
+ if (!itemType.properties[propName]) {
100
+ itemType.properties[propName] = {
101
+ name: propName,
102
+ type: isLast ? 'string' : 'object',
103
+ optional: isLast ? token.defaultValue !== undefined : false,
104
+ properties: isLast ? undefined : {},
105
+ };
106
+ }
107
+ return itemType.properties[propName];
108
+ }
109
+ function addItemProperty(itemType, propertyPath, token) {
110
+ if (propertyPath.length === 0) {
111
+ return;
112
+ }
113
+ let currentItemType = itemType;
114
+ for (let i = 0; i < propertyPath.length; i++) {
115
+ const propName = propertyPath[i];
116
+ const isLast = i === propertyPath.length - 1;
117
+ const nextType = ensurePropertyExists(currentItemType, propName, isLast, token);
118
+ if (!isLast) {
119
+ currentItemType = nextType;
120
+ }
121
+ }
122
+ }
123
+ function addLoopItemProperty(arrayPath, propertyPath, types, token) {
124
+ const arrayPathParts = arrayPath.split('.');
125
+ const rootName = arrayPathParts[0];
126
+ const rootType = ensureArrayType(rootName, types);
127
+ if (!rootType) {
128
+ return;
129
+ }
130
+ const arrayType = navigateToArrayType(rootType, arrayPathParts);
131
+ if (arrayType.itemType) {
132
+ addItemProperty(arrayType.itemType, propertyPath, token);
133
+ }
134
+ }
135
+ function ensureRootType(rootName, pathLength, isOptional, types) {
136
+ if (!types.has(rootName)) {
137
+ types.set(rootName, {
138
+ name: rootName,
139
+ type: pathLength > 1 ? 'object' : 'string',
140
+ optional: isOptional,
141
+ properties: pathLength > 1 ? {} : undefined,
142
+ });
143
+ }
144
+ return types.get(rootName) || null;
145
+ }
146
+ function createNestedProperty(currentType, propName, isLast, isOptional) {
147
+ if (!currentType.properties) {
148
+ currentType.properties = {};
149
+ currentType.type = 'object';
150
+ }
151
+ if (!currentType.properties[propName]) {
152
+ currentType.properties[propName] = {
153
+ name: propName,
154
+ type: isLast ? 'string' : 'object',
155
+ optional: isLast ? isOptional : false,
156
+ properties: isLast ? undefined : {},
157
+ };
158
+ }
159
+ return currentType.properties[propName];
160
+ }
161
+ function addNestedType(path, types, isOptional) {
162
+ const rootName = path[0];
163
+ const rootType = ensureRootType(rootName, path.length, isOptional, types);
164
+ if (!rootType || path.length === 1) {
165
+ return;
166
+ }
167
+ // Navigate and create nested properties
168
+ let currentType = rootType;
169
+ for (let i = 1; i < path.length; i++) {
170
+ const propName = path[i];
171
+ const isLast = i === path.length - 1;
172
+ currentType = createNestedProperty(currentType, propName, isLast, isOptional);
173
+ }
174
+ }
175
+ function processCondition(token, types, loopContext) {
176
+ const condition = token.condition;
177
+ // Extract variable references from condition
178
+ // Simple patterns: varName, varName.prop, !varName, varName && otherVar
179
+ const varPattern = /\b([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)\b/g;
180
+ let match = varPattern.exec(condition);
181
+ while (match !== null) {
182
+ const varPath = match[1];
183
+ // Skip JS keywords and operators
184
+ if (['true', 'false', 'null', 'undefined', 'length'].includes(varPath)) {
185
+ match = varPattern.exec(condition);
186
+ continue;
187
+ }
188
+ const path = varPath.split('.');
189
+ // Skip loop context variables
190
+ const rootName = path[0];
191
+ if (rootName.startsWith('@')) {
192
+ match = varPattern.exec(condition);
193
+ continue;
194
+ }
195
+ const loopCtx = loopContext.find((ctx) => ctx.itemName === rootName || ctx.indexName === rootName);
196
+ if (loopCtx) {
197
+ // Handle loop item property access in conditions
198
+ if (rootName === loopCtx.itemName && path.length > 1) {
199
+ addLoopItemProperty(loopCtx.arrayPath, path.slice(1), types, {
200
+ type: 'variable',
201
+ raw: '',
202
+ start: 0,
203
+ end: 0,
204
+ expression: varPath,
205
+ path,
206
+ });
207
+ }
208
+ match = varPattern.exec(condition);
209
+ continue;
210
+ }
211
+ addNestedType(path, types, false);
212
+ match = varPattern.exec(condition);
213
+ }
214
+ }
215
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex type inference logic for nested array paths
216
+ function processEachStart(token, types) {
217
+ const arrayPath = token.arrayPath.split('.');
218
+ const rootName = arrayPath[0];
219
+ if (!types.has(rootName)) {
220
+ types.set(rootName, {
221
+ name: rootName,
222
+ type: arrayPath.length > 1 ? 'object' : 'array',
223
+ optional: false,
224
+ properties: arrayPath.length > 1 ? {} : undefined,
225
+ itemType: arrayPath.length === 1
226
+ ? { name: 'item', type: 'object', optional: false, properties: {} }
227
+ : undefined,
228
+ });
229
+ }
230
+ // If it's a nested path, navigate and ensure array type at the end
231
+ if (arrayPath.length > 1) {
232
+ const rootType = types.get(rootName);
233
+ if (!rootType) {
234
+ return;
235
+ }
236
+ let currentType = rootType;
237
+ for (let i = 1; i < arrayPath.length; i++) {
238
+ const propName = arrayPath[i];
239
+ if (!currentType.properties) {
240
+ currentType.properties = {};
241
+ }
242
+ if (!currentType.properties[propName]) {
243
+ currentType.properties[propName] = {
244
+ name: propName,
245
+ type: i === arrayPath.length - 1 ? 'array' : 'object',
246
+ optional: false,
247
+ properties: i === arrayPath.length - 1 ? undefined : {},
248
+ itemType: i === arrayPath.length - 1
249
+ ? { name: 'item', type: 'object', optional: false, properties: {} }
250
+ : undefined,
251
+ };
252
+ }
253
+ currentType = currentType.properties[propName];
254
+ }
255
+ }
256
+ }
257
+ /**
258
+ * Generates a TypeScript interface from extracted types
259
+ */
260
+ export function generateInterface(name, types) {
261
+ const lines = [`export interface ${name} {`];
262
+ for (const [, type] of types) {
263
+ lines.push(...generateProperty(type, 1));
264
+ }
265
+ lines.push('}');
266
+ return lines.join('\n');
267
+ }
268
+ function generateProperty(type, indent) {
269
+ const prefix = ' '.repeat(indent);
270
+ const optional = type.optional ? '?' : '';
271
+ const lines = [];
272
+ if (type.type === 'array' && type.itemType) {
273
+ if (type.itemType.type === 'object' && type.itemType.properties) {
274
+ lines.push(`${prefix}${type.name}${optional}: Array<{`);
275
+ for (const [, prop] of Object.entries(type.itemType.properties)) {
276
+ lines.push(...generateProperty(prop, indent + 1));
277
+ }
278
+ lines.push(`${prefix}}>;`);
279
+ }
280
+ else {
281
+ lines.push(`${prefix}${type.name}${optional}: ${type.itemType.type}[];`);
282
+ }
283
+ }
284
+ else if (type.type === 'object' && type.properties) {
285
+ lines.push(`${prefix}${type.name}${optional}: {`);
286
+ for (const [, prop] of Object.entries(type.properties)) {
287
+ lines.push(...generateProperty(prop, indent + 1));
288
+ }
289
+ lines.push(`${prefix}};`);
290
+ }
291
+ else {
292
+ lines.push(`${prefix}${type.name}${optional}: ${type.type};`);
293
+ }
294
+ return lines;
295
+ }
296
+ //# sourceMappingURL=type-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-extractor.js","sourceRoot":"","sources":["../../../src/email/compiler/type-extractor.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,MAAM,WAAW,GAAuE,EAAE,CAAC;IAE3F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,UAAU;gBACb,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,MAAM;gBACT,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC/B,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,KAAK;gBACR,+BAA+B;gBAC/B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,+CAA+C;oBAC/C,wEAAwE;oBACxE,WAAW,CAAC,GAAG,EAAE,CAAC;gBACpB,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,KAAoB,EACpB,KAAgC,EAChC,WAA+E;IAE/E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzB,+DAA+D;IAC/D,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,QAAQ,CACjE,CAAC;IAEF,IAAI,OAAO,IAAI,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC7C,kEAAkE;QAClE,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,IAAI,QAAQ,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9C,6CAA6C;QAC7C,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,KAAgC;IACzE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;SAC5E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAsB,EAAE,cAAwB;IAC3E,IAAI,WAAW,GAAG,QAAQ,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC5B,WAAW,CAAC,UAAU,GAAG,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG;gBACjC,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;aAC5E,CAAC;QACJ,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,4BAA4B;IAC5B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjC,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC;QAC3B,WAAW,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3F,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAAsB,EACtB,QAAgB,EAChB,MAAe,EACf,KAAoB;IAEpB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzB,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG;YAC9B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAClC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK;YAC3D,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CACtB,QAAsB,EACtB,YAAsB,EACtB,KAAoB;IAEpB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,eAAe,GAAG,QAAQ,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAEhF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,eAAe,GAAG,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,YAAsB,EACtB,KAAgC,EAChC,KAAoB;IAEpB,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACvB,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,UAAkB,EAClB,UAAmB,EACnB,KAAgC;IAEhC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAC1C,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,oBAAoB,CAC3B,WAAyB,EACzB,QAAgB,EAChB,MAAe,EACf,UAAmB;IAEnB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5B,WAAW,CAAC,UAAU,GAAG,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG;YACjC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAClC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK;YACrC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CACpB,IAAc,EACd,KAAgC,EAChC,UAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,wCAAwC;IACxC,IAAI,WAAW,GAAG,QAAQ,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,WAAW,GAAG,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAsD,EACtD,KAAgC,EAChC,WAA+E;IAE/E,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAElC,6CAA6C;IAC7C,wEAAwE;IACxE,MAAM,UAAU,GAAG,wCAAwC,CAAC;IAC5D,IAAI,KAAK,GAA2B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/D,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzB,iCAAiC;QACjC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvE,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhC,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,QAAQ,CACjE,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,iDAAiD;YACjD,IAAI,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;oBAC3D,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,EAAE;oBACP,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,CAAC;oBACN,UAAU,EAAE,OAAO;oBACnB,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QAED,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,mHAAmH;AACnH,SAAS,gBAAgB,CAAC,KAAgB,EAAE,KAAgC;IAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAE9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;YAC/C,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACjD,QAAQ,EACN,SAAS,CAAC,MAAM,KAAK,CAAC;gBACpB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;gBACnE,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,IAAI,WAAW,GAAG,QAAQ,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC5B,WAAW,CAAC,UAAU,GAAG,EAAE,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG;oBACjC,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;oBACrD,QAAQ,EAAE,KAAK;oBACf,UAAU,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;oBACvD,QAAQ,EACN,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC;wBACxB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;wBACnE,CAAC,CAAC,SAAS;iBAChB,CAAC;YACJ,CAAC;YACD,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAgC;IAC9E,MAAM,KAAK,GAAa,CAAC,oBAAoB,IAAI,IAAI,CAAC,CAAC;IAEvD,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAkB,EAAE,MAAc;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,WAAW,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChE,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Token types for template control flow syntax
3
+ */
4
+ export type TokenType = 'text' | 'variable' | 'if' | 'elseif' | 'else' | 'each' | 'end';
5
+ /**
6
+ * Base token interface
7
+ */
8
+ interface BaseToken {
9
+ type: TokenType;
10
+ raw: string;
11
+ start: number;
12
+ end: number;
13
+ }
14
+ /**
15
+ * Plain text content
16
+ */
17
+ export interface TextToken extends BaseToken {
18
+ type: 'text';
19
+ content: string;
20
+ }
21
+ /**
22
+ * Variable interpolation: {{name}} or {{name ?? 'default'}}
23
+ */
24
+ export interface VariableToken extends BaseToken {
25
+ type: 'variable';
26
+ expression: string;
27
+ path: string[];
28
+ defaultValue?: string;
29
+ }
30
+ /**
31
+ * Conditional start: <!-- @if condition -->
32
+ */
33
+ export interface IfToken extends BaseToken {
34
+ type: 'if';
35
+ condition: string;
36
+ }
37
+ /**
38
+ * Else-if branch: <!-- @elseif condition -->
39
+ */
40
+ export interface ElseIfToken extends BaseToken {
41
+ type: 'elseif';
42
+ condition: string;
43
+ }
44
+ /**
45
+ * Else branch: <!-- @else -->
46
+ */
47
+ export interface ElseToken extends BaseToken {
48
+ type: 'else';
49
+ }
50
+ /**
51
+ * Loop start: <!-- @each array as item --> or <!-- @each array as item, index -->
52
+ */
53
+ export interface EachToken extends BaseToken {
54
+ type: 'each';
55
+ arrayPath: string;
56
+ itemName: string;
57
+ indexName?: string;
58
+ }
59
+ /**
60
+ * End marker: <!-- @end -->
61
+ */
62
+ export interface EndToken extends BaseToken {
63
+ type: 'end';
64
+ }
65
+ export type Token = TextToken | VariableToken | IfToken | ElseIfToken | ElseToken | EachToken | EndToken;
66
+ /**
67
+ * Inferred type from template analysis
68
+ */
69
+ export interface InferredType {
70
+ name: string;
71
+ type: 'string' | 'number' | 'boolean' | 'array' | 'object';
72
+ optional: boolean;
73
+ properties?: Record<string, InferredType>;
74
+ itemType?: InferredType;
75
+ }
76
+ /**
77
+ * Result of template parsing
78
+ */
79
+ export interface ParseResult {
80
+ tokens: Token[];
81
+ variables: Map<string, InferredType>;
82
+ }
83
+ /**
84
+ * Compiled template output
85
+ */
86
+ export interface CompiledTemplate {
87
+ /** TypeScript source code for the render function */
88
+ source: string;
89
+ /** Inferred context interface definition */
90
+ contextInterface: string;
91
+ /** Template name (derived from filename) */
92
+ name: string;
93
+ /** Subject line extracted from <mj-title> or <title> tag */
94
+ subject?: string;
95
+ }
96
+ /**
97
+ * Compiler options
98
+ */
99
+ export interface CompilerOptions {
100
+ /** Source directory for MJML templates */
101
+ sourceDir: string;
102
+ /** Output directory for compiled TypeScript */
103
+ outputDir: string;
104
+ /** Whether to generate plain text version */
105
+ generateText?: boolean;
106
+ }
107
+ export {};
108
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/email/compiler/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAExF;;GAEG;AACH,UAAU,SAAS;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACxC,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,MAAM,KAAK,GACb,SAAS,GACT,aAAa,GACb,OAAO,GACP,WAAW,GACX,SAAS,GACT,SAAS,GACT,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/email/compiler/types.ts"],"names":[],"mappings":""}