Skip to content
generated from un-ts/lib-boilerplate

A WASM shell parser and formatter with bash support, based on `mvdan/sh`

License

Notifications You must be signed in to change notification settings

un-ts/sh-syntax

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

99 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sh-syntax

GitHub Actions Workflow Status Codecov type-coverage CodeRabbit Pull Request Reviews npm GitHub Release

Conventional Commits Renovate enabled JavaScript Style Guide Code Style: Prettier changesets

A WASM shell parser and formatter with bash support, based on mvdan/sh

TOC

Usage

Install

# yarn yarn add sh-syntax # npm npm i sh-syntax

API

node

import { parse, print } from 'sh-syntax' const text = "echo 'Hello World!'" const ast = await parse(text) const newText = await print(ast, { // `originalText` is required for now, hope we will find better solution later originalText: text, })

browser

import { getProcessor } from 'sh-syntax' // choose your own way to load the WASM file // with `fetch` const processor = getProcessor(() => fetch('http://cdn.jsdelivr.net/npm/sh-syntax@latest/main.wasm'), ) // with `wasm?init` via `vite` import initWasm from 'sh-syntax/wasm?init' const processor = getProcessor(initWasm) const parse = (text, options) => processor(text, options) const print = (textOrAst, options) => { if (typeof textOrAst === 'string') { return processor(textOrAst, { ...options, print: true, }) } return processor(textOrAst, options) } // just like node again const text = "echo 'Hello World!'" const ast = await parse(text) const newText = await print(ast, { originalText: text })

Benchmark

clk: ~2.81 GHz cpu: Apple M1 Max runtime: node 18.20.8 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ------------------------------------------- ------------------------------- sh-syntax 18.33 ms/iter 18.56 ms ▃ ▃█  (17.48 ms … 20.83 ms) 19.09 ms ▂▂█ ▂ ██▂ ▂ ▂  ( 28.52 kb … 9.82 mb) 890.46 kb ███▆▆▁▁█▁▁▆███▁▆█▁█▆▆  5.07 ipc ( 1.22% stalls) 99.36% L1 data cache  56.96M cycles 288.57M instructions 39.27% retired LD/ST (113.32M) sh-syntax (synckit) 18.38 ms/iter 18.82 ms ▂▂▂ ▂▂ █▂  (17.63 ms … 19.06 ms) 19.04 ms ███▅ ██ ██▅▅  (291.31 kb … 312.45 kb) 292.09 kb ████▇▇▇▇▁▁▁▁▇▁██▇████  1.11 ipc ( 11.51% stalls) 40.34% L1 data cache  434.86k cycles 484.78k instructions 19.58% retired LD/ST ( 94.92k) mvdan-sh 79.47 ms/iter 78.95 ms █  (71.22 ms … 126.09 ms) 80.84 ms ▅█ ▅▅▅ ▅ ▅▅▅ ▅  ( 8.18 mb … 9.70 mb) 8.83 mb ██▁███▁▁▁▁█▁▁▁▁███▁▁█  5.18 ipc ( 1.05% stalls) 99.04% L1 data cache  249.41M cycles 1.29G instructions 34.41% retired LD/ST (444.42M) summary  sh-syntax  1x faster than sh-syntax (synckit)  4.34x faster than mvdan-sh

See benchmark for more details.

You can try it with running node benchmark by yourself. Here is the benchmark source code.

Sponsors and Backers

Sponsors and Backers

Sponsors

1stG RxTS UnTS
1stG Open Collective sponsors RxTS Open Collective sponsors UnTS Open Collective sponsors

Backers

1stG RxTS UnTS
1stG Open Collective backers RxTS Open Collective backers UnTS Open Collective backers

Changelog

Detailed changes for each release are documented in CHANGELOG.md.

License

MIT © JounQin@1stG.me