@marko/compiler 5.41.0 → 5.41.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/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
- const babelConfig = await loadBabelConfig(filename, markoConfig);
36
- const babelResult = await (0, _babel.transformAsync)(src, babelConfig);
37
- return buildResult(src, filename, markoConfig.errorRecovery, babelResult);
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
- const babelConfig = loadBabelConfigSync(filename, markoConfig);
43
- const babelResult = (0, _babel.transformSync)(src, babelConfig);
44
- return buildResult(src, filename, markoConfig.errorRecovery, babelResult);
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) {
@@ -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
- return (
9
- cache[requested] || (
10
- cache[requested] = _modules.default.require(_modules.default.resolve(requested))));
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marko/compiler",
3
- "version": "5.41.0",
3
+ "version": "5.41.1",
4
4
  "description": "Marko template to JS compiler.",
5
5
  "keywords": [
6
6
  "babel",