ezx 0.0.18 → 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.
package/README.md CHANGED
@@ -50,7 +50,7 @@ echo "We're still in my-project!"
50
50
  pwd
51
51
  ```
52
52
 
53
- **Note:** The directory context also affects file extraction blocks. Files created after `# set the current directory` will have their paths relative to the original directory, but the command will prepend `cd` to create them in the correct location.
53
+ **Note:** The directory context also affects file extraction blocks. After `# set the current directory`, a `file:` path that starts with the context directory (e.g. `my-project/package.json`) is written to that location, and any other relative path is resolved inside the context directory.
54
54
 
55
55
  ### 3. File Extraction
56
56
 
@@ -125,21 +125,20 @@ interface User {
125
125
  ```⁠
126
126
  ```
127
127
 
128
- File extraction blocks are transformed to bash heredoc commands that execute in order with the rest of the markdown. If a directory context is active, the heredoc command will prepend `cd`:
128
+ File extraction blocks are transformed into JavaScript blocks that write the file with `fs`, executing in order with the rest of the markdown. The path and the content are embedded as JSON strings, so the file receives the block's text byte for byte (backticks, `${...}`, backslashes and all), followed by a final newline. Leading and trailing whitespace of the block is trimmed, as before.
129
129
 
130
- ```bash
131
- # Without directory context:
132
- cat > 'path/to/file' << 'EZXEOF'
133
- content here
134
- EZXEOF
135
-
136
- # With directory context (after "# set the current directory my-project"):
137
- cd my-project && cat > 'path/to/file' << 'EZXEOF'
138
- content here
139
- EZXEOF
130
+ ```js
131
+ // Without directory context: relative to the working directory (--cwd, else the current directory)
132
+ fs.writeFileSync(path.resolve($.cwd || process.cwd(), "path/to/file"), "content here\n");
133
+
134
+ // With directory context (after "# set the current directory" + "cd my-project"):
135
+ // the directory is resolved by the shell, so it means what `cd my-project` means in bash blocks
136
+ fs.writeFileSync(path.resolve((await $`cd my-project && pwd`.quiet()).stdout.replace(/\n$/, ''), "path/to/file"), "content here\n");
140
137
  ```
141
138
 
142
- This means if a parent directory doesn't exist, the command will fail (as expected). You should create directories first using `mkdir -p` in a bash block.
139
+ With a directory context, a path that starts with the context directory (`my-project/path/to/file`) has that prefix stripped; any other relative path is resolved inside the context directory.
140
+
141
+ Parent directories are not created: if one doesn't exist, the write fails and the script stops (as expected). Create directories first using `mkdir -p` in a bash block.
143
142
 
144
143
  ### 4. Async Bash Execution
145
144
 
@@ -188,6 +187,8 @@ curl http://localhost:3000
188
187
  $`npm run dev`
189
188
  ```
190
189
 
190
+ The lines of the block are joined with `; ` into a single command (empty lines and lines starting with `#` are dropped), and the command is escaped for the template literal, so the shell receives it unchanged (see [Special characters](#5-special-characters-are-passed-through-unchanged)).
191
+
191
192
  The command runs without `await`, so execution continues immediately. zx automatically awaits all pending promises at the end of the script.
192
193
 
193
194
  **Kill on Complete:** Use the `--kill-on-complete` (or `-k`) CLI option to kill all async processes when the script completes, instead of waiting for them:
@@ -201,6 +202,35 @@ This is useful for development servers or other long-running processes that shou
201
202
 
202
203
  **Important:** The `async:` directive only works with bash/sh/shell blocks. Using it with other languages will result in an error.
203
204
 
205
+ ### 5. Special characters are passed through unchanged
206
+
207
+ zx runs a `bash`/`sh`/`shell` block by pasting its lines between the backticks of a JavaScript template literal (`` await $`...` ``) without escaping them. In plain zx, a backtick in the block therefore ends the command early (the script fails to parse), `${x}` is evaluated as JavaScript instead of reaching the shell, and backslash sequences such as `\n` are turned into the characters they denote.
208
+
209
+ ezx guarantees that the text of a block reaches its destination unchanged:
210
+
211
+ - **Bash blocks and `async:` blocks:** ezx generates the `` await $`...` `` itself (as a `js` block) and escapes `\`, `` ` `` and `${` for the template literal, so the shell receives exactly what is written in the Markdown. Because ezx no longer leaves bash fences to zx, this stays correct if a future zx release starts escaping bash blocks itself. `` `cmd` `` is a shell command substitution, `${VAR}` is a shell expansion, and `\n` is a backslash followed by `n`, as in any shell script.
212
+ - **`file:` blocks:** the file is written with `fs` from a JSON-encoded string, without going through a shell, so any content can be extracted, including TypeScript template literal types such as `` `0x${string}` ``, comments with backticks, backslashes, and a line reading `EZXEOF`.
213
+
214
+ This means a bash block can no longer use `${...}` to interpolate a JavaScript value, which in zx happened by accident of the transformation. Use a `js` block with `` $`...` `` when you need that.
215
+
216
+ #### Migrating from ezx 0.0.x
217
+
218
+ This is a breaking change for documents written around the old behaviour:
219
+
220
+ - **Backslash workarounds now reach the shell or the file.** If you wrote `\${` or `` \` `` to get `${` or a backtick through, the backslash is now kept, so the shell sees an escaped (literal) `${` or backtick, and an extracted file contains the backslash. Remove the backslash. ezx prints a warning to stderr (unless `--quiet`) for every bash, `async:` or `file:` block containing `\${` or `` \` ``, since such a backslash may also be intentional.
221
+ - **Doubled backslashes are no longer halved.** Backslash sequences used to be interpreted by JavaScript first, so `\\` produced one backslash and `\n` a newline. They are now passed on as written. If you doubled backslashes to compensate, undo it. Shell line continuations (a `\` at the end of a line) behave as before.
222
+ - **`${jsVariable}` in a bash block** is no longer a JavaScript interpolation. Under zx's default `set -u` it usually fails with "unbound variable". Move the command to a `js` block: `` await $`echo ${jsVariable}` ``.
223
+ - **`file:` blocks are not written by a shell.** `--prefix`, `--postfix` and `--shell` do not apply to them, and `--verbose` does not print a command for them.
224
+
225
+ ### Known pitfalls
226
+
227
+ - **zx executes `js`, `javascript`, `ts` and `typescript` blocks.** zx runs every block tagged exactly `js`, `javascript`, `ts` or `typescript` as JavaScript (TypeScript blocks are not type-stripped). A TypeScript snippet shown for documentation, that is not a `file:` block, usually crashes the script with a syntax error. Mark such blocks so zx ignores them, by adding any word after the language (`` ```ts no-eval ``) or by using a tag zx does not run (`` ```tsx ``, `` ```TypeScript ``). Blocks with any other language (`json`, `text`, `solidity`, ...) are never executed.
228
+ - **Use backtick fences.** ezx only recognises fences made of backticks (```` ``` ````). A block fenced with tildes (`~~~bash`) gets none of ezx's features (no escaping, no directory context, no `file:` or `async:` directive) and is still run by zx with its raw text, so the escaping guarantee above does not apply to it.
229
+ - **Line endings.** CRLF (Windows) documents are handled like LF documents, and extracted files are written with LF line endings.
230
+ - **Only exact fence tags run.** A bash block runs only when its tag is exactly `bash`, `sh` or `shell` after ezx removes `sleep:N` and `[label]` modifiers. Any other word after the language (`` ```bash skip ``) makes zx ignore the block.
231
+ - **`--preprocess-only` shows zx's input.** The printed Markdown is what ezx hands to zx: executed bash blocks appear as `js` blocks containing `` await $`...` `` with their backticks, `${` and backslashes escaped, and `file:` blocks appear as `js` blocks calling `fs.writeFileSync`.
232
+ - **Multi-line `async:` blocks become one line.** Their lines are joined with `; `, so constructs that span lines (heredocs, `if`/`fi` written over several lines with comments) may not work in an `async:` block.
233
+
204
234
  ## Installation
205
235
 
206
236
  ```bash
@@ -368,8 +398,10 @@ Preprocess markdown content.
368
398
  - `cwd` (string) - Current working directory (default: `process.cwd()`)
369
399
 
370
400
  **Returns:** PreprocessResult
371
- - `preprocessedMarkdown` (string) - The preprocessed markdown with file directive blocks transformed to bash heredocs
401
+ - `preprocessedMarkdown` (string) - The preprocessed markdown, ready for zx: file directive blocks are transformed into `js` blocks that write the file, and bash block bodies are escaped for zx's template literal
372
402
  - `extractedFiles` (FileExtraction[]) - Array of extracted file information (for informational purposes only)
403
+ - `hasAsyncBlocks` (boolean) - Whether the markdown contains `async:` blocks
404
+ - `warnings` (string[]) - Non-fatal hints, such as the migration warning about `\${` and `` \` ``; `runMarkdown` prints them to stderr unless `quiet` is set
373
405
 
374
406
  ### `preprocessFile(filePath, options)`
375
407
 
@@ -387,8 +419,8 @@ npm run build
387
419
  # Watch mode
388
420
  npm run dev
389
421
 
390
- # Run tests
391
- node dist/cli.js test-preprocessor.md --verbose
422
+ # Run tests (builds first, then runs test/*.test.mjs with node --test)
423
+ npm test
392
424
  ```
393
425
 
394
426
  ## License
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAwDD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2I5G;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvG;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjH;AAGD,cAAc,IAAI,CAAC;AAGnB,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAwDD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiJ5G;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvG;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjH;AAGD,cAAc,IAAI,CAAC;AAGnB,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -98,11 +98,16 @@ export async function runMarkdown(markdown, options = {}) {
98
98
  markdownContent = extractSectionsByHeading(markdownContent, options.sections);
99
99
  }
100
100
  // Preprocess markdown with ezx enhancements
101
- const { preprocessedMarkdown, hasAsyncBlocks } = preprocessMarkdown(markdownContent, {
101
+ const { preprocessedMarkdown, hasAsyncBlocks, warnings } = preprocessMarkdown(markdownContent, {
102
102
  cwd: options.cwd || process.cwd(),
103
103
  standalone: options.standalone,
104
104
  killOnComplete: options.killOnComplete,
105
105
  });
106
+ if (!options.quiet) {
107
+ for (const warning of warnings) {
108
+ console.warn(warning);
109
+ }
110
+ }
106
111
  // Sanitize markdown to prevent zx from misinterpreting indented prose as code
107
112
  // This handles edge cases like indented code blocks within list items
108
113
  const sanitizedMarkdown = sanitizeMarkdownForZx(preprocessedMarkdown);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ export interface PreprocessResult {
29
29
  preprocessedMarkdown: string;
30
30
  extractedFiles: FileExtraction[];
31
31
  hasAsyncBlocks: boolean;
32
+ warnings: string[];
32
33
  }
33
34
  /**
34
35
  * Sanitize markdown to prevent zx's parser from misinterpreting
@@ -42,6 +43,20 @@ export interface PreprocessResult {
42
43
  * (e.g., " ```bash" within a list), which zx's regex parser cannot handle.
43
44
  */
44
45
  export declare function sanitizeMarkdownForZx(markdown: string): string;
46
+ /**
47
+ * Escape text so that it survives being placed between the backticks of a
48
+ * JavaScript template literal and comes out unchanged.
49
+ *
50
+ * zx's `transformMarkdown` turns every bash/sh/shell block into
51
+ * `await $\`` + raw lines + `\`` without escaping; ezx emits that same shape
52
+ * itself with the body escaped. zx builds the command from the template's
53
+ * COOKED strings (`buildCmd` concatenates `pieces[0]`, `pieces[1]`, ... and never
54
+ * reads `pieces.raw`). So the only characters that need escaping are the ones a
55
+ * template literal interprets: `\` (escape sequences), a backtick (end of the
56
+ * literal) and `${` (substitution). A lone carriage return would be normalised
57
+ * to a line feed, so it is written as the `\r` escape sequence.
58
+ */
59
+ export declare function escapeForZxTemplate(text: string): string;
45
60
  /**
46
61
  * Preprocess markdown file
47
62
  */
@@ -1 +1 @@
1
- {"version":3,"file":"preprocessor.d.ts","sourceRoot":"","sources":["../src/preprocessor.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;CACxB;AAqBD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuC9D;AAqLD;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAM,GAC1E,gBAAgB,CA2PlB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAM,GAC1B,gBAAgB,CAGlB"}
1
+ {"version":3,"file":"preprocessor.d.ts","sourceRoot":"","sources":["../src/preprocessor.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAqBD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuC9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD;AAyOD;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAM,GAC1E,gBAAgB,CAyRlB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAM,GAC1B,gBAAgB,CAGlB"}
@@ -50,6 +50,73 @@ export function sanitizeMarkdownForZx(markdown) {
50
50
  processTokens(tokens);
51
51
  return output.join('\n');
52
52
  }
53
+ /**
54
+ * Escape text so that it survives being placed between the backticks of a
55
+ * JavaScript template literal and comes out unchanged.
56
+ *
57
+ * zx's `transformMarkdown` turns every bash/sh/shell block into
58
+ * `await $\`` + raw lines + `\`` without escaping; ezx emits that same shape
59
+ * itself with the body escaped. zx builds the command from the template's
60
+ * COOKED strings (`buildCmd` concatenates `pieces[0]`, `pieces[1]`, ... and never
61
+ * reads `pieces.raw`). So the only characters that need escaping are the ones a
62
+ * template literal interprets: `\` (escape sequences), a backtick (end of the
63
+ * literal) and `${` (substitution). A lone carriage return would be normalised
64
+ * to a line feed, so it is written as the `\r` escape sequence.
65
+ */
66
+ export function escapeForZxTemplate(text) {
67
+ return text
68
+ .replace(/\\/g, '\\\\')
69
+ .replace(/`/g, '\\`')
70
+ .replace(/\$\{/g, '\\${')
71
+ .replace(/\r/g, '\\r');
72
+ }
73
+ /**
74
+ * Whether zx will execute a fenced block with this info string as a shell command.
75
+ * Mirrors zx's own fence regex: only an info string that is exactly `sh`, `shell`
76
+ * or `bash` (case-sensitive) runs; anything else (`bash skip`, `BASH`, ...) is
77
+ * turned into comments by zx and must be left untouched. ezx rewrites the
78
+ * blocks that match into `js` blocks with an escaped `await $\`...\``.
79
+ */
80
+ function zxRunsAsBash(languageTag) {
81
+ return /^(sh|shell|bash)$/.test(languageTag);
82
+ }
83
+ /**
84
+ * Until 0.1.0, ezx (like zx) let JavaScript interpret the text of bash and
85
+ * file blocks, so authors wrote `\${` or a backslash-escaped backtick to get `${`
86
+ * or a backtick through. That text is now passed on unchanged, backslash
87
+ * included, which silently changes what such a block does. Record a warning for
88
+ * the first such line of a block; it may also be intentional, hence not an error.
89
+ */
90
+ function warnAboutBackslashWorkaround(block, kind, warnings) {
91
+ const offending = block.content.split('\n').find((line) => /\\(\$\{|`)/.test(line));
92
+ if (offending === undefined) {
93
+ return;
94
+ }
95
+ warnings.push(`[ezx] warning: ${kind} at line ${block.startLine + 1} contains "\\\${" or "\\\`": ` +
96
+ `since ezx 0.1.0 it is passed on as written, backslash included. ` +
97
+ `If the backslash was a workaround for the old escaping bug, remove it.\n ${offending.trim()}`);
98
+ }
99
+ /**
100
+ * Build the JavaScript statement that writes an extracted file.
101
+ *
102
+ * The path and the content are JSON-encoded, so no character in the file can be
103
+ * interpreted by JavaScript or by a shell. Relative paths resolve against zx's
104
+ * working directory (`$.cwd`, else `process.cwd()`), like the shell commands.
105
+ * Parent directories are NOT created: writing into a missing directory fails,
106
+ * as the former `cat > file` heredoc did.
107
+ *
108
+ * With a directory context, the directory is resolved by the shell itself
109
+ * (`cd <dir> && pwd`), so `~`, quotes and variables in the `cd` target keep
110
+ * meaning what they mean in the bash blocks.
111
+ */
112
+ function buildFileWriteStatement(filePath, content, directoryPrefix) {
113
+ let base = '$.cwd || process.cwd()';
114
+ if (directoryPrefix) {
115
+ const cdCommand = escapeForZxTemplate(`cd ${directoryPrefix} && pwd`);
116
+ base = `(await $\`${cdCommand}\`.quiet()).stdout.replace(/\\n$/, '')`;
117
+ }
118
+ return `fs.writeFileSync(path.resolve(${base}, ${JSON.stringify(filePath)}), ${JSON.stringify(content + '\n')});`;
119
+ }
53
120
  /**
54
121
  * Check if a language is a bash/shell language
55
122
  */
@@ -218,15 +285,20 @@ function isDirectorySetCommand(line) {
218
285
  */
219
286
  export function preprocessMarkdown(input, options = {}) {
220
287
  const { cwd = process.cwd(), standalone = false, killOnComplete = false } = options;
288
+ // Normalise line endings (CRLF and lone CR count as line endings in Markdown).
289
+ // Otherwise a CRLF document's fence lines ("```bash\r") are not recognised and
290
+ // its blocks keep a trailing \r on every line.
291
+ input = input.replace(/\r\n?/g, '\n');
221
292
  const lines = input.split('\n');
222
293
  const codeBlocks = parseCodeBlocks(input);
223
294
  const extractedFiles = [];
295
+ const warnings = [];
224
296
  // Track the current directory context
225
297
  let currentDirectory = null;
226
298
  // Map of block indices to transformations (prepend cd)
227
299
  const blocksToTransform = new Map();
228
- // Map of block indices to transform to heredoc
229
- const blocksToHeredoc = new Map();
300
+ // Map of block indices to transform into a file write
301
+ const blocksToFileWrite = new Map();
230
302
  // Map of block indices to transform to async JS
231
303
  const blocksToAsync = new Map();
232
304
  // Track where we need to insert .npmrc after directory set
@@ -237,6 +309,7 @@ export function preprocessMarkdown(input, options = {}) {
237
309
  const isBash = isBashLanguage(block.language);
238
310
  // Check if this is an async block
239
311
  if (block.isAsync) {
312
+ warnAboutBackslashWorkaround(block, 'async: block', warnings);
240
313
  // Transform to async JS block
241
314
  blocksToAsync.set(i, {
242
315
  content: block.content.trim(),
@@ -247,16 +320,17 @@ export function preprocessMarkdown(input, options = {}) {
247
320
  }
248
321
  // Check if this is a file extraction block (file path from file: directive)
249
322
  if (block.filePath) {
250
- // This is a file extraction block - transform to heredoc
323
+ // This is a file extraction block - transform into a file write
251
324
  const fileContent = block.content.trim();
325
+ warnAboutBackslashWorkaround(block, `file: block (${block.filePath})`, warnings);
252
326
  extractedFiles.push({
253
327
  filePath: block.filePath,
254
328
  content: fileContent,
255
329
  language: block.language,
256
330
  });
257
- // Mark this block for transformation to heredoc
258
- // If we have a current directory, prepend it to the heredoc command
259
- blocksToHeredoc.set(i, {
331
+ // Mark this block for transformation into a file write
332
+ // If we have a current directory, the path is resolved inside it
333
+ blocksToFileWrite.set(i, {
260
334
  filePath: block.filePath,
261
335
  content: fileContent,
262
336
  directoryPrefix: currentDirectory || undefined,
@@ -347,8 +421,8 @@ export function preprocessMarkdown(input, options = {}) {
347
421
  if (asyncBlock.directoryPrefix) {
348
422
  command = `cd ${asyncBlock.directoryPrefix} && ${command}`;
349
423
  }
350
- // Escape backticks in the command for the template literal
351
- const escapedCommand = command.replace(/`/g, '\\`');
424
+ // Escape the command for the template literal so the shell receives it unchanged
425
+ const escapedCommand = escapeForZxTemplate(command);
352
426
  // Output the $ template literal (fire-and-forget, no await)
353
427
  // If killOnComplete is enabled, push to tracking array so we can kill it later
354
428
  if (killOnComplete) {
@@ -366,26 +440,20 @@ export function preprocessMarkdown(input, options = {}) {
366
440
  i = block.endLine;
367
441
  continue;
368
442
  }
369
- // Check if this block should be transformed to heredoc
370
- if (blocksToHeredoc.has(blockIndex)) {
371
- const heredoc = blocksToHeredoc.get(blockIndex);
372
- // Transform to bash heredoc block
373
- preprocessedLines.push('```bash');
374
- // If we have a directory prefix, prepend cd && to the cat command
375
- // Also strip the directory prefix from the file path if it matches
376
- let catPath = heredoc.filePath;
377
- if (heredoc.directoryPrefix) {
378
- // Remove the directory prefix from the file path if it starts with it
379
- if (catPath.startsWith(heredoc.directoryPrefix + '/')) {
380
- catPath = catPath.slice(heredoc.directoryPrefix.length + 1);
381
- }
382
- preprocessedLines.push(`cd ${heredoc.directoryPrefix} && cat > '${catPath}' << 'EZXEOF'`);
383
- }
384
- else {
385
- preprocessedLines.push(`cat > '${catPath}' << 'EZXEOF'`);
443
+ // Check if this block should be transformed into a file write
444
+ if (blocksToFileWrite.has(blockIndex)) {
445
+ const fileWrite = blocksToFileWrite.get(blockIndex);
446
+ // Transform to a JS block that writes the file with fs.
447
+ // Not a bash heredoc: zx would place the heredoc inside a template
448
+ // literal, where backticks and ${ in the content break the script.
449
+ preprocessedLines.push('```js');
450
+ // With a directory context, the path is relative to the context directory,
451
+ // unless it starts with that directory, in which case the prefix is stripped
452
+ let targetPath = fileWrite.filePath;
453
+ if (fileWrite.directoryPrefix && targetPath.startsWith(fileWrite.directoryPrefix + '/')) {
454
+ targetPath = targetPath.slice(fileWrite.directoryPrefix.length + 1);
386
455
  }
387
- preprocessedLines.push(heredoc.content);
388
- preprocessedLines.push('EZXEOF');
456
+ preprocessedLines.push(buildFileWriteStatement(targetPath, fileWrite.content, fileWrite.directoryPrefix));
389
457
  preprocessedLines.push('```');
390
458
  // Skip to the closing ```
391
459
  i = block.endLine;
@@ -396,30 +464,56 @@ export function preprocessMarkdown(input, options = {}) {
396
464
  const origLangMatch = line.match(/^\s*```(.*)$/);
397
465
  const origFullTag = origLangMatch?.[1] || '';
398
466
  const { languageTag } = parseLanguageTag(origFullTag);
399
- preprocessedLines.push(`\`\`\`${languageTag}`);
467
+ const runsAsBash = zxRunsAsBash(languageTag);
468
+ if (runsAsBash) {
469
+ warnAboutBackslashWorkaround(block, 'bash block', warnings);
470
+ }
471
+ const bodyLines = [];
400
472
  // Check if we need to prepend sleep command (only for bash blocks)
401
473
  if (block.sleepSeconds && isBashLanguage(block.language)) {
402
- preprocessedLines.push(`sleep ${block.sleepSeconds}`);
474
+ bodyLines.push(`sleep ${block.sleepSeconds}`);
403
475
  }
404
476
  // Check if we need to prepend cd command
405
477
  if (blocksToTransform.has(blockIndex)) {
406
478
  const dir = blocksToTransform.get(blockIndex);
407
- preprocessedLines.push(`cd ${dir}`);
479
+ bodyLines.push(`cd ${dir}`);
408
480
  }
409
481
  // Output the block content
410
482
  if (block.content) {
411
- preprocessedLines.push(block.content);
483
+ bodyLines.push(block.content);
412
484
  }
413
485
  // If standalone mode is enabled and this block set the directory, append .npmrc creation
414
486
  if (npmrcInsertBlocks.has(blockIndex)) {
415
- preprocessedLines.push('');
416
- preprocessedLines.push('cat > .npmrc << \'EZXEOF\'');
417
- preprocessedLines.push('# Disable workspace awareness for test project');
418
- preprocessedLines.push('# This ensures that pnpm install and other commands work in standalone mode');
419
- preprocessedLines.push('enable-pre-post-scripts=true');
420
- preprocessedLines.push('shamefully-hoist=false');
421
- preprocessedLines.push('strict-peer-dependencies=false');
422
- preprocessedLines.push('EZXEOF');
487
+ bodyLines.push('');
488
+ bodyLines.push('cat > .npmrc << \'EZXEOF\'');
489
+ bodyLines.push('# Disable workspace awareness for test project');
490
+ bodyLines.push('# This ensures that pnpm install and other commands work in standalone mode');
491
+ bodyLines.push('enable-pre-post-scripts=true');
492
+ bodyLines.push('shamefully-hoist=false');
493
+ bodyLines.push('strict-peer-dependencies=false');
494
+ bodyLines.push('EZXEOF');
495
+ }
496
+ if (runsAsBash) {
497
+ // Emit the `await $\`...\`` that zx would generate for a bash block,
498
+ // but with the body escaped for the template literal, so the shell
499
+ // receives exactly the text written in the Markdown. Doing it here,
500
+ // instead of leaving a bash fence to zx's transformMarkdown, keeps the
501
+ // result correct whether or not a future zx escapes bash blocks itself
502
+ // (which would otherwise escape them a second time).
503
+ preprocessedLines.push('```js');
504
+ preprocessedLines.push('await $`');
505
+ if (bodyLines.length > 0) {
506
+ preprocessedLines.push(escapeForZxTemplate(bodyLines.join('\n')));
507
+ }
508
+ preprocessedLines.push('`');
509
+ }
510
+ else {
511
+ // Not executed by zx as a shell command (js block, skipped block,
512
+ // documentation-only language): keep the block as written.
513
+ preprocessedLines.push(`\`\`\`${languageTag}`);
514
+ if (bodyLines.length > 0) {
515
+ preprocessedLines.push(bodyLines.join('\n'));
516
+ }
423
517
  }
424
518
  // Skip to the closing ```
425
519
  i = block.endLine - 1;
@@ -440,6 +534,7 @@ export function preprocessMarkdown(input, options = {}) {
440
534
  preprocessedMarkdown: preprocessedLines.join('\n'),
441
535
  extractedFiles,
442
536
  hasAsyncBlocks,
537
+ warnings,
443
538
  };
444
539
  }
445
540
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"preprocessor.js","sourceRoot":"","sources":["../src/preprocessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preprocessor.js","sourceRoot":"","sources":["../src/preprocessor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,68 +1,69 @@
1
1
  {
2
- "name": "ezx",
3
- "version": "0.0.18",
4
- "description": "Enhanced zx - Write better shell scripts with markdown preprocessing features including directory context persistence, file extraction, and fixes for zx's indentation parsing issues",
5
- "keywords": [
6
- "zx",
7
- "shell",
8
- "bash",
9
- "script",
10
- "markdown",
11
- "cli",
12
- "terminal",
13
- "automation",
14
- "preprocessor",
15
- "code-extraction"
16
- ],
17
- "author": "Ronan Sandford",
18
- "license": "MIT",
19
- "homepage": "https://github.com/wighawag/ezx#readme",
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/wighawag/ezx.git"
23
- },
24
- "bugs": {
25
- "url": "https://github.com/wighawag/ezx/issues"
26
- },
27
- "engines": {
28
- "node": ">=18.0.0"
29
- },
30
- "publishConfig": {
31
- "access": "public"
32
- },
33
- "type": "module",
34
- "main": "dist/index.js",
35
- "module": "dist/index.js",
36
- "types": "dist/index.d.ts",
37
- "exports": {
38
- ".": {
39
- "import": {
40
- "types": "./dist/index.d.ts",
41
- "default": "./dist/index.js"
42
- }
43
- }
44
- },
45
- "bin": {
46
- "ezx": "dist/cli.js"
47
- },
48
- "files": [
49
- "dist",
50
- "src",
51
- "README.md",
52
- "LICENSE"
53
- ],
54
- "dependencies": {
55
- "commander": "^14.0.2",
56
- "marked": "^17.0.1",
57
- "zx": "^8.8.5"
58
- },
59
- "devDependencies": {
60
- "@types/node": "^25.0.10",
61
- "as-soon": "^0.1.5",
62
- "typescript": "^5.9.3"
63
- },
64
- "scripts": {
65
- "build": "tsc --project tsconfig.json",
66
- "dev": "as-soon -w src pnpm build"
67
- }
68
- }
2
+ "name": "ezx",
3
+ "version": "0.1.0",
4
+ "description": "Enhanced zx - Write better shell scripts with markdown preprocessing features including directory context persistence, file extraction, and fixes for zx's indentation parsing issues",
5
+ "keywords": [
6
+ "zx",
7
+ "shell",
8
+ "bash",
9
+ "script",
10
+ "markdown",
11
+ "cli",
12
+ "terminal",
13
+ "automation",
14
+ "preprocessor",
15
+ "code-extraction"
16
+ ],
17
+ "author": "Ronan Sandford",
18
+ "license": "MIT",
19
+ "homepage": "https://github.com/wighawag/ezx#readme",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/wighawag/ezx.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/wighawag/ezx/issues"
26
+ },
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "type": "module",
34
+ "main": "dist/index.js",
35
+ "module": "dist/index.js",
36
+ "types": "dist/index.d.ts",
37
+ "exports": {
38
+ ".": {
39
+ "import": {
40
+ "types": "./dist/index.d.ts",
41
+ "default": "./dist/index.js"
42
+ }
43
+ }
44
+ },
45
+ "bin": {
46
+ "ezx": "dist/cli.js"
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "src",
51
+ "README.md",
52
+ "LICENSE"
53
+ ],
54
+ "dependencies": {
55
+ "commander": "^14.0.2",
56
+ "marked": "^17.0.1",
57
+ "zx": "^8.8.5"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^25.0.10",
61
+ "as-soon": "^0.1.5",
62
+ "typescript": "^5.9.3"
63
+ },
64
+ "scripts": {
65
+ "build": "tsc --project tsconfig.json",
66
+ "dev": "as-soon -w src pnpm build",
67
+ "test": "pnpm build && node --test test/*.test.mjs"
68
+ }
69
+ }
package/src/index.ts CHANGED
@@ -117,12 +117,18 @@ export async function runMarkdown(markdown: string | Buffer, options: RunMarkdow
117
117
  }
118
118
 
119
119
  // Preprocess markdown with ezx enhancements
120
- const {preprocessedMarkdown, hasAsyncBlocks} = preprocessMarkdown(markdownContent, {
120
+ const {preprocessedMarkdown, hasAsyncBlocks, warnings} = preprocessMarkdown(markdownContent, {
121
121
  cwd: options.cwd || process.cwd(),
122
122
  standalone: options.standalone,
123
123
  killOnComplete: options.killOnComplete,
124
124
  });
125
125
 
126
+ if (!options.quiet) {
127
+ for (const warning of warnings) {
128
+ console.warn(warning);
129
+ }
130
+ }
131
+
126
132
  // Sanitize markdown to prevent zx from misinterpreting indented prose as code
127
133
  // This handles edge cases like indented code blocks within list items
128
134
  const sanitizedMarkdown = sanitizeMarkdownForZx(preprocessedMarkdown);
@@ -36,12 +36,13 @@ export interface PreprocessResult {
36
36
  preprocessedMarkdown: string;
37
37
  extractedFiles: FileExtraction[];
38
38
  hasAsyncBlocks: boolean; // Whether the markdown contains async blocks
39
+ warnings: string[]; // Non-fatal hints about the document, meant for stderr
39
40
  }
40
41
 
41
42
  /**
42
- * Information about a block that will be transformed to a heredoc
43
+ * Information about a block that will be transformed into a file write
43
44
  */
44
- interface HeredocTransform {
45
+ interface FileWriteTransform {
45
46
  filePath: string;
46
47
  content: string;
47
48
  directoryPrefix?: string; // Optional cd prefix for unified directory context
@@ -109,6 +110,79 @@ export function sanitizeMarkdownForZx(markdown: string): string {
109
110
  return output.join('\n');
110
111
  }
111
112
 
113
+ /**
114
+ * Escape text so that it survives being placed between the backticks of a
115
+ * JavaScript template literal and comes out unchanged.
116
+ *
117
+ * zx's `transformMarkdown` turns every bash/sh/shell block into
118
+ * `await $\`` + raw lines + `\`` without escaping; ezx emits that same shape
119
+ * itself with the body escaped. zx builds the command from the template's
120
+ * COOKED strings (`buildCmd` concatenates `pieces[0]`, `pieces[1]`, ... and never
121
+ * reads `pieces.raw`). So the only characters that need escaping are the ones a
122
+ * template literal interprets: `\` (escape sequences), a backtick (end of the
123
+ * literal) and `${` (substitution). A lone carriage return would be normalised
124
+ * to a line feed, so it is written as the `\r` escape sequence.
125
+ */
126
+ export function escapeForZxTemplate(text: string): string {
127
+ return text
128
+ .replace(/\\/g, '\\\\')
129
+ .replace(/`/g, '\\`')
130
+ .replace(/\$\{/g, '\\${')
131
+ .replace(/\r/g, '\\r');
132
+ }
133
+
134
+ /**
135
+ * Whether zx will execute a fenced block with this info string as a shell command.
136
+ * Mirrors zx's own fence regex: only an info string that is exactly `sh`, `shell`
137
+ * or `bash` (case-sensitive) runs; anything else (`bash skip`, `BASH`, ...) is
138
+ * turned into comments by zx and must be left untouched. ezx rewrites the
139
+ * blocks that match into `js` blocks with an escaped `await $\`...\``.
140
+ */
141
+ function zxRunsAsBash(languageTag: string): boolean {
142
+ return /^(sh|shell|bash)$/.test(languageTag);
143
+ }
144
+
145
+ /**
146
+ * Until 0.1.0, ezx (like zx) let JavaScript interpret the text of bash and
147
+ * file blocks, so authors wrote `\${` or a backslash-escaped backtick to get `${`
148
+ * or a backtick through. That text is now passed on unchanged, backslash
149
+ * included, which silently changes what such a block does. Record a warning for
150
+ * the first such line of a block; it may also be intentional, hence not an error.
151
+ */
152
+ function warnAboutBackslashWorkaround(block: CodeBlock, kind: string, warnings: string[]): void {
153
+ const offending = block.content.split('\n').find((line) => /\\(\$\{|`)/.test(line));
154
+ if (offending === undefined) {
155
+ return;
156
+ }
157
+ warnings.push(
158
+ `[ezx] warning: ${kind} at line ${block.startLine + 1} contains "\\\${" or "\\\`": ` +
159
+ `since ezx 0.1.0 it is passed on as written, backslash included. ` +
160
+ `If the backslash was a workaround for the old escaping bug, remove it.\n ${offending.trim()}`,
161
+ );
162
+ }
163
+
164
+ /**
165
+ * Build the JavaScript statement that writes an extracted file.
166
+ *
167
+ * The path and the content are JSON-encoded, so no character in the file can be
168
+ * interpreted by JavaScript or by a shell. Relative paths resolve against zx's
169
+ * working directory (`$.cwd`, else `process.cwd()`), like the shell commands.
170
+ * Parent directories are NOT created: writing into a missing directory fails,
171
+ * as the former `cat > file` heredoc did.
172
+ *
173
+ * With a directory context, the directory is resolved by the shell itself
174
+ * (`cd <dir> && pwd`), so `~`, quotes and variables in the `cd` target keep
175
+ * meaning what they mean in the bash blocks.
176
+ */
177
+ function buildFileWriteStatement(filePath: string, content: string, directoryPrefix?: string): string {
178
+ let base = '$.cwd || process.cwd()';
179
+ if (directoryPrefix) {
180
+ const cdCommand = escapeForZxTemplate(`cd ${directoryPrefix} && pwd`);
181
+ base = `(await $\`${cdCommand}\`.quiet()).stdout.replace(/\\n$/, '')`;
182
+ }
183
+ return `fs.writeFileSync(path.resolve(${base}, ${JSON.stringify(filePath)}), ${JSON.stringify(content + '\n')});`;
184
+ }
185
+
112
186
  /**
113
187
  * Check if a language is a bash/shell language
114
188
  */
@@ -296,17 +370,22 @@ export function preprocessMarkdown(
296
370
  options: {cwd?: string; standalone?: boolean; killOnComplete?: boolean} = {},
297
371
  ): PreprocessResult {
298
372
  const {cwd = process.cwd(), standalone = false, killOnComplete = false} = options;
373
+ // Normalise line endings (CRLF and lone CR count as line endings in Markdown).
374
+ // Otherwise a CRLF document's fence lines ("```bash\r") are not recognised and
375
+ // its blocks keep a trailing \r on every line.
376
+ input = input.replace(/\r\n?/g, '\n');
299
377
  const lines = input.split('\n');
300
378
  const codeBlocks = parseCodeBlocks(input);
301
379
  const extractedFiles: FileExtraction[] = [];
380
+ const warnings: string[] = [];
302
381
 
303
382
  // Track the current directory context
304
383
  let currentDirectory: string | null = null;
305
384
 
306
385
  // Map of block indices to transformations (prepend cd)
307
386
  const blocksToTransform: Map<number, string> = new Map();
308
- // Map of block indices to transform to heredoc
309
- const blocksToHeredoc: Map<number, HeredocTransform> = new Map();
387
+ // Map of block indices to transform into a file write
388
+ const blocksToFileWrite: Map<number, FileWriteTransform> = new Map();
310
389
  // Map of block indices to transform to async JS
311
390
  const blocksToAsync: Map<number, AsyncTransform> = new Map();
312
391
  // Track where we need to insert .npmrc after directory set
@@ -319,6 +398,7 @@ export function preprocessMarkdown(
319
398
 
320
399
  // Check if this is an async block
321
400
  if (block.isAsync) {
401
+ warnAboutBackslashWorkaround(block, 'async: block', warnings);
322
402
  // Transform to async JS block
323
403
  blocksToAsync.set(i, {
324
404
  content: block.content.trim(),
@@ -330,17 +410,18 @@ export function preprocessMarkdown(
330
410
 
331
411
  // Check if this is a file extraction block (file path from file: directive)
332
412
  if (block.filePath) {
333
- // This is a file extraction block - transform to heredoc
413
+ // This is a file extraction block - transform into a file write
334
414
  const fileContent = block.content.trim();
415
+ warnAboutBackslashWorkaround(block, `file: block (${block.filePath})`, warnings);
335
416
  extractedFiles.push({
336
417
  filePath: block.filePath,
337
418
  content: fileContent,
338
419
  language: block.language,
339
420
  });
340
421
 
341
- // Mark this block for transformation to heredoc
342
- // If we have a current directory, prepend it to the heredoc command
343
- blocksToHeredoc.set(i, {
422
+ // Mark this block for transformation into a file write
423
+ // If we have a current directory, the path is resolved inside it
424
+ blocksToFileWrite.set(i, {
344
425
  filePath: block.filePath,
345
426
  content: fileContent,
346
427
  directoryPrefix: currentDirectory || undefined,
@@ -445,8 +526,8 @@ export function preprocessMarkdown(
445
526
  command = `cd ${asyncBlock.directoryPrefix} && ${command}`;
446
527
  }
447
528
 
448
- // Escape backticks in the command for the template literal
449
- const escapedCommand = command.replace(/`/g, '\\`');
529
+ // Escape the command for the template literal so the shell receives it unchanged
530
+ const escapedCommand = escapeForZxTemplate(command);
450
531
 
451
532
  // Output the $ template literal (fire-and-forget, no await)
452
533
  // If killOnComplete is enabled, push to tracking array so we can kill it later
@@ -465,25 +546,20 @@ export function preprocessMarkdown(
465
546
  continue;
466
547
  }
467
548
 
468
- // Check if this block should be transformed to heredoc
469
- if (blocksToHeredoc.has(blockIndex)) {
470
- const heredoc = blocksToHeredoc.get(blockIndex)!;
471
- // Transform to bash heredoc block
472
- preprocessedLines.push('```bash');
473
- // If we have a directory prefix, prepend cd && to the cat command
474
- // Also strip the directory prefix from the file path if it matches
475
- let catPath = heredoc.filePath;
476
- if (heredoc.directoryPrefix) {
477
- // Remove the directory prefix from the file path if it starts with it
478
- if (catPath.startsWith(heredoc.directoryPrefix + '/')) {
479
- catPath = catPath.slice(heredoc.directoryPrefix.length + 1);
480
- }
481
- preprocessedLines.push(`cd ${heredoc.directoryPrefix} && cat > '${catPath}' << 'EZXEOF'`);
482
- } else {
483
- preprocessedLines.push(`cat > '${catPath}' << 'EZXEOF'`);
549
+ // Check if this block should be transformed into a file write
550
+ if (blocksToFileWrite.has(blockIndex)) {
551
+ const fileWrite = blocksToFileWrite.get(blockIndex)!;
552
+ // Transform to a JS block that writes the file with fs.
553
+ // Not a bash heredoc: zx would place the heredoc inside a template
554
+ // literal, where backticks and ${ in the content break the script.
555
+ preprocessedLines.push('```js');
556
+ // With a directory context, the path is relative to the context directory,
557
+ // unless it starts with that directory, in which case the prefix is stripped
558
+ let targetPath = fileWrite.filePath;
559
+ if (fileWrite.directoryPrefix && targetPath.startsWith(fileWrite.directoryPrefix + '/')) {
560
+ targetPath = targetPath.slice(fileWrite.directoryPrefix.length + 1);
484
561
  }
485
- preprocessedLines.push(heredoc.content);
486
- preprocessedLines.push('EZXEOF');
562
+ preprocessedLines.push(buildFileWriteStatement(targetPath, fileWrite.content, fileWrite.directoryPrefix));
487
563
  preprocessedLines.push('```');
488
564
  // Skip to the closing ```
489
565
  i = block.endLine;
@@ -495,34 +571,61 @@ export function preprocessMarkdown(
495
571
  const origLangMatch = line.match(/^\s*```(.*)$/);
496
572
  const origFullTag = origLangMatch?.[1] || '';
497
573
  const { languageTag } = parseLanguageTag(origFullTag);
498
- preprocessedLines.push(`\`\`\`${languageTag}`);
574
+ const runsAsBash = zxRunsAsBash(languageTag);
575
+ if (runsAsBash) {
576
+ warnAboutBackslashWorkaround(block, 'bash block', warnings);
577
+ }
578
+
579
+ const bodyLines: string[] = [];
499
580
 
500
581
  // Check if we need to prepend sleep command (only for bash blocks)
501
582
  if (block.sleepSeconds && isBashLanguage(block.language)) {
502
- preprocessedLines.push(`sleep ${block.sleepSeconds}`);
583
+ bodyLines.push(`sleep ${block.sleepSeconds}`);
503
584
  }
504
585
 
505
586
  // Check if we need to prepend cd command
506
587
  if (blocksToTransform.has(blockIndex)) {
507
588
  const dir = blocksToTransform.get(blockIndex)!;
508
- preprocessedLines.push(`cd ${dir}`);
589
+ bodyLines.push(`cd ${dir}`);
509
590
  }
510
591
 
511
592
  // Output the block content
512
593
  if (block.content) {
513
- preprocessedLines.push(block.content);
594
+ bodyLines.push(block.content);
514
595
  }
515
596
 
516
597
  // If standalone mode is enabled and this block set the directory, append .npmrc creation
517
598
  if (npmrcInsertBlocks.has(blockIndex)) {
518
- preprocessedLines.push('');
519
- preprocessedLines.push('cat > .npmrc << \'EZXEOF\'');
520
- preprocessedLines.push('# Disable workspace awareness for test project');
521
- preprocessedLines.push('# This ensures that pnpm install and other commands work in standalone mode');
522
- preprocessedLines.push('enable-pre-post-scripts=true');
523
- preprocessedLines.push('shamefully-hoist=false');
524
- preprocessedLines.push('strict-peer-dependencies=false');
525
- preprocessedLines.push('EZXEOF');
599
+ bodyLines.push('');
600
+ bodyLines.push('cat > .npmrc << \'EZXEOF\'');
601
+ bodyLines.push('# Disable workspace awareness for test project');
602
+ bodyLines.push('# This ensures that pnpm install and other commands work in standalone mode');
603
+ bodyLines.push('enable-pre-post-scripts=true');
604
+ bodyLines.push('shamefully-hoist=false');
605
+ bodyLines.push('strict-peer-dependencies=false');
606
+ bodyLines.push('EZXEOF');
607
+ }
608
+
609
+ if (runsAsBash) {
610
+ // Emit the `await $\`...\`` that zx would generate for a bash block,
611
+ // but with the body escaped for the template literal, so the shell
612
+ // receives exactly the text written in the Markdown. Doing it here,
613
+ // instead of leaving a bash fence to zx's transformMarkdown, keeps the
614
+ // result correct whether or not a future zx escapes bash blocks itself
615
+ // (which would otherwise escape them a second time).
616
+ preprocessedLines.push('```js');
617
+ preprocessedLines.push('await $`');
618
+ if (bodyLines.length > 0) {
619
+ preprocessedLines.push(escapeForZxTemplate(bodyLines.join('\n')));
620
+ }
621
+ preprocessedLines.push('`');
622
+ } else {
623
+ // Not executed by zx as a shell command (js block, skipped block,
624
+ // documentation-only language): keep the block as written.
625
+ preprocessedLines.push(`\`\`\`${languageTag}`);
626
+ if (bodyLines.length > 0) {
627
+ preprocessedLines.push(bodyLines.join('\n'));
628
+ }
526
629
  }
527
630
 
528
631
  // Skip to the closing ```
@@ -544,6 +647,7 @@ export function preprocessMarkdown(
544
647
  preprocessedMarkdown: preprocessedLines.join('\n'),
545
648
  extractedFiles,
546
649
  hasAsyncBlocks,
650
+ warnings,
547
651
  };
548
652
  }
549
653