coffeehaml 0.1.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/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/ast.d.ts +107 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +125 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler.d.ts +10 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +83 -0
- package/dist/compiler.js.map +1 -0
- package/dist/emitter.d.ts +4 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +464 -0
- package/dist/emitter.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/expressions.d.ts +10 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +70 -0
- package/dist/expressions.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +29 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +315 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +4 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +408 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/vite-plugin.d.ts +7 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +44 -0
- package/dist/vite-plugin.js.map +1 -0
- package/docs/README.md +110 -0
- package/docs/architecture.md +619 -0
- package/docs/ast.md +413 -0
- package/docs/examples.md +719 -0
- package/docs/grammar.md +432 -0
- package/docs/index.html +129 -0
- package/package.json +61 -0
package/dist/emitter.js
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { Element, ImplicitDiv, Text, Output, ControlFlow, Comment, Filter, Doctype, Expression, } from './ast.js';
|
|
2
|
+
import { compileExpression } from './expressions.js';
|
|
3
|
+
// ─── Emit State ────────────────────────────────────────────
|
|
4
|
+
class EmitState {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.indent = 0;
|
|
7
|
+
this.output = '';
|
|
8
|
+
this.needsFragment = false;
|
|
9
|
+
this.needsImport = false;
|
|
10
|
+
this.sourceMapLines = [];
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
emit(s) {
|
|
14
|
+
if (s) {
|
|
15
|
+
this.output += ' '.repeat(this.indent * 2) + s;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
emitLine(s = '') {
|
|
19
|
+
if (s) {
|
|
20
|
+
this.output += ' '.repeat(this.indent * 2) + s;
|
|
21
|
+
}
|
|
22
|
+
this.output += '\n';
|
|
23
|
+
}
|
|
24
|
+
indentBlock(fn) {
|
|
25
|
+
this.indent++;
|
|
26
|
+
fn();
|
|
27
|
+
this.indent--;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ─── Public API ────────────────────────────────────────────
|
|
31
|
+
export function emit(ast, options = {}) {
|
|
32
|
+
const state = new EmitState(options);
|
|
33
|
+
// Emit import if needed
|
|
34
|
+
state.emitLine(`import { jsx, jsxs, Fragment } from "${options.jsxRuntime || 'react/jsx-runtime'}";`);
|
|
35
|
+
state.emitLine();
|
|
36
|
+
// Emit module body
|
|
37
|
+
emitNodes(ast.children, state, true);
|
|
38
|
+
return { code: state.output };
|
|
39
|
+
}
|
|
40
|
+
// ─── Node Emitters ─────────────────────────────────────────
|
|
41
|
+
function emitNodes(nodes, state, isRoot = false) {
|
|
42
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
43
|
+
const node = nodes[i];
|
|
44
|
+
if (node instanceof ControlFlow) {
|
|
45
|
+
// Control flow wraps subsequent siblings
|
|
46
|
+
const remaining = nodes.slice(i + 1);
|
|
47
|
+
emitControlFlow(node, remaining, state, isRoot);
|
|
48
|
+
return; // control flow consumes remaining nodes
|
|
49
|
+
}
|
|
50
|
+
emitNode(node, state, isRoot);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function emitNode(node, state, isRoot) {
|
|
54
|
+
if (node instanceof Element)
|
|
55
|
+
emitElement(node, state);
|
|
56
|
+
else if (node instanceof ImplicitDiv)
|
|
57
|
+
emitImplicitDiv(node, state);
|
|
58
|
+
else if (node instanceof Text)
|
|
59
|
+
emitText(node, state);
|
|
60
|
+
else if (node instanceof Output)
|
|
61
|
+
emitOutput(node, state);
|
|
62
|
+
else if (node instanceof ControlFlow)
|
|
63
|
+
emitControlFlow(node, [], state, isRoot);
|
|
64
|
+
else if (node instanceof Comment)
|
|
65
|
+
emitComment(node, state);
|
|
66
|
+
else if (node instanceof Filter)
|
|
67
|
+
emitFilter(node, state);
|
|
68
|
+
else if (node instanceof Doctype)
|
|
69
|
+
emitDoctype(node, state);
|
|
70
|
+
}
|
|
71
|
+
// ─── Element ───────────────────────────────────────────────
|
|
72
|
+
function emitElement(el, state) {
|
|
73
|
+
const hasChildren = el.children.length > 0;
|
|
74
|
+
const fn = hasChildren ? 'jsxs' : 'jsx';
|
|
75
|
+
// Tag
|
|
76
|
+
const tagJs = tagToJs(el);
|
|
77
|
+
// Attributes
|
|
78
|
+
const attrs = buildAttributes(el);
|
|
79
|
+
const attrsJs = attrs.length > 0 ? `{ ${attrs.join(', ')} }` : 'null';
|
|
80
|
+
// Children
|
|
81
|
+
if (hasChildren) {
|
|
82
|
+
state.emit(`${fn}(${tagJs}, ${attrsJs}`);
|
|
83
|
+
if (el.children.length === 1) {
|
|
84
|
+
// Single child — inline
|
|
85
|
+
const childJs = emitChildToJs(el.children[0], state);
|
|
86
|
+
state.output += `, ${childJs});\n`;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Multiple children
|
|
90
|
+
state.output += ',\n';
|
|
91
|
+
state.indentBlock(() => {
|
|
92
|
+
for (let i = 0; i < el.children.length; i++) {
|
|
93
|
+
const childJs = emitChildToJs(el.children[i], state);
|
|
94
|
+
const comma = i < el.children.length - 1 ? ',' : '';
|
|
95
|
+
state.emitLine(`${childJs}${comma}`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
state.emitLine(');');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
state.emitLine(`${fn}(${tagJs}, ${attrsJs});`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function tagToJs(el) {
|
|
106
|
+
if (el.tag instanceof Expression) {
|
|
107
|
+
return compileExpression(el.tag);
|
|
108
|
+
}
|
|
109
|
+
if (el.isComponent) {
|
|
110
|
+
return el.tag;
|
|
111
|
+
}
|
|
112
|
+
return `"${el.tag}"`;
|
|
113
|
+
}
|
|
114
|
+
function buildAttributes(el) {
|
|
115
|
+
const parts = [];
|
|
116
|
+
// id
|
|
117
|
+
if (el.id) {
|
|
118
|
+
parts.push(`id: "${el.id}"`);
|
|
119
|
+
}
|
|
120
|
+
// class from .class modifiers
|
|
121
|
+
let classNames = [...el.classes];
|
|
122
|
+
// Named attributes
|
|
123
|
+
for (const attr of el.attributes) {
|
|
124
|
+
const valJs = compileExpression(attr.value);
|
|
125
|
+
const name = attrNameToJs(attr.name);
|
|
126
|
+
if (name === 'className' || name === 'class') {
|
|
127
|
+
// Collect class names from className/class attribute
|
|
128
|
+
if (attr.shorthand) {
|
|
129
|
+
classNames.push(`\${${valJs}}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
classNames.push(valJs.replace(/^['"]|['"]$/g, ''));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (attr.shorthand) {
|
|
136
|
+
parts.push(`${name}: ${valJs}`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
parts.push(`${name}: ${valJs}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Emit className
|
|
143
|
+
if (classNames.length > 0) {
|
|
144
|
+
const unique = [...new Set(classNames)];
|
|
145
|
+
if (unique.length === 1 && !unique[0].includes('${')) {
|
|
146
|
+
parts.push(`className: "${unique[0]}"`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const joined = unique.map(c => c.includes('${') ? c : `"${c}"`).join(' + " " + ');
|
|
150
|
+
parts.push(`className: ${joined}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// style as object
|
|
154
|
+
const styleAttr = el.attributes.find(a => attrNameToJs(a.name) === 'style');
|
|
155
|
+
if (styleAttr && !styleAttr.shorthand) {
|
|
156
|
+
// Already handled above — but ensure it's an object expression
|
|
157
|
+
}
|
|
158
|
+
return parts;
|
|
159
|
+
}
|
|
160
|
+
function attrNameToJs(name) {
|
|
161
|
+
// class → className for React
|
|
162
|
+
if (name === 'class')
|
|
163
|
+
return 'className';
|
|
164
|
+
// for → htmlFor for React
|
|
165
|
+
if (name === 'for')
|
|
166
|
+
return 'htmlFor';
|
|
167
|
+
// data-* attributes keep their name
|
|
168
|
+
if (name.includes('-')) {
|
|
169
|
+
// Convert to camelCase quoted: 'data-value' → "data-value"
|
|
170
|
+
return `"${name}"`;
|
|
171
|
+
}
|
|
172
|
+
return name;
|
|
173
|
+
}
|
|
174
|
+
function emitImplicitDiv(div, state) {
|
|
175
|
+
const el = new Element('div', {
|
|
176
|
+
classes: div.classes,
|
|
177
|
+
id: div.id,
|
|
178
|
+
attributes: div.attributes,
|
|
179
|
+
children: div.children,
|
|
180
|
+
isComponent: false,
|
|
181
|
+
isSelfClosing: false,
|
|
182
|
+
location: div.location,
|
|
183
|
+
});
|
|
184
|
+
emitElement(el, state);
|
|
185
|
+
}
|
|
186
|
+
// ─── Child Emission ────────────────────────────────────────
|
|
187
|
+
function emitChildToJs(node, state) {
|
|
188
|
+
if (node instanceof Text) {
|
|
189
|
+
return escapeString(node.value);
|
|
190
|
+
}
|
|
191
|
+
if (node instanceof Output) {
|
|
192
|
+
return compileExpression(node.expression);
|
|
193
|
+
}
|
|
194
|
+
if (node instanceof Element) {
|
|
195
|
+
const hasChildren = node.children.length > 0;
|
|
196
|
+
const fn = hasChildren ? 'jsxs' : 'jsx';
|
|
197
|
+
const tagJs = tagToJs(node);
|
|
198
|
+
const attrs = buildAttributes(node);
|
|
199
|
+
const attrsJs = attrs.length > 0 ? `{ ${attrs.join(', ')} }` : 'null';
|
|
200
|
+
if (hasChildren) {
|
|
201
|
+
const childParts = node.children.map(c => emitChildToJs(c, state));
|
|
202
|
+
return `${fn}(${tagJs}, ${attrsJs}, ${childParts.join(', ')})`;
|
|
203
|
+
}
|
|
204
|
+
return `${fn}(${tagJs}, ${attrsJs})`;
|
|
205
|
+
}
|
|
206
|
+
if (node instanceof ImplicitDiv) {
|
|
207
|
+
const el = new Element('div', {
|
|
208
|
+
classes: node.classes,
|
|
209
|
+
id: node.id,
|
|
210
|
+
attributes: node.attributes,
|
|
211
|
+
children: node.children,
|
|
212
|
+
isComponent: false,
|
|
213
|
+
isSelfClosing: false,
|
|
214
|
+
location: node.location,
|
|
215
|
+
});
|
|
216
|
+
return emitChildToJs(el, state);
|
|
217
|
+
}
|
|
218
|
+
if (node instanceof ControlFlow) {
|
|
219
|
+
return emitControlFlowToJs(node, state);
|
|
220
|
+
}
|
|
221
|
+
if (node instanceof Filter) {
|
|
222
|
+
return emitFilterToJs(node, state);
|
|
223
|
+
}
|
|
224
|
+
return 'null';
|
|
225
|
+
}
|
|
226
|
+
// ─── Control Flow ──────────────────────────────────────────
|
|
227
|
+
function emitControlFlow(cf, remaining, state, _isRoot) {
|
|
228
|
+
if (cf.isLoop) {
|
|
229
|
+
emitLoop(cf, remaining, state);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
emitConditional(cf, remaining, state);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function emitLoop(cf, remaining, state) {
|
|
236
|
+
// - for item in items → items.map(item => ...)
|
|
237
|
+
// - for item, i in items → items.map((item, i) => ...)
|
|
238
|
+
// - while condition → (() => { const __r = []; while (cond) __r.push(...); return __r; })()
|
|
239
|
+
if (cf.controlKind === 'for') {
|
|
240
|
+
const expr = cf.expression.source.trim();
|
|
241
|
+
const forMatch = expr.match(/^(.+?)\s+in\s+(.+)$/);
|
|
242
|
+
if (forMatch) {
|
|
243
|
+
const vars = forMatch[1].trim(); // e.g., "item" or "item, index"
|
|
244
|
+
const iterable = forMatch[2].trim();
|
|
245
|
+
state.emit(`...${compileExpression(new Expression(iterable))}.map((${vars}) => `);
|
|
246
|
+
// Wrap children in Fragment if multiple
|
|
247
|
+
if (cf.children.length === 0) {
|
|
248
|
+
state.output += 'null';
|
|
249
|
+
}
|
|
250
|
+
else if (cf.children.length === 1 && cf.children[0] instanceof Element) {
|
|
251
|
+
const childJs = emitChildToJs(cf.children[0], state);
|
|
252
|
+
state.output += childJs;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
state.output += 'jsxs(Fragment, {}';
|
|
256
|
+
if (cf.children.length > 0) {
|
|
257
|
+
state.output += ', ';
|
|
258
|
+
state.output += cf.children.map(c => emitChildToJs(c, state)).join(', ');
|
|
259
|
+
}
|
|
260
|
+
state.output += ')';
|
|
261
|
+
}
|
|
262
|
+
state.output += ')';
|
|
263
|
+
// Handle remaining nodes (they go after the map)
|
|
264
|
+
if (remaining.length > 0) {
|
|
265
|
+
state.output += ',\n';
|
|
266
|
+
emitNodes(remaining, state);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
state.output += ';\n';
|
|
270
|
+
}
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (cf.controlKind === 'while') {
|
|
275
|
+
const cond = compileExpression(cf.expression);
|
|
276
|
+
state.emitLine(`(() => {`);
|
|
277
|
+
state.indentBlock(() => {
|
|
278
|
+
state.emitLine(`const __result = [];`);
|
|
279
|
+
state.emitLine(`while (${cond}) {`);
|
|
280
|
+
state.indentBlock(() => {
|
|
281
|
+
if (cf.children.length === 1 && cf.children[0] instanceof Element) {
|
|
282
|
+
state.emit(`__result.push(${emitChildToJs(cf.children[0], state)});\n`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
state.emit(`__result.push(jsxs(Fragment, {}, ${cf.children.map(c => emitChildToJs(c, state)).join(', ')}));\n`);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
state.emitLine(`}`);
|
|
289
|
+
state.emitLine(`return __result;`);
|
|
290
|
+
});
|
|
291
|
+
state.emit(`})()`);
|
|
292
|
+
if (remaining.length > 0) {
|
|
293
|
+
state.output += ',\n';
|
|
294
|
+
emitNodes(remaining, state);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
state.output += ';\n';
|
|
298
|
+
}
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
// Fallback
|
|
302
|
+
state.emitLine(`/* TODO: emit loop ${cf.controlKind} */`);
|
|
303
|
+
}
|
|
304
|
+
function emitConditional(cf, remaining, state) {
|
|
305
|
+
// else is always reached via cf.next chain — the " : " was emitted by parent
|
|
306
|
+
if (cf.controlKind === 'else') {
|
|
307
|
+
emitElseBranch(cf, state);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// Build ternary chain: cond ? jsx(...) : (elseCond ? jsx(...) : null)
|
|
311
|
+
const condition = compileExpression(cf.expression);
|
|
312
|
+
if (cf.controlKind === 'unless') {
|
|
313
|
+
// unless cond → !(cond)
|
|
314
|
+
state.emit(`!(${condition}) ? `);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
state.emit(`${condition} ? `);
|
|
318
|
+
}
|
|
319
|
+
// Then branch
|
|
320
|
+
if (cf.children.length === 0) {
|
|
321
|
+
state.output += 'null';
|
|
322
|
+
}
|
|
323
|
+
else if (cf.children.length === 1) {
|
|
324
|
+
state.output += emitChildToJs(cf.children[0], state);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
state.output += `jsxs(Fragment, {}, ${cf.children.map(c => emitChildToJs(c, state)).join(', ')})`;
|
|
328
|
+
}
|
|
329
|
+
// Else / remaining
|
|
330
|
+
state.output += ' : ';
|
|
331
|
+
if (cf.next) {
|
|
332
|
+
emitConditional(cf.next, [], state);
|
|
333
|
+
}
|
|
334
|
+
else if (remaining.length > 0) {
|
|
335
|
+
if (remaining.length === 1) {
|
|
336
|
+
state.output += emitChildToJs(remaining[0], state);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
state.output += `jsxs(Fragment, {}, ${remaining.map(c => emitChildToJs(c, state)).join(', ')})`;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
state.output += 'null';
|
|
344
|
+
}
|
|
345
|
+
state.output += ';\n';
|
|
346
|
+
}
|
|
347
|
+
/** Emit the body of an else branch — no condition prefix. */
|
|
348
|
+
function emitElseBranch(cf, state) {
|
|
349
|
+
if (cf.children.length === 0) {
|
|
350
|
+
state.output += 'null';
|
|
351
|
+
}
|
|
352
|
+
else if (cf.children.length === 1) {
|
|
353
|
+
state.output += emitChildToJs(cf.children[0], state);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
state.output += `jsxs(Fragment, {}, ${cf.children.map(c => emitChildToJs(c, state)).join(', ')})`;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function emitControlFlowToJs(cf, state) {
|
|
360
|
+
// Inline version — used when control flow appears as a child
|
|
361
|
+
if (cf.isLoop && cf.controlKind === 'for') {
|
|
362
|
+
const expr = cf.expression.source.trim();
|
|
363
|
+
const forMatch = expr.match(/^(.+?)\s+in\s+(.+)$/);
|
|
364
|
+
if (forMatch) {
|
|
365
|
+
const vars = forMatch[1].trim();
|
|
366
|
+
const iterable = forMatch[2].trim();
|
|
367
|
+
const compiledIterable = compileExpression(new Expression(iterable));
|
|
368
|
+
const body = cf.children.length === 1
|
|
369
|
+
? emitChildToJs(cf.children[0], state)
|
|
370
|
+
: `jsxs(Fragment, {}, ${cf.children.map(c => emitChildToJs(c, state)).join(', ')})`;
|
|
371
|
+
return `...${compiledIterable}.map((${vars}) => ${body})`;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (cf.controlKind === 'else') {
|
|
375
|
+
// inline else — just emit the body
|
|
376
|
+
return cf.children.length === 1
|
|
377
|
+
? emitChildToJs(cf.children[0], state)
|
|
378
|
+
: cf.children.length > 0
|
|
379
|
+
? `jsxs(Fragment, {}, ${cf.children.map(c => emitChildToJs(c, state)).join(', ')})`
|
|
380
|
+
: 'null';
|
|
381
|
+
}
|
|
382
|
+
if (cf.isConditional) {
|
|
383
|
+
const condition = compileExpression(cf.expression);
|
|
384
|
+
const condExpr = cf.controlKind === 'unless' ? `!(${condition})` : condition;
|
|
385
|
+
const consequent = cf.children.length === 1
|
|
386
|
+
? emitChildToJs(cf.children[0], state)
|
|
387
|
+
: cf.children.length > 0
|
|
388
|
+
? `jsxs(Fragment, {}, ${cf.children.map(c => emitChildToJs(c, state)).join(', ')})`
|
|
389
|
+
: 'null';
|
|
390
|
+
const alternate = cf.next ? emitControlFlowToJs(cf.next, state) : 'null';
|
|
391
|
+
return `${condExpr} ? ${consequent} : ${alternate}`;
|
|
392
|
+
}
|
|
393
|
+
return 'null';
|
|
394
|
+
}
|
|
395
|
+
// ─── Text / Output / Comment / Filter / Doctype ────────────
|
|
396
|
+
function emitText(text, state) {
|
|
397
|
+
// Standalone text at module level — emit as string expression
|
|
398
|
+
state.emitLine(`"${escapeString(text.value)}";`);
|
|
399
|
+
}
|
|
400
|
+
function emitOutput(out, state) {
|
|
401
|
+
const js = compileExpression(out.expression);
|
|
402
|
+
if (out.outputKind === 'escaped') {
|
|
403
|
+
// React handles escaping via jsx text children
|
|
404
|
+
state.emitLine(`jsx(Fragment, {}, ${js});`);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
state.emitLine(`jsx(Fragment, {}, ${js});`);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function emitComment(comment, state) {
|
|
411
|
+
if (comment.commentKind === 'html') {
|
|
412
|
+
state.emitLine(`/* <!-- ${comment.text} --> */`);
|
|
413
|
+
}
|
|
414
|
+
// Haml comments (-#) are stripped entirely
|
|
415
|
+
}
|
|
416
|
+
function emitFilter(filter, state) {
|
|
417
|
+
const { filterName, content } = filter;
|
|
418
|
+
// 1. Plugin-registered filter handlers take priority
|
|
419
|
+
const handler = state.options.filters?.[filterName];
|
|
420
|
+
if (handler) {
|
|
421
|
+
const html = handler(content, filterName);
|
|
422
|
+
state.emitLine(`jsx(Fragment, { dangerouslySetInnerHTML: { __html: ${JSON.stringify(html)} } });`);
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
// 2. Built-in passthrough filters
|
|
426
|
+
switch (filterName) {
|
|
427
|
+
case 'css':
|
|
428
|
+
state.emitLine(`/* <style> */`);
|
|
429
|
+
state.emitLine(`"${escapeString(content)}";`);
|
|
430
|
+
break;
|
|
431
|
+
case 'javascript':
|
|
432
|
+
case 'coffee':
|
|
433
|
+
state.emitLine(content);
|
|
434
|
+
break;
|
|
435
|
+
case 'markdown':
|
|
436
|
+
// No handler registered — emit as raw text with a hint
|
|
437
|
+
state.emitLine(`// :markdown filter used but no handler registered. Install 'marked' and add to compilerOptions.filters`);
|
|
438
|
+
state.emitLine(`"${escapeString(content)}";`);
|
|
439
|
+
break;
|
|
440
|
+
default:
|
|
441
|
+
state.emitLine(`"${escapeString(content)}";`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/** Emit a filter as a JS expression (for use as a child within parent elements). */
|
|
445
|
+
function emitFilterToJs(filter, state) {
|
|
446
|
+
const { filterName, content } = filter;
|
|
447
|
+
const handler = state.options.filters?.[filterName];
|
|
448
|
+
if (handler) {
|
|
449
|
+
const html = handler(content, filterName);
|
|
450
|
+
return `jsx(Fragment, { dangerouslySetInnerHTML: { __html: ${JSON.stringify(html)} } })`;
|
|
451
|
+
}
|
|
452
|
+
// No handler — emit raw text as a string child
|
|
453
|
+
return escapeString(content);
|
|
454
|
+
}
|
|
455
|
+
function emitDoctype(doctype, state) {
|
|
456
|
+
// Doctype is typically handled by the HTML renderer, but for React
|
|
457
|
+
// we emit it as a comment or skip it
|
|
458
|
+
state.emitLine(`// DOCTYPE ${doctype.value || 'html'}`);
|
|
459
|
+
}
|
|
460
|
+
// ─── Helpers ───────────────────────────────────────────────
|
|
461
|
+
function escapeString(s) {
|
|
462
|
+
return JSON.stringify(s);
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Expression } from './ast.js';
|
|
2
|
+
/** Parse a CoffeeScript expression string into its AST representation.
|
|
3
|
+
* Uses the host's CoffeeScript installation. Returns null gracefully
|
|
4
|
+
* if CoffeeScript is unavailable or parsing fails. */
|
|
5
|
+
export declare function parseExpression(source: string): Expression;
|
|
6
|
+
/** Compile a CoffeeScript expression to JavaScript.
|
|
7
|
+
* If no parsed AST, compiles from source directly.
|
|
8
|
+
* Returns the source as-is if compilation fails. */
|
|
9
|
+
export declare function compileExpression(expr: Expression): string;
|
|
10
|
+
//# sourceMappingURL=expressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAatC;;uDAEuD;AACvD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAa1D;AAED;;qDAEqD;AACrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAkB1D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createRequire } from 'module';
|
|
2
|
+
import { Expression } from './ast.js';
|
|
3
|
+
// ESM-safe CoffeeScript loader — uses createRequire for projects with "type": "module"
|
|
4
|
+
const _require = createRequire(import.meta.url);
|
|
5
|
+
function loadCoffeeScript() {
|
|
6
|
+
try {
|
|
7
|
+
return _require('coffeescript');
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Parse a CoffeeScript expression string into its AST representation.
|
|
14
|
+
* Uses the host's CoffeeScript installation. Returns null gracefully
|
|
15
|
+
* if CoffeeScript is unavailable or parsing fails. */
|
|
16
|
+
export function parseExpression(source) {
|
|
17
|
+
const expr = new Expression(source);
|
|
18
|
+
try {
|
|
19
|
+
const CoffeeScript = loadCoffeeScript();
|
|
20
|
+
if (CoffeeScript && typeof CoffeeScript.parse === 'function') {
|
|
21
|
+
expr.parsed = CoffeeScript.parse(source, { bare: true });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Parse error — store raw source, let emitter handle it
|
|
26
|
+
}
|
|
27
|
+
return expr;
|
|
28
|
+
}
|
|
29
|
+
/** Compile a CoffeeScript expression to JavaScript.
|
|
30
|
+
* If no parsed AST, compiles from source directly.
|
|
31
|
+
* Returns the source as-is if compilation fails. */
|
|
32
|
+
export function compileExpression(expr) {
|
|
33
|
+
if (expr.source.trim() === '')
|
|
34
|
+
return '';
|
|
35
|
+
try {
|
|
36
|
+
const CoffeeScript = loadCoffeeScript();
|
|
37
|
+
if (CoffeeScript && typeof CoffeeScript.compile === 'function') {
|
|
38
|
+
const js = CoffeeScript.compile(expr.source, {
|
|
39
|
+
bare: true,
|
|
40
|
+
inlineMap: false,
|
|
41
|
+
});
|
|
42
|
+
// CoffeeScript.compile wraps result in an IIFE or adds var — strip to get expression
|
|
43
|
+
return stripCoffeeWrapper(js, expr.source);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Fall through
|
|
48
|
+
}
|
|
49
|
+
return expr.source;
|
|
50
|
+
}
|
|
51
|
+
/** Strip CoffeeScript's wrapper to get a clean expression.
|
|
52
|
+
* CoffeeScript.compile('x + 1', {bare: true}) → "var x;\n\nx + 1;\n"
|
|
53
|
+
* We want just "x + 1" */
|
|
54
|
+
function stripCoffeeWrapper(js, _original) {
|
|
55
|
+
let result = js.trim();
|
|
56
|
+
// Remove trailing semicolon and whitespace
|
|
57
|
+
result = result.replace(/;\s*$/, '');
|
|
58
|
+
// If result is multiline, take the last significant line
|
|
59
|
+
const lines = result.split('\n').filter(l => l.trim() !== '');
|
|
60
|
+
if (lines.length > 0) {
|
|
61
|
+
// Remove 'var' declarations from the expression
|
|
62
|
+
const meaningful = lines.filter(l => !/^\s*var\b/.test(l));
|
|
63
|
+
if (meaningful.length > 0) {
|
|
64
|
+
return meaningful.join('\n');
|
|
65
|
+
}
|
|
66
|
+
return lines[lines.length - 1];
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=expressions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,uFAAuF;AACvF,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;uDAEuD;AACvD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;QACxC,IAAI,YAAY,IAAI,OAAO,YAAY,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC7D,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;qDAEqD;AACrD,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;QACxC,IAAI,YAAY,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC/D,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,qFAAqF;YACrF,OAAO,kBAAkB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;2BAE2B;AAC3B,SAAS,kBAAkB,CAAC,EAAU,EAAE,SAAiB;IACvD,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAEvB,2CAA2C;IAC3C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAErC,yDAAyD;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,gDAAgD;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { compile, compileFile, resolveCoffeeHamlFile, COFFEEHAML_EXTENSIONS } from './compiler.js';
|
|
2
|
+
export { CompileError, CompileWarning } from './types.js';
|
|
3
|
+
export type { CompilerOptions, CompileResult, FilterHandler } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC"}
|
package/dist/lexer.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SourceLocation } from './types.js';
|
|
2
|
+
export declare enum TokenType {
|
|
3
|
+
TAG = "TAG",// %tagname
|
|
4
|
+
CLASS = "CLASS",// .classname
|
|
5
|
+
ID = "ID",// #idname
|
|
6
|
+
ATTRS_PAREN = "ATTRS_PAREN",// (attr: val, ...)
|
|
7
|
+
ATTRS_BRACE = "ATTRS_BRACE",// {attr: val, ...}
|
|
8
|
+
OUTPUT = "OUTPUT",// = expression
|
|
9
|
+
OUTPUT_UNESC = "OUTPUT_UNESC",// != expression
|
|
10
|
+
CONTROL = "CONTROL",// - keyword expression
|
|
11
|
+
COMMENT = "COMMENT",// -# comment
|
|
12
|
+
HTML_COMMENT = "HTML_COMMENT",// / comment
|
|
13
|
+
FILTER = "FILTER",// :filtername
|
|
14
|
+
DOCTYPE = "DOCTYPE",// !!! doctype
|
|
15
|
+
TEXT = "TEXT",// plain text content
|
|
16
|
+
INDENT = "INDENT",// increase indentation
|
|
17
|
+
DEDENT = "DEDENT",// decrease indentation
|
|
18
|
+
NEWLINE = "NEWLINE",// line break
|
|
19
|
+
SELF_CLOSE = "SELF_CLOSE"
|
|
20
|
+
}
|
|
21
|
+
export interface Token {
|
|
22
|
+
type: TokenType;
|
|
23
|
+
value: string;
|
|
24
|
+
location: SourceLocation;
|
|
25
|
+
/** For INDENT/DEDENT: the indent level as a number. */
|
|
26
|
+
indent?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function tokenize(source: string, filename?: string): Token[];
|
|
29
|
+
//# sourceMappingURL=lexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5C,oBAAY,SAAS;IACnB,GAAG,QAAiB,CAAa,WAAW;IAC5C,KAAK,UAAiB,CAAW,aAAa;IAC9C,EAAE,OAAiB,CAAc,UAAU;IAC3C,WAAW,gBAAiB,CAAK,mBAAmB;IACpD,WAAW,gBAAiB,CAAK,mBAAmB;IACpD,MAAM,WAAiB,CAAU,eAAe;IAChD,YAAY,iBAAiB,CAAI,gBAAgB;IACjD,OAAO,YAAiB,CAAS,uBAAuB;IACxD,OAAO,YAAiB,CAAS,aAAa;IAC9C,YAAY,iBAAiB,CAAI,YAAY;IAC7C,MAAM,WAAiB,CAAU,cAAc;IAC/C,OAAO,YAAiB,CAAS,cAAc;IAC/C,IAAI,SAAiB,CAAY,qBAAqB;IACtD,MAAM,WAAiB,CAAU,uBAAuB;IACxD,MAAM,WAAiB,CAAU,uBAAuB;IACxD,OAAO,YAAiB,CAAS,aAAa;IAC9C,UAAU,eAAiB;CAC5B;AAID,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CA2DnE"}
|