glasswork 0.12.2 → 0.13.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 (108) hide show
  1. package/dist/auth/abilities.d.ts +41 -0
  2. package/dist/auth/abilities.d.ts.map +1 -0
  3. package/dist/auth/abilities.js +62 -0
  4. package/dist/auth/abilities.js.map +1 -0
  5. package/dist/auth/assert.d.ts +20 -0
  6. package/dist/auth/assert.d.ts.map +1 -0
  7. package/dist/auth/assert.js +28 -0
  8. package/dist/auth/assert.js.map +1 -0
  9. package/dist/auth/better-auth-provider.d.ts +56 -0
  10. package/dist/auth/better-auth-provider.d.ts.map +1 -0
  11. package/dist/auth/better-auth-provider.js +62 -0
  12. package/dist/auth/better-auth-provider.js.map +1 -0
  13. package/dist/auth/index.d.ts +6 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +5 -0
  16. package/dist/auth/index.js.map +1 -0
  17. package/dist/auth/middleware.d.ts +31 -0
  18. package/dist/auth/middleware.d.ts.map +1 -0
  19. package/dist/auth/middleware.js +92 -0
  20. package/dist/auth/middleware.js.map +1 -0
  21. package/dist/auth/types.d.ts +54 -0
  22. package/dist/auth/types.d.ts.map +1 -0
  23. package/dist/auth/types.js +2 -0
  24. package/dist/auth/types.js.map +1 -0
  25. package/dist/core/bootstrap.d.ts.map +1 -1
  26. package/dist/core/bootstrap.js +5 -2
  27. package/dist/core/bootstrap.js.map +1 -1
  28. package/dist/core/types.d.ts +8 -2
  29. package/dist/core/types.d.ts.map +1 -1
  30. package/dist/http/route-helpers.d.ts +43 -0
  31. package/dist/http/route-helpers.d.ts.map +1 -1
  32. package/dist/http/route-helpers.js +90 -40
  33. package/dist/http/route-helpers.js.map +1 -1
  34. package/dist/index.d.ts +8 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +7 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/jobs/define-job.d.ts +34 -2
  39. package/dist/jobs/define-job.d.ts.map +1 -1
  40. package/dist/jobs/define-job.js.map +1 -1
  41. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +75 -0
  42. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -0
  43. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +135 -0
  44. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -0
  45. package/dist/jobs/drivers/mock-driver.d.ts +45 -10
  46. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  47. package/dist/jobs/drivers/mock-driver.js +36 -17
  48. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  49. package/dist/jobs/drivers/sqs-driver.d.ts +26 -19
  50. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  51. package/dist/jobs/drivers/sqs-driver.js +54 -69
  52. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  53. package/dist/jobs/errors.d.ts +8 -4
  54. package/dist/jobs/errors.d.ts.map +1 -1
  55. package/dist/jobs/errors.js +13 -7
  56. package/dist/jobs/errors.js.map +1 -1
  57. package/dist/jobs/index.d.ts +4 -3
  58. package/dist/jobs/index.d.ts.map +1 -1
  59. package/dist/jobs/index.js +3 -2
  60. package/dist/jobs/index.js.map +1 -1
  61. package/dist/jobs/job-registry.d.ts +4 -4
  62. package/dist/jobs/job-registry.d.ts.map +1 -1
  63. package/dist/jobs/job-registry.js.map +1 -1
  64. package/dist/jobs/job-service.js +1 -1
  65. package/dist/jobs/job-service.js.map +1 -1
  66. package/dist/jobs/schedule-constants.d.ts +0 -4
  67. package/dist/jobs/schedule-constants.d.ts.map +1 -1
  68. package/dist/jobs/schedule-constants.js +0 -4
  69. package/dist/jobs/schedule-constants.js.map +1 -1
  70. package/dist/jobs/scheduler.d.ts +1 -1
  71. package/dist/jobs/scheduler.d.ts.map +1 -1
  72. package/dist/jobs/scheduler.js +46 -10
  73. package/dist/jobs/scheduler.js.map +1 -1
  74. package/dist/jobs/types.d.ts +59 -50
  75. package/dist/jobs/types.d.ts.map +1 -1
  76. package/dist/jobs/utils.d.ts +0 -9
  77. package/dist/jobs/utils.d.ts.map +1 -1
  78. package/dist/jobs/utils.js +3 -23
  79. package/dist/jobs/utils.js.map +1 -1
  80. package/dist/jobs/worker.d.ts +2 -3
  81. package/dist/jobs/worker.d.ts.map +1 -1
  82. package/dist/jobs/worker.js +183 -82
  83. package/dist/jobs/worker.js.map +1 -1
  84. package/dist/list-query/casl.d.ts +18 -19
  85. package/dist/list-query/casl.d.ts.map +1 -1
  86. package/dist/list-query/casl.js +40 -46
  87. package/dist/list-query/casl.js.map +1 -1
  88. package/dist/uploads/file-upload.d.ts +44 -0
  89. package/dist/uploads/file-upload.d.ts.map +1 -0
  90. package/dist/uploads/file-upload.js +145 -0
  91. package/dist/uploads/file-upload.js.map +1 -0
  92. package/dist/uploads/index.d.ts +6 -0
  93. package/dist/uploads/index.d.ts.map +1 -0
  94. package/dist/uploads/index.js +7 -0
  95. package/dist/uploads/index.js.map +1 -0
  96. package/dist/uploads/uploads.service.d.ts +98 -0
  97. package/dist/uploads/uploads.service.d.ts.map +1 -0
  98. package/dist/uploads/uploads.service.js +134 -0
  99. package/dist/uploads/uploads.service.js.map +1 -0
  100. package/dist/uploads/validators.d.ts +41 -0
  101. package/dist/uploads/validators.d.ts.map +1 -0
  102. package/dist/uploads/validators.js +94 -0
  103. package/dist/uploads/validators.js.map +1 -0
  104. package/package.json +34 -3
  105. package/dist/email/compiler/code-generator.d.ts +0 -11
  106. package/dist/email/compiler/code-generator.d.ts.map +0 -1
  107. package/dist/email/compiler/code-generator.js +0 -319
  108. package/dist/email/compiler/code-generator.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glasswork",
3
- "version": "0.12.2",
3
+ "version": "0.13.0",
4
4
  "description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -52,6 +52,7 @@
52
52
  "test:coverage": "vitest run --coverage",
53
53
  "lint": "biome check . --write",
54
54
  "lint:ci": "biome check .",
55
+ "typecheck": "tsc --noEmit",
55
56
  "prepublishOnly": "npm run build && npm test",
56
57
  "docs:dev": "vitepress dev docs",
57
58
  "docs:build": "vitepress build docs",
@@ -63,19 +64,31 @@
63
64
  "peerDependencies": {
64
65
  "@aws-sdk/client-cloudwatch": "^3.900.0",
65
66
  "@aws-sdk/client-dynamodb": "^3.900.0",
67
+ "@aws-sdk/client-s3": "^3.900.0",
68
+ "@aws-sdk/client-scheduler": "^3.900.0",
66
69
  "@aws-sdk/client-sesv2": "^3.900.0",
70
+ "@aws-sdk/client-sqs": "^3.900.0",
67
71
  "@aws-sdk/client-ssm": "^3.900.0",
68
72
  "@aws-sdk/lib-dynamodb": "^3.900.0",
73
+ "@aws-sdk/s3-request-presigner": "^3.900.0",
74
+ "@casl/ability": "^6.7.3",
69
75
  "@casl/prisma": "^1.4.0",
70
76
  "@hono/swagger-ui": "^0.5.0",
71
77
  "@prisma/client": "^6.0.0",
72
78
  "awilix": "^12.0.0",
79
+ "better-auth": "^1.0.0",
73
80
  "dotenv": "^16.0.0",
74
81
  "hono": "^4.9.0",
75
82
  "hono-openapi": "^1.0.0",
76
83
  "valibot": "^1.0.0"
77
84
  },
78
85
  "peerDependenciesMeta": {
86
+ "@aws-sdk/client-scheduler": {
87
+ "optional": true
88
+ },
89
+ "@aws-sdk/client-sqs": {
90
+ "optional": true
91
+ },
79
92
  "@aws-sdk/client-cloudwatch": {
80
93
  "optional": true
81
94
  },
@@ -91,6 +104,12 @@
91
104
  "@aws-sdk/lib-dynamodb": {
92
105
  "optional": true
93
106
  },
107
+ "@aws-sdk/client-s3": {
108
+ "optional": true
109
+ },
110
+ "@aws-sdk/s3-request-presigner": {
111
+ "optional": true
112
+ },
94
113
  "@casl/prisma": {
95
114
  "optional": true
96
115
  },
@@ -100,6 +119,12 @@
100
119
  "@prisma/client": {
101
120
  "optional": true
102
121
  },
122
+ "@casl/ability": {
123
+ "optional": true
124
+ },
125
+ "better-auth": {
126
+ "optional": true
127
+ },
103
128
  "dotenv": {
104
129
  "optional": true
105
130
  }
@@ -107,20 +132,25 @@
107
132
  "devDependencies": {
108
133
  "@aws-sdk/client-cloudwatch": "^3.948.0",
109
134
  "@aws-sdk/client-dynamodb": "^3.948.0",
135
+ "@aws-sdk/client-s3": "^3.948.0",
136
+ "@aws-sdk/client-scheduler": "^3.948.0",
110
137
  "@aws-sdk/client-sesv2": "^3.948.0",
138
+ "@aws-sdk/client-sqs": "^3.948.0",
111
139
  "@aws-sdk/client-ssm": "^3.948.0",
112
140
  "@aws-sdk/lib-dynamodb": "^3.948.0",
141
+ "@aws-sdk/s3-request-presigner": "^3.948.0",
113
142
  "@biomejs/biome": "^2.2.5",
114
143
  "@casl/ability": "^6.7.3",
115
144
  "@casl/prisma": "^1.6.0",
116
145
  "@hono/swagger-ui": "^0.5.2",
117
146
  "@prisma/client": "^7.1.0",
147
+ "@types/aws-lambda": "^8.10.159",
118
148
  "@types/html-to-text": "^9.0.4",
119
149
  "@types/node": "^22.19.1",
120
150
  "@vitest/coverage-v8": "^4.0.15",
121
151
  "awilix": "^12.0.5",
122
152
  "dotenv": "^17.2.3",
123
- "hono": "^4.11.0",
153
+ "hono": "^4.11.3",
124
154
  "hono-openapi": "^1.1.2",
125
155
  "html-to-text": "^9.0.5",
126
156
  "mermaid": "^11.12.2",
@@ -139,6 +169,7 @@
139
169
  "@standard-community/standard-openapi": "^0.2.9",
140
170
  "@valibot/to-json-schema": "^1.4.0",
141
171
  "deepmerge": "^4.3.1",
172
+ "nanoid": "^5.0.0",
142
173
  "openapi-types": "^12.1.3"
143
174
  }
144
- }
175
+ }
@@ -1,11 +0,0 @@
1
- import type { InferredType, Token } from './types.js';
2
- /**
3
- * Generates TypeScript code from tokenized template.
4
- * Converts control flow markers and variables to JS template literals.
5
- */
6
- export declare function generateCode(name: string, tokens: Token[], types: Map<string, InferredType>, html: string): string;
7
- /**
8
- * Alternative code generator that produces cleaner output for simple templates
9
- */
10
- export declare function generateCodeWithContext(name: string, compiledHtml: string, tokens: Token[], types: Map<string, InferredType>): string;
11
- //# sourceMappingURL=code-generator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../../src/email/compiler/code-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAChC,IAAI,EAAE,MAAM,GACX,MAAM,CAgDR;AAoID;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC/B,MAAM,CAgDR"}
@@ -1,319 +0,0 @@
1
- import { generateInterface } from './type-extractor.js';
2
- /**
3
- * Generates TypeScript code from tokenized template.
4
- * Converts control flow markers and variables to JS template literals.
5
- */
6
- export function generateCode(name, tokens, types, html) {
7
- const interfaceName = toPascalCase(name) + 'Context';
8
- const interfaceCode = generateInterface(interfaceName, types);
9
- // Transform the HTML with control flow markers into template literal
10
- const transformedHtml = transformToTemplateLiteral(tokens);
11
- const code = `// This file is auto-generated by @glasswork/email. Do not edit manually.
12
-
13
- ${interfaceCode}
14
-
15
- export function render(ctx: ${interfaceName}): { html: string; text: string } {
16
- const html = \`${escapeBackticks(transformedHtml)}\`;
17
-
18
- // Auto-generated plain text version
19
- const text = htmlToText(html);
20
-
21
- return { html, text };
22
- }
23
-
24
- function htmlToText(html: string): string {
25
- return html
26
- // Remove style and script tags with content
27
- .replace(/<style[^>]*>[sS]*?</style>/gi, '')
28
- .replace(/<script[^>]*>[sS]*?</script>/gi, '')
29
- // Convert line breaks
30
- .replace(/<br\\s*\\/?>/gi, '\\n')
31
- // Convert block elements to newlines
32
- .replace(/<\\/(p|div|tr|h[1-6])>/gi, '\\n')
33
- // Convert list items
34
- .replace(/<li[^>]*>/gi, '• ')
35
- .replace(/<\\/li>/gi, '\\n')
36
- // Remove remaining HTML tags
37
- .replace(/<[^>]+>/g, '')
38
- // Decode common HTML entities
39
- .replace(/&nbsp;/gi, ' ')
40
- .replace(/&amp;/gi, '&')
41
- .replace(/&lt;/gi, '<')
42
- .replace(/&gt;/gi, '>')
43
- .replace(/&quot;/gi, '"')
44
- .replace(/&#39;/gi, "'")
45
- // Clean up whitespace
46
- .replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n')
47
- .trim();
48
- }
49
- `;
50
- return code;
51
- }
52
- /**
53
- * Transforms tokens back into a string with JS template literal expressions.
54
- */
55
- function transformToTemplateLiteral(tokens) {
56
- const parts = [];
57
- const blockStack = [];
58
- for (const token of tokens) {
59
- switch (token.type) {
60
- case 'text':
61
- parts.push(token.content);
62
- break;
63
- case 'variable':
64
- parts.push(transformVariable(token));
65
- break;
66
- case 'if':
67
- blockStack.push('if');
68
- parts.push(`\${${transformCondition(token.condition)} ? \``);
69
- break;
70
- case 'elseif':
71
- // Close previous if/elseif block and start new conditional
72
- parts.push(`\` : ${transformCondition(token.condition)} ? \``);
73
- break;
74
- case 'else':
75
- // Close previous if/elseif block and start else
76
- parts.push('` : `');
77
- break;
78
- case 'each':
79
- blockStack.push('each');
80
- parts.push(transformEachStart(token));
81
- break;
82
- case 'end': {
83
- const blockType = blockStack.pop();
84
- if (blockType === 'if') {
85
- // Close conditional - if no else was provided, use empty string
86
- parts.push("` : ''}");
87
- }
88
- else if (blockType === 'each') {
89
- parts.push("`).join('')}");
90
- }
91
- break;
92
- }
93
- }
94
- }
95
- return parts.join('');
96
- }
97
- function transformVariable(token) {
98
- const path = token.path.join('.');
99
- // Handle loop context variables
100
- if (token.path[0].startsWith('@')) {
101
- const loopVar = token.path[0].slice(1); // Remove @ prefix
102
- switch (loopVar) {
103
- case 'index':
104
- return '${__index}';
105
- case 'first':
106
- return '${__index === 0}';
107
- case 'last':
108
- return '${__index === __array.length - 1}';
109
- case 'length':
110
- return '${__array.length}';
111
- default:
112
- return `\${${loopVar}}`;
113
- }
114
- }
115
- // Handle expressions with operators (like @index + 1)
116
- if (token.expression.includes('+') || token.expression.includes('-')) {
117
- const transformed = token.expression
118
- .replace(/@index/g, '__index')
119
- .replace(/@first/g, '(__index === 0)')
120
- .replace(/@last/g, '(__index === __array.length - 1)')
121
- .replace(/@length/g, '__array.length');
122
- return `\${${transformed}}`;
123
- }
124
- if (token.defaultValue !== undefined) {
125
- return `\${${path} ?? '${token.defaultValue}'}`;
126
- }
127
- return `\${${path}}`;
128
- }
129
- function transformCondition(condition) {
130
- // Transform loop context variables in conditions
131
- return condition
132
- .replace(/@index/g, '__index')
133
- .replace(/@first/g, '(__index === 0)')
134
- .replace(/@last/g, '(__index === __array.length - 1)')
135
- .replace(/@length/g, '__array.length');
136
- }
137
- function transformEachStart(token) {
138
- const { arrayPath, itemName, indexName } = token;
139
- // Build the map function with proper destructuring
140
- const mapParams = indexName ? `(${itemName}, ${indexName})` : `(${itemName}, __index)`;
141
- // Store array reference for @last, @length access
142
- return `\${(((__array) => __array.map(${mapParams} => \``;
143
- }
144
- function toPascalCase(str) {
145
- return str
146
- .split(/[-_\s]+/)
147
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
148
- .join('');
149
- }
150
- function escapeBackticks(str) {
151
- // Escape backticks that aren't part of our template expressions
152
- // We need to be careful not to escape the ones we're inserting
153
- return str.replace(/`/g, '\\`');
154
- }
155
- /**
156
- * Alternative code generator that produces cleaner output for simple templates
157
- */
158
- export function generateCodeWithContext(name, compiledHtml, tokens, types) {
159
- const interfaceName = toPascalCase(name) + 'Context';
160
- const interfaceCode = generateInterface(interfaceName, types);
161
- // Replace control flow markers and variables in the compiled HTML
162
- const transformedHtml = transformCompiledHtml(compiledHtml, tokens);
163
- const code = `// This file is auto-generated by @glasswork/email. Do not edit manually.
164
-
165
- ${interfaceCode}
166
-
167
- export function render(ctx: ${interfaceName}): { html: string; text: string } {
168
- const html = \`${escapeBackticks(transformedHtml)}\`;
169
-
170
- // Auto-generated plain text version
171
- const text = htmlToText(html);
172
-
173
- return { html, text };
174
- }
175
-
176
- function htmlToText(html: string): string {
177
- return html
178
- // Remove style and script tags with content
179
- .replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '')
180
- .replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '')
181
- // Convert line breaks
182
- .replace(/<br\\s*\\/?>/gi, '\\n')
183
- // Convert block elements to newlines
184
- .replace(/<\\/(p|div|tr|h[1-6])>/gi, '\\n')
185
- // Convert list items
186
- .replace(/<li[^>]*>/gi, '• ')
187
- .replace(/<\\/li>/gi, '\\n')
188
- // Remove remaining HTML tags
189
- .replace(/<[^>]+>/g, '')
190
- // Decode common HTML entities
191
- .replace(/&nbsp;/gi, ' ')
192
- .replace(/&amp;/gi, '&')
193
- .replace(/&lt;/gi, '<')
194
- .replace(/&gt;/gi, '>')
195
- .replace(/&quot;/gi, '"')
196
- .replace(/&#39;/gi, "'")
197
- // Clean up whitespace
198
- .replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n')
199
- .trim();
200
- }
201
- `;
202
- return code;
203
- }
204
- /**
205
- * Transforms compiled HTML (from MJML) by replacing markers with template expressions.
206
- * This is the second pass of the two-pass compilation.
207
- */
208
- function transformCompiledHtml(html, tokens) {
209
- // Build a map of original positions to replacements
210
- // Since MJML compilation may have moved things around, we use regex to find markers
211
- let result = html;
212
- // Transform control flow markers (they're preserved in HTML comments)
213
- result = result.replace(/<!--\s*@if\s+([^-]*?)\s*-->/g, (_match, condition) => {
214
- return `\${${transformCondition(condition.trim())} ? \``;
215
- });
216
- result = result.replace(/<!--\s*@elseif\s+([^-]*?)\s*-->/g, (_match, condition) => {
217
- return `\` : ${transformCondition(condition.trim())} ? \``;
218
- });
219
- result = result.replace(/<!--\s*@else\s*-->/g, '` : `');
220
- // Handle @each - need to track which @end belongs to which @each/@if
221
- const eachPattern = /<!--\s*@each\s+(\S+)\s+as\s+(\w+)(?:\s*,\s*(\w+))?\s*-->/g;
222
- result = result.replace(eachPattern, (_match, arrayPath, itemName, indexName) => {
223
- const mapParams = indexName ? `(${itemName}, ${indexName})` : `(${itemName}, __index)`;
224
- return `\${(((__array) => __array.map(${mapParams} => \``;
225
- });
226
- // Handle @end markers - need context to know if it's if or each
227
- // For simplicity in spike, we'll use a simple approach
228
- result = transformEndMarkers(result);
229
- // Transform variables
230
- result = result.replace(/\{\{([^}]+)\}\}/g, (_match, expression) => {
231
- const trimmed = expression.trim();
232
- // Check for default value
233
- const defaultMatch = trimmed.match(/^(.+?)\s*\?\?\s*['"]([^'"]*)['"]\s*$/);
234
- if (defaultMatch) {
235
- return `\${${defaultMatch[1].trim()} ?? '${defaultMatch[2]}'}`;
236
- }
237
- // Handle loop context variables
238
- if (trimmed.startsWith('@')) {
239
- const loopVar = trimmed.slice(1);
240
- switch (loopVar) {
241
- case 'index':
242
- return '${__index}';
243
- case 'first':
244
- return '${__index === 0}';
245
- case 'last':
246
- return '${__index === __array.length - 1}';
247
- case 'length':
248
- return '${__array.length}';
249
- }
250
- }
251
- // Handle expressions with loop context
252
- if (trimmed.includes('@')) {
253
- const transformed = trimmed
254
- .replace(/@index/g, '__index')
255
- .replace(/@first/g, '(__index === 0)')
256
- .replace(/@last/g, '(__index === __array.length - 1)')
257
- .replace(/@length/g, '__array.length');
258
- return `\${${transformed}}`;
259
- }
260
- return `\${ctx.${trimmed}}`;
261
- });
262
- return result;
263
- }
264
- /**
265
- * Transforms @end markers based on context.
266
- * This is tricky because we need to know if it ends an @if or @each.
267
- */
268
- function transformEndMarkers(html) {
269
- // Track block types as we encounter them
270
- const blockStack = [];
271
- const markers = [];
272
- // Find all markers
273
- const markerPattern = /<!--\s*@(if|elseif|else|each|end)(?:\s+[^-]*?)?\s*-->/g;
274
- let match;
275
- while ((match = markerPattern.exec(html)) !== null) {
276
- const type = match[1];
277
- markers.push({ type, index: match.index, length: match[0].length });
278
- }
279
- // Process markers in order and build replacement map
280
- const replacements = [];
281
- for (const marker of markers) {
282
- if (marker.type === 'if') {
283
- blockStack.push('if');
284
- }
285
- else if (marker.type === 'each') {
286
- blockStack.push('each');
287
- }
288
- else if (marker.type === 'end') {
289
- const blockType = blockStack.pop();
290
- if (blockType === 'if') {
291
- replacements.push({
292
- index: marker.index,
293
- length: marker.length,
294
- replacement: "` : ''}",
295
- });
296
- }
297
- else if (blockType === 'each') {
298
- replacements.push({
299
- index: marker.index,
300
- length: marker.length,
301
- replacement: "`).join('')})(ctx." + findArrayPath(markers, replacements.length) + ')}', // This is simplified
302
- });
303
- }
304
- }
305
- }
306
- // Apply replacements in reverse order to preserve indices
307
- let result = html;
308
- for (let i = replacements.length - 1; i >= 0; i--) {
309
- const { index, length, replacement } = replacements[i];
310
- result = result.slice(0, index) + replacement + result.slice(index + length);
311
- }
312
- return result;
313
- }
314
- // Helper to find the array path for an @each block
315
- function findArrayPath(markers, endIndex) {
316
- // This is a simplified version - in a real implementation we'd track this properly
317
- return 'items';
318
- }
319
- //# sourceMappingURL=code-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../../src/email/compiler/code-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,MAAe,EACf,KAAgC,EAChC,IAAY;IAEZ,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACrD,MAAM,aAAa,GAAG,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAE9D,qEAAqE;IACrE,MAAM,eAAe,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG;;EAEb,aAAa;;8BAEe,aAAa;mBACxB,eAAe,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiClD,CAAC;IAEA,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CAAC,MAAe;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAyB,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1B,MAAM;YAER,KAAK,UAAU;gBACb,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrC,MAAM;YAER,KAAK,IAAI;gBACP,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC7D,MAAM;YAER,KAAK,QAAQ;gBACX,2DAA2D;gBAC3D,KAAK,CAAC,IAAI,CAAC,QAAQ,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC/D,MAAM;YAER,KAAK,MAAM;gBACT,gDAAgD;gBAChD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,MAAM;YAER,KAAK,MAAM;gBACT,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,MAAM;YAER,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;gBACnC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACvB,gEAAgE;oBAChE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;qBAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAI1B;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAElC,gCAAgC;IAChC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;QAC1D,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,OAAO;gBACV,OAAO,YAAY,CAAC;YACtB,KAAK,OAAO;gBACV,OAAO,kBAAkB,CAAC;YAC5B,KAAK,MAAM;gBACT,OAAO,mCAAmC,CAAC;YAC7C,KAAK,QAAQ;gBACX,OAAO,mBAAmB,CAAC;YAC7B;gBACE,OAAO,MAAM,OAAO,GAAG,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU;aACjC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;aAC7B,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;aACrC,OAAO,CAAC,QAAQ,EAAE,kCAAkC,CAAC;aACrD,OAAO,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACzC,OAAO,MAAM,WAAW,GAAG,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,MAAM,IAAI,QAAQ,KAAK,CAAC,YAAY,IAAI,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,IAAI,GAAG,CAAC;AACvB,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,iDAAiD;IACjD,OAAO,SAAS;SACb,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACrC,OAAO,CAAC,QAAQ,EAAE,kCAAkC,CAAC;SACrD,OAAO,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAI3B;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEjD,mDAAmD;IACnD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,YAAY,CAAC;IAEvF,kDAAkD;IAClD,OAAO,iCAAiC,SAAS,QAAQ,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACzE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,gEAAgE;IAChE,+DAA+D;IAC/D,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,YAAoB,EACpB,MAAe,EACf,KAAgC;IAEhC,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACrD,MAAM,aAAa,GAAG,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAE9D,kEAAkE;IAClE,MAAM,eAAe,GAAG,qBAAqB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAEpE,MAAM,IAAI,GAAG;;EAEb,aAAa;;8BAEe,aAAa;mBACxB,eAAe,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiClD,CAAC;IAEA,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,MAAe;IAC1D,oDAAoD;IACpD,oFAAoF;IAEpF,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,sEAAsE;IACtE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QAC5E,OAAO,MAAM,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QAChF,OAAO,QAAQ,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAExD,qEAAqE;IACrE,MAAM,WAAW,GAAG,2DAA2D,CAAC;IAChF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;QAC9E,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,YAAY,CAAC;QACvF,OAAO,iCAAiC,SAAS,QAAQ,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,gEAAgE;IAChE,uDAAuD;IACvD,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAErC,sBAAsB;IACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAElC,0BAA0B;QAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC3E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,OAAO;oBACV,OAAO,YAAY,CAAC;gBACtB,KAAK,OAAO;oBACV,OAAO,kBAAkB,CAAC;gBAC5B,KAAK,MAAM;oBACT,OAAO,mCAAmC,CAAC;gBAC7C,KAAK,QAAQ;oBACX,OAAO,mBAAmB,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,OAAO;iBACxB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;iBAC7B,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;iBACrC,OAAO,CAAC,QAAQ,EAAE,kCAAkC,CAAC;iBACrD,OAAO,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;YACzC,OAAO,MAAM,WAAW,GAAG,CAAC;QAC9B,CAAC;QAED,OAAO,UAAU,OAAO,GAAG,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,yCAAyC;IACzC,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,OAAO,GAIR,EAAE,CAAC;IAER,mBAAmB;IACnB,MAAM,aAAa,GAAG,wDAAwD,CAAC;IAC/E,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAA8C,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,qDAAqD;IACrD,MAAM,YAAY,GAAkE,EAAE,CAAC;IAEvF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,WAAW,EAAE,SAAS;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBAChC,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,WAAW,EAAE,oBAAoB,GAAG,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,qBAAqB;iBAC9G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mDAAmD;AACnD,SAAS,aAAa,CAAC,OAAgC,EAAE,QAAgB;IACvE,mFAAmF;IACnF,OAAO,OAAO,CAAC;AACjB,CAAC"}