RFC7643 SCIM(System for Cross-domain Identity Management) 2.0 filter parser. see section 3.4.2.2. Filtering.
This implements filter syntax parser and json filter function.
This is a fork https://www.npmjs.com/package/scim2-filter version 0.2.0 with bug correction.
You can parse filter query and get ast.
import {parse} from 'scim2-parse-filter';
const f = parse(`userType eq "Employee" and emails[type eq "work" and value co "@example.com"]`);
assert.deepEqual(f, {
op:"and",
filters:[
{
op:"eq",
attrPath:"userType",
compValue:"Employee"
},
{
op:"[]",
attrPath:"emails",
valFilter:{
op:"and",
filters:[
{
op:"eq",
attrPath:"type",
compValue:"work"
},
{
op:"co",
attrPath:"value",
compValue:"@example.com"
}
]
}
}
]
});
and You can use filter in json.
import {parse, filter} from 'scim2-parse-filter';
const f = filter(parse(`userName eq "test1@example.com"`));
const users = [
{ userName: "test1@example.com" },
{ userName: "test2@example.com" }
];
const ret = users.filter(f);
assert.deepEqual(ret, [users[0]]);
and you can convert an AST back into a SCIM query.
import { Filter, stringify } from 'scim2-parse-filter';
const ast: Filter = {
op:"and",
filters:[
{
op:"eq",
attrPath:"userType",
compValue:"Employee"
},
{
op:"[]",
attrPath:"emails",
valFilter:{
op:"and",
filters:[
{
op:"eq",
attrPath:"type",
compValue:"work"
},
{
op:"co",
attrPath:"value",
compValue:"@example.com"
}
]
}
}
]
};
assert.deepEqual(stringify(ast), 'userType eq "Employee" and emails[type eq "work" and value co "@example.com"]');