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.
0.6.1 - 2026-02-11
Changed
- List operators with a single value (no commas) now pass through as a string instead of a single-element list. This allows Flop to apply its own parsing, such as whitespace splitting for
like_and/like_or/ilike_and/ilike_or.
0.6.0 - 2026-02-11
Added
- Comma-separated value parsing for list operators (
in,not_in,like_and,like_or,ilike_and,ilike_or). For example,status[in]=draft,publishedis now equivalent tostatus[in][]=draft&status[in][]=published. The bracket[]syntax still works and serves as an escape hatch for values that contain commas. - Operator reference table with SQL examples in
FlopRest.Operatorsmoduledoc.
0.5.0 - 2026-02-05
Changed
- Breaking: Renamed cursor pagination params
starting_after→afterandending_before→beforefor brevity.
0.4.0 - 2025-02-04
Added
FlopRest.normalize/2with:foroption for schema-aware filtering. When a schema is provided, only fields in the schema'sfilterablelist become filters. Non-filterable params are kept in the result at the root level for custom handling.FlopRest.Filters.extract/2accepts aMapSetof filterable field names and returns a{filters, extra_params}tuple.
0.3.0 - 2025-02-04
Changed
- Breaking:
to_query/1,2now returns a map with string keys instead of a keyword list. This is more consistent since operator keys like"amount[gte]"don't map cleanly to atoms.
0.2.0 - 2025-02-04
Added
FlopRest.to_query/1,2to convert Flop structs back to REST-style query paramsFlopRest.build_path/2,3to build URL paths with REST-style query strings (merges with existing query params)FlopRest.Operators.to_rest/1for reverse operator mapping (Flop → REST)FlopRest.Pagination.to_rest/1for reverse pagination transformationFlopRest.Sorting.to_rest/1for reverse sorting transformationFlopRest.Filters.to_rest/1for reverse filter transformation- Accepts both
Flop.t()andFlop.Meta.t()structs
Changed
- Added
flopandplugas runtime dependencies limitalone now defaults to cursor-based pagination (first) instead of offset-based. This ensures Flop returns cursor metadata for use withafter/before. To use offset-based pagination, includeoffset(e.g.,offset=0&limit=25).
0.1.0 - 2025-02-03
Added
- Initial release of FlopRest
FlopRest.normalize/1to transform REST-style query params to Flop format- Filter transformation with support for:
- Bare values as equality filters (
status=published) - Nested operator syntax (
amount[gte]=100) - All Flop operators:
eq,ne,lt,lte,gt,gte,in,not_in,contains,not_contains,like,not_like,like_and,like_or,ilike,not_ilike,ilike_and,ilike_or,empty,not_empty,search - Unknown operators passed through for Flop validation
- Bare values as equality filters (
- Sorting transformation:
- Comma-separated fields (
sort=name,-created_at) -prefix for descending order+or no prefix for ascending order
- Comma-separated fields (
- Pagination support for all three Flop pagination types:
- Cursor-based (Stripe-style):
limit,after,before - Page-based:
page,page_size - Offset-based:
offset,limit
- Cursor-based (Stripe-style):