ezx 0.0.17 → 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 +48 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/preprocessor.d.ts +15 -0
- package/dist/preprocessor.d.ts.map +1 -1
- package/dist/preprocessor.js +134 -39
- package/dist/preprocessor.js.map +1 -1
- package/package.json +68 -67
- package/src/index.ts +25 -3
- package/src/preprocessor.ts +144 -40
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.
|
|
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
|
|
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
|
-
```
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
422
|
+
# Run tests (builds first, then runs test/*.test.mjs with node --test)
|
|
423
|
+
npm test
|
|
392
424
|
```
|
|
393
425
|
|
|
394
426
|
## License
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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);
|
|
@@ -123,10 +128,25 @@ export async function runMarkdown(markdown, options = {}) {
|
|
|
123
128
|
// Resolve the absolute path to zx/globals using Node's module resolution
|
|
124
129
|
// This will work regardless of where ezx is installed (local, global, or as a dependency)
|
|
125
130
|
const zxGlobalsPath = await import.meta.resolve('zx/globals');
|
|
131
|
+
// Generate temp file path first so we can include it in the preamble for cleanup
|
|
132
|
+
const cwd = options.cwd || process.cwd();
|
|
133
|
+
const tempFile = path.join(cwd, `.ezx-${randomBytes(8).toString('hex')}.mjs`);
|
|
126
134
|
// Prepend globals import to make $, fs, path, etc. available in the script context
|
|
127
135
|
// Use the resolved absolute path to ensure zx is found
|
|
128
136
|
// Also suppress the DEP0190 deprecation warning from Node.js about shell args
|
|
137
|
+
// And add SIGINT handler to exit cleanly when user presses Ctrl+C
|
|
129
138
|
let preamble = `process.noDeprecation = true;\n\nawait import('${zxGlobalsPath}')\n\n`;
|
|
139
|
+
// Store temp file path for cleanup in SIGINT handler
|
|
140
|
+
preamble += `const __ezx_temp_file = '${tempFile.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}';\n\n`;
|
|
141
|
+
// Add SIGINT handler to exit cleanly - this prevents zx from throwing errors when Ctrl+C is pressed
|
|
142
|
+
preamble += `process.on('SIGINT', () => {\n`;
|
|
143
|
+
preamble += ` if (typeof __ezx_async_processes !== 'undefined') {\n`;
|
|
144
|
+
preamble += ` __ezx_async_processes.forEach(p => p.kill('SIGKILL'));\n`;
|
|
145
|
+
preamble += ` }\n`;
|
|
146
|
+
preamble += ` // Clean up temp file - fs is available from zx/globals\n`;
|
|
147
|
+
preamble += ` try { fs.rmSync(__ezx_temp_file, { force: true }); } catch {}\n`;
|
|
148
|
+
preamble += ` process.exit(0);\n`;
|
|
149
|
+
preamble += `});\n\n`;
|
|
130
150
|
// If killOnComplete is enabled and there are async blocks, add process tracking
|
|
131
151
|
if (options.killOnComplete && hasAsyncBlocks) {
|
|
132
152
|
preamble += `const __ezx_async_processes = [];\n\n`;
|
|
@@ -140,8 +160,6 @@ export async function runMarkdown(markdown, options = {}) {
|
|
|
140
160
|
// Write to temp file in current directory (not tmpdir) so zx can be resolved
|
|
141
161
|
// Node's module resolution looks for package.json starting from the file's directory,
|
|
142
162
|
// so the temp file needs to be in a location that has access to node_modules
|
|
143
|
-
const cwd = options.cwd || process.cwd();
|
|
144
|
-
const tempFile = path.join(cwd, `.ezx-${randomBytes(8).toString('hex')}.mjs`);
|
|
145
163
|
await fs.writeFile(tempFile, jsCode);
|
|
146
164
|
// Register cleanup handlers for various exit scenarios
|
|
147
165
|
let tempFileCleaned = false;
|
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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"}
|
package/dist/preprocessor.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/preprocessor.js
CHANGED
|
@@ -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
|
|
229
|
-
const
|
|
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
|
|
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
|
|
258
|
-
// If we have a current directory,
|
|
259
|
-
|
|
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
|
|
351
|
-
const escapedCommand = command
|
|
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
|
|
370
|
-
if (
|
|
371
|
-
const
|
|
372
|
-
// Transform to
|
|
373
|
-
|
|
374
|
-
//
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
479
|
+
bodyLines.push(`cd ${dir}`);
|
|
408
480
|
}
|
|
409
481
|
// Output the block content
|
|
410
482
|
if (block.content) {
|
|
411
|
-
|
|
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
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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
|
/**
|
package/dist/preprocessor.js.map
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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);
|
|
@@ -146,11 +152,29 @@ export async function runMarkdown(markdown: string | Buffer, options: RunMarkdow
|
|
|
146
152
|
// This will work regardless of where ezx is installed (local, global, or as a dependency)
|
|
147
153
|
const zxGlobalsPath = await import.meta.resolve('zx/globals');
|
|
148
154
|
|
|
155
|
+
// Generate temp file path first so we can include it in the preamble for cleanup
|
|
156
|
+
const cwd = options.cwd || process.cwd();
|
|
157
|
+
const tempFile = path.join(cwd, `.ezx-${randomBytes(8).toString('hex')}.mjs`);
|
|
158
|
+
|
|
149
159
|
// Prepend globals import to make $, fs, path, etc. available in the script context
|
|
150
160
|
// Use the resolved absolute path to ensure zx is found
|
|
151
161
|
// Also suppress the DEP0190 deprecation warning from Node.js about shell args
|
|
162
|
+
// And add SIGINT handler to exit cleanly when user presses Ctrl+C
|
|
152
163
|
let preamble = `process.noDeprecation = true;\n\nawait import('${zxGlobalsPath}')\n\n`;
|
|
153
164
|
|
|
165
|
+
// Store temp file path for cleanup in SIGINT handler
|
|
166
|
+
preamble += `const __ezx_temp_file = '${tempFile.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}';\n\n`;
|
|
167
|
+
|
|
168
|
+
// Add SIGINT handler to exit cleanly - this prevents zx from throwing errors when Ctrl+C is pressed
|
|
169
|
+
preamble += `process.on('SIGINT', () => {\n`;
|
|
170
|
+
preamble += ` if (typeof __ezx_async_processes !== 'undefined') {\n`;
|
|
171
|
+
preamble += ` __ezx_async_processes.forEach(p => p.kill('SIGKILL'));\n`;
|
|
172
|
+
preamble += ` }\n`;
|
|
173
|
+
preamble += ` // Clean up temp file - fs is available from zx/globals\n`;
|
|
174
|
+
preamble += ` try { fs.rmSync(__ezx_temp_file, { force: true }); } catch {}\n`;
|
|
175
|
+
preamble += ` process.exit(0);\n`;
|
|
176
|
+
preamble += `});\n\n`;
|
|
177
|
+
|
|
154
178
|
// If killOnComplete is enabled and there are async blocks, add process tracking
|
|
155
179
|
if (options.killOnComplete && hasAsyncBlocks) {
|
|
156
180
|
preamble += `const __ezx_async_processes = [];\n\n`;
|
|
@@ -167,8 +191,6 @@ export async function runMarkdown(markdown: string | Buffer, options: RunMarkdow
|
|
|
167
191
|
// Write to temp file in current directory (not tmpdir) so zx can be resolved
|
|
168
192
|
// Node's module resolution looks for package.json starting from the file's directory,
|
|
169
193
|
// so the temp file needs to be in a location that has access to node_modules
|
|
170
|
-
const cwd = options.cwd || process.cwd();
|
|
171
|
-
const tempFile = path.join(cwd, `.ezx-${randomBytes(8).toString('hex')}.mjs`);
|
|
172
194
|
await fs.writeFile(tempFile, jsCode);
|
|
173
195
|
|
|
174
196
|
// Register cleanup handlers for various exit scenarios
|
package/src/preprocessor.ts
CHANGED
|
@@ -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
|
|
43
|
+
* Information about a block that will be transformed into a file write
|
|
43
44
|
*/
|
|
44
|
-
interface
|
|
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
|
|
309
|
-
const
|
|
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
|
|
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
|
|
342
|
-
// If we have a current directory,
|
|
343
|
-
|
|
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
|
|
449
|
-
const escapedCommand = command
|
|
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
|
|
469
|
-
if (
|
|
470
|
-
const
|
|
471
|
-
// Transform to
|
|
472
|
-
|
|
473
|
-
//
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
589
|
+
bodyLines.push(`cd ${dir}`);
|
|
509
590
|
}
|
|
510
591
|
|
|
511
592
|
// Output the block content
|
|
512
593
|
if (block.content) {
|
|
513
|
-
|
|
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
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
|