Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
86fc135
feat(filters): Add base64_encode and base64_decode filters for Shopif…
rosomri Oct 27, 2025
a2da822
docs: add rosomri as a contributor for code (#829)
allcontributors[bot] Oct 27, 2025
9067078
chore(release): 10.24.0 [skip ci]
semantic-release-bot Oct 27, 2025
3a02eb1
docs: update tutorial on operators and precedence (#830)
immerrr Oct 31, 2025
8686876
docs: add immerrr as a contributor for doc (#831)
allcontributors[bot] Oct 31, 2025
955b797
Support having new line and other whitespace after include filename (…
rongjiecomputer Nov 11, 2025
350f95c
docs: add rongjiecomputer as a contributor for code (#835)
allcontributors[bot] Nov 11, 2025
71aa1b1
feat: export error types, resolving #837 (#840)
harttle Nov 21, 2025
1c63161
docs: update docs for operators (#847)
harttle Jan 10, 2026
02403a1
docs: Change LambdaTest to TestMu AI (#848)
harttle Jan 19, 2026
85233e0
docs: update testmu sponsor link (#850)
harttle Feb 14, 2026
3cd024d
fix: path traversal vulnerability, #851 (#855)
harttle Mar 7, 2026
0d9e797
docs: add MorielHarush as a contributor for code (#856)
allcontributors[bot] Mar 7, 2026
524cd92
docs: add peaktwilight as a contributor for code (#857)
allcontributors[bot] Mar 7, 2026
f1fc573
docs: state differences regarding inspect array/hash, #852, #853 (#858)
harttle Mar 7, 2026
eb4683e
chore: update to NPM Trusted Release (#860)
harttle Mar 7, 2026
c7a291b
chore: update semantic-release dependencies (#861)
harttle Mar 7, 2026
93c38c7
chore(release): 10.25.0 [skip ci]
semantic-release-bot Mar 7, 2026
1b85fda
docs: update contact in security.md (#862)
harttle Mar 8, 2026
95ddefc
fix: mem limiter for invalid ranges
harttle Mar 19, 2026
94440a0
chore: more strict mem limit for string filters
harttle Mar 22, 2026
35d5230
fix: treat args for replace_first as literal
harttle Mar 22, 2026
97d8291
chore(release): 10.25.1 [skip ci]
semantic-release-bot Mar 22, 2026
e7e3aeb
Add support of inner expressions enclosed by parentheses
skynetigor Mar 23, 2026
0ad2b11
fix: handle undefined replacement argument in replace filter (#864)
joecottam Mar 25, 2026
75e06ef
docs: add joecottam as a contributor for code (#865)
allcontributors[bot] Mar 25, 2026
521177e
chore(release): 10.25.2 [skip ci]
semantic-release-bot Mar 25, 2026
abc058b
fix: precise memoryLimit for string replace
harttle Mar 26, 2026
75314d0
Add support of inner expressions enclosed by parentheses
skynetigor Mar 23, 2026
489d136
Merge branch '833_Support-Value-Expressions-as-Operands-in-Conditiona…
skynetigor Apr 3, 2026
a84df57
simplify implementation
skynetigor Apr 3, 2026
4b5296a
fix lint
skynetigor Apr 3, 2026
ba50a32
Merge branch 'master' into 833_Support-Value-Expressions-as-Operands-…
skynetigor Apr 3, 2026
0bedce9
fix test
skynetigor Apr 3, 2026
d6ec7cd
Merge branch '833_Support-Value-Expressions-as-Operands-in-Conditiona…
skynetigor Apr 3, 2026
f45c4f1
Enhance tests for parenthesized filter chains in Liquid tags. Added s…
skynetigor Apr 3, 2026
529dd67
fix: use realpath for fs.contains (#867)
harttle Apr 6, 2026
8f69a08
chore(release): 10.25.3 [skip ci]
semantic-release-bot Apr 6, 2026
e743da0
fix: sort and sort_natural filters bypass ownPropertyOnly (#869)
harttle Apr 7, 2026
db43485
chore(release): 10.25.4 [skip ci]
semantic-release-bot Apr 7, 2026
f41c1fc
fix: enforce root containment for renderFile/parseFile lookups (#870)
harttle Apr 7, 2026
4f9a499
fix: null date should return empty (#868) (#872)
timbze Apr 7, 2026
1cdf10b
fix: rounding negative away from zero when half (#873)
timbze Apr 7, 2026
66011d1
docs: add timbze as a contributor for code (#874)
allcontributors[bot] Apr 7, 2026
05c47da
refactor: replace shell scripts with JS for cross-platform support (#…
harttle Apr 7, 2026
4af7be6
chore(release): 10.25.5 [skip ci]
semantic-release-bot Apr 7, 2026
bd65ca6
Merge branch 'master' of https://github.com/harttle/liquidjs into HEAD
rosomri Apr 12, 2026
2cc74bf
test: remove duplicate readGroupedExpression test block
rosomri Apr 12, 2026
e1afb68
refactor: extract extractGroupedExpressionTokenVariables helper
rosomri Apr 12, 2026
60a6d0a
refactor(types): explicit type for collection in for tag
rosomri Apr 12, 2026
c4b4b6a
refactor: evaluate grouped expressions at render time with resolvedFi…
rosomri Apr 13, 2026
7f2b3ff
refactor: reuse FilteredValueToken and fix architectural layering
rosomri Apr 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions .all-contributorsrc
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,69 @@
"contributions": [
"code"
]
},
{
"login": "rosomri",
"name": "Omri Rosner",
"avatar_url": "https://avatars.githubusercontent.com/u/68001413?v=4",
"profile": "https://github.com/rosomri",
"contributions": [
"code"
]
},
{
"login": "immerrr",
"name": "immerrr again",
"avatar_url": "https://avatars.githubusercontent.com/u/579798?v=4",
"profile": "https://github.com/immerrr",
"contributions": [
"doc"
]
},
{
"login": "rongjiecomputer",
"name": "Loo Rong Jie",
"avatar_url": "https://avatars.githubusercontent.com/u/13115060?v=4",
"profile": "https://github.com/rongjiecomputer",
"contributions": [
"code"
]
},
{
"login": "MorielHarush",
"name": "MorielHarush",
"avatar_url": "https://avatars.githubusercontent.com/u/93482738?v=4",
"profile": "https://github.com/MorielHarush",
"contributions": [
"code"
]
},
{
"login": "peaktwilight",
"name": "Peak Twilight",
"avatar_url": "https://avatars.githubusercontent.com/u/77903714?v=4",
"profile": "https://doruk.ch",
"contributions": [
"code"
]
},
{
"login": "joecottam",
"name": "Joe Cottam",
"avatar_url": "https://avatars.githubusercontent.com/u/44173086?v=4",
"profile": "https://github.com/joecottam",
"contributions": [
"code"
]
},
{
"login": "timbze",
"name": "Timmy Braun",
"avatar_url": "https://avatars.githubusercontent.com/u/35117769?v=4",
"profile": "https://github.com/timbze",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,
Expand Down
17 changes: 17 additions & 0 deletions .cursor/rules/architecture.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
description: Architecture overview for liquidjs internals
alwaysApply: true
---

## Async/sync duality via generators

All core logic is written once as a `Generator` function (`function *`). Use `yield` where you'd normally `await` a potentially async value.

- `toPromise(generator)` drives it **asynchronously** — awaits yielded promises.
- `toValueSync(generator)` drives it **synchronously** — passes yielded values through as-is.

Never duplicate logic into separate async and sync methods. A single generator serves both paths.

When wrapping an async+sync function pair (e.g. `contains`/`containsSync`, `exists`/`existsSync`, `readFile`/`readFileSync`), use `toLiquidAsync(asyncFn, syncFn?)` which returns a `LiquidAsync<F>` — one function that picks the sync or async implementation based on a leading `sync: boolean` arg. Then `yield` the result inside a generator to let the driver handle it in both modes.

See `src/util/async.ts`.
6 changes: 6 additions & 0 deletions .cursor/rules/conventions.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
description: Project conventions for liquidjs
alwaysApply: true
---

- Keep edits minimal: change only what the task requires, match existing style.
5 changes: 5 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ jobs:
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
pull-requests: write
id-token: write
steps:
- name: Checkout
uses: actions/checkout@v3
Expand Down
58 changes: 58 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,61 @@
## [10.25.5](https://github.com/harttle/liquidjs/compare/v10.25.4...v10.25.5) (2026-04-07)


### Bug Fixes

* enforce root containment for renderFile/parseFile lookups ([#870](https://github.com/harttle/liquidjs/issues/870)) ([f41c1fc](https://github.com/harttle/liquidjs/commit/f41c1fc02fe901598f3328118b42b13bc6bc9b04))
* null date should return empty ([#868](https://github.com/harttle/liquidjs/issues/868)) ([#872](https://github.com/harttle/liquidjs/issues/872)) ([4f9a499](https://github.com/harttle/liquidjs/commit/4f9a49988a93c156524981e189a4fec238e682b8))
* rounding negative away from zero when half ([#873](https://github.com/harttle/liquidjs/issues/873)) ([1cdf10b](https://github.com/harttle/liquidjs/commit/1cdf10b57d82f0592414efbfca19e204b37aea9f))

## [10.25.4](https://github.com/harttle/liquidjs/compare/v10.25.3...v10.25.4) (2026-04-07)


### Bug Fixes

* sort and sort_natural filters bypass ownPropertyOnly ([#869](https://github.com/harttle/liquidjs/issues/869)) ([e743da0](https://github.com/harttle/liquidjs/commit/e743da0020d34e2ee547e1cc1a86b58377ebe1ce))

## [10.25.3](https://github.com/harttle/liquidjs/compare/v10.25.2...v10.25.3) (2026-04-06)


### Bug Fixes

* precise memoryLimit for string replace ([abc058b](https://github.com/harttle/liquidjs/commit/abc058be0f33d6372cd2216f4945183167abeb25))
* use realpath for fs.contains ([#867](https://github.com/harttle/liquidjs/issues/867)) ([529dd67](https://github.com/harttle/liquidjs/commit/529dd67eeb6b125637623d6a723601f0938d3613))

## [10.25.2](https://github.com/harttle/liquidjs/compare/v10.25.1...v10.25.2) (2026-03-25)


### Bug Fixes

* handle undefined replacement argument in replace filter ([#864](https://github.com/harttle/liquidjs/issues/864)) ([0ad2b11](https://github.com/harttle/liquidjs/commit/0ad2b11ab15e7da608a9ef936b2a00a6a6517038))

## [10.25.1](https://github.com/harttle/liquidjs/compare/v10.25.0...v10.25.1) (2026-03-22)


### Bug Fixes

* mem limiter for invalid ranges ([95ddefc](https://github.com/harttle/liquidjs/commit/95ddefc056a11a44d9e753fd47a39db2c241e578))
* treat args for replace_first as literal ([35d5230](https://github.com/harttle/liquidjs/commit/35d523026345d80458df24c72e653db78b5d061d))

# [10.25.0](https://github.com/harttle/liquidjs/compare/v10.24.0...v10.25.0) (2026-03-07)


### Bug Fixes

* path traversal vulnerability, [#851](https://github.com/harttle/liquidjs/issues/851) ([#855](https://github.com/harttle/liquidjs/issues/855)) ([3cd024d](https://github.com/harttle/liquidjs/commit/3cd024d652dc883c46307581e979fe32302adbac))


### Features

* export error types, resolving [#837](https://github.com/harttle/liquidjs/issues/837) ([#840](https://github.com/harttle/liquidjs/issues/840)) ([71aa1b1](https://github.com/harttle/liquidjs/commit/71aa1b1998a3a66e536af67c6ea8947a28616eaf))

# [10.24.0](https://github.com/harttle/liquidjs/compare/v10.23.0...v10.24.0) (2025-10-27)


### Features

* **filters:** Add base64_encode and base64_decode filters for Shopify compatibility ([#828](https://github.com/harttle/liquidjs/issues/828)) ([86fc135](https://github.com/harttle/liquidjs/commit/86fc135d9ec0137689faf150535b9315e75ecc30))

# [10.23.0](https://github.com/harttle/liquidjs/compare/v10.22.0...v10.23.0) (2025-10-23)


Expand Down
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ If you personally love LiquidJS or it's benefiting your business, please conside
<a href="https://customer.io/" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://avatars.githubusercontent.com/u/1152079?v=4&s=100" height="80" style="vertical-align: middle;" alt="Customer IO" title="Customer IO"/></a>
<a href="https://syntax.fm/" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://avatars.githubusercontent.com/u/130389858?v=4&s=100" height="80" style="vertical-align: middle;" alt="Syntax Podcast" title="Syntax Podcast"/></a>
<br/>
<a href="https://www.lambdatest.com/?utm_source=liquidjs&utm_medium=sponsor" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://www.lambdatest.com/blue-logo.png" width="240" style="vertical-align: middle;" alt="LambdaTest" title="LambdaTest"/></a>
<a href="https://www.testmuai.com/?utm_medium=sponsor&utm_source=liquidjs" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://avatars.githubusercontent.com/u/27130435?s=200&v=4" width="80" style="vertical-align: middle;" alt="TestMu AI" title="TestMu AI"/></a>
<a href="https://chudovo.com/" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://images.opencollective.com/Chudovo/avatar/256.png?height=100" width="160" style="vertical-align: middle;background: white;padding: 8px 16px;" alt="Chudovo" title="Chudovo"/></a>
<a href="https://dailycontributors.com/" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://images.opencollective.com/dailycontributors/3c2e057/logo/256.png?height=50&width=100" width="120" style="vertical-align: middle;" alt="Dailycontributors" title="Dailycontributors"/></a>
<a href="https://www.pakstyle.pk/" style="display: inline-block; vertical-align: middle; margin: 8px;"><img src="https://images.opencollective.com/pakstyle/2b81605/logo/256.png?height=100" height="80" style="vertical-align: middle;" alt="PakStyle.pk" title="PakStyle.pk"/></a>
Expand Down Expand Up @@ -212,6 +212,15 @@ Want to contribute? see [Contribution Guidelines][contribution]. Thanks goes to
<td align="center" valign="top" width="14.28%"><a href="https://gurdiga.com"><img src="https://avatars.githubusercontent.com/u/53922?v=4?s=100" width="100px;" alt="Vlad GURDIGA"/><br /><sub><b>Vlad GURDIGA</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=gurdiga" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.streakingman.com"><img src="https://avatars.githubusercontent.com/u/30397306?v=4?s=100" width="100px;" alt="裸奔狂甩丁丁"/><br /><sub><b>裸奔狂甩丁丁</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=StreakingMan" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/skynetigor"><img src="https://avatars.githubusercontent.com/u/20903171?v=4?s=100" width="100px;" alt="Ihor Panasiuk"/><br /><sub><b>Ihor Panasiuk</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=skynetigor" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rosomri"><img src="https://avatars.githubusercontent.com/u/68001413?v=4?s=100" width="100px;" alt="Omri Rosner"/><br /><sub><b>Omri Rosner</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=rosomri" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/immerrr"><img src="https://avatars.githubusercontent.com/u/579798?v=4?s=100" width="100px;" alt="immerrr again"/><br /><sub><b>immerrr again</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=immerrr" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rongjiecomputer"><img src="https://avatars.githubusercontent.com/u/13115060?v=4?s=100" width="100px;" alt="Loo Rong Jie"/><br /><sub><b>Loo Rong Jie</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=rongjiecomputer" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MorielHarush"><img src="https://avatars.githubusercontent.com/u/93482738?v=4?s=100" width="100px;" alt="MorielHarush"/><br /><sub><b>MorielHarush</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=MorielHarush" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://doruk.ch"><img src="https://avatars.githubusercontent.com/u/77903714?v=4?s=100" width="100px;" alt="Peak Twilight"/><br /><sub><b>Peak Twilight</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=peaktwilight" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joecottam"><img src="https://avatars.githubusercontent.com/u/44173086?v=4?s=100" width="100px;" alt="Joe Cottam"/><br /><sub><b>Joe Cottam</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=joecottam" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/timbze"><img src="https://avatars.githubusercontent.com/u/35117769?v=4?s=100" width="100px;" alt="Timmy Braun"/><br /><sub><b>Timmy Braun</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=timbze" title="Code">💻</a></td>
</tr>
</tbody>
</table>
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Only the latest major version is supported with security updates. It can be chan

## Reporting a Vulnerability

Please contact yangjvn@126.com to report a vulnerability or change request.
Please contact harttleharttle@gmail.com to report a vulnerability or change request.

- If the vulnerability in question affects common use cases, it will be treated as a bug and fixed very soon (typically within 1 week).
- Otherwise, it'll be scheduled in the same priority of feature request (which is lower than bugs).
Expand Down
4 changes: 0 additions & 4 deletions bin/build-apidoc.sh

This file was deleted.

24 changes: 24 additions & 0 deletions bin/build-changelog.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const fs = require('fs')
const path = require('path')

const root = path.resolve(__dirname, '..')
const src = path.join(root, 'CHANGELOG.md')

let content = fs.readFileSync(src, 'utf8').replace(/\r\n/g, '\n')

const lines = content.split('\n')
lines[0] = lines[0]
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
content = lines.join('\n')

content = content
.replace(/{%/g, '{% raw %}{%{% endraw %}')
.replace(/\{\{/g, '{% raw %}{{{% endraw %}')

const enFrontmatter = '---\ntitle: Changelog\nauto: true\n---\n\n'
const zhFrontmatter = '---\ntitle: 更新日志\nauto: true\n---\n\n'

fs.writeFileSync(path.join(root, 'docs/source/tutorials/changelog.md'), enFrontmatter + content)
fs.writeFileSync(path.join(root, 'docs/source/zh-cn/tutorials/changelog.md'), zhFrontmatter + content)
15 changes: 0 additions & 15 deletions bin/build-changelog.sh

This file was deleted.

39 changes: 39 additions & 0 deletions bin/build-contributors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const fs = require('fs')
const path = require('path')

const root = path.resolve(__dirname, '..')
const readme = fs.readFileSync(path.join(root, 'README.md'), 'utf8').replace(/\r\n/g, '\n')

function extractSection (text, beginMarker, endMarker) {
const lines = text.split('\n')
let inside = false
const result = []
for (const line of lines) {
if (line.includes(endMarker)) inside = false
if (inside) result.push(line)
if (line.includes(beginMarker)) inside = true
}
return result.join('\n')
}

function transformContributors (html) {
return html
.replace(/<br \/>.*?<\/td>/g, '</a></td>')
.replace(/width="[^"]*"/g, '')
.replace(/\n/g, '')
.replace(/<\/tr>\s*<tr>/g, '')
}

function transformFinancial (html) {
return html
.replace(/<br \/>.*?<\/td>/g, '</a></td>')
.replace(/\n/g, '')
.replace(/<\/tr>\s*<tr>/g, '')
}

const allContributors = transformContributors(extractSection(readme, 'ALL-CONTRIBUTORS-LIST:START', 'ALL-CONTRIBUTORS-LIST:END'))
const financialContributors = transformFinancial(extractSection(readme, 'FINANCIAL-CONTRIBUTORS-BEGIN', 'FINANCIAL-CONTRIBUTORS-END'))

const outDir = path.join(root, 'docs/themes/navy/layout/partial')
fs.writeFileSync(path.join(outDir, 'all-contributors.swig'), allContributors)
fs.writeFileSync(path.join(outDir, 'financial-contributors.swig'), financialContributors)
25 changes: 0 additions & 25 deletions bin/build-contributors.sh

This file was deleted.

6 changes: 0 additions & 6 deletions bin/build-docs-liquid.sh

This file was deleted.

17 changes: 0 additions & 17 deletions bin/build-docs.sh

This file was deleted.

36 changes: 0 additions & 36 deletions bin/build-icons.sh

This file was deleted.

17 changes: 17 additions & 0 deletions bin/perf-diff.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const { execSync } = require('child_process')
const fs = require('fs')
const path = require('path')

const root = path.resolve(__dirname, '..')
const version = require(path.join(root, 'package.json')).version

const fileLocal = path.join(root, 'dist/liquid.node.js')
const fileLatest = path.join(root, `dist/liquid.node.${version}.js`)

if (!fs.existsSync(fileLatest)) {
const url = `https://unpkg.com/liquidjs@${version}/dist/liquid.node.js`
console.log(`Downloading liquidjs@${version}...`)
execSync(`curl -sL -o "${fileLatest}" "${url}"`)
}

execSync(`node benchmark/diff.js "${fileLocal}" "${fileLatest}"`, { cwd: root, stdio: 'inherit' })
Loading
Loading