@marko/compiler 5.41.0 → 5.41.2
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/index.js +22 -7
- package/dist/util/agent-fix-guide.js +51 -0
- package/dist/util/try-load-translator.js +16 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
13
13
|
var _babelPlugin = _interopRequireDefault(require("./babel-plugin"));
|
|
14
14
|
var _config = _interopRequireDefault(require("./config"));
|
|
15
15
|
var taglib = _interopRequireWildcard(require("./taglib"));exports.taglib = taglib;
|
|
16
|
+
var _agentFixGuide = _interopRequireDefault(require("./util/agent-fix-guide"));
|
|
16
17
|
var _buildCodeFrame = require("./util/build-code-frame");
|
|
17
18
|
var _mergeErrors = _interopRequireDefault(require("./util/merge-errors"));
|
|
18
19
|
var _shouldOptimize = _interopRequireDefault(require("./util/should-optimize"));
|
|
@@ -32,16 +33,24 @@ function configure(newConfig) {
|
|
|
32
33
|
|
|
33
34
|
async function compile(src, filename, config) {
|
|
34
35
|
const markoConfig = loadMarkoConfig(config);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
try {
|
|
37
|
+
const babelConfig = await loadBabelConfig(filename, markoConfig);
|
|
38
|
+
const babelResult = await (0, _babel.transformAsync)(src, babelConfig);
|
|
39
|
+
return buildResult(src, filename, markoConfig.errorRecovery, babelResult);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
throw (0, _agentFixGuide.default)(err, markoConfig.translator);
|
|
42
|
+
}
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
function compileSync(src, filename, config) {
|
|
41
46
|
const markoConfig = loadMarkoConfig(config);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
try {
|
|
48
|
+
const babelConfig = loadBabelConfigSync(filename, markoConfig);
|
|
49
|
+
const babelResult = (0, _babel.transformSync)(src, babelConfig);
|
|
50
|
+
return buildResult(src, filename, markoConfig.errorRecovery, babelResult);
|
|
51
|
+
} catch (err) {
|
|
52
|
+
throw (0, _agentFixGuide.default)(err, markoConfig.translator);
|
|
53
|
+
}
|
|
45
54
|
}
|
|
46
55
|
|
|
47
56
|
async function compileFile(filename, config) {
|
|
@@ -122,7 +131,9 @@ function getBaseBabelConfig(filename, { babelConfig, ...markoConfig }) {
|
|
|
122
131
|
...babelConfig,
|
|
123
132
|
filename,
|
|
124
133
|
sourceType: "module",
|
|
125
|
-
|
|
134
|
+
// An entry wrapper's own map is meaningless; the translator still keeps
|
|
135
|
+
// extracted `<style>` maps off `markoConfig.sourceMaps` regardless.
|
|
136
|
+
sourceMaps: isEntryOutput(markoConfig) ? false : markoConfig.sourceMaps,
|
|
126
137
|
code: markoConfig.code,
|
|
127
138
|
ast: markoConfig.ast,
|
|
128
139
|
plugins:
|
|
@@ -176,4 +187,8 @@ function getFs(config) {
|
|
|
176
187
|
|
|
177
188
|
function isTranslatedOutput(output) {
|
|
178
189
|
return output !== "source" && output !== "migrate";
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function isEntryOutput({ output, entry }) {
|
|
193
|
+
return output === "hydrate" || entry != null;
|
|
179
194
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";exports.__esModule = true;exports.default = appendAgentFixGuide;var _tryLoadTranslator = _interopRequireDefault(require("./try-load-translator"));function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };}
|
|
2
|
+
|
|
3
|
+
const applied = Symbol("markoAgentFixGuide");
|
|
4
|
+
|
|
5
|
+
function appendAgentFixGuide(error, translator) {
|
|
6
|
+
if (error instanceof Error && !error[applied] && isCodingAgent()) {
|
|
7
|
+
const guide = fixGuide(translator);
|
|
8
|
+
if (guide) {
|
|
9
|
+
// `message` is locked against Babel mutations, so redefine rather than assign.
|
|
10
|
+
error[applied] = true;
|
|
11
|
+
Object.defineProperty(error, "message", {
|
|
12
|
+
value: error.message + guide,
|
|
13
|
+
enumerable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
configurable: true
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return error;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Env markers terminal coding agents set.
|
|
24
|
+
function isCodingAgent() {
|
|
25
|
+
return (
|
|
26
|
+
typeof process === "object" && (
|
|
27
|
+
process.env.CLAUDECODE ||
|
|
28
|
+
process.env.CLAUDE_CODE ||
|
|
29
|
+
process.env.CURSOR_AGENT ||
|
|
30
|
+
process.env.GEMINI_CLI ||
|
|
31
|
+
process.env.CODEX_SANDBOX ||
|
|
32
|
+
process.env.CODEX_THREAD_ID ||
|
|
33
|
+
process.env.AI_AGENT));
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function fixGuide(translator) {
|
|
38
|
+
// Only resolved specifiers expose a cheat sheet; inline objects (tests,
|
|
39
|
+
// embedders) opt out.
|
|
40
|
+
if (typeof translator !== "string") return undefined;
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const cheatsheet = (0, _tryLoadTranslator.default)(translator)?.cheatsheet;
|
|
44
|
+
return cheatsheet ?
|
|
45
|
+
`\n\nFix guide: READ ${cheatsheet} before writing a fix.` :
|
|
46
|
+
undefined;
|
|
47
|
+
} catch {
|
|
48
|
+
// Leave the real compile error untouched if the translator can't load.
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
"use strict";exports.__esModule = true;exports.default = _default;var _modules = _interopRequireDefault(require("@marko/compiler/modules"));
|
|
2
|
+
var _path = _interopRequireDefault(require("path"));
|
|
2
3
|
|
|
3
4
|
var _config = _interopRequireDefault(require("../config"));function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };}
|
|
4
5
|
const cache = {};
|
|
5
6
|
|
|
6
7
|
function _default(requested = _config.default.translator) {
|
|
7
8
|
if (typeof requested === "string") {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
let translator = cache[requested];
|
|
10
|
+
if (!translator) {
|
|
11
|
+
const file = _modules.default.resolve(requested);
|
|
12
|
+
translator = _modules.default.require(file);
|
|
13
|
+
// The translator declares its LLM cheat sheet relative to its own module;
|
|
14
|
+
// resolve it to a cwd-relative path an agent can read directly.
|
|
15
|
+
if (typeof translator.cheatsheet === "string") {
|
|
16
|
+
translator.cheatsheet = _path.default.relative(
|
|
17
|
+
_modules.default.cwd,
|
|
18
|
+
_path.default.resolve(_path.default.dirname(file), translator.cheatsheet)
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
cache[requested] = translator;
|
|
22
|
+
}
|
|
23
|
+
return translator;
|
|
12
24
|
}
|
|
13
25
|
|
|
14
26
|
return requested;
|