filter-shapes filter
function lets you filter an object using an example of that "shape" (these
examples are type
values, see type-by-example).
The way type-by-example
type values work is that an example of what you want will usually do the trick.
Simple values will be filtered using examples in an obvious way, and more specifically using the Specific Type strings implemented in the type system.
filter(1, -1) // -1
filter("1", -1) // undefined
filter('#int', -1) // -1
filter('#int [0,∞)', -1) // undefined
filter('#int [0,∞)', 17) // 17
filter('#regex ^\\d{5}$', '1234') // undefined
filter('#regex ^\\d{5}$', '90210') // '90210'
You can filter objects down to just the desired "shape".
If the provided object simply doesn't match the type of the filter then nothing will pass through.
const orig = {
foo: 'bar',
baz: 17
}
filter({ foo: 'whatever' }, orig) // { foo: 'bar' }
filter({ baz: 100 }, orig) // { baz: 17 }
filter({ foo: 100 }, orig) // undefined
filter({x: 0, y: 0}, {x: 100, y: 120, z: 17}) // returns {x: 100, y: 120}
filter({x: 0, y: 0, z: 0}, {x: 100, y: 120}) // returns undefined
Filter will filter arrays based on the elements in the corresponding type's array, e.g.
const orig = [true, false, 'hello', 17]
filter([true], orig) // returns [true, false]
filter([0], orig) // returns [17]
filter(['test', false], orig) // returns [true, false, 'hello']
filter([], orig) // returns [...orig]
This library originally started out as part of xinjs and is now being broken out as a standalone library.
Aside from the usual nodejs toolchain, this project uses bun for speed and as a test runner.