coffeehaml 0.7.0 → 0.7.1
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/README.md +21 -5
- package/dist/ast.js +334 -125
- package/dist/cli.js +363 -291
- package/dist/compiler.js +126 -89
- package/dist/emitter.js +771 -736
- package/dist/errors.js +5 -2
- package/dist/expressions.js +211 -154
- package/dist/index.js +22 -6
- package/dist/lexer.js +536 -340
- package/dist/parser.js +533 -438
- package/dist/prettier/coffeescript-formatter.js +292 -392
- package/dist/prettier/index.js +96 -60
- package/dist/prettier/options.js +179 -147
- package/dist/prettier/printer.js +549 -642
- package/dist/src/ast.js +338 -0
- package/dist/src/cli.js +430 -0
- package/dist/src/compiler.js +132 -0
- package/dist/src/emitter.js +791 -0
- package/dist/src/errors.js +5 -0
- package/dist/src/expressions.js +223 -0
- package/dist/src/index.js +22 -0
- package/dist/src/lexer.js +504 -0
- package/dist/src/parser.js +575 -0
- package/dist/src/types.js +122 -0
- package/dist/src/vite-plugin.js +78 -0
- package/dist/types.js +122 -12
- package/dist/vite-plugin.js +78 -63
- package/package.json +4 -9
- package/dist/ast.d.ts +0 -123
- package/dist/ast.d.ts.map +0 -1
- package/dist/ast.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/compiler.d.ts +0 -10
- package/dist/compiler.d.ts.map +0 -1
- package/dist/compiler.js.map +0 -1
- package/dist/emitter.d.ts +0 -4
- package/dist/emitter.d.ts.map +0 -1
- package/dist/emitter.js.map +0 -1
- package/dist/errors.d.ts +0 -3
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/expressions.d.ts +0 -22
- package/dist/expressions.d.ts.map +0 -1
- package/dist/expressions.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lexer.d.ts +0 -30
- package/dist/lexer.d.ts.map +0 -1
- package/dist/lexer.js.map +0 -1
- package/dist/parser.d.ts +0 -10
- package/dist/parser.d.ts.map +0 -1
- package/dist/parser.js.map +0 -1
- package/dist/prettier/coffeescript-formatter.d.ts +0 -31
- package/dist/prettier/coffeescript-formatter.d.ts.map +0 -1
- package/dist/prettier/coffeescript-formatter.js.map +0 -1
- package/dist/prettier/index.d.ts +0 -8
- package/dist/prettier/index.d.ts.map +0 -1
- package/dist/prettier/index.js.map +0 -1
- package/dist/prettier/options.d.ts +0 -10
- package/dist/prettier/options.d.ts.map +0 -1
- package/dist/prettier/options.js.map +0 -1
- package/dist/prettier/printer.d.ts +0 -45
- package/dist/prettier/printer.d.ts.map +0 -1
- package/dist/prettier/printer.js.map +0 -1
- package/dist/types.d.ts +0 -76
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vite-plugin.d.ts +0 -7
- package/dist/vite-plugin.d.ts.map +0 -1
- package/dist/vite-plugin.js.map +0 -1
package/dist/errors.js
CHANGED
package/dist/expressions.js
CHANGED
|
@@ -1,166 +1,223 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
// Generated by CoffeeScript 2.7.0
|
|
2
|
+
// expressions.coffee — CoffeeScript expression compilation bridge
|
|
3
|
+
var _coffeeScriptAvailable, _coffeeScriptUnavailableReason, _require, checkCoffeeScript, loadCoffeeScript, stripCoffeeWrapper, stripToConst;
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
createRequire
|
|
7
|
+
} from 'module';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
Expression
|
|
11
|
+
} from './ast.js';
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
CompileError
|
|
15
|
+
} from './types.js';
|
|
16
|
+
|
|
17
|
+
// ESM-safe CoffeeScript loader
|
|
18
|
+
_require = createRequire(import.meta.url);
|
|
19
|
+
|
|
20
|
+
loadCoffeeScript = function() {
|
|
21
|
+
try {
|
|
22
|
+
return _require('coffeescript');
|
|
23
|
+
} catch (error) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// ─── Availability check ────────────────────────────────────
|
|
29
|
+
_coffeeScriptAvailable = null;
|
|
30
|
+
|
|
31
|
+
_coffeeScriptUnavailableReason = '';
|
|
32
|
+
|
|
33
|
+
checkCoffeeScript = function() {
|
|
34
|
+
var cs, e;
|
|
35
|
+
if (_coffeeScriptAvailable !== null) {
|
|
36
|
+
return _coffeeScriptAvailable;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
cs = loadCoffeeScript();
|
|
40
|
+
if (cs && typeof cs.compile === 'function') {
|
|
41
|
+
_coffeeScriptAvailable = true;
|
|
42
|
+
return true;
|
|
9
43
|
}
|
|
10
|
-
|
|
11
|
-
|
|
44
|
+
_coffeeScriptAvailable = false;
|
|
45
|
+
_coffeeScriptUnavailableReason = 'CoffeeScript module loaded but has no compile() function';
|
|
46
|
+
return false;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
e = error;
|
|
49
|
+
_coffeeScriptAvailable = false;
|
|
50
|
+
_coffeeScriptUnavailableReason = `CoffeeScript unavailable: ${e instanceof Error ? e.message : String(e)}`;
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export var isCoffeeScriptAvailable = function() {
|
|
56
|
+
return checkCoffeeScript();
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export var getCoffeeScriptUnavailableReason = function() {
|
|
60
|
+
checkCoffeeScript();
|
|
61
|
+
return _coffeeScriptUnavailableReason;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// ─── Parse expression ──────────────────────────────────────
|
|
65
|
+
export var parseExpression = function(source) {
|
|
66
|
+
var CoffeeScript, expr;
|
|
67
|
+
expr = new Expression(source);
|
|
68
|
+
try {
|
|
69
|
+
CoffeeScript = loadCoffeeScript();
|
|
70
|
+
if (CoffeeScript && typeof CoffeeScript.parse === 'function') {
|
|
71
|
+
expr.parsed = CoffeeScript.parse(source, {
|
|
72
|
+
bare: true
|
|
73
|
+
});
|
|
12
74
|
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
75
|
+
} catch (error) {
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
// Parse error — store raw source
|
|
79
|
+
return expr;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// ─── Compile expression to JS ──────────────────────────────
|
|
83
|
+
export var compileExpression = function(expr, location = null) {
|
|
84
|
+
var CoffeeScript, e, js, msg;
|
|
85
|
+
if (expr.source.trim() === '') {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
CoffeeScript = loadCoffeeScript();
|
|
90
|
+
if (CoffeeScript && typeof CoffeeScript.compile === 'function') {
|
|
91
|
+
js = CoffeeScript.compile(expr.source, {
|
|
92
|
+
bare: true,
|
|
93
|
+
inlineMap: false
|
|
94
|
+
});
|
|
95
|
+
return stripCoffeeWrapper(js, expr.source);
|
|
34
96
|
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
/** Get a human-readable reason if CoffeeScript is not available. */
|
|
41
|
-
export function getCoffeeScriptUnavailableReason() {
|
|
42
|
-
checkCoffeeScript(); // ensure initialized
|
|
43
|
-
return _coffeeScriptUnavailableReason;
|
|
44
|
-
}
|
|
45
|
-
/** Parse a CoffeeScript expression string into its AST representation.
|
|
46
|
-
* Uses the host's CoffeeScript installation. Returns null gracefully
|
|
47
|
-
* if CoffeeScript is unavailable or parsing fails. */
|
|
48
|
-
export function parseExpression(source) {
|
|
49
|
-
const expr = new Expression(source);
|
|
50
|
-
try {
|
|
51
|
-
const CoffeeScript = loadCoffeeScript();
|
|
52
|
-
if (CoffeeScript && typeof CoffeeScript.parse === 'function') {
|
|
53
|
-
expr.parsed = CoffeeScript.parse(source, { bare: true });
|
|
54
|
-
}
|
|
97
|
+
} catch (error) {
|
|
98
|
+
e = error;
|
|
99
|
+
msg = e instanceof Error ? e.message : String(e);
|
|
100
|
+
if (location) {
|
|
101
|
+
throw new CompileError(`CoffeeScript expression error: ${msg}`, 'emitter', 'EXPRESSION_ERROR', location, `Check expression: ${expr.source.slice(0, 80)}`);
|
|
55
102
|
}
|
|
56
|
-
|
|
57
|
-
|
|
103
|
+
}
|
|
104
|
+
return expr.source;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// ─── Strip CoffeeScript wrapper ────────────────────────────
|
|
108
|
+
stripCoffeeWrapper = function(js, _original) {
|
|
109
|
+
var body, l, lines, meaningful, result, varLines;
|
|
110
|
+
result = js.trim();
|
|
111
|
+
result = result.replace(/;\s*$/, '');
|
|
112
|
+
lines = (function() {
|
|
113
|
+
var i, len, ref, results;
|
|
114
|
+
ref = result.split('\n');
|
|
115
|
+
results = [];
|
|
116
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
|
117
|
+
l = ref[i];
|
|
118
|
+
if (l.trim() !== '') {
|
|
119
|
+
results.push(l);
|
|
120
|
+
}
|
|
58
121
|
}
|
|
59
|
-
return
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const CoffeeScript = loadCoffeeScript();
|
|
70
|
-
if (CoffeeScript && typeof CoffeeScript.compile === 'function') {
|
|
71
|
-
const js = CoffeeScript.compile(expr.source, {
|
|
72
|
-
bare: true,
|
|
73
|
-
inlineMap: false,
|
|
74
|
-
});
|
|
75
|
-
// CoffeeScript.compile wraps result in an IIFE or adds var — strip to get expression
|
|
76
|
-
return stripCoffeeWrapper(js, expr.source);
|
|
122
|
+
return results;
|
|
123
|
+
})();
|
|
124
|
+
if (lines.length > 0) {
|
|
125
|
+
varLines = (function() {
|
|
126
|
+
var i, len, results;
|
|
127
|
+
results = [];
|
|
128
|
+
for (i = 0, len = lines.length; i < len; i++) {
|
|
129
|
+
l = lines[i];
|
|
130
|
+
if (/^\s*var\b/.test(l)) {
|
|
131
|
+
results.push(l);
|
|
77
132
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
133
|
+
}
|
|
134
|
+
return results;
|
|
135
|
+
})();
|
|
136
|
+
meaningful = (function() {
|
|
137
|
+
var i, len, results;
|
|
138
|
+
results = [];
|
|
139
|
+
for (i = 0, len = lines.length; i < len; i++) {
|
|
140
|
+
l = lines[i];
|
|
141
|
+
if (!/^\s*var\b/.test(l)) {
|
|
142
|
+
results.push(l);
|
|
83
143
|
}
|
|
84
|
-
|
|
144
|
+
}
|
|
145
|
+
return results;
|
|
146
|
+
})();
|
|
147
|
+
if (meaningful.length > 0) {
|
|
148
|
+
if (varLines.length > 0) {
|
|
149
|
+
body = meaningful.join(' ');
|
|
150
|
+
return `(() => { ${varLines.join(' ')} return ${body}; })()`;
|
|
151
|
+
}
|
|
152
|
+
return meaningful.join('\n');
|
|
85
153
|
}
|
|
86
|
-
return
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const varLines = lines.filter(l => /^\s*var\b/.test(l));
|
|
103
|
-
const meaningful = lines.filter(l => !/^\s*var\b/.test(l));
|
|
104
|
-
if (meaningful.length > 0) {
|
|
105
|
-
if (varLines.length > 0) {
|
|
106
|
-
// Var declarations stripped — wrap in IIFE to keep refs scoped
|
|
107
|
-
const body = meaningful.join(' ');
|
|
108
|
-
return `(() => { ${varLines.join(' ')} return ${body}; })()`;
|
|
109
|
-
}
|
|
110
|
-
return meaningful.join('\n');
|
|
111
|
-
}
|
|
112
|
-
return lines[lines.length - 1];
|
|
154
|
+
return lines[lines.length - 1];
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// ─── Compile statement to JS ───────────────────────────────
|
|
160
|
+
export var compileStatement = function(source, location = null) {
|
|
161
|
+
var CoffeeScript, e, js, msg;
|
|
162
|
+
try {
|
|
163
|
+
CoffeeScript = loadCoffeeScript();
|
|
164
|
+
if (CoffeeScript && typeof CoffeeScript.compile === 'function') {
|
|
165
|
+
js = CoffeeScript.compile(source, {
|
|
166
|
+
bare: true,
|
|
167
|
+
inlineMap: false
|
|
168
|
+
});
|
|
169
|
+
return stripToConst(js.trim());
|
|
113
170
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
* Multi-var: "var a, b; a = 1; b = 2;" → "let a = 1; let b = 2;"
|
|
120
|
-
* @param location Source location for error context. */
|
|
121
|
-
export function compileStatement(source, location) {
|
|
122
|
-
try {
|
|
123
|
-
const CoffeeScript = loadCoffeeScript();
|
|
124
|
-
if (CoffeeScript && typeof CoffeeScript.compile === 'function') {
|
|
125
|
-
const js = CoffeeScript.compile(source, {
|
|
126
|
-
bare: true,
|
|
127
|
-
inlineMap: false,
|
|
128
|
-
});
|
|
129
|
-
return stripToConst(js.trim());
|
|
130
|
-
}
|
|
171
|
+
} catch (error) {
|
|
172
|
+
e = error;
|
|
173
|
+
msg = e instanceof Error ? e.message : String(e);
|
|
174
|
+
if (location) {
|
|
175
|
+
throw new CompileError(`CoffeeScript compilation error: ${msg}`, 'emitter', 'COMPILE_ERROR', location, `Check statement: ${source.slice(0, 80)}`);
|
|
131
176
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
177
|
+
}
|
|
178
|
+
return source;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// ─── Convert var → const/let ───────────────────────────────
|
|
182
|
+
stripToConst = function(js) {
|
|
183
|
+
var assignLine, assignments, i, l, len, lines, name, varLine, varNames;
|
|
184
|
+
lines = (function() {
|
|
185
|
+
var i, len, ref, results;
|
|
186
|
+
ref = js.split('\n');
|
|
187
|
+
results = [];
|
|
188
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
|
189
|
+
l = ref[i];
|
|
190
|
+
if (l.trim() !== '') {
|
|
191
|
+
results.push(l);
|
|
192
|
+
}
|
|
138
193
|
}
|
|
139
|
-
return
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
194
|
+
return results;
|
|
195
|
+
})();
|
|
196
|
+
varLine = lines.find(function(l) {
|
|
197
|
+
return /^\s*var\b/.test(l);
|
|
198
|
+
});
|
|
199
|
+
if (!varLine) {
|
|
200
|
+
return js.replace(/;\s*$/, '');
|
|
201
|
+
}
|
|
202
|
+
varNames = varLine.replace(/^\s*var\s+/, '').replace(/;\s*$/, '').split(',').map(function(s) {
|
|
203
|
+
return s.trim();
|
|
204
|
+
}).filter(Boolean);
|
|
205
|
+
assignments = [];
|
|
206
|
+
for (i = 0, len = varNames.length; i < len; i++) {
|
|
207
|
+
name = varNames[i];
|
|
208
|
+
assignLine = lines.find(function(l) {
|
|
209
|
+
var t;
|
|
210
|
+
t = l.trim();
|
|
211
|
+
return t.startsWith(`${name} =`) || t.startsWith(`${name}=`);
|
|
212
|
+
});
|
|
213
|
+
if (assignLine) {
|
|
214
|
+
assignments.push('const ' + assignLine.trim().replace(/;\s*$/, ''));
|
|
160
215
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
216
|
+
}
|
|
217
|
+
if (assignments.length > 0) {
|
|
218
|
+
return assignments.join('; ');
|
|
219
|
+
}
|
|
220
|
+
return lines.filter(function(l) {
|
|
221
|
+
return !/^\s*$/.test(l);
|
|
222
|
+
}).join(' ').replace(/;\s*$/, '');
|
|
223
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
// Generated by CoffeeScript 2.7.0
|
|
2
|
+
// index.coffee — public API
|
|
3
|
+
export {
|
|
4
|
+
compile,
|
|
5
|
+
compileFile,
|
|
6
|
+
resolveCoffeeHamlFile,
|
|
7
|
+
COFFEEHAML_EXTENSIONS
|
|
8
|
+
} from './compiler.js';
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
isCoffeeScriptAvailable
|
|
12
|
+
} from './expressions.js';
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
CompileError,
|
|
16
|
+
CompileWarning
|
|
17
|
+
} from './types.js';
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
// Prettier plugin
|
|
21
|
+
default as prettierPlugin
|
|
22
|
+
} from './prettier/index.js';
|