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.
- package/dist/email/compiler/code-generator.d.ts +11 -0
- package/dist/email/compiler/code-generator.d.ts.map +1 -0
- package/dist/email/compiler/code-generator.js +319 -0
- package/dist/email/compiler/code-generator.js.map +1 -0
- package/dist/email/compiler/compile-templates.d.ts +68 -0
- package/dist/email/compiler/compile-templates.d.ts.map +1 -0
- package/dist/email/compiler/compile-templates.js +156 -0
- package/dist/email/compiler/compile-templates.js.map +1 -0
- package/dist/email/compiler/compiler.d.ts +30 -0
- package/dist/email/compiler/compiler.d.ts.map +1 -0
- package/dist/email/compiler/compiler.js +510 -0
- package/dist/email/compiler/compiler.js.map +1 -0
- package/dist/email/compiler/index.d.ts +4 -0
- package/dist/email/compiler/index.d.ts.map +1 -0
- package/dist/email/compiler/index.js +3 -0
- package/dist/email/compiler/index.js.map +1 -0
- package/dist/email/compiler/tokenizer.d.ts +7 -0
- package/dist/email/compiler/tokenizer.d.ts.map +1 -0
- package/dist/email/compiler/tokenizer.js +154 -0
- package/dist/email/compiler/tokenizer.js.map +1 -0
- package/dist/email/compiler/type-extractor.d.ts +11 -0
- package/dist/email/compiler/type-extractor.d.ts.map +1 -0
- package/dist/email/compiler/type-extractor.js +296 -0
- package/dist/email/compiler/type-extractor.js.map +1 -0
- package/dist/email/compiler/types.d.ts +108 -0
- package/dist/email/compiler/types.d.ts.map +1 -0
- package/dist/email/compiler/types.js +2 -0
- package/dist/email/compiler/types.js.map +1 -0
- package/dist/email/config.d.ts +89 -0
- package/dist/email/config.d.ts.map +1 -0
- package/dist/email/config.js +55 -0
- package/dist/email/config.js.map +1 -0
- package/dist/email/email-service.d.ts +54 -0
- package/dist/email/email-service.d.ts.map +1 -0
- package/dist/email/email-service.js +94 -0
- package/dist/email/email-service.js.map +1 -0
- package/dist/email/index.d.ts +12 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +23 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/template-registry.d.ts +83 -0
- package/dist/email/template-registry.d.ts.map +1 -0
- package/dist/email/template-registry.js +85 -0
- package/dist/email/template-registry.js.map +1 -0
- package/dist/email/templated-email-service.d.ts +59 -0
- package/dist/email/templated-email-service.d.ts.map +1 -0
- package/dist/email/templated-email-service.js +63 -0
- package/dist/email/templated-email-service.js.map +1 -0
- package/dist/email/transports/index.d.ts +3 -0
- package/dist/email/transports/index.d.ts.map +1 -0
- package/dist/email/transports/index.js +3 -0
- package/dist/email/transports/index.js.map +1 -0
- package/dist/email/transports/mock-transport.d.ts +74 -0
- package/dist/email/transports/mock-transport.d.ts.map +1 -0
- package/dist/email/transports/mock-transport.js +102 -0
- package/dist/email/transports/mock-transport.js.map +1 -0
- package/dist/email/transports/ses-transport.d.ts +65 -0
- package/dist/email/transports/ses-transport.d.ts.map +1 -0
- package/dist/email/transports/ses-transport.js +290 -0
- package/dist/email/transports/ses-transport.js.map +1 -0
- package/dist/email/types.d.ts +128 -0
- package/dist/email/types.d.ts.map +1 -0
- package/dist/email/types.js +2 -0
- package/dist/email/types.js.map +1 -0
- package/dist/email/webhooks/handler-factory.d.ts +41 -0
- package/dist/email/webhooks/handler-factory.d.ts.map +1 -0
- package/dist/email/webhooks/handler-factory.js +136 -0
- package/dist/email/webhooks/handler-factory.js.map +1 -0
- package/dist/email/webhooks/index.d.ts +6 -0
- package/dist/email/webhooks/index.d.ts.map +1 -0
- package/dist/email/webhooks/index.js +9 -0
- package/dist/email/webhooks/index.js.map +1 -0
- package/dist/email/webhooks/notification-parser.d.ts +45 -0
- package/dist/email/webhooks/notification-parser.d.ts.map +1 -0
- package/dist/email/webhooks/notification-parser.js +150 -0
- package/dist/email/webhooks/notification-parser.js.map +1 -0
- package/dist/email/webhooks/signature-verification.d.ts +38 -0
- package/dist/email/webhooks/signature-verification.d.ts.map +1 -0
- package/dist/email/webhooks/signature-verification.js +179 -0
- package/dist/email/webhooks/signature-verification.js.map +1 -0
- package/dist/email/webhooks/subscription-handler.d.ts +37 -0
- package/dist/email/webhooks/subscription-handler.d.ts.map +1 -0
- package/dist/email/webhooks/subscription-handler.js +99 -0
- package/dist/email/webhooks/subscription-handler.js.map +1 -0
- package/dist/email/webhooks/types.d.ts +187 -0
- package/dist/email/webhooks/types.d.ts.map +1 -0
- package/dist/email/webhooks/types.js +5 -0
- package/dist/email/webhooks/types.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- 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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/email/compiler/types.ts"],"names":[],"mappings":""}
|