@xjslang/defer-parser
v1.0.2
Published
Defer for JavaScript
Readme
@xjslang/defer-parser
A JavaScript parser that adds defer statements to the language, inspired by Go and V programming languages.
Overview
This library extends JavaScript with defer functionality by transforming source code using AST manipulation. The defer statement allows you to specify code that should run when a function exits, regardless of how it exits (normal return, exception, etc.).
function example() {
defer console.log("This runs when function exits");
if (someCondition) {
return "early return"; // defer still executes
}
return "normal return"; // defer executes here too
}How it works
The parser uses a two-pass approach with industry-standard tools:
[Source Code] → acorn → [ESTree AST] → recast → [Final AST]- First pass (acorn): Parses JavaScript source code into an ESTree-compatible AST, recognizing the new
defersyntax - Second pass (recast): Transforms the AST by analyzing function bodies and inserting the necessary control structures to implement defer behavior
Why two passes?
The two-pass approach is necessary because we need to:
- Detect all
deferstatements in a function before generating the final code - Determine the appropriate cleanup and exception handling structures
- Maintain compatibility with existing JavaScript semantics
Installation
npm install @xjslang/defer-parserPeer Dependencies
This package requires the following peer dependencies:
npm install acorn recastUsage
import * as recast from 'recast'
import { parse as parseDefer } from './src/index.js'
const sourceCode = `
function connectToDB() {
const conn = createDBConn();
defer conn.close();
const file = openFile("/path/to/file");
defer { // you can use blocks
file.close();
// ... etc ...
}
// ... etc ...
return "done!";
}
`
// generates the AST and prints it
const transformedCode = parseDefer(sourceCode)
const result = recast.print(transformedCode)
console.log(result.code)API
parse(code, options?)
Transforms JavaScript code containing defer statements.
Parameters:
code(string): Source JavaScript code with defer statementsoptions(object, optional): Parser options
Returns: Transformed JavaScript code as a string
Development
Prerequisites
- Node.js >= 20.17 || >= 22
- npm
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Code Style
This project uses ESLint and Prettier for code formatting. Run npm run lint:fix and npm run format before submitting PRs.
Architecture
Core Dependencies
- acorn: Fast JavaScript parser that generates ESTree-compatible AST
- recast: JavaScript syntax tree transformer that preserves original formatting
Project Structure
src/
├── index.js # Main entry point
├── parser.js # Core parsing logic
├── builders.js # AST node builders
└── libs/
└── utils.js # Utility functions