coffeehaml 0.6.0 → 0.7.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/ast.d.ts +6 -0
- package/dist/ast.d.ts.map +1 -1
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/parser.js +8 -2
- package/dist/parser.js.map +1 -1
- package/dist/prettier/coffeescript-formatter.d.ts +31 -0
- package/dist/prettier/coffeescript-formatter.d.ts.map +1 -0
- package/dist/prettier/coffeescript-formatter.js +409 -0
- package/dist/prettier/coffeescript-formatter.js.map +1 -0
- package/dist/prettier/index.d.ts +8 -0
- package/dist/prettier/index.d.ts.map +1 -0
- package/dist/prettier/index.js +69 -0
- package/dist/prettier/index.js.map +1 -0
- package/dist/prettier/options.d.ts +10 -0
- package/dist/prettier/options.d.ts.map +1 -0
- package/dist/prettier/options.js +200 -0
- package/dist/prettier/options.js.map +1 -0
- package/dist/prettier/printer.d.ts +45 -0
- package/dist/prettier/printer.d.ts.map +1 -0
- package/dist/prettier/printer.js +652 -0
- package/dist/prettier/printer.js.map +1 -0
- package/docs/examples.md +201 -1
- package/docs/grammar.md +90 -1
- package/docs/index.html +260 -37
- package/package.json +10 -3
- package/syntaxes/CoffeeHaml.tmLanguage +815 -868
- package/syntaxes/coffeehaml.tmLanguage.json +352 -161
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoffeeScript Token-Based Formatter
|
|
3
|
+
*
|
|
4
|
+
* Normalizes whitespace and wraps long lines in CoffeeScript expressions
|
|
5
|
+
* embedded within CoffeeHaml templates. Uses CoffeeScript's own lexer
|
|
6
|
+
* (`CoffeeScript.tokens()`) for robust tokenization. Falls back to
|
|
7
|
+
* original source on any parse error.
|
|
8
|
+
*
|
|
9
|
+
* Approach:
|
|
10
|
+
* Phase 1: Tokenize with CoffeeScript's lexer
|
|
11
|
+
* Phase 2: Normalize spacing based on token categories
|
|
12
|
+
* Phase 3: Line-wrap expressions exceeding printWidth
|
|
13
|
+
* Fallback: Return original source on any error
|
|
14
|
+
*/
|
|
15
|
+
import { createRequire } from 'module';
|
|
16
|
+
const _require = createRequire(import.meta.url);
|
|
17
|
+
function loadCoffeeScript() {
|
|
18
|
+
try {
|
|
19
|
+
return _require('coffeescript');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// ─── Spacing categories ───────────────────────────────────
|
|
26
|
+
// ──────────────────────────────────────────────────────────
|
|
27
|
+
// NOTE: Spacing rules use CoffeeScript token TYPES, not values.
|
|
28
|
+
// CoffeeScript categorizes operators into type groups:
|
|
29
|
+
// * / % → MATH
|
|
30
|
+
// << >> >>> → SHIFT
|
|
31
|
+
// == != < > → COMPARE
|
|
32
|
+
// is isnt → COMPARE (rewritten to ==, !=)
|
|
33
|
+
// and or → &&, || (rewritten)
|
|
34
|
+
// not → UNARY (rewritten to !)
|
|
35
|
+
// += -= etc → COMPOUND_ASSIGN
|
|
36
|
+
// + - → + - (same type as value)
|
|
37
|
+
// We use original source text for output but token types for spacing.
|
|
38
|
+
// ──────────────────────────────────────────────────────────
|
|
39
|
+
/** Tokens that should NOT have a space before them. */
|
|
40
|
+
const NO_SPACE_BEFORE = new Set([
|
|
41
|
+
',', ':', ';', '.', '?.', '::',
|
|
42
|
+
')', ']', '}',
|
|
43
|
+
'CALL_END', 'PARAM_END', 'INDEX_END',
|
|
44
|
+
'POST_IF', 'POST_FOR', 'POST_WHILE',
|
|
45
|
+
'TERMINATOR',
|
|
46
|
+
// NOTE: FORIN, FOROF removed — they need space before them
|
|
47
|
+
]);
|
|
48
|
+
/** Tokens that should NOT have a space after them. */
|
|
49
|
+
const NO_SPACE_AFTER = new Set([
|
|
50
|
+
'.', '?.', '::', '...', '..',
|
|
51
|
+
'(', '[', '{',
|
|
52
|
+
'CALL_START', 'PARAM_START', 'INDEX_START',
|
|
53
|
+
'STRING_START', 'INTERPOLATION_START',
|
|
54
|
+
'INDENT', '@',
|
|
55
|
+
// UNARY removed — we handle it in needsSpaceBetween based on original text
|
|
56
|
+
]);
|
|
57
|
+
/** Tokens that ALWAYS get a space after them. */
|
|
58
|
+
const SPACE_AFTER = new Set([
|
|
59
|
+
',', // comma in args/arrays
|
|
60
|
+
':', // colon in object literals
|
|
61
|
+
]);
|
|
62
|
+
/** Binary operators that get spaces on both sides.
|
|
63
|
+
* Uses CoffeeScript token TYPES (MATH, SHIFT, COMPARE, etc.). */
|
|
64
|
+
const SPACE_BOTH = new Set([
|
|
65
|
+
'=', '?=',
|
|
66
|
+
'+', '-', // simple arithmetic (unary handled separately)
|
|
67
|
+
'MATH', // * / %
|
|
68
|
+
'**', // power
|
|
69
|
+
'SHIFT', // << >> >>>
|
|
70
|
+
'&', '|', '^', // bitwise
|
|
71
|
+
'&&', '||', '?', // logical
|
|
72
|
+
'=>', '->', // arrows
|
|
73
|
+
'COMPARE', // == != < > <= >= is isnt
|
|
74
|
+
'COMPOUND_ASSIGN', // += -= *= /= etc.
|
|
75
|
+
'RELATION', // in, of (when not FORIN/FOROF)
|
|
76
|
+
'FOR', // for (comprehension keyword)
|
|
77
|
+
'ELSE', 'IF', 'WHILE', // control flow keywords
|
|
78
|
+
]);
|
|
79
|
+
/** Keywords that should have a space after them (but not before). */
|
|
80
|
+
const KEYWORD_SPACE_AFTER = new Set([
|
|
81
|
+
'RETURN', 'THROW', 'NEW', 'TYPEOF', 'INSTANCEOF', 'DELETE',
|
|
82
|
+
'CLASS', 'EXTENDS', 'DEFAULT', 'IMPORT', 'EXPORT', 'AWAIT',
|
|
83
|
+
'YIELD', 'BREAK', 'CONTINUE', 'SWITCH',
|
|
84
|
+
]);
|
|
85
|
+
/** For-comprehension internal keywords get space on both sides. */
|
|
86
|
+
const FOR_KEYWORDS = new Set(['FORIN', 'FOROF', 'WHEN', 'BY']);
|
|
87
|
+
/** Tokens that start a new expression — after these, - and + are unary. */
|
|
88
|
+
const EXPR_STARTERS = new Set([
|
|
89
|
+
'(', '[', '{', ',', ':',
|
|
90
|
+
'=', '?=',
|
|
91
|
+
'+', '-', 'MATH', '**', 'SHIFT',
|
|
92
|
+
'&', '|', '^',
|
|
93
|
+
'&&', '||', '?',
|
|
94
|
+
'=>', '->',
|
|
95
|
+
'COMPARE', 'COMPOUND_ASSIGN',
|
|
96
|
+
'RETURN', 'INDENT', 'OUTDENT', 'TERMINATOR', 'FOR', 'FORIN', 'FOROF',
|
|
97
|
+
'WHILE', 'IF', 'ELSE', 'THROW', 'NEW', 'TYPEOF', 'INSTANCEOF',
|
|
98
|
+
'DELETE', 'EXTENDS', 'DEFAULT',
|
|
99
|
+
'CALL_START', 'PARAM_START', 'INDEX_START',
|
|
100
|
+
'UNARY',
|
|
101
|
+
]);
|
|
102
|
+
const DEFAULT_OPTS = {
|
|
103
|
+
printWidth: 80,
|
|
104
|
+
methodChainAlign: true,
|
|
105
|
+
enabled: true,
|
|
106
|
+
};
|
|
107
|
+
// ─── Public API ───────────────────────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Format a CoffeeScript expression string.
|
|
110
|
+
* Returns the formatted string or the original on error.
|
|
111
|
+
*/
|
|
112
|
+
export function formatCoffeeScript(source, options = {}) {
|
|
113
|
+
const opts = { ...DEFAULT_OPTS, ...options };
|
|
114
|
+
if (!opts.enabled)
|
|
115
|
+
return source;
|
|
116
|
+
if (!source || source.trim() === '')
|
|
117
|
+
return source;
|
|
118
|
+
try {
|
|
119
|
+
const cs = loadCoffeeScript();
|
|
120
|
+
if (!cs || typeof cs.tokens !== 'function')
|
|
121
|
+
return source;
|
|
122
|
+
// CoffeeScript.tokens() returns tuples: [string, string, location]
|
|
123
|
+
// Map them to our CSToken interface for easier access
|
|
124
|
+
const rawTokens = cs.tokens(source);
|
|
125
|
+
if (!rawTokens || rawTokens.length === 0)
|
|
126
|
+
return source;
|
|
127
|
+
const tokens = rawTokens.map((t) => ({
|
|
128
|
+
type: t[0],
|
|
129
|
+
value: t[1],
|
|
130
|
+
range: t[2]?.range ?? [0, 0],
|
|
131
|
+
generated: !!t[2]?.generated,
|
|
132
|
+
originalText: (t[2]?.range && t[2].range[0] < t[2].range[1])
|
|
133
|
+
? source.slice(t[2].range[0], t[2].range[1])
|
|
134
|
+
: t[1],
|
|
135
|
+
}));
|
|
136
|
+
// Check for implicit/synthetic tokens that would make formatting unsafe.
|
|
137
|
+
// If the expression has zero-width tokens (implicit calls, generated params),
|
|
138
|
+
// fall back to original source to avoid changing semantics.
|
|
139
|
+
if (hasImplicitTokens(tokens)) {
|
|
140
|
+
return source;
|
|
141
|
+
}
|
|
142
|
+
// Phase 2: Normalize spacing (pass original source for text extraction)
|
|
143
|
+
const normalized = normalizeSpacing(tokens, source);
|
|
144
|
+
// Phase 3: Line-wrap if needed
|
|
145
|
+
if (normalized.length > opts.printWidth) {
|
|
146
|
+
return lineWrap(normalized, opts, source);
|
|
147
|
+
}
|
|
148
|
+
return normalized;
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
// On any error, return original source unchanged
|
|
152
|
+
return source;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if the token stream contains implicit/synthetic tokens
|
|
157
|
+
* (zero-width CALL/PARAM tokens) that indicate CoffeeScript
|
|
158
|
+
* implicit function calls. Formatting these would change semantics.
|
|
159
|
+
*/
|
|
160
|
+
function hasImplicitTokens(tokens) {
|
|
161
|
+
for (const t of tokens) {
|
|
162
|
+
if (t.type === 'INDENT' || t.type === 'OUTDENT' || t.type === 'TERMINATOR')
|
|
163
|
+
continue;
|
|
164
|
+
if (t.generated)
|
|
165
|
+
return true;
|
|
166
|
+
if (t.range && t.range[0] >= t.range[1])
|
|
167
|
+
return true;
|
|
168
|
+
// Check for CALL_START/CALL_END that aren't explicit parens:
|
|
169
|
+
// If they're at same position as another token, they're implicit
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
// ─── Phase 2: Spacing normalization ──────────────────────
|
|
174
|
+
/**
|
|
175
|
+
* Normalize whitespace in a token stream.
|
|
176
|
+
* Uses original source text (from token ranges) for output
|
|
177
|
+
* but CoffeeScript token TYPES for spacing decisions.
|
|
178
|
+
* This preserves keywords like 'is', 'and', 'not' that
|
|
179
|
+
* CoffeeScript rewrites internally.
|
|
180
|
+
*/
|
|
181
|
+
function normalizeSpacing(tokens, originalSource) {
|
|
182
|
+
const parts = [];
|
|
183
|
+
let prevVisible = null;
|
|
184
|
+
// Track whether prev was at expression start (for unary detection).
|
|
185
|
+
// Starts true because the first token is at expression start.
|
|
186
|
+
let prevWasAtExprStart = true;
|
|
187
|
+
// Track whether the position AFTER prev starts an expression
|
|
188
|
+
// (for the next token's unary detection).
|
|
189
|
+
let afterPrevIsExprStart = true;
|
|
190
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
191
|
+
const cur = tokens[i];
|
|
192
|
+
// Skip implicit/synthetic call tokens:
|
|
193
|
+
// - generated CALL_START/CALL_END
|
|
194
|
+
// - zero-width CALL_START/CALL_END (CoffeeScript may not mark these as generated)
|
|
195
|
+
if (cur.type === 'CALL_START' || cur.type === 'CALL_END') {
|
|
196
|
+
if (cur.generated)
|
|
197
|
+
continue;
|
|
198
|
+
// Also skip if zero-width (implicit parens)
|
|
199
|
+
if (cur.range && cur.range[0] >= cur.range[1])
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// Also skip zero-width PARAM_START/PARAM_END (generated arrow params)
|
|
203
|
+
if (cur.type === 'PARAM_START' || cur.type === 'PARAM_END') {
|
|
204
|
+
if (cur.generated)
|
|
205
|
+
continue;
|
|
206
|
+
if (cur.range && cur.range[0] >= cur.range[1])
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
// INDENT/OUTDENT: skip output but track the previous real token
|
|
210
|
+
// for spacing purposes (INDENT after => should not break the
|
|
211
|
+
// space between => and the next token).
|
|
212
|
+
if (cur.type === 'INDENT' || cur.type === 'OUTDENT') {
|
|
213
|
+
// Don't update prevVisible — keep the last real token
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
// TERMINATOR: skip entirely
|
|
217
|
+
if (cur.type === 'TERMINATOR') {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
// Determine space before this token
|
|
221
|
+
if (prevVisible && prevVisible.type !== 'INDENT' && prevVisible.type !== 'OUTDENT') {
|
|
222
|
+
if (needsSpaceBetween(prevVisible, cur, prevWasAtExprStart)) {
|
|
223
|
+
parts.push(' ');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Output token text: prefer original source, fall back to token value
|
|
227
|
+
parts.push(getTokenText(cur, originalSource));
|
|
228
|
+
// Update tracking for next iteration
|
|
229
|
+
prevWasAtExprStart = afterPrevIsExprStart;
|
|
230
|
+
afterPrevIsExprStart = EXPR_STARTERS.has(cur.type);
|
|
231
|
+
prevVisible = cur;
|
|
232
|
+
}
|
|
233
|
+
return parts.join('');
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get the original source text for a token.
|
|
237
|
+
* CoffeeScript may rewrite token values (is→==, and→&&),
|
|
238
|
+
* so we use the original source range when available.
|
|
239
|
+
*/
|
|
240
|
+
/**
|
|
241
|
+
* Get the output text for a token.
|
|
242
|
+
* Prefers original source text from the token's range,
|
|
243
|
+
* but falls back to token value for zero-width ranges,
|
|
244
|
+
* generated tokens, or when originalSource is unavailable.
|
|
245
|
+
*/
|
|
246
|
+
function getTokenText(token, originalSource) {
|
|
247
|
+
// For generated tokens, use the token value (e.g., '(' for CALL_START)
|
|
248
|
+
if (token.generated)
|
|
249
|
+
return token.value;
|
|
250
|
+
// For zero-width ranges, use token value
|
|
251
|
+
if (!token.range || token.range[0] >= token.range[1])
|
|
252
|
+
return token.value;
|
|
253
|
+
// Use original source text
|
|
254
|
+
if (originalSource) {
|
|
255
|
+
return originalSource.slice(token.range[0], token.range[1]);
|
|
256
|
+
}
|
|
257
|
+
return token.value;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Determine if a space is needed between two visible tokens.
|
|
261
|
+
* @param prevAtExprStart true if the position BEFORE prev was at
|
|
262
|
+
* expression start — used to detect unary + / - operators.
|
|
263
|
+
*/
|
|
264
|
+
function needsSpaceBetween(prev, cur, prevAtExprStart) {
|
|
265
|
+
// No space after these token types (e.g., ., (, [, @)
|
|
266
|
+
if (NO_SPACE_AFTER.has(prev.type))
|
|
267
|
+
return false;
|
|
268
|
+
// No space before these token types (e.g., , : ; . ) ] })
|
|
269
|
+
if (NO_SPACE_BEFORE.has(cur.type))
|
|
270
|
+
return false;
|
|
271
|
+
// @property access: no space after @
|
|
272
|
+
if (prev.type === '@')
|
|
273
|
+
return false;
|
|
274
|
+
// Tokens that always get a space after (comma, colon)
|
|
275
|
+
if (SPACE_AFTER.has(prev.type))
|
|
276
|
+
return true;
|
|
277
|
+
// For-comprehension keywords: space around FORIN, FOROF, WHEN, BY
|
|
278
|
+
if (FOR_KEYWORDS.has(prev.type) || FOR_KEYWORDS.has(cur.type))
|
|
279
|
+
return true;
|
|
280
|
+
// Keywords that take space after them (FOR, RETURN, THROW, etc.)
|
|
281
|
+
if (KEYWORD_SPACE_AFTER.has(prev.type))
|
|
282
|
+
return true;
|
|
283
|
+
// UNARY (! or not): no space after if the original text is !
|
|
284
|
+
// (as opposed to the keyword 'not')
|
|
285
|
+
if (prev.type === 'UNARY') {
|
|
286
|
+
const text = prev.originalText || prev.value;
|
|
287
|
+
if (text === '!' || text === '!!')
|
|
288
|
+
return false;
|
|
289
|
+
// For 'not' keyword: space after is desired
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
// Binary operators: space on both sides
|
|
293
|
+
if (SPACE_BOTH.has(prev.type) || SPACE_BOTH.has(cur.type)) {
|
|
294
|
+
// If prev is + or - and is at expression start, it's unary — no space after it
|
|
295
|
+
if (isUnaryOp(prev, prevAtExprStart))
|
|
296
|
+
return false;
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
// Space between two identifiers (rare but possible)
|
|
300
|
+
if (prev.type === 'IDENTIFIER' && cur.type === 'IDENTIFIER')
|
|
301
|
+
return true;
|
|
302
|
+
// Default: no extra space
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Check if prev token is a unary + or - operator.
|
|
307
|
+
* prevAtExprStart is the expression-start state BEFORE prev was processed.
|
|
308
|
+
*/
|
|
309
|
+
function isUnaryOp(prev, prevAtExprStart) {
|
|
310
|
+
if (prev.type !== '+' && prev.type !== '-')
|
|
311
|
+
return false;
|
|
312
|
+
// At expression start (first token or after expression starter)
|
|
313
|
+
if (prevAtExprStart)
|
|
314
|
+
return true;
|
|
315
|
+
// Also unary if at the very beginning (range[0] === 0)
|
|
316
|
+
if (prev.range && prev.range[0] === 0)
|
|
317
|
+
return true;
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
// ─── Phase 3: Line wrapping ──────────────────────────────
|
|
321
|
+
function lineWrap(source, opts, fallback) {
|
|
322
|
+
// Strategy: break at natural points
|
|
323
|
+
// 1. Method chains: break after each .method
|
|
324
|
+
// 2. Arrow functions: break after =>
|
|
325
|
+
// 3. Binary expressions: break after operators
|
|
326
|
+
// 4. Object literals: break after ,
|
|
327
|
+
// For now, implement method chain wrapping (most common long-expression case)
|
|
328
|
+
if (opts.methodChainAlign && hasMethodChain(source)) {
|
|
329
|
+
return wrapMethodChain(source, opts);
|
|
330
|
+
}
|
|
331
|
+
// Fall back — source is already normalized, just too long
|
|
332
|
+
return fallback;
|
|
333
|
+
}
|
|
334
|
+
function hasMethodChain(source) {
|
|
335
|
+
// Detect .method chains (not just a single .property)
|
|
336
|
+
const dotCount = (source.match(/\.[a-zA-Z_$]/g) || []).length;
|
|
337
|
+
return dotCount >= 2;
|
|
338
|
+
}
|
|
339
|
+
function wrapMethodChain(source, _opts) {
|
|
340
|
+
// Break .method calls onto separate lines with aligned dots
|
|
341
|
+
// But be careful not to break inside strings, parens, or brackets
|
|
342
|
+
const indent = ' '.repeat(1); // 1 level of indentation for continuation
|
|
343
|
+
const result = [];
|
|
344
|
+
const chars = [...source];
|
|
345
|
+
let depth = 0;
|
|
346
|
+
let current = '';
|
|
347
|
+
let i = 0;
|
|
348
|
+
while (i < chars.length) {
|
|
349
|
+
const ch = chars[i];
|
|
350
|
+
// Track nesting depth
|
|
351
|
+
if (ch === '(' || ch === '[' || ch === '{')
|
|
352
|
+
depth++;
|
|
353
|
+
if (ch === ')' || ch === ']' || ch === '}')
|
|
354
|
+
depth--;
|
|
355
|
+
// Break before . at depth 0
|
|
356
|
+
if (ch === '.' && depth === 0 && i > 0 && chars[i - 1] !== '?' && current.trim().length > 0) {
|
|
357
|
+
if (result.length === 0) {
|
|
358
|
+
// First segment
|
|
359
|
+
result.push(current.trimEnd());
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
result.push(indent + current.trimEnd());
|
|
363
|
+
}
|
|
364
|
+
current = ch;
|
|
365
|
+
i++;
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
current += ch;
|
|
369
|
+
i++;
|
|
370
|
+
}
|
|
371
|
+
// Add remaining
|
|
372
|
+
if (current.trim().length > 0) {
|
|
373
|
+
if (result.length === 0) {
|
|
374
|
+
result.push(current.trim());
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
result.push(indent + current.trim());
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return result.length > 1 ? result.join('\n') : source;
|
|
381
|
+
}
|
|
382
|
+
// ─── Batch formatting for embedded blocks ─────────────────
|
|
383
|
+
/**
|
|
384
|
+
* Format a block of CoffeeScript code (multiple statements).
|
|
385
|
+
* Used for Statement bodies, CoffeeScript filters, and prologue.
|
|
386
|
+
*/
|
|
387
|
+
export function formatCoffeeScriptBlock(source, options = {}) {
|
|
388
|
+
const opts = { ...DEFAULT_OPTS, ...options };
|
|
389
|
+
if (!opts.enabled || !source || source.trim() === '')
|
|
390
|
+
return source;
|
|
391
|
+
// For blocks, format each line individually
|
|
392
|
+
const lines = source.split('\n');
|
|
393
|
+
const formatted = lines.map(line => {
|
|
394
|
+
const trimmed = line.trim();
|
|
395
|
+
if (!trimmed)
|
|
396
|
+
return '';
|
|
397
|
+
// Preserve leading whitespace for indentation
|
|
398
|
+
const leading = line.match(/^(\s*)/)?.[1] ?? '';
|
|
399
|
+
try {
|
|
400
|
+
const formattedExpr = formatCoffeeScript(trimmed, options);
|
|
401
|
+
return leading + formattedExpr;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return line;
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
return formatted.join('\n');
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=coffeescript-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coffeescript-formatter.js","sourceRoot":"","sources":["../../src/prettier/coffeescript-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Plugin } from 'prettier';
|
|
2
|
+
import { Node } from '../ast.js';
|
|
3
|
+
declare const plugin: Plugin<Node>;
|
|
4
|
+
export default plugin;
|
|
5
|
+
export { options, defaultOptions } from './options.js';
|
|
6
|
+
export { print } from './printer.js';
|
|
7
|
+
export type { CoffeeHamlFormatOptions } from './printer.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prettier/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAA0E,MAAM,UAAU,CAAC;AAG/G,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0EjC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,IAAI,CAMxB,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// CoffeeHaml Prettier Plugin — Entry Point
|
|
2
|
+
//
|
|
3
|
+
// Auto-discovered by Prettier when listed in plugins.
|
|
4
|
+
// Usage in .prettierrc: { "plugins": ["prettier-plugin-coffeehaml"] }
|
|
5
|
+
import { tokenize } from '../lexer.js';
|
|
6
|
+
import { parse } from '../parser.js';
|
|
7
|
+
import { print, embedCoffeeScript } from './printer.js';
|
|
8
|
+
import { options, defaultOptions } from './options.js';
|
|
9
|
+
// ─── Language ──────────────────────────────────────────────
|
|
10
|
+
const coffeeHamlLanguage = {
|
|
11
|
+
name: 'CoffeeHaml',
|
|
12
|
+
parsers: ['coffeehaml'],
|
|
13
|
+
extensions: ['.chaml', '.coffeehaml'],
|
|
14
|
+
vscodeLanguageIds: ['coffeehaml'],
|
|
15
|
+
};
|
|
16
|
+
// ─── Parser ────────────────────────────────────────────────
|
|
17
|
+
const coffeeHamlParser = {
|
|
18
|
+
parse(text, _options) {
|
|
19
|
+
const tokens = tokenize(text);
|
|
20
|
+
const result = parse(tokens);
|
|
21
|
+
if (result.errors.length > 0 && result.document.children.length === 0) {
|
|
22
|
+
throw new Error('CoffeeHaml parse errors:\n' +
|
|
23
|
+
result.errors.map(e => ` ${e.message}`).join('\n'));
|
|
24
|
+
}
|
|
25
|
+
return result.document;
|
|
26
|
+
},
|
|
27
|
+
astFormat: 'coffeehaml-ast',
|
|
28
|
+
locStart(node) {
|
|
29
|
+
return node?.location?.offset ?? 0;
|
|
30
|
+
},
|
|
31
|
+
locEnd(node) {
|
|
32
|
+
if (!node?.location)
|
|
33
|
+
return 0;
|
|
34
|
+
return node.location.offset + node.location.length;
|
|
35
|
+
},
|
|
36
|
+
hasPragma(text) {
|
|
37
|
+
return /\/\*\*\s*@format\s*\*\//.test(text) || /^\/\s*@format/.test(text);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
// ─── Printer ───────────────────────────────────────────────
|
|
41
|
+
const coffeeHamlPrinter = {
|
|
42
|
+
print(path, options, printFn, _args) {
|
|
43
|
+
// Merge Prettier core options + our plugin options into CoffeeHamlFormatOptions
|
|
44
|
+
const opts = options;
|
|
45
|
+
// Pass original text for blank-line detection
|
|
46
|
+
if (options.originalText) {
|
|
47
|
+
opts.originalText = options.originalText;
|
|
48
|
+
}
|
|
49
|
+
return print(path, opts, printFn);
|
|
50
|
+
},
|
|
51
|
+
embed(path, _options) {
|
|
52
|
+
return embedCoffeeScript(path, print) ?? null;
|
|
53
|
+
},
|
|
54
|
+
insertPragma(text) {
|
|
55
|
+
return '/** @format */\n' + text;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
// ─── Export ────────────────────────────────────────────────
|
|
59
|
+
const plugin = {
|
|
60
|
+
languages: [coffeeHamlLanguage],
|
|
61
|
+
parsers: { coffeehaml: coffeeHamlParser },
|
|
62
|
+
printers: { 'coffeehaml-ast': coffeeHamlPrinter },
|
|
63
|
+
options,
|
|
64
|
+
defaultOptions,
|
|
65
|
+
};
|
|
66
|
+
export default plugin;
|
|
67
|
+
export { options, defaultOptions } from './options.js';
|
|
68
|
+
export { print } from './printer.js';
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prettier/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoffeeHaml Prettier Plugin — Formatting Options
|
|
3
|
+
*
|
|
4
|
+
* Every formatting feature is independently deactivatable.
|
|
5
|
+
* 'preserve', false, or -1 means "leave as-is, no intervention."
|
|
6
|
+
*/
|
|
7
|
+
import type { SupportOption } from 'prettier';
|
|
8
|
+
export declare const options: Record<string, SupportOption>;
|
|
9
|
+
export declare const defaultOptions: Record<string, any>;
|
|
10
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/prettier/options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAA+D,aAAa,EAAE,MAAM,UAAU,CAAC;AAkL3G,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAkBjD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAkB9C,CAAC"}
|