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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/ast.d.ts +107 -0
  4. package/dist/ast.d.ts.map +1 -0
  5. package/dist/ast.js +125 -0
  6. package/dist/ast.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +53 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compiler.d.ts +10 -0
  12. package/dist/compiler.d.ts.map +1 -0
  13. package/dist/compiler.js +83 -0
  14. package/dist/compiler.js.map +1 -0
  15. package/dist/emitter.d.ts +4 -0
  16. package/dist/emitter.d.ts.map +1 -0
  17. package/dist/emitter.js +464 -0
  18. package/dist/emitter.js.map +1 -0
  19. package/dist/errors.d.ts +3 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +2 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/expressions.d.ts +10 -0
  24. package/dist/expressions.d.ts.map +1 -0
  25. package/dist/expressions.js +70 -0
  26. package/dist/expressions.js.map +1 -0
  27. package/dist/index.d.ts +4 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lexer.d.ts +29 -0
  32. package/dist/lexer.d.ts.map +1 -0
  33. package/dist/lexer.js +315 -0
  34. package/dist/lexer.js.map +1 -0
  35. package/dist/parser.d.ts +4 -0
  36. package/dist/parser.d.ts.map +1 -0
  37. package/dist/parser.js +408 -0
  38. package/dist/parser.js.map +1 -0
  39. package/dist/types.d.ts +65 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +12 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/vite-plugin.d.ts +7 -0
  44. package/dist/vite-plugin.d.ts.map +1 -0
  45. package/dist/vite-plugin.js +44 -0
  46. package/dist/vite-plugin.js.map +1 -0
  47. package/docs/README.md +110 -0
  48. package/docs/architecture.md +619 -0
  49. package/docs/ast.md +413 -0
  50. package/docs/examples.md +719 -0
  51. package/docs/grammar.md +432 -0
  52. package/docs/index.html +129 -0
  53. package/package.json +61 -0
package/dist/parser.js ADDED
@@ -0,0 +1,408 @@
1
+ import { TokenType } from './lexer.js';
2
+ import { Document, Element, ImplicitDiv, Text, Output, ControlFlow, Comment, Filter, Doctype, Expression, } from './ast.js';
3
+ import { CompileError } from './types.js';
4
+ // ─── Parser State ──────────────────────────────────────────
5
+ class ParserState {
6
+ constructor(tokens, filename) {
7
+ this.tokens = tokens;
8
+ this.pos = 0;
9
+ this.filename = filename;
10
+ }
11
+ get current() {
12
+ return this.pos < this.tokens.length ? this.tokens[this.pos] : null;
13
+ }
14
+ get peek() {
15
+ return this.pos + 1 < this.tokens.length ? this.tokens[this.pos + 1] : null;
16
+ }
17
+ advance() {
18
+ const token = this.current;
19
+ this.pos++;
20
+ return token;
21
+ }
22
+ expect(type) {
23
+ const token = this.current;
24
+ if (!token || token.type !== type) {
25
+ throw new CompileError(`Expected ${type} but got ${token?.type ?? 'EOF'}`, 'parser', 'UNEXPECTED_TOKEN', token?.location);
26
+ }
27
+ return this.advance();
28
+ }
29
+ skip(type) {
30
+ if (this.current?.type === type) {
31
+ this.advance();
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ isAt(type) {
37
+ return this.current?.type === type;
38
+ }
39
+ }
40
+ // ─── Public API ────────────────────────────────────────────
41
+ export function parse(tokens, filename) {
42
+ const state = new ParserState(tokens, filename);
43
+ const children = parseBlock(state);
44
+ return new Document(children);
45
+ }
46
+ // ─── Block Parsing ─────────────────────────────────────────
47
+ /** Parse nodes until DEDENT or EOF. */
48
+ function parseBlock(state) {
49
+ const nodes = [];
50
+ while (state.current && state.current.type !== TokenType.DEDENT) {
51
+ const node = parseNode(state);
52
+ if (node)
53
+ nodes.push(node);
54
+ }
55
+ return nodes;
56
+ }
57
+ // ─── Node Dispatcher ───────────────────────────────────────
58
+ function parseNode(state) {
59
+ const token = state.current;
60
+ if (!token)
61
+ return null;
62
+ switch (token.type) {
63
+ case TokenType.TAG:
64
+ return parseElement(state);
65
+ case TokenType.CLASS:
66
+ case TokenType.ID:
67
+ return parseImplicitDiv(state);
68
+ case TokenType.OUTPUT:
69
+ case TokenType.OUTPUT_UNESC:
70
+ return parseOutput(state);
71
+ case TokenType.CONTROL:
72
+ return parseControlFlow(state);
73
+ case TokenType.COMMENT:
74
+ return parseComment(state);
75
+ case TokenType.HTML_COMMENT:
76
+ return parseHtmlComment(state);
77
+ case TokenType.FILTER:
78
+ return parseFilter(state);
79
+ case TokenType.DOCTYPE:
80
+ return parseDoctype(state);
81
+ case TokenType.TEXT:
82
+ return parseText(state);
83
+ case TokenType.INDENT:
84
+ state.advance(); // skip, handled by parseBlock
85
+ return null;
86
+ case TokenType.DEDENT:
87
+ return null; // handled by parseBlock loop
88
+ case TokenType.NEWLINE:
89
+ state.advance();
90
+ return null;
91
+ default:
92
+ state.advance();
93
+ return null;
94
+ }
95
+ }
96
+ // ─── Element ───────────────────────────────────────────────
97
+ function parseElement(state) {
98
+ const tagToken = state.expect(TokenType.TAG);
99
+ const tag = tagToken.value;
100
+ const isComponent = /^[A-Z]/.test(tag);
101
+ let classes = [];
102
+ let id = null;
103
+ let attributes = [];
104
+ let isSelfClosing = false;
105
+ // Parse modifiers and attributes
106
+ while (state.current &&
107
+ (state.current.type === TokenType.CLASS ||
108
+ state.current.type === TokenType.ID ||
109
+ state.current.type === TokenType.ATTRS_BRACE ||
110
+ state.current.type === TokenType.ATTRS_PAREN ||
111
+ state.current.type === TokenType.SELF_CLOSE)) {
112
+ const tok = state.current;
113
+ if (tok.type === TokenType.CLASS) {
114
+ state.advance();
115
+ classes.push(tok.value);
116
+ }
117
+ else if (tok.type === TokenType.ID) {
118
+ state.advance();
119
+ id = tok.value; // last #id wins
120
+ }
121
+ else if (tok.type === TokenType.ATTRS_BRACE) {
122
+ state.advance();
123
+ attributes.push(...parseAttributeBlock(tok.value, '{}', tagToken.location));
124
+ }
125
+ else if (tok.type === TokenType.ATTRS_PAREN) {
126
+ state.advance();
127
+ attributes.push(...parseAttributeBlock(tok.value, '()', tagToken.location));
128
+ }
129
+ else if (tok.type === TokenType.SELF_CLOSE) {
130
+ state.advance();
131
+ isSelfClosing = true;
132
+ }
133
+ }
134
+ // Parse inline text or output if present
135
+ let children = [];
136
+ if (state.current && !isSelfClosing) {
137
+ if (state.current.type === TokenType.OUTPUT) {
138
+ const tok = state.advance();
139
+ children.push(new Output(new Expression(tok.value), 'escaped', tok.location));
140
+ }
141
+ else if (state.current.type === TokenType.OUTPUT_UNESC) {
142
+ const tok = state.advance();
143
+ children.push(new Output(new Expression(tok.value), 'unescaped', tok.location));
144
+ }
145
+ else if (state.current.type === TokenType.TEXT) {
146
+ const textToken = state.advance();
147
+ children.push(new Text(textToken.value, textToken.location));
148
+ }
149
+ }
150
+ // Parse child block if INDENT follows
151
+ if (state.current?.type === TokenType.INDENT && !isSelfClosing) {
152
+ state.advance(); // consume INDENT
153
+ children = children.concat(parseBlock(state));
154
+ state.expect(TokenType.DEDENT);
155
+ }
156
+ return new Element(tag, { classes, id, attributes, children, isComponent, isSelfClosing, location: tagToken.location });
157
+ }
158
+ // ─── ImplicitDiv ───────────────────────────────────────────
159
+ function parseImplicitDiv(state) {
160
+ let classes = [];
161
+ let id = null;
162
+ let attributes = [];
163
+ const firstToken = state.current; // for location
164
+ while (state.current &&
165
+ (state.current.type === TokenType.CLASS ||
166
+ state.current.type === TokenType.ID ||
167
+ state.current.type === TokenType.ATTRS_BRACE ||
168
+ state.current.type === TokenType.ATTRS_PAREN)) {
169
+ const tok = state.current;
170
+ if (tok.type === TokenType.CLASS) {
171
+ state.advance();
172
+ classes.push(tok.value);
173
+ }
174
+ else if (tok.type === TokenType.ID) {
175
+ state.advance();
176
+ id = tok.value;
177
+ }
178
+ else if (tok.type === TokenType.ATTRS_BRACE) {
179
+ state.advance();
180
+ attributes.push(...parseAttributeBlock(tok.value, '{}', firstToken.location));
181
+ }
182
+ else if (tok.type === TokenType.ATTRS_PAREN) {
183
+ state.advance();
184
+ attributes.push(...parseAttributeBlock(tok.value, '()', firstToken.location));
185
+ }
186
+ }
187
+ // Parse inline text
188
+ let children = [];
189
+ if (state.current && state.current.type === TokenType.TEXT) {
190
+ const textToken = state.advance();
191
+ children.push(new Text(textToken.value, textToken.location));
192
+ }
193
+ // Parse child block
194
+ if (state.current?.type === TokenType.INDENT) {
195
+ state.advance();
196
+ children = children.concat(parseBlock(state));
197
+ state.expect(TokenType.DEDENT);
198
+ }
199
+ return new ImplicitDiv({ classes, id, attributes, children, location: firstToken.location });
200
+ }
201
+ // ─── Output ────────────────────────────────────────────────
202
+ function parseOutput(state) {
203
+ const token = state.current;
204
+ const outputKind = token.type === TokenType.OUTPUT ? 'escaped' : 'unescaped';
205
+ state.advance();
206
+ const expr = new Expression(token.value, undefined);
207
+ return new Output(expr, outputKind, token.location);
208
+ }
209
+ // ─── Control Flow ──────────────────────────────────────────
210
+ function parseControlFlow(state) {
211
+ const token = state.expect(TokenType.CONTROL);
212
+ let source = token.value;
213
+ // Normalize "else if" → "if" so it chains naturally in ternary
214
+ if (/^\s*else\s+if\b/.test(source)) {
215
+ source = source.replace(/^\s*else\s+/, '');
216
+ }
217
+ // Parse the control kind from the expression
218
+ const controlKind = parseControlKind(source);
219
+ // Strip the keyword from the expression — store only the condition/iterable
220
+ const exprSource = stripControlKeyword(source, controlKind);
221
+ const expr = new Expression(exprSource, undefined);
222
+ // Parse body if INDENT follows
223
+ let children = [];
224
+ if (state.current?.type === TokenType.INDENT) {
225
+ state.advance();
226
+ children = parseBlock(state);
227
+ state.expect(TokenType.DEDENT);
228
+ }
229
+ // Check for chained else / else if
230
+ let next = null;
231
+ if (state.current?.type === TokenType.CONTROL) {
232
+ const nextSource = state.current.value.trimStart();
233
+ if (isElse(nextSource)) {
234
+ next = parseControlFlow(state);
235
+ }
236
+ }
237
+ return new ControlFlow(controlKind, expr, children, next, token.location);
238
+ }
239
+ function parseControlKind(source) {
240
+ const trimmed = source.trimStart();
241
+ const keyword = trimmed.split(/\s+/)[0];
242
+ switch (keyword) {
243
+ case 'if': return 'if';
244
+ case 'unless': return 'unless';
245
+ case 'for': return 'for';
246
+ case 'while': return 'while';
247
+ case 'else': return 'else';
248
+ default: return 'if'; // default
249
+ }
250
+ }
251
+ function stripControlKeyword(source, kind) {
252
+ const trimmed = source.trimStart();
253
+ // Remove the keyword and any whitespace after it
254
+ const keyword = kind === 'else' ? 'else' : kind;
255
+ const re = new RegExp(`^\\s*${keyword}\\b\\s*`);
256
+ return trimmed.replace(re, '');
257
+ }
258
+ function isElse(source) {
259
+ return /^\s*else\b/.test(source);
260
+ }
261
+ // ─── Comments ──────────────────────────────────────────────
262
+ function parseComment(state) {
263
+ const token = state.expect(TokenType.COMMENT);
264
+ return new Comment('haml', token.value, token.location);
265
+ }
266
+ function parseHtmlComment(state) {
267
+ const token = state.expect(TokenType.HTML_COMMENT);
268
+ return new Comment('html', token.value, token.location);
269
+ }
270
+ // ─── Filter ────────────────────────────────────────────────
271
+ function parseFilter(state) {
272
+ const token = state.expect(TokenType.FILTER);
273
+ const parts = token.value.split('\n');
274
+ const filterName = parts[0];
275
+ let content = parts.slice(1).join('\n');
276
+ // Consume indented children as filter body (Haml convention).
277
+ // After `:markdown`, all indented content belongs to the filter.
278
+ if (state.isAt(TokenType.INDENT)) {
279
+ state.advance(); // skip INDENT
280
+ const lines = [];
281
+ while (state.current && !state.isAt(TokenType.DEDENT)) {
282
+ const tok = state.current;
283
+ if (tok.type === TokenType.TEXT) {
284
+ lines.push(tok.value);
285
+ state.advance();
286
+ }
287
+ else if (tok.type === TokenType.NEWLINE) {
288
+ state.advance();
289
+ }
290
+ else {
291
+ // Unexpected token in filter body — break to avoid infinite loop
292
+ break;
293
+ }
294
+ }
295
+ // Consume DEDENT
296
+ if (state.isAt(TokenType.DEDENT)) {
297
+ state.advance();
298
+ }
299
+ if (lines.length > 0) {
300
+ content = (content ? content + '\n' : '') + lines.join('\n');
301
+ }
302
+ }
303
+ return new Filter(filterName, content, token.location);
304
+ }
305
+ // ─── Doctype ───────────────────────────────────────────────
306
+ function parseDoctype(state) {
307
+ const token = state.expect(TokenType.DOCTYPE);
308
+ return new Doctype(token.value || 'html', token.location);
309
+ }
310
+ // ─── Text ──────────────────────────────────────────────────
311
+ function parseText(state) {
312
+ const token = state.expect(TokenType.TEXT);
313
+ return new Text(token.value, token.location);
314
+ }
315
+ // ─── Attribute Block Parser ────────────────────────────────
316
+ /** Parse a CoffeeScript object literal into attributes.
317
+ * Uses a simple key-value parser that handles:
318
+ * {key: value, key2: value2}
319
+ * {shorthand}
320
+ * {key: "string", 'quoted-key': val, nested: {a: 1}}
321
+ */
322
+ function parseAttributeBlock(source, _style, _location) {
323
+ const attrs = [];
324
+ if (!source.trim())
325
+ return attrs;
326
+ // Simple attribute parser: split on commas outside of brackets/strings
327
+ const pairs = splitAttributePairs(source);
328
+ for (const pair of pairs) {
329
+ const trimmed = pair.trim();
330
+ if (!trimmed)
331
+ continue;
332
+ const colonIdx = findColon(trimmed);
333
+ if (colonIdx === -1) {
334
+ // Shorthand: {foo} → foo={foo}
335
+ attrs.push({
336
+ name: trimmed,
337
+ value: new Expression(trimmed),
338
+ shorthand: true,
339
+ });
340
+ }
341
+ else {
342
+ const name = trimmed.slice(0, colonIdx).trim();
343
+ const value = trimmed.slice(colonIdx + 1).trim();
344
+ // Strip quotes from key if present
345
+ const cleanName = name.replace(/^['"]|['"]$/g, '');
346
+ attrs.push({
347
+ name: cleanName,
348
+ value: new Expression(value),
349
+ shorthand: false,
350
+ });
351
+ }
352
+ }
353
+ return attrs;
354
+ }
355
+ /** Split attribute string on commas, respecting nested brackets and string literals. */
356
+ function splitAttributePairs(source) {
357
+ const result = [];
358
+ let depth = 0;
359
+ let start = 0;
360
+ for (let i = 0; i < source.length; i++) {
361
+ const ch = source[i];
362
+ if (ch === '{' || ch === '[' || ch === '(')
363
+ depth++;
364
+ else if (ch === '}' || ch === ']' || ch === ')')
365
+ depth--;
366
+ else if ((ch === '"' || ch === "'") && depth === 0) {
367
+ // Skip over string literals
368
+ const q = ch;
369
+ i++;
370
+ while (i < source.length && source[i] !== q) {
371
+ if (source[i] === '\\')
372
+ i++;
373
+ i++;
374
+ }
375
+ }
376
+ else if (ch === ',' && depth === 0) {
377
+ result.push(source.slice(start, i));
378
+ start = i + 1;
379
+ }
380
+ }
381
+ result.push(source.slice(start));
382
+ return result;
383
+ }
384
+ /** Find the first colon that is not inside brackets or strings. */
385
+ function findColon(source) {
386
+ let depth = 0;
387
+ for (let i = 0; i < source.length; i++) {
388
+ const ch = source[i];
389
+ if (ch === '{' || ch === '[' || ch === '(')
390
+ depth++;
391
+ else if (ch === '}' || ch === ']' || ch === ')')
392
+ depth--;
393
+ else if ((ch === '"' || ch === "'") && depth === 0) {
394
+ const q = ch;
395
+ i++;
396
+ while (i < source.length && source[i] !== q) {
397
+ if (source[i] === '\\')
398
+ i++;
399
+ i++;
400
+ }
401
+ }
402
+ else if (ch === ':' && depth === 0) {
403
+ return i;
404
+ }
405
+ }
406
+ return -1;
407
+ }
408
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /** Line/column position in source. */
2
+ export interface SourcePosition {
3
+ line: number;
4
+ column: number;
5
+ }
6
+ /** Span within source file. */
7
+ export interface SourceLocation {
8
+ start: SourcePosition;
9
+ end: SourcePosition;
10
+ offset: number;
11
+ length: number;
12
+ file?: string;
13
+ }
14
+ /** A filter handler transforms raw filter content to an HTML string. */
15
+ export interface FilterHandler {
16
+ (content: string, filterName: string): string;
17
+ }
18
+ /** Compiler options. */
19
+ export interface CompilerOptions {
20
+ /** Source file path (for error messages and source maps). */
21
+ filename?: string;
22
+ /** Emit source map alongside output. */
23
+ sourceMap?: boolean;
24
+ /** React JSX runtime import source. */
25
+ jsxRuntime?: string;
26
+ /** JSX import style: 'classic' (React) or 'automatic' (default). */
27
+ jsxImportSource?: string;
28
+ /** Custom filter handlers. Key = filter name (e.g. 'markdown'), value = content→HTML transform. */
29
+ filters?: Record<string, FilterHandler>;
30
+ }
31
+ /** Compiler result. */
32
+ export interface CompileResult {
33
+ code: string;
34
+ sourceMap?: string;
35
+ errors: CompileError[];
36
+ warnings: CompileWarning[];
37
+ }
38
+ /** Compiler error with source location. */
39
+ export declare class CompileError extends Error {
40
+ location?: SourceLocation;
41
+ phase: string;
42
+ hint?: string;
43
+ code: string;
44
+ constructor(message: string, phase: string, code: string, location?: SourceLocation, hint?: string);
45
+ }
46
+ /** Compiler warning. */
47
+ export interface CompileWarning {
48
+ message: string;
49
+ location?: SourceLocation;
50
+ phase: string;
51
+ }
52
+ /** Emitter options. */
53
+ export interface EmitterOptions {
54
+ sourceMap?: boolean;
55
+ filename?: string;
56
+ jsxRuntime?: string;
57
+ /** Custom filter handlers. Key = filter name, value = content→HTML transform. */
58
+ filters?: Record<string, FilterHandler>;
59
+ }
60
+ /** Emitter result. */
61
+ export interface EmitResult {
62
+ code: string;
63
+ sourceMap?: string;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/C;AAED,wBAAwB;AACxB,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,uBAAuB;AACvB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,2CAA2C;AAC3C,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM;CAQnG;AAED,wBAAwB;AACxB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uBAAuB;AACvB,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,sBAAsB;AACtB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ /** Compiler error with source location. */
2
+ export class CompileError extends Error {
3
+ constructor(message, phase, code, location, hint) {
4
+ super(message);
5
+ this.name = 'CompileError';
6
+ this.phase = phase;
7
+ this.code = code;
8
+ this.location = location;
9
+ this.hint = hint;
10
+ }
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA0CA,2CAA2C;AAC3C,MAAM,OAAO,YAAa,SAAQ,KAAK;IAMrC,YAAY,OAAe,EAAE,KAAa,EAAE,IAAY,EAAE,QAAyB,EAAE,IAAa;QAChG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { Plugin } from 'vite';
2
+ import type { CompilerOptions } from './types.js';
3
+ export interface CoffeeHamlPluginOptions {
4
+ compilerOptions?: CompilerOptions;
5
+ }
6
+ export default function coffeehaml(options?: CoffeeHamlPluginOptions): Plugin;
7
+ //# sourceMappingURL=vite-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAID,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,GAAE,uBAA4B,GAAG,MAAM,CA6ChF"}
@@ -0,0 +1,44 @@
1
+ import { compile } from './compiler.js';
2
+ const COFFEEHAML_RE = /\.(coffeehaml|cohaml|chaml)$/;
3
+ export default function coffeehaml(options = {}) {
4
+ const compilerOpts = {
5
+ sourceMap: true,
6
+ ...options.compilerOptions,
7
+ };
8
+ return {
9
+ name: 'coffeehaml',
10
+ transform(code, id) {
11
+ if (!COFFEEHAML_RE.test(id))
12
+ return;
13
+ const result = compile(code, {
14
+ ...compilerOpts,
15
+ filename: id,
16
+ });
17
+ if (result.errors.length > 0) {
18
+ const err = result.errors[0];
19
+ this.error({
20
+ message: err.message,
21
+ id,
22
+ // @ts-ignore
23
+ loc: err.location ? {
24
+ line: err.location.start.line + 1,
25
+ column: err.location.start.column + 1,
26
+ } : undefined,
27
+ });
28
+ return null;
29
+ }
30
+ return {
31
+ code: result.code,
32
+ map: result.sourceMap ? { mappings: result.sourceMap } : null,
33
+ };
34
+ },
35
+ handleHotUpdate({ file, server }) {
36
+ if (COFFEEHAML_RE.test(file)) {
37
+ // Invalidate and reload — the transform hook will recompile
38
+ server.ws.send({ type: 'full-reload' });
39
+ return [];
40
+ }
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAOxC,MAAM,aAAa,GAAG,8BAA8B,CAAC;AAErD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,UAAmC,EAAE;IACtE,MAAM,YAAY,GAAoB;QACpC,SAAS,EAAE,IAAI;QACf,GAAG,OAAO,CAAC,eAAe;KAC3B,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,YAAY;QAElB,SAAS,CAAC,IAAY,EAAE,EAAU;YAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,OAAO;YAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE;gBAC3B,GAAG,YAAY;gBACf,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC;oBACT,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,EAAE;oBACF,aAAa;oBACb,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAClB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;wBACjC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;qBACtC,CAAC,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAS,CAAC,CAAC,CAAC,IAAI;aACrE,CAAC;QACJ,CAAC;QAED,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAC9B,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,4DAA4D;gBAC5D,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;gBACxC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}