All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
v1.10.0 - 2026-07-10
- [New]
parse: add opt-insplitUnquotedoption for shell field-splitting of unquoted expansions#1
- [Fix]
parse: match nested${...}braces so nested parameter expansion is consumed as one substitutionc0842c8 - [Tests]
parse: pin single-quote literalness and unmatched-quote handlinga0d03e3 - [readme] remove the space in js code fences so evalmd evaluates them
2116fa3 - [Tests]
quote: pin conservative escaping of=,@,^,,,:,!(#11)1c36f3f - [readme] document that
quoteoutputs POSIX quoting, notcmd.exe/PowerShell100e96e - [readme] document
parse's supported parameter-expansion subsete1c75cd - [Fix]
parse: a backslash inside single quotes must not escape the closing quote5d460a3 - [readme] fix stale example outputs
2de86f5 - [Tests]
quote: pin that a backslash with whitespace is not doubled in single quotes (#14)190e236 - [readme]
quote: use output verbatim; do not re-quote it (#11)1b36468 - [Refactor]
parse: fix swappedSINGLE_QUOTE/DOUBLE_QUOTEvariable names801af5c - [types] fix an error TS v6 ignores but v7 fails on
59bbf8b - [Dev Deps] update
@arethetypeswrong/cli,evalmda04d475 - [Dev Deps] update
@arethetypeswrong/ci,eslintd390f9a - [Tests]
quote: the tilde test escapes every~, not just a leading one (#9)617d119
v1.9.0 - 2026-06-24
- [New] add types
dca6e21 - [Dev Deps] update
eslint9aa9e8f - [Fix]
parse: finalize tokens in linear time (GHSA-395f-4hp3-45gv)7ff5488 - [actions] update workflows
75e8497 - [actions] Windows + node 4/6/7: pin eslint to 9 before install, since npm 2/3 cannot stage eslint 10
@types/esrecurse3fb739d - [actions] retry
npm installon Windows to survive npm 2/3 staging-rename flakeabe0163 - [actions] Windows + node 5/7: install deps with a modern node
b4bafa2 - [Fix]
quote: escape leading~to prevent shell tilde-expansion7a76c1a - [Dev Deps] update
auto-changelog,tape7184b44 - [Dev Deps] apparently
jackspeakis no longer in the graph9ba368a
v1.8.4 - 2026-05-22
- [Fix]
quote: validate object-token shapes4378a6e - [Dev Deps] update
@ljharb/eslint-config,auto-changelog,eslint,npmignore22ebec0 - [Tests] increase coverage
9f3caa3 - [readme] replace runkit CI badge with shields.io check-runs badge
3344a04 - [Dev Deps] update
@ljharb/eslint-config699c511
v1.8.3 - 2025-06-01
- [Fix] remove unnecessary backslash escaping in single quotes
#15
v1.8.2 - 2024-11-27
- [Fix]
quote: preserve empty strings#18
- [meta] fix changelog tags
0fb9fd8 - [actions] split out node 10-20, and 20+
819bd84 - [Dev Deps] update
@ljharb/eslint-config,auto-changelog,npmignore,tapefc56408 - [actions] update npm for windows tests
fdeb0fd - [Dev Deps] update
@ljharb/eslint-config,aud,tapeb8a4a3b - [actions] prevent node 14 on ARM mac from failing
9eecafc - [meta] exclude more files from the package
4044e7f - [Tests] replace
audwithnpm audit8cfdbd8 - [meta] add missing
engines.node843820e - [Dev Deps] add missing peer dep
4c3b88d - [Dev Deps] pin
jackspeaksince 2.1.2+ depends on npm aliases, which kill the install process in npm < 680322ed
v1.8.1 - 2023-04-07
- [Refactor]
parse: hoistgetVarto module levelb42ac73 - [Refactor] hoist some vars to module level
8f0c5c3 - [Refactor]
parse: usesliceoversubstr, cache some valuesfcb2e1a - [Refactor]
parse: a bit of cleanup6780ec5 - [Refactor]
parse: tweak the regex to not match nothing227d474 - [Tests] increase coverage
a66de94 - [Refactor]
parse: avoid shadowing a function arg1d58679
v1.8.0 - 2023-01-30
- [New] extract
parseandquoteto their own deep imports553fdfc - [Tests] add
nyccoveragefd7ddcd - [New] Add support for here strings (
<<<)9802fb3 - [New]
parse: Add syntax support for duplicating input file descriptors216b198 - [Dev Deps] update
@ljharb/eslint-config,aud,tape85f8e31 - [Tests] add
evalmdc5549fc - [actions] update checkout action
62e9b49
v1.7.4 - 2022-10-12
- Add node_modules to .gitignore
#48
- [eslint] fix indentation and whitespace
aaa9d1f - [eslint] additional cleanup
397cb62 - [meta] add
auto-changelog497fca5 - [actions] add reusable workflows
4763c36 - [eslint] add eslint
6ee1437 - [readme] rename, add badges
7eb5134 - [meta] update URLs
67381b6 - [meta] create FUNDING.yml; add
fundingin package.json8641572 - [meta] use
npmignoreto autogenerate an npmignore file2e2007a - Only apps should have lockfiles
f97411e - [Dev Deps] update
tape051f608 - [meta] add
safe-publish-latest18cadf9 - [Tests] add
audinposttestdc1cc12
v1.7.3 - 2021-10-20
- Fix a security issue where the regex for windows drive letters allowed some shell meta-characters to escape the quoting rules. (CVE-2021-42740)
v1.7.2 - 2019-08-30
- Fix a regression introduced in 1.6.3. This reverts the Windows path quoting fix. (144e1c2)
v1.7.1 - 2019-08-13
v1.7.0 - 2019-08-13
- Add support for parsing
>>and>&redirection operators. (@forivall in #16) - Add support for parsing
<(process substitution operator. (@cuonglm in #15)
v1.6.3 - 2019-08-13
v1.6.2 - 2019-08-13
- Use native JSON and Array methods
#21
1.6.1 - 2016-06-17
1.6.0 - 2016-04-23
- add comment parsing feature
b8b5c31
1.5.0 - 2016-03-16
- add escape option to .parse
4d400e7
1.4.3 - 2015-03-07
- Fix quote() with special chars
811b5a0
1.4.2 - 2014-07-20
1.4.1 - 2013-12-24
- es5 shims
00dc6ab - separate shim file to get the coverage up
e29a216 - use array-{filter,map,reduce}
97a2fc9 - add testling badge
44c98b1 - upgrade tape
3fc22d3
1.4.0 - 2013-10-17
- Add MIT LICENSE file
#6
- Rewrite parser as a character based scanner
c7ca9a2 - Add tests for glob patterns
3418892 - Update algo description
e1442cf - Fix test case for backslash in double quotes
89bc550 - Add failing tests for crazy quoting tricks
58a5e48
1.3.3 - 2013-06-24
1.3.2 - 2013-06-24
- tests for setting env vars
f44b039 - fixed the parse test, broke the op tests
74d6686 - factored out single and double quote regex
de9e0a5 - updated set env test, already passes
7d5636b - ops fixed
2b4e1b1 - passing all tests
44177e3 - backreferences in negated capture groups don't actually work
e189d9d - another crazy ridiculous passing parse test
d1beb6b - failing test for quoted whitespace and nested quotes
9a4c11c - failing test for quotes embedded inside barewords
d997384
1.3.1 - 2013-05-13
- pass objects through
f9c0514
1.3.0 - 2013-05-13
- hacky tokenizer is much simpler
7e91b18 - nearly passing with a clunky state env parser, array issues
d6d6416 - test for functional env expansion
666395f - upgrade travis versions, tape
f6f8bd6 - 1.3.0, document env() lookups
041c5da - first half of functional env() works
7a0cf79 - env() objects even work inside quote strings
16139f5 - another check just to make sure env() works
914a1a9
1.2.0 - 2013-05-13
- failing test for special shell parameter env vars
728862a - add the special vars to the replace regex but the chunker breaks on them
d1ff82a - fixed the env test, everything is fine
a45897f
1.1.0 - 2013-05-13
- quote all ops objects
ac7be63 - test for parsed ops objects in quote()
59fb71b - another test for op object quoting
5819a31
1.0.0 - 2013-05-13
- document ops, op example
a6381e6 - some more passing double-char op tests
fbc6e5c - failing test for | and & ops
d817736 - labeled regex states
8c008b2 - refactored the chunker regex into a string
0331c7f - simple failing double-char op test
e51fa90 - failing expanded single-op tests for ; and ()
710bb24 - now passing all the single-char op tests
e3e9ac1 - using the control ops directly from the docs
f535987 - first part of op parsing works
e6f9199 - failing redirect tests
cb94c10 - another double-char op test just to be sure
5cf1bf2 - 1.0.0 for ops
17a40ed - adding redirect <> ops to CONTROL makes the tests pass
48b1eb9 - double-char op test now passing
3998b0f - using the meta chars directly from the docs
b009ef6 - the spec says tabs are also allowed
2adb373 - op test completely passing
20a0147
0.1.1 - 2013-04-17
- Return empty list when parsing an empty (or whitespace-only) string
1475717
0.1.0 - 2013-04-14
- externalize the regex declaration
37d6058 - modernize the readme
24106f5 - factor out interpolation
1b21b01 - half the env tests are working with basic interpolation
5891471 - env parse example
5757c42 - failing tests for unimplemented env interpolation
590534a - denormalize the interpolate logic to make room for special cases
c669d2e - cleaner implementation recursing on the double quote case
adae66f - one test was wrong, checking for pre escapes
42b5f83 - finally passing all the tests
efa4084 - one more test passing with quote recursion
e9537b9 - use tape everywhere
ed0c1c6 - some extra metacharacter tests just to be sure
a6782ae - minor fix to an env test
601b340 - document parse env
cc0efba - better parse recursion to capture the containing quotes
8467961 - now just 2 tests failing with a subtle regex reordering
5448a02 - pass another test by using "" as the undefined
46e6cf4 - fixed a failing env test
17d1fda - actually the test was wrong, module works fine
9d7b727 - another test to be even more sure
5afd47b - failing test for: echo "foo = "foo""
8dbb280